跑大图崩在最后一步:ComfyUI 的 VAE 解码显存算术(崩铁跑图) szthrk.cn

二十步采样,一路风平浪静,进度条走满的瞬间,终端里蹦出三行红色的 CUDA out of memory。更气人的是另一种情况——连报错都没有,图安安静静地出来了,纯黑。

很多人第一反应是显卡不行了,第二反应是买新卡。其实这两件事都轮不到。崩掉的不是采样,是收尾。

崩在城门口的漕船

打个比方。采样像漕运:粮船沿河道慢慢走,一段一段地挪,河道再窄,一次只过一条船,总能过去。KSampler 干的就是这个活——1024×1024 的图,在潜空间里只是 128×128 的一小块张量,二十步来来回回,显存波澜不惊。

VAE 解码是进城卸货。船到城门,一整船粮要在门口一次性倒出来:潜空间放大八倍变像素,通道数打回三,中间特征图在那一瞬间铺满显存。这笔账按分辨率平方涨——512×512 大概占 0.5G,1024×1024 顶到 2G,2048×2048 要 8G,4096×4096 就是 32G 上下。显卡扛得住采样,未必扛得住卸货。

所以排查大图崩溃,第一步永远是看终端最后一行停在哪个节点。停在 VAE Decode,问题在收尾;停在 KSampler,才轮到谈采样。定位错地方,参数拧一圈也是白拧。

黑图是另一桩案子

如果图出来了但全黑、发灰、色块斑驳,那不是显存的事,别往分块解码上使劲。这类案子有两个惯犯。

一个是 fp16 溢出。SDXL 原版 VAE 在 fp16 精度下解到高亮度区域容易算出 NaN,画面直接烧成黑块,GTX 16 系这类老卡尤其高发。解法是启动参数加 --fp32-vae,或者换社区修过的 fp16-fix 版 VAE 文件,两个都不行再把 CFG 往 6 到 8 的区间降一降。

另一个更冤:VAE 家族对不上号。拿 SD 的 VAE 去解 Flux 的潜空间,出来的是马赛克花图,跟信号不好的电视一个样。潜空间是各家自己的方言,解码器得配原厂翻译——Flux 用 ae.safetensors,SDXL 用 sdxl_vae,别混着来。

分块解码:把一船粮拆成蚂蚁搬家

Tiled 的思路很朴素:一次卸不完,就分批卸。潜空间被切成小方块,逐块送进解码器,算完一块再算下一块,显存峰值从"整图负载"降到"单块负载"。

切块有个讲究:每块不能只看自己。卷积靠周围的邻居才能算准边缘,所以每块会向外多借一圈数据当上下文,解完再把借来的裁掉。相邻两块的重叠地带,同一个像素会被算两次,按次数加权平均掉,拼接才不留痕。

ComfyUI 里默认 tile_size 512、overlap 64,这个组合对绝大多数卡是安全牌。块切得越小越省显存,但天空、皮肤这类平滑区域会浮起淡淡的格纹;overlap 压到 32 以下,块与块之间就开始现出细缝。代价是速度,大约慢一到三成——拿时间换显存,这笔账是划算的。

新版 ComfyUI 还有一层保险:解码 OOM 时会自动退回分块重试,多数人压根没察觉这一幕发生过。但自动兜底是最后一次机会,别把它当常规操作赌运气。

同一个节点,三种卡的活法

24G 往上的卡,平时确实无感。但 4096 的放大链路、批量四张、再挂一个放大模型同时驻留,照样能撞天花板。这类用户要改的不是节点,是工作流习惯:模型串着用,用完就卸,必要时插一个 Free Memory 节点清场,再加载下一家。

8G 到 16G 之间,是最常见的主战场。把 VAE Decode 直接换成 VAE Decode (Tiled),一次性了断;编码阶段也爆的话,VAE Encode 同步换 Tiled 版。模型层面从 --medvram 起步,能跑就别再降档——每降一档,速度都是断崖。

8G 以下,就得拿出过日子的心态精打细算。TAESD 这个只有十几 MB 的小解码器,做预览和草稿绰绰有余,成图阶段再换回完整 VAE 出片;tile_size 压到 256;启动加 --cpu-vae 让解码走内存;系统内存别少于 32G,否则模型往硬盘上换页,速度崩得比显存还快。

最后记一条动手顺序:先换节点,再动启动参数,最后才考虑换模型。大多数所谓显存不够,不过是峰值没人管——船还是那些船,把城门口的卸货方式改了,路就通了。