首页 文章

最大化tensorflow多GPU性能

提问于
浏览
11

我想知道是否有人可以建议如何在4 GPU设置中从tensorflow中获得最佳性能 .

作为测试,我在32x32输入上创建了两个相同的网络(18个ish层残留网络,带有小型滤波器组(范围从16-128) . 批量大小512,每个GPU 128个 . ) . 一个在MXNet和一个我已经模拟the inception example .

我的MXNet网络每秒可以训练大约7k个示例,其中张量流仅能够使用虚拟数据4.2k,使用实际数据能够达到3.7 .

(在1 GPU上运行时,数字是每秒1.2k的例子,相比之下2.1k)

在我的实验中,我有几个问题希望加快速度 .

  • 培训时GPU利用率似乎很低 . 我注意到在tensorflow白皮书中支持在同一GPU上运行多个流 . 这是否可以在公开发布?

  • 无论如何在一次执行 session.run() 时执行多个列车操作?或者有异步执行?这样可以在下一批次向前通过的同时进行重量更新吗?我尝试过使用2个线程(系统和 QueueRunners 's), but this only resulted in a slowdown. MXNet is able to increase speeds by running weight updates on the CPU so that the gpu'都可以用于下一批 .

  • 新的分布式运行时是否允许我在一台机器上运行多个工作程序来解决其中一些问题?

  • 还有别的东西可以做吗?

我知道堆栈溢出有很多类似的问题,但是我的搜索无法找到我尚未尝试的问题的解决方案 .

Edit:

我做了一些CUDA分析,看看昂贵的内核是什么 . 根据我的说法,21.4%的时间用于内部:

void Eigen::internal::EigenMetaKernel_NonVectorizable<Eigen::TensorEvaluator
<Eigen::TensorAssignOp<Eigen::TensorMap<Eigen::Tensor<float, int=4, int=1, long>, int=16>,
Eigen::TensorPaddingOp<Eigen::array<std::pair<int, int>,
unsigned long=4> const, Eigen::TensorMap<Eigen::Tensor<float const,
int=4, int=1, long>, int=16> const > const > const, Eigen::GpuDevice>, long>(float, int=4)

20.0%的时间花在了

void Eigen::internal::EigenMetaKernel_NonVectorizable<Eigen::TensorEvaluator
<Eigen::TensorAssignOp<Eigen::TensorMap<Eigen::Tensor<float, int=4, int=1, long>, int=16>,
Eigen::TensorBroadcastingOp<Eigen::array<int, unsigned long=4>
const, Eigen::TensorMap<Eigen::Tensor<float const, int=4, int=1, long>,
int=16> const > const > const, Eigen::GpuDevice>, long>(float, int=4)

关闭签名我不确定这些是做什么的 . 这些有意义吗?

除此之外,分析还报告了低内核并发性,0%,如预期的那样 . 并且计算利用率低34.9%(授予此项包括启动时间和火车循环中的一点python . 大约32秒,总共91秒 . 这在tensorflow内部利用率约为50% . )

Edit 2:

我附上了一份修剪过的source code . 总的来说,虽然我更关心问题1-3,并且不想花费太多时间 .

另外我运行的tensorflow来自:f07234db2f7b316b08f7df25417245274b63342a

Edit 3:

更新到最新的tensorflow(63409bd23facad471973b110df998782c0e19c06)相同的代码,默认数据格式(NHWC),这似乎加快了这一点 . 关于假数据6.7k-6.8k(我觉得热依赖?)示例第二个4gpu . 1gpu - 每秒2.0k的例子 . 对于4gpu,实际数据性能约为每秒4.9k . 1gpu - 每秒1.7k的例子 .

Edit 4:

此外,我尝试将数据格式切换到BCHW . 我将转换建模为Soumith's benchmarks . 卷积部分确实更快,但批量规范似乎搞乱了一切 . 使用naive implementation(固定轴,并使权重[1,C,1,1]而不是[C,])我只能在4 gpu(伪数据)上获得1.2k示例 . 如果在批量规范操作之前和之后进行转置,我可以每秒获得6.2k示例(假数据) . 仍然比NHWC data_format慢 .

1 回答

  • 1

    如果没有看到代码,就很难诊断程序的性能问题 . 我们有可能以某种方式阅读您的测试代码吗?

    显示在顶部的TensorPadding有点奇怪 . 我希望cudnn调用应该在配置文件的顶部 . 无论如何,向我们展示测试代码将会有所帮助 .

相关问题