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中的wxPython实现最基本的浏览器功能
Apr 14 Python
Python删除windows垃圾文件的方法
Jul 14 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
使用python将请求的requests headers参数格式化方法
Jan 02 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
python中mongodb包操作数据库
Apr 19 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创建Cookie数组的详解
2013/07/03 PHP
PHP循环结构实例讲解
2014/02/10 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
jquery一般方法介绍 入门参考
2011/06/21 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
jquery easyui使用心得
2014/07/07 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
日期和时间问题
2015/01/04 面试题
计算机应用毕业生自荐信
2013/10/23 职场文书
视光学专业毕业生推荐信
2013/10/28 职场文书
《燕子》教学反思
2014/02/18 职场文书
人民调解员培训方案
2014/06/05 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
检讨书模板大全
2015/05/07 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
党课主持词大全
2015/06/30 职场文书
消费者理赔投诉书
2015/07/02 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
导游词之贵州织金洞
2019/10/12 职场文书