1

演示问题的最小示例:

import tensorflow as tf
    
with tf.distribute.MirroredStrategy().scope():
    print(tf.Variable(1.))

4-GPU 服务器上的输出:

INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1', '/job:localhost/replica:0/task:0/device:GPU:2', '/job:localhost/replica:0/task:0/device:GPU:3')
MirroredVariable:{
  0: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>,
  1: <tf.Variable 'Variable/replica_1:0' shape=() dtype=float32, numpy=0.0>,
  2: <tf.Variable 'Variable/replica_2:0' shape=() dtype=float32, numpy=0.0>,
  3: <tf.Variable 'Variable/replica_2:0' shape=() dtype=float32, numpy=0.0>
}

问题是,如上所示,副本不包含正确的变量值,除了第一个设备(numpy=0.0部件)之外,所有的值都是零值。2 或 3 个设备也是如此,而不仅仅是所有 4 个。

相同的代码确实会在不同的机器上产生预期的行为。

在不同的 2-GPU 工作站上正确输出:

INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0', '/job:localhost/replica:0/task:0/device:GPU:1')
MirroredVariable:{
  0: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>,
  1: <tf.Variable 'Variable/replica_1:0' shape=() dtype=float32, numpy=1.0>
}

(注意两个设备上的值 1.0)


有问题的机器是带有 4 个 Nvidia A40 GPU 的 Dell PowerEdge R750xa。

正常工作的机器有 2x Titan RTX。

两者的软件配置:

  • Ubuntu 18.04
  • CUDA 11.4
  • cuDNN 8.2.4
  • TensorFlow 2.6.0

这种行为的原因可能是什么?很高兴提供更多细节。

4

0 回答 0