关于GPU利用率低值得考虑的几个点

2022-10-22 10:17:13

【问题】

深度学习相关的程序运行时,GPU利用率很低,间隔地达到一下一个较高的值,但大部分时间是0%。

【分析】
通常是因为GPU在等程度的其他动作,主要就是加载数据和CPU上的一些操作(包括数据预处理等),所以可以按照以下步骤逐一确认瓶颈所在:

  1. 确认一下CPU利用率是不是很高:
    top # 查看对应CPU利用率是不是爆满
    如果CPU利用已经超负荷了,那说明数据预处理等操作的一步可能就已经达到机器上限了,需要考虑CPU性能是不是不太够。

  2. 更常见的原因是I/O瓶颈,尤其常见的情景是数据存储在机械硬盘上,也就是CPU的利用率也不是很高,GPU利用率更低,这时候可以看一下I/O的情况:
    sudo iotop # 需要sudo权限
    如果只用一个进程读数据,那势必会比较慢,这时候应该考虑多进程并行地读数据,如果在pytorch中,可以用torch.util.data.Dataloader来包自定义的数据读取函数,num_worker参数可以控制数据读取的进程数:

自定义数据读取函数

代码隐身了

num_workers的数量具体设置多少要根据CPU核数来确定,可以自己试一下,什么时候CPU和GPU有一个撑满了,就算是够多了。
但是如果机械硬盘的I/O上限在那里,那肯定是再多进程也没有用,这时候只能感叹SSD大法好了。

【总结】

影响程序运行速度主要有三个节点,以及根据常见的机器配置,它们限制速度的可能性大小关系如下:
数据读取(I/O速度)> 数据预处理等(CPU)> 网络前馈(GPU)

在不改变硬件条件的情况下,最能够努力的就是增加数据读取的进程,以及尽量把数据预处理操作能移到GPU上进行的就都移到GPU上。

这是从宏观角度来看的,当然另外还有一些比较细节的黑科技,需要根据特定的程序来寻找针对性的优化方法了。

  • 作者:dwqy11
  • 原文链接:https://blog.csdn.net/dwqy11/article/details/117769866
    更新时间:2022-10-22 10:17:13