训练期间 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 使用率激增的原因。
(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 使用率激增的原因。