432 字
2 分钟
PyTorch 释放占用的多余内存
2022-02-06

前言#

最近我在尝试通过 PyQt 和 Yolo 做一个桌面端的检测工具。

我通过一个按钮控制 QThread 多线程的开启和关闭,这个线程的主要工作就是在不影响界面操作的同时通过 Yolo 进行目标检测。

问题描述#

我通过 VsCode 的调试模式打开程序文件时,发现本应关闭的线程并没有被关闭:

每次新建的线程,在关闭后,仍然在运行中,并且占用的内存并没有被释放:

解决方法#

彻底关闭线程(失败)#

首先,我先尝试去彻底关闭线程:

qThread.stop() # 通过标志位关闭线程
qThread.quit() # 关闭线程
qThread.wait() # 等待线程关闭
del qThread # 删除线程

通过这套标准的 QThread 线程关闭下来,正常的线程应该是要被关闭的,但我的项目中并没有。

又尝试通过 qThread.terminate() 强制关闭,直接给我报错 段错误 (核心已转储)

解除内存占用(部分)#

在上一步失败后,我意识到如果需要完全关闭线程,就需要通过先解除被 Yolo(Torch) 占用的内存。

这里感谢 Oldpan1 提供的方法。

import torch
torch.cuda.empty_cache() # 释放占用的内存

使用这个函数能释放大部分 Torch 占用的内存,但释放并不完全。

每次应该是只释放到掉了图像占用的内存资源,并没有把模型、参数这部分的资源释放掉,线程也没有关闭。

2022.02.06 我准备之后项目完成差不多之后在慢慢看…

Footnotes#

  1. 再次浅谈Pytorch中的显存利用问题(附完善显存跟踪代码)

PyTorch 释放占用的多余内存
https://fuwari.vercel.app/posts/编程/python/pytorch-释放占用的多余内存/
作者
Asuwee
发布于
2022-02-06
许可协议
CC BY-NC-SA 4.0