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 设置工作是一个非常开放的领域,让我们知道您发现了什么!
我想知道在使用 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 设置工作是一个非常开放的领域,让我们知道您发现了什么!