You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在使用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库提供了两种内存优化的注意力方式,选其中一种就行:

    1. XFormers(推荐):如果你的环境能安装XFormers(需要对应版本的PyTorch),启用它能大幅降低注意力层的显存占用,还能加快生成速度。启用代码:
      pipe.enable_xformers_memory_efficient_attention()
      
    2. 注意力切片(无需额外安装):如果装不了XFormers,用注意力切片也能缓解显存压力,只是速度会稍慢一点:
      pipe.enable_attention_slicing()
      
  • 启用梯度检查点
    这个方法会牺牲一点生成速度来换取显存节省,适合显存刚好卡线的情况,只需要加一行代码:

    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,提问作者范姜伯軒

火山引擎 最新活动