如何在使用HuggingFace Diffusers运行Stable Diffusion时降低GPU内存占用?
如何在使用HuggingFace Diffusers运行Stable Diffusion时降低GPU内存占用?
兄弟,我之前用RTX3060(12GB)跑Stable Diffusion的时候也碰到过一模一样的CUDA内存不足问题,默认配置确实容易爆显存,给你几个亲测有效的优化方法,一步步调整就行:
使用FP16半精度加载模型
这是最立竿见影的优化,默认的FP32精度会占用双倍显存,改成FP16能直接砍掉近一半的显存占用。只需要在加载模型的时候指定torch_dtype=torch.float16,然后把模型移到CUDA上就行。修改后的代码片段:from diffusers import StableDiffusionPipeline import torch # 加载模型时指定FP16精度 pipe = StableDiffusionPipeline.from_pretrained( "CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16 ).to("cuda")启用内存高效的注意力机制
Diffusers库提供了两种内存优化的注意力方式,选其中一种就行:- XFormers(推荐):如果你的环境能安装XFormers(需要对应版本的PyTorch),启用它能大幅降低注意力层的显存占用,还能加快生成速度。启用代码:
pipe.enable_xformers_memory_efficient_attention() - 注意力切片(无需额外安装):如果装不了XFormers,用注意力切片也能缓解显存压力,只是速度会稍慢一点:
pipe.enable_attention_slicing()
- XFormers(推荐):如果你的环境能安装XFormers(需要对应版本的PyTorch),启用它能大幅降低注意力层的显存占用,还能加快生成速度。启用代码:
启用梯度检查点
这个方法会牺牲一点生成速度来换取显存节省,适合显存刚好卡线的情况,只需要加一行代码:pipe.enable_gradient_checkpointing()避免批量生成,单次只生成1张图
如果你的代码里设置了num_images_per_prompt大于1,改成1试试,批量生成会成倍增加显存占用,12GB显存单次生成1张FP16的图基本是没问题的。清理显存缓存
有时候之前的操作残留的显存缓存也会导致爆显存,可以在加载模型前加一行清理代码:torch.cuda.empty_cache()
把这些方法组合起来,12GB的RTX3060跑Stable Diffusion v1-4完全没问题,我自己这么调整后再也没碰到过显存不足的情况。
备注:内容来源于stack exchange,提问作者范姜伯軒




