Pytorch GPU内存占用很高,但是利用率很低如何解决


Posted in Python onJune 01, 2021

1.GPU 占用率,利用率

输入nvidia-smi来观察显卡的GPU内存占用率(Memory-Usage),显卡的GPU利用率(GPU-util)

GPU内存占用率(Memory-Usage) 往往是由于模型的大小以及batch size的大小,来影响这个指标 显卡的GPU利用率(GPU-util) 往往跟代码有关,有更多的io运算,cpu运算就会导致利用率变低。

比如打印loss, 输出图像,等等

Pytorch GPU内存占用很高,但是利用率很低如何解决

这个时候发现,有一块卡的利用率经常跳到1%,而其他三块卡经常维持在70%以上

2.原因分析

当没有设置好CPU的线程数时,Volatile GPU-Util参数是在反复的跳动的,0%,20%,70%,95%,0%。

这样停息1-2 秒然后又重复起来。其实是GPU在等待数据从CPU传输过来,当从总线传输到GPU之后,GPU逐渐起计算来,利用率会突然升高,但是GPU的算力很强大,0.5秒就基本能处理完数据,所以利用率接下来又会降下去,等待下一个batch的传入。

因此,这个GPU利用率瓶颈在内存带宽和内存介质上以及CPU的性能上面。

最好当然就是换更好的四代或者更强大的内存条,配合更好的CPU。

3.解决方法:

(1)为了提高利用率,首先要将num_workers(线程数)设置得体,4,8,16是几个常选的几个参数。本人测试过,将num_workers设置的非常大,例如,24,32,等,其效率反而降低,因为模型需要将数据平均分配到几个子线程去进行预处理,分发等数据操作,设高了反而影响效率。当然,线程数设置为1,是单个CPU来进行数据的预处理和传输给GPU,效率也会低。其次,当你的服务器或者电脑的内存较大,性能较好的时候,建议打开pin_memory打开,就省掉了将数据从CPU传入到缓存RAM里面,再给传输到GPU上;为True时是直接映射到GPU的相关内存块上,省掉了一点数据传输时间。

(2) 另外的一个方法是,在PyTorch这个框架里面,数据加载Dataloader上做更改和优化,包括num_workers(线程数),pin_memory,会提升速度。解决好数据传输的带宽瓶颈和GPU的运算效率低的问题。在TensorFlow下面,也有这个加载数据的设置。

(3) 修改代码(我遇到的问题)

每个iteration 都写文件了,这个就会导致cpu 一直运算,GPU 等待

Pytorch GPU内存占用很高,但是利用率很低如何解决

造成GPU利用率低还有其他原因

1. CPU数据读取更不上:读到内存+多线程+二进制文件(比如tf record)

2. GPU温度过高,使用功率太大:每次少用几个GPU,降低功耗(但是多卡的作用何在?)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
通过源码分析Python中的切片赋值
May 08 Python
python操作列表的函数使用代码详解
Dec 28 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python之list对应元素求和的方法
Jun 28 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
如何判断pytorch是否支持GPU加速
Jun 01 #Python
pytorch 两个GPU同时训练的解决方案
Jun 01 #Python
使用Django实现商城验证码模块的方法
Jun 01 #Python
pytorch通过训练结果的复现设置随机种子
Jun 01 #Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 #Python
详细介绍python类及类的用法
You might like
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
php实现文件下载更能介绍
2012/11/23 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Python实现Linux监控的方法
2019/05/16 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
python中format函数如何使用
2020/06/22 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
会计求职信范文
2014/05/24 职场文书
运动会表扬稿范文
2015/05/05 职场文书
大学运动会通讯稿
2015/07/18 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis