6. TF – Session分析
客戶端使用會話來和TF系統互動,一般的模式是,建立會話,在會話中新增節點和邊,形成一張圖,然後執行。如圖 6 1所示,包含一個client和一個master。Client通過Session與Master互動,而Master協調一個或者多個的 worker processes 完成計算任務,每個 worker process 負責對一個或者多個計算裝置(CPU 核或者 GPU card)的任意訪問和在這些裝置上進行圖節點的計算按照 master 的要求執行。
圖 6 1 TF Session Simple Example
圖 6 1中Session.run()向Master傳送計算請求,執行graph計算。Session.run函式定義如下:
TF中Session有兩種實現:一種是DirectSession類,可以執行localhost環境執行的圖;另一種是GrpcSession類,可以執行分散式環境執行的圖。
6.1 Direct Session分析
DirectSession定義在localhost環境,執行環境如下所示。圖 6 2中僅一個本地worker,由master管理worker完成計算任務。
圖 6 2 Session本地執行架構
首先,從run函式開始,指定feed節點、fetch節點和feed資料。
建立Executors。Executor將執行graph計算操作,多個Executor可以平行計算,在feed批處理計算資料時非常有用。
將input放入Rendez訊息信箱中,等待consumer取出。
建立ExecutorBarrier。ExecutorBarrier在多個Executor平行計算時起協調作用,保證每個Executor執行graph計算時資料的一致性。
在barrier的協調下,每個executor完成對應的graph計算操作。
每個executor對應一個ExecutorState例項。executorstate跟蹤graph中的node,通常認為node有完成計算、準備計算、等待計算等狀態。當node處於就緒狀態就為該節點執行計算操作。
建立節點序列觸發器TaggedNodeSeq 變數,即ready佇列。先為ready佇列新增root節點,即起始點,然後放入schedule任務佇列中。
從ready隊首開始,執行計算操作,計算過程由ExecutorState::Process函式完成。
ExecutorState::Process呼叫每個節點中OpKernel對應的Compute函式或ComputeAsync函式,如MatMulOp實現了Compute函式,RecvOp實現了ComputeAsync函式。