繁体   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