训练神经网络时,GPU利用率低而显存占用率高的思考

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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月21日
下一篇 2022年5月21日

相关推荐