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 相关文章推荐
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
python爬虫的工作原理
Mar 05 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
Python 实现12306登录功能实例代码
Feb 09 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
python opencv读mp4视频的实例
Dec 07 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
python 伯努利分布详解
Feb 25 Python
Python configparser模块常用方法解析
May 22 Python
Python基于httpx模块实现发送请求
Jul 07 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 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
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
制作特殊字的脚本
2006/06/26 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
Vue实现简易购物车页面
2020/12/30 Vue.js
python中MySQLdb模块用法实例
2014/11/10 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python下载网络小说实例代码
2018/02/03 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
Python学习笔记之装饰器
2020/08/06 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
你对IPv6了解程度
2016/02/09 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
工程造价自荐信
2013/10/09 职场文书
上级检查欢迎词
2014/01/18 职场文书
管理标语大全
2014/06/24 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
培训讲师开场白
2015/06/01 职场文书
超市主管竞聘书
2015/09/15 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
Redis基本数据类型Set常用操作命令
2022/06/01 Redis