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库urllib与urllib2主要区别分析
Jul 13 Python
python进程管理工具supervisor使用实例
Sep 17 Python
浅谈python中的__init__、__new__和__call__方法
Jul 18 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
python实践项目之监控当前联网状态详情
May 23 Python
关于Python作用域自学总结
Jun 10 Python
django之自定义软删除Model的方法
Aug 14 Python
Python datetime包函数简单介绍
Aug 28 Python
Python解析json代码实例解析
Nov 25 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
如何利用Python实现一个论文降重工具
Jul 09 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 管理系统程序中的后门
2009/08/05 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
php自定义错误处理用法实例
2015/03/20 PHP
JS location几个方法小姐
2008/07/09 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
详谈javascript异步编程
2016/02/21 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
浅析为什么a="abc" 不等于 a=new String("abc")
2017/10/25 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
军训自我鉴定200字
2014/02/13 职场文书
护士工作失误检讨书
2014/09/14 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
z-index不起作用
2021/03/31 HTML / CSS
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS