Keras / Tensorflow 的 GPU 使用率低?

19

我正在使用带有NVIDIA Tesla K20c GPU的计算机上的TensorFlow后端keras。(CUDA 8)

我正在训练一个相对简单的卷积神经网络,在训练期间,我运行终端程序nvidia-smi以检查GPU使用情况。如下图所示,GPU利用率通常显示在7%-13%左右。

我的问题是:在CNN训练期间,GPU使用率不应该更高吗? 这是错误的GPU配置或keras / tensorflow使用的迹象吗?

nvidia-smi输出结果

输入图像描述

5个回答

13

可能由于多种原因,但最有可能的是您在读取训练数据时遇到了瓶颈。当GPU处理完一个批次后会需要更多的数据。根据您的实现方式,这可能会导致GPU等待CPU加载更多数据,从而降低GPU使用率并延长训练时间。

如果内存足够,请尝试将所有数据加载到内存中,或使用QueueRunner,该工具可以在后台读取数据以建立输入管道。这会减少GPU等待更多数据的时间。

TensorFlow网站上的阅读数据指南包含更多信息。


2
你应该找到瓶颈所在:
在Windows上,使用Task-Manager> Performance来监视您如何使用资源。
在Linux上,使用nmon、nvidia-smi和htop来监视您的资源。
最可能的情况是:
如果你有一个庞大的数据集,请查看磁盘读写速率;如果你经常访问硬盘,很可能需要改变处理数据集的方式,以减少磁盘访问次数。尽量利用内存预加载所有内容。如果你使用restful API或任何类似服务,请确保你不用等待太久才能收到你需要的东西。对于restful服务,每秒请求的数量可能会受到限制(通过nmon /任务管理器检查网络使用情况)。无论如何,请确保不使用交换空间!通过任何方式减少预处理的开销(例如使用缓存、更快的库等)。尝试调整batch_size(然而,据说batch_size的值越高(>512),对准确性的负面影响就越大)。

2
低GPU利用率可能是由于批处理大小太小。Keras有一个习惯,无论您使用批处理大小x还是批处理大小2x,都会占用整个内存大小。如果可能,请尝试使用更大的批处理大小并查看是否有变化。

将我的批大小增加2048几乎可以提高x2048的速度...你救了我的一天。 - Galigator

2
可能的原因是您的网络“相对简单”。我有一个包含60k个训练示例的MNIST网络。
- 在一个隐藏层中有100个神经元时,CPU训练速度更快,GPU训练的利用率约为10%。 - 在2个隐藏层中每层有2000个神经元时,GPU的速度显着更快(与CPU相比,24秒 vs 452秒),利用率约为39%。
我有一台相当老的PC(24GB DDR3-1333,i7 3770k),但有一张现代的图形卡(RTX 2070 + SSDs),所以存在内存-GPU数据传输瓶颈。
我还不确定这里可以改进多少。我需要训练一个更大的网络,并将其与更好的CPU/内存配置+相同的GPU进行比较。
我想对于较小的网络来说,这并不那么重要,因为它们对CPU来说相对容易。

1
测量GPU性能和利用率并不像CPU或内存那样简单。GPU是一个极端的并行处理单元,有很多因素。nvidia-smi显示的GPU利用率数字表示至少有一个GPU多进程组处于活动状态的时间百分比。如果这个数字为0,则意味着没有任何GPU被利用,但如果这个数字为100,并不意味着GPU正在充分利用。
这两篇文章对这个主题有很多有趣的信息: https://www.imgtec.com/blog/a-quick-guide-to-writing-opencl-kernels-for-rogue/ https://www.imgtec.com/blog/measuring-gpu-compute-performance/

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