当前位置:  开发笔记 > 人工智能 > 正文

TensorFlow:多GPU配置(性能)

如何解决《TensorFlow:多GPU配置(性能)》经验,为你挑选了1个好方法。

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

我想卷积层的单个"流"不能并行计算?!因此,卷积,汇集,...部分哪个设备无关紧要?!

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

目前我正在使用2个GPU的Slurm集群的一个节点上进行培训,但我可能可以在更多节点上进行训练,因此可以训练4个,6个甚至8个GPU.但是,我猜超过2个GPU会有很多开销吗?


编辑(慢多GPU性能):一些测试后,我感到很吃惊......如果我让TensorFlow决定如何分配和删除设备特定的语句在网络训练相当快.这对我来说真的很令人惊讶......当总共有两个GPU时,什么比在一个GPU上拥有每个输出流更有效?此外,似乎(根据输出)Tensorflow只使用一个GPU?!


EDIT2(NaN值):经过一些测试后,我经历过我的gpu:0流1和gpu:1流2的手动设置不仅比让TensorFlow决定使用什么慢(而且根据管道脚本输出TensorFlow只使用一个 GPU)但是有时我的(我不知道为什么)我的" gpu:0为流1和gpu:1流2" - 解决方案只生成NaN值.喜欢在init之后直接或短期.很奇怪.

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



1> Yaroslav Bul..:

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

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

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

至于你的实现很慢......也许在某个地方发生了gpu0-> gpu1副本?

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有