TensorFlow之設備(device)詳解

對TensorFlow不瞭解的,猛的一看還以爲TensorFlow是個設備什麼的,其實本文要說的是Python的TensorFlow模塊下一個叫device()的方法,即:

import tensorflow as tf

with tf.device('/gpu:0'):
    ...
    ...
    ...

設備是指一塊可以用來運算並且擁有自己的地址空間的硬件,如CPU和GPU

TensorFlow爲了在執行操作的時候充分利用計算資源,可以通過tf.device()方法明確指定操作在哪個設備上執行.

一般情況下不需要顯示指定使用CPU還是GPU,TensorFlow會自動檢測.

如果檢測到GPU,TensorFlow會儘可能地利用第一個GPU('/gpu:0')來執行操作.

注意:如果機器上有超過一個可用的GPU,那麼除了第一個外其它GPU默認是不參與計算的.

所以,在實際TensorFlow編程中,經常需要明確給定使用的CPU和GPU.
你可以通過如下方式指定使用哪個設備:

  • "/cpu:0": 表示使用機器CPU運算
  • "/gpu:0": 表示使用第一個GPU運算,如果有的話
  • "/gpu:1": 表示使用第二個GPU運算,以此類推

TensorFlow集羣(Cluster)是一系列能夠對TensorFlow中的圖(Graph)進行分佈式計算的任務(Task)。每個任務是同服務(Server,你可以把它認識是服務器集羣中的一臺服務器)相關聯的。
TensorFlow中的服務會包含一個用於創建Session的主節點和至少一個用於圖運算的工作節點。
另外在TensorFlow中,一個集羣可以被拆分爲一個或者多個作業(Job),每個作業可以包含至少一個任務(Task)
就這樣TensorFlow把整個運算過程層層分包,最終確定哪個設備執行哪個操作
如下圖所示:
TensorFlow之設備(device)方法詳解_執行流程

下面來一個簡單的例子:

# 測試TensorFlow的分佈式集羣設備調用
# 2019年4月18日
import tensorflow as tf


if __name__ == '__main__':
    mat1 = tf.constant([3, 3], dtype=tf.float32, shape=[1,2])
    mat2 = tf.constant([[3.], [3.]])
    product = tf.matmul(mat1, mat2)
    # log_device_placement=True表示打印TensorFlow設備信息
    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
    sess.run(product)

TensorFlow之設備(device)方法詳解_執行設備信息
我們可以發現Matmul(乘法)操作先創建了一個job,這個job又創建了一個Task,這個Task又把這個操作分配給了CPU:0去執行。

其實TensorFlow的CPU版本也能調用GPU,但是它少了個GPU加速,只有TensorFlow-gpu版本有GPU加速,因爲GPU加速的原因,同一個程序,使用GPU版的TensorFlow可能會比CPU版的快100倍。

問題又來了,既然它能調用GPU,他是怎麼去調用的呢?
這就和TensorFlow設備有關係了,設備(device)其實就是指你想調用哪個命名空間?然後就可以通過如下代碼進行調用:

with tf.device('/gpu:0'):
    a = tf.constant([1, 2, 3], name='a')
    b = tf.constant(2, name='b')
    c = a * b

# 新建Session
# log_device_placement=True表示打印TensorFlow設備信息
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print(sess.run(c))

但是這也僅僅只能調用英偉達的顯卡,英特爾的和AMD的顯卡調用不了。
就拿自己的電腦舉例吧,我的電腦有兩個顯卡:

  1. CPU的的集顯(Intel),這個調用不了
  2. 英偉達(NVIDIA)的獨顯,這個可以調用

那麼AMD和Intel或者其他顯卡不能用來訓練深度學習的模型呢?
因爲其他的顯卡內部是寫死的,英偉達的顯卡不是寫死的,我們可以通過Python/C++調用CUDNN,從而進行矩陣運算。

另外你顯卡的顯存最好不要小於4G,原因嘛,算了又是一堆扯淡。

或者準確來說在TensorFlow的GPU版本中我們也很少調用GPU因爲沒有那個意義,在這種情況下,你這樣那個GPU和CPU原理是一樣的,因爲他這裏GPU是沒有加速的,你等同於調了一個CPU,只有在TensorFlow的GPU版本中,我們纔會分別調GPU和CPU。

有些操作只能在CPU下運算,所以我們纔會在CPU下放入我們需要計算的東西,在這種場景下,我們纔會用到這種設備(CPU)

既然這個東西在實際工作中作用不是太大,那麼我們爲什麼會提到這個點呢?

因爲我們更多的不是用它來調用本地資源,而是用它來調用分佈式服務器資源,這就是另一回事了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章