这类问题我又碰上了一次。在 12G 的 4070 上用 ComfyUI 跑 SDXL 出 1024x1024,采样到第三步就报 Allocation on device 0 would exceed allowed memory,把 batch 设成 2 更容易复现。
第一反应是「vae 解码阶段峰值比采样阶段更高」,验证下来不成立。
排查方向其实有限,先把可能性排一排。SDXL 的 fp16 权重加文本编码器已占大半显存;同时开了 refiner 与放大模型,两份权重常驻;没开显存优化参数,中间激活全部保留。
动手时先看启动参数有没有低显存选项
python -c "print({'--lowvram':True,'--medvram':False})"
再往下换 fp8 精度并限制分辨率
python -c "print({'dtype':'fp8_e4m3fn','size':832})"
接着分阶段执行 先出图再单独放大
python -c "print({'stage':['base','upscale']})"
采样后及时卸载文本编码器
python -c "print({'unload_models':True,'vae_tiling':True})"
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
改完先别撤,确认这几项。1024 图能连续出十张不报错,显存峰值低于 11G,单张耗时增加不超过两成。
补一句。显存峰值往往出现在解码而不是采样,开 vae 分块与模型卸载比一味降分辨率更划算。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
