提升 Stable Diffusion 显卡性能的系统化做法
一 基础环境与驱动
- 更新到与显卡匹配的 NVIDIA/AMD 驱动,避免兼容性与性能回退;确保 CUDA/cuDNN 与 PyTorch 版本匹配,建议优先使用 PyTorch 2.x + cu118/cu124 的稳定组合。
- 在 Python 中快速自检:
- import torch; print(torch.version.cuda); print(torch.backends.cudnn.version()); print(torch.cuda.get_device_name(0))
- 启用 TF32(Ampere 及以上):torch.backends.cuda.matmul.allow_tf32 = True(在不明显牺牲质量的前提下提升吞吐)。
- 笔记本注意散热与功耗墙,必要时启用“高性能电源计划”,避免生成过程中因温度降频导致速度骤降。
二 推理引擎与注意力优化
- 启用 xFormers 高效注意力(大幅降低显存占用并提升 it/s):
- WebUI(AUTOMATIC1111):在启动参数加入 --xformers;若遇到兼容问题,可改用 --opt-sdp-attention。
- Diffusers:pipe.enable_xformers_memory_efficient_attention()。
- 使用 SDP 注意力 作为备选:--opt-sdp-attention(部分环境较 xFormers 更稳定)。
- 采用 channels_last 内存布局:--opt-channelslast,提升卷积与注意力内核效率。
- 容器化场景(Docker/ComfyUI):确保 NVIDIA Container Toolkit 正确配置,并在 compose 中传入加速参数(如 --xformers --medvram)。
三 精度与模型编译加速
- 混合精度 FP16/BF16:UNet/文本编码器使用 FP16 通常可提速 30%~80% 并显著降显存;在 PyTorch 中用 AMP 或在 Diffusers 中直接指定 torch_dtype=torch.float16。
- 仅在 H100 等支持 FP8 的硬件上使用 Transformer Engine 的 FP8 训练/推理,吞吐可进一步跃升。
- 生产级加速链路:TorchScript + ONNX + TensorRT
- 将 UNet 导出为 ONNX,再用 TensorRT 编译为 .engine;实测在 512×512 分辨率下可从约 1.2 it/s 提升到 3.8 it/s,显存占用下降约 30%。
- 第三方推理引擎:如 OneDiff,在多项优化组合下对 SDXL 的速度表现突出,可作为 xFormers/TensorRT 的有力替代或补充。
四 显存不足时的专项优化
- VAE 切片解码:将隐空间分块解码,显存占用可从约 10 GB 降至 3 GB,画质基本无损(代价是解码时间略增)。
- 梯度检查点(训练/微调):用重计算换显存,节省约 30%~50%。
- ZeRO + CPU Offload(训练/微调):权重/优化器状态分片并卸载至 CPU,节省 60%+ 显存。
- WebUI 显存模式:
- --medvram:适合 4–8 GB 显存显卡;
- --lowvram:适合 ≤4 GB 显存;
- ≥10 GB 显存建议移除 --medvram 获取最佳性能。
- 极端场景可用 CPU 渲染 或 ComfyUI 的 offload_to_cpu 节点 作为兜底(速度很慢,仅应急)。
五 参数设置与采样策略
- 分辨率优先:从 1024×1024 降到 768×768/512×512 可显著减少计算量;高分辨率更适合 TensorRT/OneDiff 等优化路径。
- 采样步数:多数场景 20–35 步 已足够;步数继续增加收益递减。
- CFG Scale:建议 7–12;过高会引入伪影并拖慢速度。
- 采样器选择:优先 Euler a、DPM++ 2M Karras 等高效采样器,在速度与质量间取得平衡。
- 批量与吞吐:在显存允许下优先提高 Batch Size 而非 Batch Count,以提升 GPU 利用率与总体吞吐。
- 稳定性优先:若出现黑屏/报错,可临时关闭 xFormers 或改用 --opt-sdp-attention;必要时禁用 半精度 VAE(--no-half-vae) 排查兼容性。