2021-05-12 14:32:11
深度學習利器: TensorFlow系統架構及高效能程式設計
2015年11月9日谷歌開源了人工智慧平台TensorFlow,同時成為2015年最受關注的開源專案之一。經歷了從v0.1到v0.12的12個版本疊代後,谷歌於2017年2月15日發布了TensorFlow 1.0 版本,並同時在美國加州山景城舉辦了首屆TensorFlow Dev Summit會議。
TensorFlow 1.0及Dev Summit(2017)回顧
和以往版本相比,TensorFlow 1.0 的特性改進主要體現在以下幾個方面:
- 速度更快:TensorFlow 1.0版本採用了XLA的編譯技術,改進了TensorFlow的執行效能及記憶體利用。從Benchmark問題的測試結果來看,對單機Inception v3模型,實現了在單機8 GPUs上7.3倍的運算加速;對分散式Inception v3模型,實現了在多機64 GPUs上58倍的運算加速。
- 更加靈活:該版本除了支援tf.layers,tf.metrics及tf.losses模型的High-Level API外,實現了對keras(high-level neural networks library)API的全面相容。
- 更產品化:TensorFlow Python API在v1.0版本中趨於穩定,為產品相容性打下堅實基礎。
在TensorFlow 1.0版本發布的當天,谷歌公司還舉辦了TensorFlow 2017 DEV Summit。該日程主要包括以下幾個方面的主題演講:
-
XLA (TensorFlow, Compiled)編譯技術 :介紹採用XLA技術最小化圖計算執行時間和最大化利用計算資源,用於減少資料訓練和模型結果推斷時間。
-
Hands-on TensorBoard視覺化技術:介紹了如何使用TensorBoard,以及TensorFlow圖模型、訓練資料的視覺化等。
-
TensorFlow High-Level API:介紹了使用Layers, Estimators, and Canned Estimators High-Level API定義訓練模型。
-
Integrating Keras & TensorFlow: 介紹了如何在TensorFlow中使用Keras API進行模型定義及訓練。
-
TensorFlow at DeepMind:介紹了在DeepMind中使用TensorFlow平台的典型案例,包括AlphaGo等應用。
-
Skin Cancer Image Classification:介紹了斯坦福醫學院使用TensorFlow分類皮膚癌照片,用於醫學診斷。
-
Mobile and Embedded TensorFlow:介紹了如何把TensorFlow模型執行在行動終端、嵌入式裝置,包括安卓,iOS等系統。
-
Distributed TensorFlow:系統性地介紹了分散式TensorFlow的相關技術,以及如何應用於大規模模型訓練。
-
TensorFlow Ecosystem:講解了TensorFlow的生態系統,包括生成訓練資料,分散式執行TensorFlow和serving models的產品化流程。
-
Serving Models in Production with TensorFlow Serving:系統性講解了如何在生產環境中應用TensorFlow Serving模型。
-
ML Toolkit:介紹了TensorFlow的機器學習庫,如線性回歸,KMeans等演算法模型的使用。
-
Sequence Models and the RNN API:介紹了如何構建高效能的sequence-to-sequence模型,以及相關API。
-
Wide & Deep Learning: 介紹了如何結合Wide模型和Deep模型構建綜合訓練模型。
-
Magenta,Music and Art Generation:使用增強型深度學習模型生成音樂聲音和藝術圖片。
-
Case Study,TensorFlow in Medicine - Retinal Imaging:使用TensorFlow機器學習平台對醫學視網膜圖片進行分類,輔助醫學診斷。
TensorFlow系統架構
TensorFlow作為分散式機器學習平台,主要架構如下圖所示。RPC和RDMA為網路層,主要負責傳遞神經網路演算法引數。CPU和GPU為裝置層,主要負責神經網路演算法中具體的運算操作。Kernel為TensorFlow中演算法操作的具體實現,如折積操作,啟用操作等。Distributed Master用於構建子圖;切割子圖為多個分片,不同的子圖分片執行在不同的裝置上;Master還負責分發子圖分片到Executor/Work端。Executor/Work在裝置(CPUs,GPUs,etc.)上,排程執行子圖操作;並負責向其它Worker傳送和接收圖操作的執行結果。C API把TensorFlow分割為前端和後端,前端(Python/C++/Java Client)基於C API觸發TensorFlow後端程式執行。Training libraries和Inference libs是模型訓練和推導的庫函數,為使用者開發應用模型使用。
下圖為Client、Master及Worker的內部工作原理。"/job:worker/task:0" 和 "/job:ps/task:0" 表示worker中的執行服務。"job:ps"表示引數伺服器,用於儲存及更新模型引數。"job:worker"用於優化模型引數,並行引數傳送到引數伺服器上。Distributed Master和Worker Service只存在於分散式TensorFlow中。單機版本的TensorFlow實現了Local的Session,通過本地進程的內部通訊實現上述功能。
使用者編寫TensorFlow應用程式生成計算圖,Client元件會建立Session,並通過序列化技術,傳送圖定義到Distributed Master元件。下圖中,Client建立了一個 s+=w*x+b的圖計算模型。
當Client觸發Session運算的時候,Maser構建將要執行的子圖。並根據裝置情況,切割子圖為多個分片。下面為Master構建的執行子圖:
接著切割子圖,把模型引數分組在引數伺服器上,圖計算操作分組在運算Worker上。下圖為一種可行的圖切割策略:
Distributed Master會根據模型引數的分割區情況進行切割邊,在Task間插入傳送和接收Tensor資訊的通訊節點,如下圖所示:
接著Distributed Master通過RegisterGraph方法傳送子圖分片給Task,如下圖所示:
Master通過RunGraph觸發子圖運算,Worker會使用GPU/CPU運算裝置執行TensorFlow Kernel運算。在本節點的CPU和GPU之間,使用cudaMemcpyAsync傳輸資料;在本節點GPU和GPU之間,使用peer-to-peer DMA傳輸資料,避免通過CPU複製資料。TensorFlow使用gRPC(TCP)和RDMA (Converged Ethernet)技術,實現Worker間的資料通訊及傳輸,如下圖所示:
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2017-04/143079p2.htm
相關文章