TensorFlow:多 GPU 配置(性能)

TensorFlow: Multi-GPU configuration (performance)

我想知道在使用 TensorFlow 训练网络时,多 GPU 系统被认为是什么 "best practice"。

例如,我的一个网络是这样的:

                         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 开放?

我猜一个 "stream" 的卷积层不能并行计算?!所以哪个设备执行卷积、池化、……部分并不重要?!

获得最佳性能的任何提示?

目前我正在使用 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 只使用 one GPU)而且有时我的(我不知道为什么)我的“gpu:0 for stream 1 and gpu:1 for stream 2" - 解决方案仅生成 NaN 值。就像在 init 之后直接或短时间一样。很奇怪。

TensorFlow 是否需要某种线程锁定或手动复制多个 GPU 的输入数据?

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

我可能在逻辑上遗漏了一些东西,但从 this line 看来它会将所有 GPU 操作放在 gpu:0

您可以从实现中看出放置策略没有考虑数据传输或计算成本,因此手动放置通常比自动放置更好。例如,如果您正在执行某种输入管道,默认放置通常会将一些数据处理操作放在 GPU 上,这会使整体速度变慢。

就您的实施速度而言...也许某处发生了 gpu0->gpu1 复制?

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