首頁 > 軟體

深度學習利器: TensorFlow系統架構及高效能程式設計

2020-06-16 17:17:19

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


IT145.com E-mail:sddin#qq.com