神經(jīng)網(wǎng)絡對于電腦硬件非常依賴,尤其是顯卡初坠。顯卡的優(yōu)劣決定了訓練網(wǎng)絡的規(guī)模上限和訓練速度和簸。而對于一般的個人,甚至實驗室來講碟刺,配備多個性能較好的gpu要比配備單個頂級gpu劃算很多锁保。如果配備了多個gpu,在訓練的時候如果沒有指定device的話半沽,你會發(fā)現(xiàn)你只有一個gpu的使用率上來了爽柒,其他的gpu都是被分配了一部分或全部的顯存,但是使用率為0者填。這就有點浪費了嘛~ ?那么裝備了一個以上的gpu之后浩村,能否把這些gpu們充分調(diào)動起來,多個gpu同時進行訓練呢幔托?
答案當然是可以的穴亏,而且很簡單蜂挪≈靥簦可惜tensorflow上的官網(wǎng)沒寫(至少我沒看見嗓化。。) 最下邊的for loop來loop過device會讓每一個gpu挨個運行一次指令谬哀,這肯定不是我們想要的刺覆。
如果要調(diào)用多個gpu的話,你先要知道自己有幾塊gpu史煎,并且它們的device_name是什么谦屑,才好手動分配。在上面tensorflow網(wǎng)頁上有顯示gpu device mapping的代碼篇梭,運行一下就知道了:
# Creates a graph.?
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')?
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')?
c = tf.matmul(a, b)?
# Creates a session with log_device_placement set to True.?
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))?
# Runs the op.?
print(sess.run(c))
比如我的就是GPU:0 和 GPU:1氢橙。如果你打開NVIDIA X Server Setting的話也能看到這兩個gpu。
下面重點來了恬偷,找到你的gpu的device_name以后怎么辦悍手?你需要指定哪一段代碼用哪個gpu運行。用tf.device()命令袍患。比如我再訓練一個結(jié)構(gòu)的時候要用到gpu:0坦康,那就這么開頭:
with tf.device('/device:GPU:0'): ?#指定gpu
? ? with tf.Graph().as_default(): ?# 配置你的graph
? ? ? ? with tf.Session(config=tf.ConfigProto(log)device_placement=True)) as sess: ?# 配置你的session
? ? ? ? ? ? xxxxxx ?# 訓練
同時我要訓練另外一個網(wǎng)絡,只要把上面的GPU:0 換成 GPU:1就行了(我的第二塊gpu名字是GPU:1)诡延。
但是光這樣還不夠滞欠。如果要用不同的進程調(diào)用不同的GPU,你還需要設置Cuda里的環(huán)境變量CUDA_VISIBLE_DEVICE肆良。如果你用的命令行訓練的話筛璧,只需要分別打開兩個窗口分別進行訓練就可以了。比如:
用命令行:
CUDA_VISIBLE_DEVICES=0 python script_one.py
CUDA_VISIBLE_DEVICES=1 python script_two.py
好像也可以兩個gpu一起訓練一個:
CUDA_VISIBLE_DEVICES=0,1 python script.py ?# 這個沒測試過 stackoverflow上有大神說可以
如果你用IDE惹恃,比如pycharm的話夭谤,可以分別打開兩個文件頁:
用Pycharm:
import os?
os.environ["CUDA_VISIBLE_DEVICES"] = "0" ?# 第一個文件配置device GPU:0里開始輸入這一行
os.environ["CUDA_VISIBLE_DEVICES"] = "1" ?# 同理第二個文件配置GPU:1
然后分別運行兩個文件,就可以做到同時訓練多個模型了座舍。再看你的NVIDIA X Server就會看到兩個gpu使用率都起來了~
Ref:
https://www.tensorflow.org/guide/using_gpu
https://github.com/tensorflow/nmt/issues/60
https://stackoverflow.com/questions/44135538/tensorflow-using-2-gpu-at-the-same-time