关于tensorflow:训练期间GPU利用率通常为0%

GPU utilization mostly 0% during training

(GTX 1080,Tensorflow 1.0.0)

在训练期间,nvidia-smi输出(如下所示)表明,大多数情况下GPU使用率均为0%(尽管使用了GPU)。 关于我已经训练的时间,情况似乎是这样。 偶尔,它有时会达到100%或类似的峰值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+-----------------------------------------------------------------------------+
    | NVIDIA-SMI 375.26                 Driver Version: 375.26                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce GTX 1080    Off  | 0000:01:00.0      On |                  N/A |
    | 33%   35C    P2    49W / 190W |   7982MiB /  8110MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+

    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID  Type  Process name                               Usage      |
    |=============================================================================|
    |    0      1093    G   /usr/lib/xorg/Xorg                             175MiB |
    |    0      1915    G   compiz                                          90MiB |
    |    0      4383    C   python                                        7712MiB |
    +-----------------------------------------------------------------------------+

正如我在本期中所描述的,这种情况发生在我身上。
可以使用该github存储库中的代码或通过遵循来自tensorflow网站的此简单重新培训示例并通过类似于会话中的受限per_process_gpu_memory_fraction(小于1.0)来复制该问题:

1
2
3
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

问题1:如何在训练中使用<1.0的GPU时真正使用(利用)GPU?

问题2:如何在图形卡上真正使用完整的GPU(而不是将其设置为<1.0)?

帮助和提示表示赞赏!


当创建的图形大于GPU的内存时,TensorFlow会退回到CPU,因为它使用RAM和CPU而不是GPU。 因此,只需删除per_process_gpu_memory_fraction的选项并减小批处理大小即可。 这些示例很可能使用大批处理量,因为它是在多个GPU或大于32Gb的CPU中训练的,这不是您的情况。 它也可以是您选择的优化程序算法。 SGD使用的内存少于其他算法,请尝试先进行设置。 在GPU中使用8Gb时,您可以尝试使用16和SGD的批处理大小,它应该可以工作。 然后,您可以增加批处理大小或使用其他算法(例如RMSprop)。

如果仍然无法正常工作,您可能正在做其他事情。 例如,您在每次迭代中都保存一个检查点。 保存检查点是在CPU中完成的,并且可能比在GPU中进行简单的迭代花费更多的时间。 这可能是您看到GPU使用率激增的原因。