tensorflow多GPU并行使用

时间:2018-07-14 17:53:26

标签: python tensorflow multi-gpu

我想并行使用8 gpu,而不是顺序使用。

例如,当我执行此代码时,

  <tr *ngFor="let data of allUsers">    
     <td><input type="radio" name="id" [value]="allUsers.id" ></td>
     <td>{{data.id}}</td>   
     <td>{{data.name}}</td>    
     <td>{{data.address}}</td> 
     <td><button (click)="deleteUser(data.id)">delete</button></td>
  </tr>

我尝试了cmd命令'CUDA_VISIBLE_DEVICE ='0,1',但结果相同。

我想查看结果“ 0 10 1 11 2 3 12 ....等”

但是实际结果是依次为“ 0 1 2 3 4 5 ..... 10 11 12 13 ..”

如何获得想要的结果?

1 个答案:

答案 0 :(得分:3)

**我看到有问题的编辑,因此将其添加到我的答案中**

您需要将操作传递给Tensorflow会话,否则,代码将被解释为顺序的(就像许多编程语言一样),然后操作将顺序完成。

为先前对该问题的理解,下面将讨论创建具有多个GPU的神经网络训练的讨论:

坏消息是没有神奇的功能可以为您完成此操作。

好消息是有一些已建立的方法。

第一个是某些CUDA和其他GPU开发人员熟悉的东西,可以将模型复制到多个GPU,并通过CPU进行同步。一种方法是将数据集成批拆分,在这种情况下称为“塔”,然后为每个GPU喂一个塔。如果这是MNIST数据集,并且您有两个GPU,则可以显式使用CPU作为设备来初始化此数据。现在,随着数据集变小,您的相对批次大小可能会变大。完成一个时期后,您可以共享渐变并求平均值以训练两个网络。当然,使用8个GPU可以轻松扩展到您的情况。

A minimal example分配任务并在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