演示问题的最小示例:
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
这种行为的原因可能是什么?很高兴提供更多细节。