TensorFlow:多GPU配置(性能)

时间:2016-03-03 22:53:27

标签: machine-learning cluster-computing tensorflow cudnn

我想知道什么是最佳实践"用于使用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的输入数据手动复制?

1 个答案:

答案 0 :(得分:5)

设备默认放置的逻辑在于simple_placer.cc

我可能会遗漏逻辑中的某些内容,但是从this line来看,似乎它会将所有GPU操作都放在gpu上:0

您可以从实施中看到,展示位置策略未考虑数据传输或计算成本,因此手动展示位置通常优于自动展示位置。例如,如果您正在进行某种输入管道,默认放置通常会在GPU上放置一些数据处理操作,这会使整体速度变慢。

至于你的实施速度很慢......也许某个地方发生了gpu0-&gt; gpu1副本?

让多GPU设置工作是一个非常开放的领域,让我们知道你发现了什么!