Stable Diffusion(以及绝大多数现代深度学习扩散模型)在运行时非常吃显存(GPU 内存),主要原因可以归纳为以下几个方面:
1. 模型本身参数量大
- Stable Diffusion 核心是一个 UDF(U-Net) + 文本编码器(如 CLIP) + VAE 的组合。
- 以 SD 1.5 为例:
- U-Net:约 860M 参数
- 在 float32 下,仅权重就约 3.4 GB
- 在 float16 下约 1.7 GB
- 若使用 SDXL、SD3、Flux 等更大模型,参数量和显存占用会进一步翻倍甚至更高。
2. 推理过程是“多次迭代”
不同于传统模型“一次前向就出结果”,Stable Diffusion 是逐步去噪:
- 通常要跑 20~50 步
- 每一步都要:
- 过一次 U-Net
- 保存中间激活值(feature maps)
- 这些中间激活值会临时占用大量显存
3. 高分辨率带来显存爆炸
显存占用与图像尺寸近似 平方关系:
- 512×512:相对可控
- 1024×1024:显存需求可能 4 倍
- 若开启高分辨率修复(Hires Fix),还会再生成一次大图
4. 批量生成(Batch Size)
- 一次生成多张图(batch size > 1)
- 显存几乎线性增长
- 例如 batch=4 可能直接吃掉 8–12 GB 显存
5. 额外模块和插件
实际使用中常开启:
- LoRA / Embedding
- ControlNet(额外一个网络)
- IP-Adapter
- 多个采样器缓存
- VAE 解码
这些都会叠加显存占用。
6. GPU 显存 vs 系统内存
- 模型计算必须在 显存 中完成
- 系统内存再大也没用(不能代替显存)
- 显存不足就会:
- 报错(CUDA out of memory)
- 或被迫用 CPU(极慢)
7. 为什么不能“小一点”?
- 降精度(fp16 / bf16)能省显存,但仍有下限
- 模型结构决定了必须保留大量中间状态
- 目前优化手段(如 xFormers、CPU offload)只是“缓解”,不是“消除”
简单总结
Stable Diffusion 吃显存,是因为:
大模型 + 多步迭代 + 高分辨率 + 中间激活 + 附加模块
共同导致的必然结果。
如果你愿意,我也可以:
- 告诉你 不同显卡能跑什么分辨率
- 或讲 如何省显存(实用技巧)