训练期间 GPU 利用率大多为 0%

GPU utilization mostly 0% during training

(GTX 1080, Tensorflow 1.0.0)

在训练期间 nvidia-smi 输出(下图)表明 GPU utilization 大多数时候为 0%(尽管 usage GPU)。关于我已经训练的时间,似乎是这样。偶尔它会达到 100% 或类似的峰值,但只有一秒钟。

+-----------------------------------------------------------------------------+
    | 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 |
    +-----------------------------------------------------------------------------+

正如我在 this 问题中描述的那样,我遇到了这种情况。 该问题可以通过 github 存储库中的代码或通过遵循 this simple retraining example from tensorflow's website and passing restricted per_process_gpu_memory_fraction(小于 1.0)像会话中的那样进行复制:

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

问题一:在使用<1.0的GPU的情况下,如何在训练中真正使用(utilize)GPU?

问题 2:如何让我的显卡真正使用完整的 GPU(不是将其设置为 <1.0)?

感谢帮助和提示!

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

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