发现全球最佳 AI 工具

从零教你部署与精通,掌握实战变现工作流

Stable Diffusion 黑图与显存溢出终极排障指南封面图

Stable Diffusion 黑图 / 爆显存终极排障指南

这是一篇面向 Stable Diffusion WebUI 用户的故障排查长文,核心解决黑图、绿图、VAE NaN、CUDA Out of Memory 和 xFormers 兼容性问题。文章采用“先做基线、再分层排障”的写法,兼顾新手能照着做、老手能快速定位。

Stable Diffusion 黑图 / 爆显存终极排障指南

从 WebUI 参数、VAE、xFormers 到 CUDA 环境,一次讲清楚最常见的黑图、NaN 与显存溢出问题。

文档定位
图文实战版|适合 Stable Diffusion 新手与本地部署用户
适用范围
AUTOMATIC1111 / 常见整合包 / Windows 为主,亦可迁移到 Linux
核心问题
黑图、绿图、灰图、VAE NaN、CUDA Out of Memory、xFormers 异常
阅读收益
先判断症状,再按优先级修复,减少反复重装和无效折腾

导读

Stable Diffusion 的“黑图”与“显存溢出”,看起来像两个问题,实则经常是同一条链路上的不同表现:模型、VAE、注意力后端、半精度、分辨率、扩展插件和 CUDA 环境一起叠加后,最终要么直接报错,要么勉强跑完却只输出一张黑图。

很多人一出问题就重装整套 WebUI,但真正高效的做法,是先把问题缩小成“最小可复现基线”:单模型、单 VAE、无 Hires.fix、无 ControlNet、Batch Size = 1。只要基线能跑,再逐个把功能加回去,故障点通常很快就会暴露。

这篇教程的核心结论 黑图优先排查半精度与 VAE:先试 –upcast-sampling,再试 –no-half-vae,最后才考虑 –no-half。 爆显存优先排查分辨率、Batch Size、Hires.fix 和附加模块;步骤数通常影响时间多于显存。 低显存卡先用 –xformers 或 –opt-sdp-no-mem-attention,再看是否需要 –medvram / –lowvram。 PyTorch 的 empty_cache() 不是万能药;如果是碎片化或版本错配,真正有效的往往是重启进程、清理扩展或重建 venv。

图 1|黑图 / 爆显存排障分流图

一、先判断:你遇到的到底是哪一类问题?

先别急着改一堆参数。下面这张表能帮你把故障快速归类。

症状最可能原因第一步动作
黑图 / 绿图显卡对 fp16 不稳定,或 VAE 里出现 NaN先加 –upcast-sampling;再试 –no-half-vae
立刻 OOM分辨率、Batch Size、Hires.fix 或扩展过重宽高回到 512-768 档,Batch Size = 1
更新后出错xFormers / Torch / CUDA 版本错配临时去掉 –xformers,必要时清 venv
只在某模型下异常Checkpoint / VAE / LoRA 组合问题换回已知正常模型做基线测试
连续跑久了才炸缓存碎片、扩展泄漏、长期占用未释放重启 WebUI,再考虑 allocator 调优

二、黑图的 4 个高频根因:为什么它能“生成完成”却什么都没有?

1)半精度不兼容:最常见,也最容易被误判成模型坏了

在部分显卡上,fp16 路线并不稳定,结果就是进度条跑完、显存也动了,但输出是一整张黑图、绿图或灰块。AUTOMATIC1111 的故障排查页直接给出的第一条方向,就是先尝试 –upcast-sampling;如果还不行,再提升到 –precision full –no-half,不过后者会明显增加显存占用。

经验上,更稳妥的顺序是:–upcast-sampling → –no-half-vae → –no-half。因为很多问题其实只发生在 VAE 阶段,直接把整个推理链路都切成全精度,代价往往太大。

2)VAE 出现 NaN:看起来像模型崩了,本质却常常是解码阶段翻车

当控制台出现“A tensor with all NaNs was produced in the VAE”一类提示时,说明模型前面可能还在正常推理,但在 VAE 解码时数值爆掉了。这类问题可能来自模型本身、模型合并、VAE 不匹配,或者显卡 / 算子对 fp16 支持不佳。

此时 –disable-nan-check 只能帮助你确认问题,不是修复手段。更实用的动作,是先换回已知正常的 checkpoint 与 VAE,再逐个撤掉 LoRA、ControlNet 和后处理模块。

3)注意力后端或 xFormers 版本错配:更新后突然坏,大多不是“玄学”

如果你之前一直正常,更新 WebUI、Torch、CUDA、显卡驱动或 xFormers 之后突然开始黑图、报 no kernel image 或随机异常,优先怀疑版本兼容性。

最简单的验证法不是继续叠参数,而是先去掉 –xformers,用默认路径跑一轮;如果恢复正常,再决定是重装 xFormers,还是改回 WebUI 提供的另一条注意力优化路线。

4)环境脏了:旧扩展、旧缓存、旧 venv 混到一起

长期使用整合包的人,最容易忽略的一件事是:同一个目录里可能已经积了多轮升级残留、旧扩展和不兼容依赖。控制台明明写着 CUDA OOM,真正的问题却可能是扩展重复吃显存,或者老版本 wheel 没被彻底替换。

当你无法确认到底是模型、参数还是环境时,最有价值的操作是做一次“干净启动”:临时禁用扩展、换回官方推荐参数、必要时删除 venv 重建。

:: Windows 用户可先在 webui-user.bat 里尝试这一组保守参数
set COMMANDLINE_ARGS=–xformers –upcast-sampling –no-half-vae –medvram

上面这组不是“最强性能配置”,但对于 6GB 及以下显存、或容易出黑图的老卡来说,通常是一个更稳的起点。

三、显存溢出的真正罪魁祸首:别把精力都浪费在“步骤数”上

很多新手看到 OOM,会先把采样步数从 30 改到 20。但对显存来说,更应该优先动的是下面这些项目。

项目对显存影响更实用的建议
分辨率 / 宽高极高先把长边控制在 512-768 档,确认稳定后再逐步加大
Batch Size极高优先设为 1;需要多图时尽量提高 Batch Count 而非 Batch Size
Hires.fix黑图 / OOM 时先关掉,先在基础尺寸上跑通
ControlNet / ADetailer / 面修逐个开启,别一上来全叠上
模型体量(如 SDXL)先用更轻的模型做基线,确认环境没问题
xFormers / SDP 优化缺失中高补上 –xformers 或 –opt-sdp-no-mem-attention
Steps主要影响速度与收敛,不是最优先的显存开关

图 2|显存优化优先级路径图

四、真正好用的“终极方案”:按这 5 步排,不走弯路

第 1 步:先做最小可复现基线

只保留一个已知正常的 checkpoint 与 VAE,关闭 Hires.fix、ControlNet、ADetailer、面部修复、脚本与多数扩展。

分辨率先放回 512×512、512×768 或 768×512;Batch Size = 1;Batch Count 可先设 1-4。

第 2 步:优先修黑图,不要一上来就 no-half

先加 –upcast-sampling。

如果控制台出现 VAE NaN,或旧卡依旧异常,再加 –no-half-vae。

只有前两步都失败,才上 –precision full –no-half;同时准备接受更高显存占用,并视情况搭配 –medvram。

第 3 步:优先修 OOM,先关最重的功能

先砍分辨率,再看 Batch Size,再关 Hires.fix 和附加模块。

如果显存本来就很紧,先试 –xformers 或 –opt-sdp-no-mem-attention;4GB 左右显存再考虑 –medvram / –lowvram。

第 4 步:怀疑环境时,先做“干净重启”,再做“干净重装”

退出 WebUI,清掉后台占显存的软件,重新启动一次。

问题仍在时,临时禁用扩展;再不行就删除 venv 让环境重建,而不是盲目覆盖安装。

第 5 步:最后再动 allocator 和高级变量

如果你已经确认不是模型、不是分辨率、不是扩展,而是长时间运行后才 OOM,可以把 PyTorch allocator 调优作为“最后一手”。

这类设置更像手术刀,不是万金油;有些机器会改善碎片化,有些机器只会变慢。

高级用户才建议尝试的 allocator 设置 PyTorch 新文档中推荐使用 PYTORCH_ALLOC_CONF;PYTORCH_CUDA_ALLOC_CONF 只是兼容旧写法。 max_split_size_mb 适合怀疑“内存碎片化”的场景,但官方明确把它描述为 last resort。 如果你只是单次高分辨率任务 OOM,先降分辨率、关扩展,通常比改 allocator 更直接。
:: 仅在确认存在碎片化、且反复长跑后才 OOM 时再尝试
set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
:: 或者新写法
set PYTORCH_ALLOC_CONF=max_split_size_mb:128
 

五、很多人容易踩的 6 个误区

误区 1|一黑图就直接 no-half

no-half 常常能绕过问题,但它不是最低成本方案;不少情况只需要 no-half-vae。

误区 2|OOM 先降 steps

步数影响更多是时间,而不是最优先的显存开销。

误区 3|Batch Count 和 Batch Size 一样伤显存

真正更吃显存的是并行生成的 Batch Size。

误区 4|empty_cache() 能把当前任务也救回来

PyTorch 文档明确指出,它释放的是未使用缓存,对已被张量占用的显存无能为力。

误区 5|某个模型能跑,说明环境一定没问题

环境错配并不一定会让所有模型都报错;重模型、某些 VAE 或扩展路径更容易先暴露问题。

误区 6|重装等于解决

如果不先做基线测试,你很可能只是把原来的问题打包迁移到新目录。

FAQ

Q1:GTX 10 系 / 16 系更容易黑图吗?

相对更容易踩到半精度相关问题。按 WebUI 故障页的建议,优先尝试 –upcast-sampling,并视情况补 –no-half-vae。

Q2:我只有 4GB 显存,还能继续玩吗?

可以,但要接受速度下降。优先使用 –xformers 或 –opt-sdp-no-mem-attention,再配合 –medvram;不行再尝试 –lowvram。

Q3:为什么我把 Batch Size 调成 1 还是会爆显存?

因为分辨率、Hires.fix、ControlNet、ADetailer、模型体量和 no-half 都会继续拉高显存需求。Batch Size 只是第一层开关。

Q4:黑图和 NaN 一定是显卡坏了吗?

不一定。模型 / VAE 不匹配、扩展冲突、xFormers 版本不兼容都可能造成相似现象。

Q5:清 venv 值得做吗?

如果问题出现在升级、换 Python/Torch/CUDA 之后,非常值得。它常常比‘覆盖安装’更干净。

相关阅读

《本地部署入门:手把手带你下载 Stable Diffusion WebUI 整合包》

《小白必看:如何在 Windows / Mac 上配置 Python 与 GPU 加速环境》

《从零开始:使用 Flux 1.0 生成超写实摄影大片的参数指南》

《Midjourney v7 新功能详解:局部重绘与风格迁移实战》

资料参考(官方 / 一手资料)

AUTOMATIC1111 stable-diffusion-webui Wiki:Troubleshooting、Command Line Arguments and Settings

PyTorch 官方文档:CUDA semantics / Memory management / CUDA Environment Variables

Hugging Face Diffusers 官方文档:Reduce memory usage

xFormers 官方文档:memory-efficient attention 说明

Facebook
LinkedIn
Reddit
X
Email
WhatsApp
Telegram
Pinterest
Mix

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注