現在讓我們看一下圖表和對談。
有向無環圖(TensorFlow中的DAG)與任何圖表一樣,它是由邊和節點組成。邊表示數據,也就是張量,如我們所知的,張量是n維陣列(arrays)。節點表示這些張量上的TensorFlow操作。
我們在上一篇文中解決了類似tf.add
之類的問題。 TensorFlow DAG由張量和這些張量上的操作(節點)組成。那麼,為什麼TensorFlow會進行惰性求值?這是因為在運行圖形時,惰性求值能夠有很好的靈活性和優化。
TensorFlow現在可以處理圖形,對其進行編譯,在DAG的中間插入發送和接收節點,以及可以在遠端執行它。 Tensorflow可以將DAG的不同部分分配給不同的設備,具體取決於它是受I/O約束還是需要GPU功能。在處理圖形時,TensorFlow可以添加量化或數據類型,可以添加調試節點,可以使用summary
以將值寫出,因此張量除了可以讀取諸如add
, matmul
、常數、變數之類的所有值外,還可以讀取它們。
TensorFlow可以與他們合作。編譯圖形時,TensorFlow可以進行兩次操作並將其融合以提高性能。例如,您可能有兩個連續的添加節點,TensorFlow可以將它們融合為一個節點。 TensorFlow的XLA編譯器可以將訊息用於有向無環圖,以生成更快的代碼。因此,這就是為什麼要使用DAG進行優化的其中一個原因。但是最令人興奮的部分是DAG可以遠程執行並分配給各設備,而這也是DAG明顯優勢的地方。透過使用顯式邊緣表示操作之間的依賴關係,系統可以輕鬆識別可以並行執行的操作。通過使用顯式邊緣(explicit edge)表示操作之間流動的值,TensorFLow可以在多個設備之間劃分程序,甚至是連接到不同機器的CPU, GPU, TPU等。
TensorFlow在這些設備之間插入必要的通信和協調。因此,請注意圖中的顏色。圖的幾個部分可以位於不同的設備上,無論是GPU還是不同的電腦都沒有關係。因此,DAG使得該模型能夠在許多電腦和許多類型的電腦之間分配計算的一個主要優點。我們只編寫Python代碼,然後讓TensorFlow執行系統優化並分發圖形。對談表示我們編寫的Python程序與C ++運行時之間的這種連接。對談對象提供對使用分發器TensorFlow運行時的本地計算機以及遠程設備的訪問。它還緩存有關圖表的訊息,因此,相同的計算可以運行多次。
如我們所見,我們透過在tf對談上調用run
來執行TensorFlow圖,當我們這樣做的時後,我們指定了要評估的張量。因此,在此代碼示例中,我定義了兩個數據張量X和Y。它們是常數,也是一維張量。張量Z是在X和Y上調用tf.add
的結果。當我要求值時,我在Z上調用session.run
。session這裡的scss是tf.session
的實例,而Python中的with
語句是我們可以確保完成後自動關閉會話。