前言

在跑数据集时碰到了GPU利用率浮动的问题,上网查了查解决方案。随手看了一下相关内容。。。深度学习就那么几个参数,调多了总能碰到合适的吧。
但我的GPU利用率浮动问题仍然没解决(50%-100%之间)
本篇文章参考:深度学习训练中的GPU利用率和显存占用问题、num_workers&batch_size设置问题
linux下查看GPU参数可参考:JC-Linux系统下常用命令

GPU显存

占GPU显存的主要是两部分,一是模型网络的加载,而是batch_size大小的设置。模型的加载很难控制(但是考虑到部署的话就要考虑模型加载需要的显存问题了),一般调节batch_size来控制显存的占用(若出现out of memry,那就调batch_size就完事了)

GPU利用率

GPU只是在数据在网络的流通下使用。而数据的加载,预处理,后处理等都是在CPU上进行(了解一下CPU的核心、线程、超线程等)。GPU利用的好不好,主要是看和CPU配合的怎么样,还有就是内存带宽等。如果衔接流畅就能有一个不错的利用率。

GPU利用率低的因素有很多,一般情况下,通过调节num_workers数量调节GPU利用率。设置在一个比较大的范围内比较好(可以考虑8-16),但不是越大越好。因为越大,虽然线程多了,但是切分到每一个线程消耗也大了,所以会增加CPU的负荷,从而降低对GPU的利用。num_workers数一般和batch_size数配合使用。

再者可能是因为打印日志、计算eta等无关数据处理和计算的操作占用了CPU处理时间。
还要注意的一个问题就是,你的网络训练结束的标准是什么。是以epoch还是iteration为标准。如果是以iteration为标准,那么你加大batch_size大小,网络训练时间自然就会增加,此时需要在batch_size翻倍时iteration打对折。如果是以epoch为标准,那么更改batch_size时不需要做其他更改。
“但是如果你的网络本身就是一个小网络,可能GPU的利用率就是上不去。因为你的batch中的数据很小,又不能用过大的batch_size(一般选取2-32),也不能用过大的num_workers,所以GPU利用率就是很低。”这样说可能不太正确,因为时间消耗相对变大可能只是浪费在多次传输数据上,而CPU的处理速度还是不变的。
参考:深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
训练效率低?GPU利用率上不去?快来看看别人家的tricks吧~

batch_size不能选取过大来占据显存

如果你的batch_size选择已经达到了32了还没能占完显存,那可能是你的数据单个样本占存本来就很小。此时再增大batch_size就要慎重了。
参考:batch_size是否越大越好?

总结

粗略的讲,batch_size管显存,num_workers管GPU利用率。batch_size设置一般为2-32,num_workers一般为8、16。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐