pytorch在kill主进程后无法释放显存的问题

PyTorch程序在结束或被强制杀死后,有时无法释放显存,这可能由于多进程模式下子进程成为僵尸进程导致。解决方法包括使用特定命令找出并kill占用显存的僵尸进程,特别是通过匹配.py文件名来定位。在极端情况下,可能需要重启系统来彻底解决无法清除的僵尸进程。
摘要由CSDN通过智能技术生成

同事写的pytorch程序最近有点奇怪,程序运行结束/强制杀死后,占用的显存没能正常释放。这是怎么一回事呢?

在pytorch论坛搜到以下的信息:https://discuss.pytorch.org/t/pytorch-doesnt-free-gpus-memory-of-it-gets-aborted-due-to-out-of-memory-error/13775/13

就是说:多进程模式下的pytorch程序有个别版本会有这个bug:已经kill了主进程,可是子进程却没有kill掉,成了僵尸进程。

而且这些进程通过nvidia-smi是无法查看的T_T

怎么kill这些进程呢?首先要确定进程号,运行指令:

fuser -v /dev/nvidia*

即可查看所有占用了显存的进程。

然后找到需要干掉的僵尸进程,为了避免误杀那些还在运行的进程,可以选出需要干掉的进程中特有的关键词,比如.py文件的名称train_imagenet.py这种,然后运行以下指令:

ps -ef | grep train_imagenet | grep -v grep | cut -c 9-15 | xargs kill -9

理论上说,这些僵尸子进程就能被干掉了。

当然,凡事皆有例外。有时候,我们会碰到怎么kill -9也干不掉的僵尸进程。。。这时可能需要reboot一下了。

在使用PyCharm编写程序时,有时候会遇到程序已经结束,但是GPU的显存并没有被释放的情况。这可能是因为PyCharm使用了多线程进行数据读取,但实际上是通过开启多个子进程来模拟多线程工作。当主进程被终止时,子进程的GPU显存并不会被自动释放,需要手动一个一个地杀掉这些子进程才能释放显存。 具体的方法可以按照以下步骤进行操作: 1. 找到正在运行的子进程的PID。可以使用命令" fuser -v /dev/nvidia*|awk -F" "'{print $0}' > /tmp/pid.file "来获取这些PID。 2. 使用命令" while read pid ; do kill -9 $pid; done < /tmp/pid.file "来强制杀掉这些子进程。 3. 这样就可以逐个杀掉子进程,从而释放GPU显存。 需要注意的是,这个方法只适用于使用PyTorch设置多线程进行数据读取的情况。如果是其他情况导致的显存释放问题,可能需要根据具体的情况采取相应的解决方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [解决GPU显存无法释放问题](https://blog.csdn.net/m0_48898914/article/details/121746197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值