Keras/Tensorflow的GPU使用率低?

Keras/Tensorflow的GPU使用率低?,tensorflow,gpu,keras,Tensorflow,Gpu,Keras,我在一台装有nvidia特斯拉K20c GPU的计算机上使用keras和tensorflow后端。(CUDA 8) 我正在训练一个相对简单的卷积神经网络,在训练期间,我运行终端程序nvidia smi来检查GPU的使用情况。正如您在下面的输出中所看到的,GPU利用率通常显示在7%-13%左右 我的问题是:在CNN培训期间,GPU的使用率不应该更高吗?这是否表明keras/tensorflow的GPU配置或使用不当 可能有多种原因,但最有可能的原因是您在读取培训数据时遇到了瓶颈。由于您的GPU已

我在一台装有nvidia特斯拉K20c GPU的计算机上使用keras和tensorflow后端。(CUDA 8)

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

我的问题是:在CNN培训期间,GPU的使用率不应该更高吗?这是否表明keras/tensorflow的GPU配置或使用不当


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

如果合适,尝试将所有数据加载到内存中,或者使用一个将使输入管道在后台读取数据的命令。这将减少GPU等待更多数据的时间


TensorFlow网站上的包含更多信息。

您应该找到瓶颈:

在windows上使用T监视您如何使用资源

在Linux上使用nmon、nvidia smi和htop来监视您的资源

最可能的情况是:

  • 如果你有一个巨大的数据集,看看磁盘读/写速率;如果您经常访问硬盘,很可能需要更改处理数据集的方式,以减少磁盘访问次数

  • 使用内存尽可能预加载所有内容

  • 如果您使用的是restful API或任何类似的服务,请确保不要等待太多时间来接收所需的内容。对于restful服务,每秒的请求数可能会受到限制(通过nmon/Task manager检查网络使用情况)

  • 确保在任何情况下都不要使用交换空间

  • 通过任何方式(例如使用缓存、更快的库等)减少预处理的开销

  • 使用bach_大小(然而,据说批量大小的更高值(>512)可能会对准确性产生负面影响)


衡量GPU性能和利用率不如CPU或内存那么简单。GPU是一个极端的并行处理单元,有很多因素。nvidia smi显示的GPU利用率数字表示至少一个GPU多处理组处于活动状态的时间百分比。如果该数字为0,则表示您的GPU没有被使用,但如果该数字为100,则并不意味着GPU正在充分发挥其潜力

这两篇文章有很多关于这个主题的有趣信息:
原因可能是您的网络“相对简单”。我有一个MNIST网络,有60k个培训示例

  • 在一个隐藏层中有100个神经元,CPU训练速度更快,GPU训练的GPU利用率约为10%

  • GPU有两个隐藏层,每个层有2000个神经元,速度明显更快(CPU上的24秒比452秒),利用率约为39%

我有一台非常旧的PC(24GB DDR3-1333,i7 3770k),但有一个现代图形卡(RTX 2070+SSD,如果这很重要的话),因此存在内存GPU数据传输瓶颈

我还不确定还有多少改进的余地。我必须训练一个更大的网络,并将其与更好的CPU/内存配置+相同的GPU进行比较


我想对于较小的网络来说,这并不重要,因为它们对CPU来说相对容易。

GPU利用率低可能是由于小批量。Keras有占用整个内存大小的习惯,例如,使用批大小x或批大小2x。如果可能的话,试着使用更大的批量,看看是否有变化