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 获取本机ip地址的两个方法
Feb 25 Python
python开发之文件操作用法实例
Nov 13 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
Django入门使用示例
Dec 12 Python
Django框架实现逆向解析url的方法
Jul 04 Python
Django时区详解
Jul 24 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
Python的历史与优缺点整理
May 26 Python
Python Selenium自动化获取页面信息的方法
Aug 31 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连mysql和oracle数据库性能比较
2006/10/09 PHP
在IIS上安装PHP4.0正式版
2006/10/09 PHP
pdo中使用参数化查询sql
2011/08/11 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
php查看当前Session的ID实例
2015/03/16 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
Python实现时间序列可视化的方法
2019/08/06 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
struct和class的区别
2015/11/20 面试题
网络编辑职责
2014/03/01 职场文书
房屋买卖委托公证书
2014/04/08 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
服务口号大全
2014/06/11 职场文书
个人授权委托书模板
2014/09/14 职场文书
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript