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进行稳定可靠的文件操作详解
Dec 31 Python
Python isinstance函数介绍
Apr 14 Python
Python lxml模块安装教程
Jun 02 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
python使用matplotlib画饼状图
Sep 25 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
使用python模拟高斯分布例子
Dec 09 Python
python sorted函数原理解析及练习
Feb 10 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
Python循环之while无限迭代
Apr 30 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
PHP运行模式汇总
2016/11/06 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
详解JavaScript函数绑定
2013/08/18 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
win7安装python生成随机数代码分享
2013/12/27 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python3获取当前目录的实现方法
2019/07/29 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
python+requests接口自动化框架的实现
2020/08/31 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
软件工程师面试题
2012/06/25 面试题
高中生的自我鉴定范文
2014/01/24 职场文书
总结表彰大会主持词
2014/03/26 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
活动总结书
2014/05/08 职场文书
春节超市活动方案
2014/08/14 职场文书
聘任证明怎么写
2015/03/02 职场文书
主婚人致辞精选
2015/07/28 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL