You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用diffusers时无法释放RAM的问题求助

解决diffusers模型使用后RAM无法完全释放的问题

问题背景

使用StableDiffusionPipeline并开启enable_sequential_cpu_offload()后,执行del(pipe)、gc.collect()和torch.cuda.empty_cache()无法完全释放RAM(从3.4GB降至3GB但无法清零),而llama-cpp-python模型可正常释放RAM。硬件为32GB RAM、GTX 960 4GB、Manjaro Linux系统。

可行解决方法

1. 逐个清理Pipeline的子组件

enable_sequential_cpu_offload()会将模型组件分散在CPU和GPU之间,仅删除pipe对象可能无法回收所有子模块的内存。需先手动删除各核心组件:

# 先删除pipe的各个子模块
del pipe.unet
del pipe.text_encoder
del pipe.vae
del pipe.tokenizer
del pipe.scheduler
# 再删除pipe本身
del pipe
# 强制垃圾回收
import gc
gc.collect()
# 清理CUDA缓存
torch.cuda.empty_cache()

2. 使用上下文管理器自动管理生命周期

用with语句创建Pipeline,上下文结束后会自动触发资源清理,减少引用泄漏的可能:

from diffusers import StableDiffusionPipeline

with StableDiffusionPipeline.from_pretrained("模型路径") as pipe:
    pipe.enable_sequential_cpu_offload()
    # 执行推理任务
    image = pipe("prompt").images[0]
    image.save("output.png")

# 上下文结束后自动销毁pipe,再执行清理
import gc
gc.collect()
torch.cuda.empty_cache()

3. 检查并清除隐式引用

确保没有其他全局变量、函数闭包或回调引用了Pipeline的任何部分。比如如果之前有类似encoder = pipe.text_encoder的赋值,需先删除这类引用:

# 若存在隐式引用,先删除
del encoder  # 假设encoder是引用了pipe子组件的变量
gc.collect()

4. 强制释放CPU张量

将所有模型组件移回CPU后再删除,确保CPU上的张量被正确回收:

pipe.unet.to("cpu")
pipe.text_encoder.to("cpu")
pipe.vae.to("cpu")
# 然后执行删除和回收步骤
del pipe.unet
del pipe.text_encoder
del pipe.vae
del pipe
gc.collect()
torch.cuda.empty_cache()

额外说明

  • numba.cuda.close()主要用于关闭CUDA设备上下文,对CPU RAM释放无帮助,无需使用。
  • 若仍有残留RAM占用,可通过ps或htop查看进程内存,确认是否为Python进程本身的内存碎片(Python的垃圾回收不会自动整理内存碎片,长期运行可能残留少量占用,重启进程可彻底解决)。

内容的提问来源于stack exchange,提问作者minto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:52:43