TensorFlow - Titan X使用率低

15
有一段时间了,我注意到TensorFlow(v0.8)似乎没有充分利用我Titan X的计算能力。对于我运行的几个CNN,GPU使用率似乎没有超过30%。通常,GPU利用率甚至更低,只有15%左右。表现出这种行为的CNN之一是来自DeepMind的Atari论文中使用Q-learning的CNN(请参见下面代码的链接)。当我看到我们实验室中其他人运行使用Theano或Torch编写的CNN时,GPU使用率通常为80% +。这使我想知道,为什么我在TensorFlow中编写的CNN如此“慢”,我可以做些什么来更有效地利用GPU处理能力?总的来说,我对分析GPU操作并发现瓶颈所在的方法很感兴趣。如果有任何建议,请告诉我,因为目前似乎不太可能通过TensorFlow进行此操作。
我为了找出问题原因而做的事情:
  1. 分析TensorFlow的设备放置,一切都在gpu:/0上,看起来没问题。
  2. 使用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

    NVIDIA SMI显示低GPU利用率的示例:NVIDIA-SMI


    改变批次大小会改变行为吗?或者使网络更复杂呢? - etarion
    增加小批量大小会使得+1。Volatile GPU-Util 数字可能与内存利用有关,而不仅仅是其他方面。Titan X 上的12GB内存还有很大的余地。如果您的模型占用的内存不多,您可以使用更大的批次来填充它。 - j314erre
    1
    我进行了一个小实验来研究改变批量大小的影响。以下是将大小为N = 1..512的批次提供给训练操作的结果。每个训练示例都是一个84x84x4类型为tf.float32的张量。结果在这里:http://pastebin.com/xrku9AjW正如您所看到的,GPU利用率似乎没有显着变化,甚至在增加批量大小时会降低。时间测量是100个批次的平均值,并使用time.time()记录。有什么线索错在哪里吗? - verified.human
    这个问题在1.0版本中还能重现吗? - Alexandre Passos
    你曾经设法解决过这个问题吗?我在我的GTX1060上有一个非常类似的问题。 - Aleksei Petrenko
    你好,你解决了那个问题吗?当我运行我的TensorFlow代码时,我也遇到了同样的问题,GPU利用率只有35%。 - Abhay Singh
    1个回答

    1

    随着Tensorflow的更新(我使用的是Tensorflow 1.4),我们可以获取运行时统计信息并在Tensorboard中进行可视化。

    这些统计信息包括计算图中每个节点的计算时间和内存使用情况。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接