嘗試理解 TensorFlow 的總體機制

上文我們已經詳細了解了關於 Graph 的相關知識點,這次我們通過幾個問題的回答來進一步加深對 TensorFlow 的總體設計機制的認識。

首先回答上文最後提的一個問題,TensorFlow 為什麼要構建計算圖 Graph ?

我在官方手冊中看到了這樣一段話,很精確的回答了這個問題:

為了在Python中進行高效的數值計算,我們通常會使用像NumPy一類的庫,將一些諸如矩陣乘法的耗時操作在Python環境的外部來計算,這些計算通常會通過其它語言並用更為高效的代碼來實現。

但遺憾的是,每一個操作切換回Python環境時仍需要不小的開銷。如果你想在GPU或者分散式環境中計算時,這一開銷更加可怖,這一開銷主要可能是用來進行數據遷移。

TensorFlow也是在Python外部完成其主要工作,但是進行了改進以避免這種開銷。其並沒有採用在Python外部獨立運行某個耗時操作的方式,而是先讓我們描述一個交互操作圖,然後完全將其運行在Python外部。這與Theano或Torch的做法類似。

因此Python代碼的目的是用來構建這個可以在外部運行的計算圖,以及安排計算圖的哪一部分應該被運行。

TensorFlow 的總體機制是什麼?

TensorFlow 是一個編程系統, 使用圖來表示計算任務. 圖中的節點被稱之為 op (operation 的縮寫). 一個 op 獲得零或多個 tensor , 執行計算, 產生零或多個 tensor . 每個 tensor 是一個類型化的多維數組. 例如, 你可以將一小組圖像集表示為一個四維浮點數數組, 這四個維度分別是 [ batch_size, height, width, channel ] .

一個 TensorFlow 的計算圖描述了計算的過程. 為了進行計算, 圖必須在 session 里被啟動. session 將圖的 op 分發到諸如 CPU 或 GPU 之類的設備上, 同時提供執行 op 的方法. 這些方法執行後, 將產生的 tensor 返回. 在 Python 語言中, 返回的 tensor 是 numpy 的 ndarray 對象; 在 C 和 C++ 語言中, 返回的 tensor 是 tensorflow::Tensor 的實例.

TensorFlow 的設計機制會對我寫的程序結構造成什麼影響?

因為它的這種獨特的設計機制,所以我們的程序也會相應的表現出適應它的獨特的二段式結構,而不是通常程序的線性結構.

TensorFlow 程序通常被組織成一個構建階段和一個執行階段. 在構建階段, op 的執行步驟 被描述成一個圖. 在執行階段, 使用會話執行執行圖中的 op.

例如, 通常在構建階段創建一個圖來表示和訓練神經網路, 然後在執行階段反覆執行圖中的訓練 op.

進一步的 TensorFlow 的設計架構是什麼樣的?

找到一幅比較好的架構圖:

可以看到,TensorFlow 整體架構還是比較複雜的,但是我們只需要大致了解幾個層的作用:

  • 前端的實現層,它就是我們構建計算圖的主要工具,有 Python 和 C++等介面
  • C API 是前端到後端的橋樑
  • 分散式任務層負責分解計算圖 Graph,派發和收集數據
  • Kernel層是OP在某種硬體設備的特定實現,它負責執行OP的運算
  • 網路層負責多設備之間通信任務的處理
  • 設備層就是類似 cuDNN 的專門在 GPU之類的特定設備上進行特定數值計算的框架

推薦閱讀:

透過產業AI的發展歷程,看阿里的「愚公移山」精神
智能行業如何發展?
這次人工智慧革命,你不用擔心是否會成功
偽裝撒謊和識別敵我是否應加入,2018新版世界AI智商評測標準探討

TAG:TensorFlow | 人工智慧 |