小編說:将深度學習應用到實際問題中,一個非常大的問題在于訓練深度學習模型需要的計算量太大。為了加速訓練過程,本文将介紹如何如何在TensorFlow中使用單個GPU進行計算加速,也将介紹生成TensorFlow會話(tf.Session)時的一些常用參數。通過這些參數可以使調試更加友善而且程式的可擴充性更好。本文選自《TensorFlow:實戰Google深度學習架構(第2版)》。
TensorFlow程式可以通過tf.device函數來指定運作每一個操作的裝置,這個裝置可以是本地的CPU或者GPU,也可以是某一台遠端的伺服器。但在本文中隻關心本地的裝置。TensorFlow會給每一個可用的裝置一個名稱,tf.device函數可以通過裝置的名稱來指定執行運算的裝置。比如CPU在TensorFlow中的名稱為/cpu:0。在預設情況下,即使機器有多個CPU,TensorFlow也不會區分它們,所有的CPU都使用/cpu:0作為名稱。而一台機器上不同GPU的名稱是不同的,第n個GPU在TensorFlow中的名稱為/gpu:n。比如第一個GPU的名稱為/gpu:0,第二個GPU名稱為/gpu:1,以此類推。
TensorFlow提供了一個快捷的方式來檢視運作每一個運算的裝置。在生成會話時,可以通過設定log_device_placement參數來列印運作每一個運算的裝置。以下程式展示了如何使用log_device_placement這個參數。
在以上代碼中,TensorFlow程式生成會話時加入了參數log_device_placement=True,是以程式會将運作每一個操作的裝置輸出到螢幕。于是除了可以看到最後的計算結果,還可以看到類似“add:
/job:localhost/replica:0/task:0/cpu:0”這樣的輸出。這些輸出顯示了執行每一個運算的裝置。比如加法操作add是通過CPU來運作的,因為它的裝置名稱中包含了/cpu:0。
在配置好GPU環境的TensorFlow中,如果操作沒有明确地指定運作裝置,那麼TensorFlow會優先選擇GPU。比如将以上代碼在亞馬遜(Amazon Web Services, AWS)的 g2.8xlarge執行個體上運作時,會得到類似以下的運作結果。
從以上輸出可以看到在配置好GPU環境的TensorFlow中,TensorFlow會自動優先将運算放置在GPU上。不過,盡管g2.8xlarge執行個體有4個GPU,在預設情況下,TensorFlow隻會将運算優先放到/gpu:0上。于是可以看見在以上程式中,所有的運算都被放在了/gpu:0上。如果需要将某些運算放到不同的GPU或者CPU上,就需要通過tf.device來手工指定。以下程式給出了一個通過tf.device手工指定運作裝置的樣例。
在以上代碼中可以看到生成常量a和b的操作被加載到了CPU上,而加法操作被放到了第二個GPU“/gpu:1”上。在TensorFlow中,不是所有的操作都可以被放在GPU上,如果強行将無法放在GPU上的操作指定到GPU上,那麼程式将會報錯。以下代碼給出了一個報錯的樣例。
不同版本的TensorFlow對GPU的支援不一樣,如果程式中全部使用強制指定裝置的方式會降低程式的可移植性。在TensorFlow的kernel中定義了哪些操作可以跑在GPU上。比如可以在variable_ops.cc程式中找到以下定義。
在這段定義中可以看到GPU隻在部分資料類型上支援tf.Variable操作。如果在TensorFlow代碼庫中搜尋調用這段代碼的宏TF_CALL_GPU_NUMBER_TYPES,可以發現在GPU上,tf.Variable操作隻支援實數型(float16、float32和double)的參數。而在報錯的樣例代碼中給定的參數是整數型的,是以不支援在GPU上運作。為避免這個問題,TensorFlow在生成會話時可以指定allow_soft_placement參數。當allow_soft_placement參數設定為True時,如果運算無法由GPU執行,那麼TensorFlow會自動将它放到CPU上執行。以下代碼給出了一個使用allow_soft_placement參數的樣例。
雖然GPU可以加速TensorFlow的計算,但一般來說不會把所有的操作全部放在GPU上。一個比較好的實踐是将計算密集型的運算放在GPU上,而把其他操作放到CPU上。GPU是機器中相對獨立的資源,将計算放入或者轉出GPU都需要額外的時間。而且GPU需要将計算時用到的資料從記憶體複制到GPU裝置上,這也需要額外的時間。TensorFlow可以自動完成這些操作而不需要使用者特别處理,但為了提高程式運作的速度,使用者也需要盡量将相關的運算放在同一個裝置上。
TensorFlow預設會占用裝置上的所有GPU以及每個GPU的所有顯存。如果在一個TensorFlow程式中隻需要使用部分GPU,可以通過設定CUDA_VISIBLE_DEVICES環境變量來控制。以下樣例介紹了如何在運作時設定這個環境變量。
TensorFlow也支援在程式中設定環境變量,以下代碼展示了如何在程式中設定這些環境變量。
雖然TensorFlow預設會一次性占用一個GPU的所有顯存,但是TensorFlow也支援動态配置設定GPU的顯存,使得一塊GPU上可以同時運作多個任務。下面給出了TensorFlow動态配置設定顯存的方法。
<a target="_blank" href="https://item.jd.com/12287533.html"></a>
