我在带有nvidia Tesla K20c GPU的计算机上使用带有张量流后端的keras。 (CUDA 8)
我正在转换一个相对简单的卷积神经网络,在训练期间我运行终端程序nvidia-smi
来检查GPU的使用情况。正如您在以下输出中所看到的,GPU利用率通常显示在7%-13%左右
我的问题是:在CNN培训期间,GPU的使用率是否应该更高?这是keras / tensorflow的糟糕GPU配置或使用情况的标志吗?
答案 0 :(得分:7)
Could be due to several reasons but most likely you're having a bottleneck when reading the training data. As your GPU has processed a batch it requires more data. Depending on your implementation this can cause the GPU to wait for the CPU to load more data resulting in a lower GPU usage and also a longer training time.
Try loading all data into memory if it fits or use a QueueRunner which will make an input pipeline reading data in the background. This will reduce the time that your GPU is waiting for more data.
The Reading Data Guide on the TensorFlow website contains more information.
答案 1 :(得分:0)
您应该找到瓶颈:
在Windows上使用T ask-Manager> Performance监视资源的使用方式
在Linux上,使用nmon,nvidia-smi和htop监视资源。
最可能的情况是:
如果您有巨大的数据集,请看一下磁盘的读写速率;如果您经常访问硬盘,则很可能需要更改它们与数据集的处理方式,以减少磁盘访问次数
使用内存尽可能多地预加载所有内容。
如果您使用的是静态API或任何类似的服务,请确保不要等待太多时间来接收所需的内容。对于宁静的服务,每秒的请求数可能会受到限制(请通过nmon /任务管理器检查网络使用情况)
确保在任何情况下都不要使用交换空间!
通过任何方式(例如,使用缓存,更快的库等)减少预处理的开销
使用bach_size(但是,据说批量大小的较高值(> 512)可能会对准确性产生负面影响)
答案 2 :(得分:0)
测量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/
答案 3 :(得分:0)
原因可能是您的网络“相对简单”。我有一个包含6万个训练示例的MNIST网络。
在1个隐藏层中具有100个神经元,CPU训练速度更快,GPU训练中GPU的利用率约为10%
具有2个隐藏层,每个隐藏层2000个神经元,GPU显着更快(CPU上为24s对452s),利用率约为39%
我有一台很旧的PC(24GB DDR3-1333,i7 3770k),但是有一个现代的图形卡(RTX 2070 + SSD,如果需要的话),因此存在内存GPU数据传输瓶颈。
我不确定这里有多少改进空间。我必须训练一个更大的网络,并将其与更好的CPU /内存配置+相同的GPU进行比较。
我想对于较小的网络来说没什么关系,因为它们对于CPU来说相对容易。
答案 4 :(得分:0)
GPU 利用率低可能是由于批量较小。 Keras 有占用整个内存大小的习惯,例如,您使用批大小 x 或批大小 2x。如果可能,尝试使用更大的批量大小,看看它是否会发生变化。