深度学习PyTorch中GPU利用率较低,且模型训练速度很慢的问题总结与分析
没人重复的昵称
2022年07月14日 18:48

问题描述:

服务器单卡训练gpu的内存占有率没问题,但使用率很低,很长一段时间在百分之零。

问题分析:

1.   GPU内存占用率

   GPU内存占用通常是由模型的大小以及batch size的大小来决定。如果你的GPU占用率很低的话,一般来说只需要改变batch size的大小,尽可能占用90就可以了。

  总的来说,合理的batch size可以提高显存的效率和数据的处理速度,跑完一次epoch需要迭代的次数也会随之减少,并且训练过程中的loss震荡也会减小。但batch size太小会导致模型震荡且不收敛,batch size太大则会导致训练速度慢且模型不易收敛

2.   GPU内存利用率Volatile GPU-Util

GPU内存利用率代表CUDA引擎占用率,需要注意的是Windows系统自带的任务管理器显示默认占用率,不代表训练时需要的CUDA引擎占用率,需要在CMD输入nvidia-smi来查看真实的GPU内存利用率(nvidia-smi -l可以每五秒输出一次GPU信息)

GPU内存利用率反复跳动的原因一般是GPU在等待数据从CPU传来(就是低U高显),当输入传到GPU之后,利用率就会升高,但GPU会在短时间内处理完数据,所以利用率又会降下来,等待下一个batch的输入。所以决定GPU内存利用率的不仅仅需要更好的显卡,内存和CPU也会产生至关重要的影响。

解决方法:

3.   GPU内存占用率

通过调整batch size的大小。

4.   GPU内存利用率(Volatile GPU-Util

通过调整Dataloader的num workers和pin memory。

需要注意的是num workers并不是越大越好(本人亲测!!!),一般 0、1、2、4是常用参数,num workers太大的话就会导致CPU对各个子线程的数据合并所花时间太多,数据加载速度就会下降;pin memory就是禁止数据放到虚拟内存中,可以省掉一些CPU到GPU数据传输的时间。

总结

有些时候模型训练慢并不是因为显卡不行或者模型不合理,训练过程中的一些超参数对训练速度的影响也很大,根据我的个人经验来说(虽然我只是一个小白),先把batch size调整到合适的大小,再去调节num workers,batch size的大小是影响模型精度的关键因素,num workers只会影响速度。