簡體   English   中英

tensorflow多GPU並行使用

[英]tensorflow multi GPU parallel usage

我想在並行上使用8 gpus,而不是順序使用。

例如,當我執行此代碼時,

import tensorflow as tf

with tf.device('/gpu:0'):
    for i in range(10):
        print(i)

with tf.device('/gpu:1'):
    for i in range(10, 20):
        print(i)

我嘗試了cmd命令'CUDA_VISIBLE_DEVICE ='0,1',但結果是一樣的。

我想看到結果“0 10 1 11 2 3 12 ......等”

但實際結果依次為“0 1 2 3 4 5 ..... 10 11 12 13 ..”

我怎樣才能得到想要的結果?

**我看到一個問題的編輯,所以將此添加到我的答案**

您需要將操作傳遞給Tensorflow會話,否則,代碼將被解釋為順序(與許多編程語言一樣),然后操作將按順序完成。

對於先前對該問題的理解,討論了如下所述的創建具有多個gpus的神經網絡的訓練:

壞消息是沒有神奇的功能可以簡單地為你做這件事。

好消息是有一些既定的方法。

第一個是某些CUDA和其他GPU開發人員熟悉的東西,可以將模型復制到多個GPU,通過CPU進行同步。 一種方法是分批分割數據集,或者在這種情況下稱為塔,然后將每個GPU提供給塔。 如果這是MNIST數據集,並且您有兩個GPU,則可以使用CPU作為設備明確地啟動此數據。 現在,隨着數據集變小,您的相對批量大小可能會更大。 完成一個紀元后,你可以分享漸變並平均訓練兩個網絡。 當然,這可以通過8個GPU輕松擴展到您的情況。

可以在下面看到CPU上任務分發和收集結果的最小示例

# Creates a graph.
c = []
for d in ['/gpu:2', '/gpu:3']:
  with tf.device(d):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
    c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
  sum = tf.add_n(c)
# 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(sum))

但是,在許多設備之間傳輸數據會使您無法正確地獲得your_gpu_number次加速度。 因此,您需要優化每個GPU的工作負載,以最大限度地提高性能,並盡可能避免設備間通信。

第二個是將您的神經網絡分成多個設備,訓練和合並它們。

在多個GPU上顯式運行模型將要求您以這種方式設置算法。 看看這些:

https://www.tensorflow.org/guide/using_gpu#using_multiple_gpus

https://gist.github.com/j-min/69aae99be6f6acfadf2073817c2f61b0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM