1 Dive into TensorFlow系列-靜態圖運行原理( 二 )


def run(self, fetches, feed_dict=None, options=None, run_metadata=https://www.huyubaike.com/biancheng/None):run()方法的參數說明如下:
?fetches:指定要執行的tf.Operation或評估的tf.Tensor,可以是單個元素或是列表、字典 。?feed_dict:一個占位符到填充值的映射 。?options:RunOptions的protocol buffer 。?run_metadata:RunMetadata的protocol buffer,用來收集執行過程的元數據信息 。當Session指定fetches后 , 根據要獲取的結果決定tf.Graph實際執行的subgraph(并非整個tf.Graph都要執行) 。執行靜態圖還有三個要點:
?訓練階段用一個靜態圖,而預測/評估階段用另一個靜態圖 。?一個session實例只能運行一個graph實例,但一個graph可以運行在多個session中 。?session之間可通過共享graph的方式來提高運行效率 。創建session時若不指定graph,則運行的是default graph 。如果新創建的session也不指定graph , 則只需要對default graph的引用計數加1即可;當此session close時,default graph引用計數減1 。2.3 Session類前后端設計首先我們看一下和用戶直接打交道的前端Session,具體分為普通Session和交互式InteractiveSession 。前者全稱為tf.Session,需要在啟動之前先構建完整的計算圖;后者全稱為tf.InteractiveSession,它是先構建一個session , 然后再定義各種操作,適用于shell和IPython等交互式環境 。這兩個類均繼承自BaseSession,這個基類實現了整個生命周期的所有會話邏輯(相關代碼在tensorflow/python/client/session.py中) 。前端Session類的繼承關系如下圖:

1 Dive into TensorFlow系列-靜態圖運行原理

文章插圖
TensorFlow后端會根據前端tf.Session(target='', graph=None, config=None)創建時指定的target來創建不同的后端Session 。target是要連接的TF后端執行引擎,默認為空字符串 。后端Session的創建采用抽象工廠模式,如果為空字符串,則創建本地DirectionSession;如果是grpc://開頭的URL串,則創建分布式GrpcSession 。DirectSession只能利用本地設備 , 將任務調度到本地的CPU/GPU設備上;GrpcSession可利用遠程設備,將任務分發到不同機器的CPU/GPU上,然后機器之間通過gRPC進行通信 。顯而易見,DirectionSession的定義應在core/common_runtime/direction_session.h中;GrpcSession的定義在core/distributed_runtime/rpc/grpc_session.h中 。后端Session的類圖關系如下所示:
1 Dive into TensorFlow系列-靜態圖運行原理

文章插圖
三、靜態圖執行過程3.1 執行框架為便于大家理解 , 我們先給出粗粒度的靜態圖執行原理如下:
1.客戶端程序定義基于數據流的計算圖,然后創建session并初始化計算引擎 。2.分布式Master依次完成四項工作:抽取實際執行的subgraph、切分subgraph形成若干子圖片段、調度子圖片段至集群、每個子圖片段執行前的初始化工作 。3.集群中的Worker節點調度子圖片段中Operation的執行,與其他Worker節點通過send/recv節點對進行通信 。
1 Dive into TensorFlow系列-靜態圖運行原理

文章插圖
3.2 若干執行細節靜態圖的實際執行過程要比3.1節描述的復雜得多 。由于本篇的初衷不是做源碼的完整剖析 , 因此我們僅就Client向Master的處理過程做詳細說明,旨在讓讀者親身體會一下交互過程的復雜性 。
Client創建GrpcSession , 控制Client會話的生命周期;Master運行時被MasterSession控制 。GrpcSession通過抽象工廠模式得到 , 首先得到工廠類GrpcSessionFactory的對象,并用SessionFactory句柄factory存儲 。然后通過factory的多態方法生成GrpcSession,如果target為grpc://的話 。Master本質上是一個Server,每個Server均有一個MasterService和一個WorkerService 。
Client通過GrpcSession調用Master節點的MasterService,這個過程需借助MasterInterface才可完成 。MasterInterface用來和MasterService進行通信 , 它有兩種不同的場景實現:
?如果Client和Master在同一個進程中,則用LocalMaster實現進程內的直接通信 。?GrpcRemoteMaster則使用gRPC來和MasterService進行通信,此時Master和Client在兩個不同的進程中 。GrpcRemoteMaster的角色是gRPC客戶端,它通過stub訪問遠程Master節點上的MasterService服務 。
1 Dive into TensorFlow系列-靜態圖運行原理

文章插圖
如果讀者想對上述過程做更為深入的了解,可以參考幾個關鍵類的源碼:
?GrpcSession:core/distributed_runtime/rpc/grpc_session.h?LocalMaster:core/distributed_runtime/local_master.h?GrpcRemoteMaster:core/distributed_runtime/rpc/grpc_remote_master.cc?GrpcMasterService:core/distributed_runtime/rpc/grpc_master_service.cc其實Client到Master的處理過程還涉及MasterSession的創建,以及GrpcSession與MasterSession的交互與標識問題 。篇幅所限,不展開了 。

推薦閱讀