432 字
2 分钟
PyTorch 释放占用的多余内存
前言
最近我在尝试通过 PyQt 和 Yolo 做一个桌面端的检测工具。
我通过一个按钮控制 QThread 多线程的开启和关闭,这个线程的主要工作就是在不影响界面操作的同时通过 Yolo 进行目标检测。
问题描述
我通过 VsCode 的调试模式打开程序文件时,发现本应关闭的线程并没有被关闭:
每次新建的线程,在关闭后,仍然在运行中,并且占用的内存并没有被释放:
解决方法
彻底关闭线程(失败)
首先,我先尝试去彻底关闭线程:
qThread.stop() # 通过标志位关闭线程qThread.quit() # 关闭线程qThread.wait() # 等待线程关闭del qThread # 删除线程
通过这套标准的 QThread 线程关闭下来,正常的线程应该是要被关闭的,但我的项目中并没有。
又尝试通过 qThread.terminate()
强制关闭,直接给我报错 段错误 (核心已转储)
。
解除内存占用(部分)
在上一步失败后,我意识到如果需要完全关闭线程,就需要通过先解除被 Yolo(Torch) 占用的内存。
这里感谢 Oldpan1 提供的方法。
import torchtorch.cuda.empty_cache() # 释放占用的内存
使用这个函数能释放大部分 Torch 占用的内存,但释放并不完全。
每次应该是只释放到掉了图像占用的内存资源,并没有把模型、参数这部分的资源释放掉,线程也没有关闭。
2022.02.06 我准备之后项目完成差不多之后在慢慢看…
Footnotes
PyTorch 释放占用的多余内存
https://fuwari.vercel.app/posts/编程/python/pytorch-释放占用的多余内存/