
AttributeError: ‘VAE’ object has no attribute ‘patcher’
快速结论:此报错通常发生在 ComfyUI 加载没有可识别 VAE 权重的检查点(如 Flux、Qwen 等 UNET-only 模型)时,且启用了 `–cache-ram` 模式。优先排查是否加载了不包含 VAE 权重的模型文件。
问题场景
用户在 ComfyUI 中加载任何检查点(例如来自 black-forest-labs/FLUX.2-small-decoder 的 full_encoder_small_decoder.safetensors)时触发。该检查点不包含可识别的 VAE 权重,导致 ComfyUI 的 VAE 初始化失败。当用户运行第二个提示词时,RAM 缓存压力释放功能(RAMPressureCache.ram_release)在扫描缓存输出时抛出异常。
报错原文
AttributeError: 'VAE' object has no attribute 'patcher'
完整 Traceback(部分):
File "D:\ComfyUI\comfy\sd.py", line 1258, in is_dynamic
return self.patcher.is_dynamic()
^^^^^^^^^^^^
AttributeError: 'VAE' object has no attribute 'patcher'
原因分析
这是 #14799 提交引入的功能与 VAE 早期返回路径之间的交互问题。具体机制如下:
#14799在comfy/sd.py中新增了VAE.is_dynamic()方法,该方法直接调用self.patcher.is_dynamic(),隐含假设self.patcher始终存在。- 但
VAE.__init__在检测到无法识别为 VAE 的状态字典时,会提前返回(early-return),此时self.patcher尚未被赋值(在后续代码行 L937 才被创建)。该 VAE 对象虽然不完整,但仍被返回给工作流并存储在输出缓存中。 - 当使用
--cache-ram模式时,每个节点执行后都会触发RAMPressureCache.ram_release,它会遍历所有缓存输出并调用all_outputs_dynamic。虽然代码通过hasattr(output, "is_dynamic")检查方法是否存在(方法确实存在),但调用时self.patcher不存在,导致AttributeError传播并终止prompt_worker线程。
重要说明:即使 VAE 输出端口未连接,CheckpointLoaderSimple 也会从检查点的状态字典中构造 VAE 对象。因此,加载任何不包含 VAE 权重的检查点(如 Qwen、FLUX 等 UNET-only 模型)都足以触发此错误。
环境排查
- 确认 ComfyUI 版本:建议检查是否在 2026 年 7 月 5 日之后(#14799 合并后)的版本。
- 确认是否启用了
--cache-ram启动参数(这是默认缓存模式)。 - 确认是否加载了提示
WARNING: No VAE weights detected, VAE not initalized.的模型文件。 - 确认 Python 版本(报错中显示为 3.13)。
解决步骤
-
可优先尝试的修复方案:更改
comfy/sd.py中is_dynamic方法,使用getattr进行安全检查:def is_dynamic(self): patcher = getattr(self, "patcher", None) return patcher is not None and patcher.is_dynamic() -
替代方案:在 VAE 的早期返回路径中设置
self.patcher = None,并在is_dynamic方法中添加None检查。 -
临时回避方案:降级到 2026 年 7 月 5 日的 Nightly 版本(在
#14799之前),但此方案不推荐,因为会丢失后续重要更新。
注意:不要简单地使用全局 try/except 包裹 ram_release,因为失败的缓存清除会导致 RAM 无限增长,直到操作系统 OOM 终止进程。
验证方法
应用修复后,重新运行包含不检测 VAE 权重的检查点的工作流,然后执行第二个提示词,观察是否不再出现 AttributeError: 'VAE' object has no attribute 'patcher' 错误。如果之前因该错误导致进程崩溃,修复后应能正常运行。建议同时监控任务管理器中的内存使用情况,确认 RAM 不再无限增长。



