標籤:

譯文 | 與TensorFlow的第一次接觸 第六章:並發

作者:cn_Fly

原文鏈接:jianshu.com/p/e8a267e9f

正文共1434個字,21張圖,預計閱讀時間:4分鐘。

第一版TensorFlow第一版發佈於2015年11月,它可以運行在多台伺服器的GPU上,同時並在其上面進行訓練。2016年2月,更新版中增加了分散式與並發處理。

在本章簡短的小節中,我會介紹如何使用GPU。對想深入理解這些設備是如何工作的讀者,最後章節中列出了一些參考引用,本書不會討論分散式版本中的細節,對分散式細節感興趣的讀者,最後章節中同樣列出了一些參考引用。

GPU的執行環境

如果需要TensorFlow支持GPU,需要安裝CudaToolkit 7.0 and CUDNN 6.5 V2。為安裝這些環境,建議讀者訪問cuda的官網來了解安裝細節。

TensorFlow中引用這些設備的方式如下:

「/cpu:0」: To reference the server』s CPU.

「/gpu:0」: The server』s GPU, if only one is available.

「/gpu:1」: The second server』s GPU, and so on.

為了追蹤操作與tensor被分配到哪個設備上了,我們需要以log_device_placement設置為true作為參數來創建session,示例代碼如下:

當讀者在自己電腦上測試本代碼時,會看如下類似的相關輸出:

同時,根據這個輸出結果,我們同樣可看到每一部分是在哪調度執行的。

如果我們希望一個具體的操作調度到一個具體的設備上執行,而不是由系統自動選擇設備,我們可通過tf.device來創建設備上下文,所有在該上下文中的操作都會調度到該設備中。

如果系統中不止一個GPU,默認選擇較小編號的GPU。假如我們想在不同的GPU上執行操作,需要顯式指明。例如,如果我們想讓之前的代碼在GPU2上執行,可通過tf.device(「/gpu:2」)來指定:

多個GPU 並發

假如我們有不止一個CPU,通常我們想在解決一個問題時並發使用民有GPU。例如,我們可建立模型來將工作分散式分發到多個GPU上,示例如下:

代碼與之前的代碼功能類似,但是現在有2個GPU來執行乘法計算(為簡化示例,兩個GPU執行的邏輯一樣),稍後CPU執行加法計算。因為log_device_placement設置為true,我們可看到操作是如何在多個設備間分散式分發的:

編碼實現多GPU

我們通過一個代碼例子為總結這一簡短的小節,代碼例子與DamienAymeric在Github上分享的類似,n=10時,計算An+Bn,比較1個GPU與2個GPU的執行時間。

首先,導入需要庫:

通過numpy庫用隨機值創建兩個矩陣:

然後創建兩個結構體來存儲結果:

接下來,定義matpow()函數如下:

如果在一個GPU上執行這段代碼,過程如下:

如果在2個GPU上運行,代碼如下:

最後,列印計算時間:

分散式版本TensorFlow

如之前所說,Google在2016年2月開源了分散式版本的TensorFlow,其基於gRPC,一個用來進程間通信的,高性能開源RPC框架(TensorFlow Serving使用同樣的協議)。

如果想使用分散式版本,需要自己編譯二進位程序,因為目前該庫只以源碼的形式提供。本書不會討論分散式版本的細節,如果讀者想了解關於分散式的信息,建議訪問TensorFlow分散式版本的官網。

跟之前章節類似,本章中的代碼同樣能在Github上獲得。我希望本章節已經描述清楚了如何通過多GPU來加速訓練模型。

推薦閱讀:

NLP(2) Tensorflow 文本- 價格建模 Part2
【博客存檔】風格畫之最後一彈MRF-CNN
深度學習對話系統實戰篇--老版本tf.contrib.legacy_seq2seq API介紹和源碼解析
拔了智齒,疼滴想屎。
【博客存檔】深度學習之Neural Image Caption

TAG:TensorFlow |