GPU利用率低而显存占用率高的思考
问题描述:在深度学习training中,可以看到cpu利用率很高、内存占用率很高、显存占用率很 高,但GPU利用率很低,train比较耗时。
本文对这个问题进行了思考。
(仅仅是自己遇到问题思考的一些内容,也不一定正确,期待和大家交流探讨)
1.先了解下深度学习中数据的加载问题
先将硬盘中的数据读取到内存中,然后CPU从内存中读取数据,再将数据传输到显存中,等待GPU处理,处理完成之后会传递一部分参数数据到CPU。同时CPU还会将网络和损失函数等传递给GPU。详细可以看这里:http://t.csdn.cn/reYH6。
2.遇到的问题描述
性能可以在任务管理中查看,也可以通过终端查看。不多过阐述。
内存占用率很高(27G/63G);CPU利用率很高70%-90%;显存占用率很高,GPU利用率不高。可以看下图,我用的dataset是Cityscapes精细标注的版本。
3.问题分析
1)从CPU传输数据角度来考虑
GPU处理的数据是从CPU拿过来的,是否存在io传输瓶颈的问题?针对我的情况来看,我的理解是cpu、显存占用率都这么高,可以理解为GPU要从显存拿数据做处理,如果传输受到了限制,那首先显存占用率会降下来,所以这一点可以排除。
2)从batch_size角度考虑
首先考虑这样一个问题,假设一批次就送一张图片进去,但这种图片分辨率非常高,足以占满显存(极端情况),这个时候外在表现就是显存占用率高但是GPU利用率低。因为大量的时候都用在传输数据上了,传进来的数据GPU可以很快的处理完成,所以GPU利用率很低而显存很高。这个角度我还不能验证,等我训练完之后抽空试试看,但是这个思路可以和大家分享。
以上两点是我的思考,以下是两点有关调参的小tips。
Num_works和pin memory这两个参数的作用,第一个是开辟多少个CPU线程来处理数据,可以根据CPU核数设置,一般用4,8,16等。但是这个参数也不能太大。当这个参数太大是,在分发数据的时候可能会消耗一定的时间,极端点可以理解为CPU处理数据很快只要1s,但是因为线程数太多而分发数据的时候花了5s。pin memory的介绍可以参考这里:pin_memory – 知乎。简单讲就是该参数开启时,可以减少数据传递到显存中的时间。
参考:
https://www.jb51.net/article/213809.htm
https://www.cxyzjd.com/article/ProLayman/104758331
文章出处登录后可见!