解决GPU显存未释放问题
前言
今早我想用多块GPU测试模型,于是就用了PyTorch里的torch.nn.parallel.DistributedDataParallel来支持用多块GPU的同时使用(下面简称其为Dist)。
程序运行时,由于程序中其他部分的代码(与Dist无关的代码)出现了错误,导致程序退出。这次使用Dist时没有考虑和处理这种程序崩溃的情况,因此在程序退出前没有用Dist关闭生成的所有进程,最终导致本次进程运行后GPU显存未释放(经观察,发现是由于没有用Dist关闭所有进程,导致程序运行后还有一部分进程在运行)。
下面介绍这次我解决该问题的过程。
正文
MVE
Minimal Verifiable Examples,关于本问题的程序代码如下:
import torch.distributed as dist
# 一些代码:定义model等
some code
# 初始化并行训练
dist.init_process_group(xxxx) # 函数参数省略
model = torch.nn.parallel.DistributedDataParallel(model, find_unused_parameters=True)
# 一些代码:训练、测试模型等
some code # 我的程序在这个部分出错且程序直接退出,导致下面的关闭进程的代码没有运行
# 关闭所有进程
dist.destroy_process_group()
问题的出现
如下图所示,程序退出后,并没有进程在使用0号GPU,但0号GPU的显存却被占用。原因是程序退出前没有用Dist关闭所有进程,一部分进程还在运行,这些进程占用0号GPU的显存。
占用7号GPU的进程是我的另外一个进程,与本文讨论的问题无关。

定位占用GPU显存的PID
执行下面的指令
fuser -v /dev/nvidia*
该命令执行后得到下图所示的结果,可以看到是PID为285448的进程占用了0号GPU。
下面的图中忘记打了马赛克,后来用黑色遮挡了一下信息,所以USER这一列是看起来是空的。

执行下面这条命令,查看该进程的信息,可以发现该进程的PPID(其父进程的PID)是1,说明该进程不是我占用7号GPU的进程生成的,并且现在只有它在使用0号GPU。可以推断出这个进程是因为程序运行错误导致其没有被关闭,因此可以手动关闭该进程。
ps -f -p 285448
下面的图中忘记打了马赛克,后来用黑色遮挡了一下信息,所以图中的路径不是很清晰。

先后执行下面这两条命令,杀掉该进程,再查看GPU情况,可以看到0号GPU的显存已经被释放,现在的GPU显存占用情况是正常的。
kill -9 2885448
nvidia-smi

作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!
解决GPU显存未释放问题的更多相关文章
- 解决矩池云GPU显存未释放问题
很多用户反馈说终止程序之后,显存依然被占用,这里我们提供了两种解决方案,帮助用户解决这个问题. nvidia-smi查看 我们可以先用如下命令 nvidia-smi 查看一下当前GPU进程情况. _ ...
- ubuntu服务器常见使用技巧及-kill掉后GPU显存不释放进程-
如何解决python进程被kill掉后GPU显存不释放的问题 1 重新开一个shell,然后输入: ps aux|grep user_name|grep python.所有该用户下的python程序就 ...
- Ubuntu-Tensorflow 程序结束掉GPU显存没有释放的问题
笔者在ubuntu上跑Tensorflow的程序的时候,中途使用了Win+C键结束了程序的进行,但是GPU的显存却显示没有释放,一直处于被占用状态. 使用命令 nvidia-smi 显示如下 两个GP ...
- GPU 显存释放
我们在使用tensorflow 的时候, 有时候会在控制台终止掉正在运行的程序,但是有时候程序已经结束了,nvidia-smi也看到没有程序了,但是GPU的内存并没有释放,那么怎么解决该问题呢? 首先 ...
- (原)tensorflow中使用指定的GPU及GPU显存
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6591923.html 参考网址: http://stackoverflow.com/questions ...
- tensorflow中使用指定的GPU及GPU显存
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本文目录 1 终端执行程序时设置使用的GPU 2 python代码中设置使用的GPU 3 设置tensorflow使用的显 ...
- gpu显存(全局内存)在使用时数据对齐的问题
全局存储器,即普通的显存,整个网格中的随意线程都能读写全局存储器的任何位置. 存取延时为400-600 clock cycles 很easy成为性能瓶颈. 訪问显存时,读取和存储必须对齐,宽度为4B ...
- 查找和杀掉占用GPU显存的进程
用只有2个G的显卡跑数据就需要在训练之前先把无关进程杀掉,防止跑到一半显存满了 nvidia-smi:显示当前GPU中的线程 kill -9 PID:输入PID以结束线程
- GPU显存释放
一.当程序没有运行,但GPU仍被占用, 可通过nvidia-smi查看,被占用的pid是什么 或通过sudo fuser -v /dev/nvidia* #查找占用GPU资源的PID 然后采用kill ...
随机推荐
- Sublime Text3 旧版本下载以及破解激活方式
前言 当前Sublime Text3 出到了32**版本,以前直接输入激活码的方法已经不能使用. 而官网又不提供旧版本的下载链接,因此在此分享旧版本下载方式以及激活方式. 下载方法 通过下面这个链接下 ...
- flask-restful 初探
flask-restful 是 Flask 的一个用于支持 RESTful 的插件. 刚开始用对我来说还是比较坑的... 目录结构 / /test /test/common /__init__.py ...
- Spring的工作原理
一.什么是Spring (1).Spring真正的精华是它的Ioc模式实现的BeanFactory和AOP,它自己在这个基础上延伸的功能有些画蛇添足. (2). Spring它是一个开源的项目,而且目 ...
- JavaScript实现队列结构(Queue)
JavaScript实现队列结构(Queue) 一.队列简介 队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out). 受限之处在于它只允许在表的前端(front) ...
- 我的webpack学习笔记(二)
前言 上一篇文章我们讲了多页面js的打包,本篇文章我们继续scss的打包. 多页面css单独打包 首先,我们css编写采用的是sass,所以我们先来安装sass-loader以及可以用到的依赖 $ n ...
- 【线上测试之后的应用】基于MySQL+MHA+Haproxy构建高可用负载均衡数据库集群(详解)
这里我们先介绍一下MHA是什么,其次就是它的应用与测试,同时为了大家呈现了数据备份案例,最后总结了使用情况以及注意事项和解决办法 一.MHA 概述 MHA(Master High Availabili ...
- intel硬件视频加速介绍
目录 硬件视频加速技术 intel 硬件加速技术 intel 的开源媒体栈 VA-API 安装 样例 Intel Quick Sync(QSV) API支持情况 vaapi/mfx比较 安装 样例 硬 ...
- Delphi XE XML信息的读取
<?xml version=""?> <ConString> <Item> <Name/> <Type>C</Ty ...
- cocoapods安装以及ZXingObjC的安装
因为项目要用到第三方包ZXingObjC,需要安装cocoapods.下面是我曲折的安装过程. 1.直接在终端内输入: sudo gem install cocoapods 我直接安装成功. 由于国内 ...
- JS数组遍历方法集合
就让我们在逆战中成长吧,加油武汉,加油自己 1.for循环 使用零时变量将长度存起来,当数组较大时优化效果才会比较明显. var ar1=[2,4,6,8] for(var i=0;i<ar1. ...