【发布时间】:2016-09-28 18:25:09
【问题描述】:
一段时间以来,我一直注意到 TensorFlow (v0.8) 似乎没有充分利用我的 Titan X 的计算能力。对于我一直在运行的几个 CNN,GPU 使用率似乎没有超过 ~30 %。通常,GPU 利用率甚至更低,接近 15%。显示这种行为的 CNN 的一个特定示例是来自 DeepMind 的 Atari 论文中的 CNN,它带有 Q-learning(代码见下面的链接)。
当我看到我们实验室的其他人在运行用 Theano 或 Torch 编写的 CNN 时,GPU 的使用率通常超过 80%。这让我想知道,为什么我在 TensorFlow 中编写的 CNN 如此“慢”,我该怎么做才能更有效地利用 GPU 处理能力?一般来说,我对分析 GPU 操作和发现瓶颈所在的方法感兴趣。任何建议如何做到这一点都非常受欢迎,因为目前这在 TensorFlow 上似乎不太可能。
我为进一步了解此问题的原因所做的事情:
分析 TensorFlow 的设备放置,一切似乎都在 gpu:/0 上,所以看起来没问题。
-
使用 cProfile,我优化了批处理生成和其他预处理步骤。预处理是在单个线程上执行的,但 TensorFlow 步骤执行的实际优化需要更长的时间(请参阅下面的平均运行时间)。提高速度的一个明显想法是使用 TF 队列运行器,但由于批处理准备已经比优化快 20 倍,我想知道这是否会产生很大的不同。
Avg. Time Batch Preparation: 0.001 seconds Avg. Time Train Operation: 0.021 seconds Avg. Time Total per Batch: 0.022 seconds (45.18 batches/second) 在多台机器上运行以排除硬件问题。
大约一周前升级到最新版本的 CuDNN v5 (RC)、CUDA Toolkit 7.5 并重新安装了 TensorFlow。
可以在此处找到出现此“问题”的 Q-learning CNN 示例:https://github.com/tomrunia/DeepReinforcementLearning-Atari/blob/master/qnetwork.py
显示 GPU 利用率低的 NVIDIA SMI 示例:NVIDIA-SMI
【问题讨论】:
-
改变批量大小会改变行为吗?还是让网络更复杂?
-
+1 增加小批量大小。由于内存利用率的原因,Volatile GPU-Util 数量可能与其他任何因素一样多。 Titan X 有 12GB 的内存,你有很多头部空间。如果您的模型不占用太多内存,您可以用更大的批次填充它。
-
我做了一个小实验来研究改变批量大小的影响。以下是将大小为 N = 1..512 的批次提供给训练操作的结果。每个训练示例都是一个 84x84x4 类型的张量
tf.float32。结果在这里:pastebin.com/xrku9AjW 如您所见,GPU 利用率似乎没有显着变化,或者在增加批量大小时甚至会降低。时间测量是 100 个批次的平均值,并使用time.time()记录。关于这里出了什么问题的任何线索? -
这个1.0还能重现吗?
-
你有没有设法弄明白?我的 GTX1060 也有类似的问题。
标签: performance profiling gpu tensorflow conv-neural-network