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下载Bing图片(代码)
Nov 07 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
python使用Tesseract库识别验证
Mar 21 Python
Python3实现的简单验证码识别功能示例
May 02 Python
Python3之简单搭建自带服务器的实例讲解
Jun 04 Python
Python WEB应用部署的实现方法
Jan 02 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
Python项目跨域问题解决方案
Jun 22 Python
python实现人性化显示金额数字实例详解
Sep 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
牡丹941资料
2021/03/01 无线电
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
python安装后的目录在哪里
2020/06/21 Python
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
人力资源经理自我评价
2014/01/04 职场文书
三八节主持词
2014/03/17 职场文书
房产电话营销开场白
2015/05/29 职场文书
工作简历的自我评价
2019/05/16 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android