[英]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.