TensorFlow:多GPU配置(性能)



我想知道在使用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开放?

我想一个卷

积层的"流"不能并行计算?!因此,哪个设备进行卷积、池化并不重要-, ....part?!

有什么技巧可以获得最佳性能吗?

目前,我正在具有 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),而且有时我的(我不知道为什么)我的"流 1 gpu:0和流 2 的gpu:1"解决方案只是生成 NaN 值。喜欢在初始化后直接或短暂。很奇怪。

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

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

我可能在逻辑中缺少一些东西,但从这一行来看,它似乎会将所有 GPU 操作放在 gpu:0 上

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

就您的实施速度慢而言...也许在某处发生了 GPU0->GPU 1 副本?

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

最新更新