我想知道什么是最佳实践"用于使用TensorFlow训练网络时的多GPU系统。
例如,我的一个网络看起来像这样:
input
|
(...) <-- convolutional layers
|
_________
fully-connected | | fully-connected
output stream 1 -> | | <- output stream 2
TensorFlow是否有效分配多个GPU?或者我应该指定自己哪个GPU TensorFlow应该用于特定操作?
我现在还没有对它进行基准测试,今天刚开始进行一些GPU实验。但是,目前我不指定在卷积层上使用哪个设备,但我确实为完全连接的层指定了它:
# flattened information of the last convolutional layer
h_pooln_flat = tf.reshape(...)
with tf.device("/gpu:0"):
# stream 1 stuff
with tf.device("/gpu:1"):
# stream 2 stuff
这是个好主意吗?或者应该将资源分配留给TensorFlow?
我想一个单一的&#34;流&#34;卷积层不能并行计算?!因此,卷积,汇集,......部分的哪个设备无关紧要?!
获得最佳表现的任何提示?
目前我正在使用2个GPU的Slurm群集的一个节点上进行培训,但我可能可以在更多节点上进行训练,因此可以训练4个,6个甚至8个GPU。但是,我猜超过2个GPU会有很多开销吗?
编辑(慢速多GPU性能):经过一些测试后我感到非常惊讶...如果我让TensorFlow决定分配什么并删除特定于设备的语句,那么网络训练相当更快。这对我来说真的很令人惊讶......当总共有两个GPU时,什么比在一个GPU上拥有每个输出流更有效?另外,根据输出,Tensorflow只使用一个GPU?!
EDIT2(NaN值):经过多次测试后,我发现我为流1设置了gpu:0
,为流2设置了gpu:1
,这不仅比让它更慢TensorFlow决定使用什么(根据管道脚本输出TensorFlow只使用一个 GPU)但有时候我(我不知道为什么)我的&#34; gpu:0
用于流1和gpu:1
for stream 2&#34; -solution只生成NaN值。喜欢在init之后直接或短期。非常奇怪。
TensorFlow是否需要某种线程锁定或多个GPU的输入数据手动复制?
答案 0 :(得分:5)
设备默认放置的逻辑在于simple_placer.cc
我可能会遗漏逻辑中的某些内容,但是从this line来看,似乎它会将所有GPU操作都放在gpu上:0
您可以从实施中看到,展示位置策略未考虑数据传输或计算成本,因此手动展示位置通常优于自动展示位置。例如,如果您正在进行某种输入管道,默认放置通常会在GPU上放置一些数据处理操作,这会使整体速度变慢。
至于你的实施速度很慢......也许某个地方发生了gpu0-&gt; gpu1副本?
让多GPU设置工作是一个非常开放的领域,让我们知道你发现了什么!