ComfyUI v0.33.1 在 PyTorch 2.6 环境中启动即退出,错误指向 torch.library.custom_op 无法解析 list[int] 参数。异常发生在 Python 导入阶段,尚未访问 GPU;使用 CPU 版 PyTorch 做最小对照即可确认解析差异。PyTorch 2.8 通过最小复现后,完整 CUDA 12.8 镜像又完成了 ComfyUI 启动、工作流执行和真实出图。
问题详情
故障环境使用 ComfyUI v0.33.1、comfy-kitchen==0.2.31 与 PyTorch 2.6.0。ComfyUI 载入量化算子时立即退出,主要调用链为:
File ".../comfy/quant_ops.py", line 23, in <module>
import comfy_kitchen as ck
File ".../comfy_kitchen/backends/eager/na.py", line 163, in <module>
@torch.library.custom_op("comfy_kitchen::na3d", mutates_args=())
File ".../torch/_library/infer_schema.py", line 58, in error_fn
ValueError: infer_schema(func): Parameter kernel_size has unsupported type list[int].
torch.library.custom_op 会根据 Python 函数的类型注解生成算子 schema。comfy-kitchen 0.2.31 注册 na3d 时使用以下签名:
@torch.library.custom_op("comfy_kitchen::na3d", mutates_args=())
def _op_na3d(
q: torch.Tensor,
k: torch.Tensor,
v: torch.Tensor,
kernel_size: list[int],
is_causal: list[bool],
scale: float | None,
) -> torch.Tensor:
...
Python 可以正常解析这些注解。异常来自 PyTorch 2.6 的 schema 推断器,因此 ComfyUI 会在模型加载和 GPU 初始化之前终止。
排查与原因
PyTorch 2.6 没有完整处理内置泛型
PyTorch 2.6 的 infer_schema.py 主要登记 typing.List[...] 形式。遇到 Python 3.9 以后常用的 list[int] 时,解析结果属于 GenericAlias,无法命中已登记类型,最终抛出 unsupported type list[int]。
PyTorch 2.8 增加了基于 typing.get_origin() 的泛型归一化,并把 list[...] 形式加入支持集合。相同函数签名因此可以生成 schema。
最小复现不需要 GPU
故障发生在装饰器执行和函数签名检查阶段。以下代码保留了触发问题所需的最小结构:
import torch
@torch.library.custom_op("probe::na3d", mutates_args=())
def na3d(x: torch.Tensor, kernel_size: list[int]) -> torch.Tensor:
return x
print("custom op registered")
CPU 环境的对照结果为:
| PyTorch | 结果 |
|---|---|
2.6.0+cpu | 失败:Parameter kernel_size has unsupported type list[int] |
2.8.0+cpu | 成功注册自定义算子 |
2.6 环境复现了与 GPU 容器相同的错误,说明最小用例覆盖了已知根因。2.8 通过只证明 schema 解析已经修复,无法单独证明 ComfyUI 全部依赖和 CUDA 运行时可用。
修改依赖源码不能形成稳定修复
把 list[int] 临时改写为其他注解只能处理当前一处签名。真实函数还包含 list[bool] 与 float | None,依赖升级或重新安装也会覆盖本地修改。
可维护的修复应统一兼容 PyTorch、TorchVision、TorchAudio、CUDA 或 ROCm 版本,再对真实 ComfyUI 导入链执行冒烟检查。
解决办法
1. 确认实际使用的 Python 与依赖版本
必须在 ComfyUI 真正使用的解释器中执行检查。Windows 便携版通常使用 python_embeded/python.exe,虚拟环境和容器则使用各自环境内的 python。
python -c "import sys, torch, importlib.metadata as m; print(sys.executable); print(torch.__version__); print(torch.version.cuda); print(m.version('comfy-kitchen'))"
只检查系统全局 Python 可能得到另一套依赖,无法说明 ComfyUI 的实际运行环境。
2. 安装匹配硬件的 PyTorch 2.8 发行包
CPU 环境可以使用:
python -m pip install --upgrade torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cpu
CUDA 12.8 环境可以使用:
python -m pip install --upgrade torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128
三个包需要使用官方对应版本。直接执行不带下载源的 pip install -U torch 可能安装 CPU 包或不匹配的 CUDA 变体,应根据 PyTorch 官方安装表选择索引。
容器镜像可以直接更换底座:
FROM pytorch/pytorch:2.8.0-cuda12.8-cudnn9-runtime
RTX 5090 属于 Blackwell SM_120,CUDA 12.8 才加入对应编译支持。本次环境同时从 PyTorch 2.6/CUDA 12.4 升级到 PyTorch 2.8/CUDA 12.8,用一次底座升级解决类型解析和显卡架构支持两项问题。其他显卡应选择与驱动兼容的官方构建,不能直接照搬 cu128。
3. 依次验证 schema、真实导入和实际工作流
先运行最小复现,确认输出:
custom op registered
随后在 ComfyUI 根目录检查真实依赖:
python -c "import torch; import comfy_kitchen; import comfy.quant_ops; print(torch.__version__); print('ComfyUI quant ops imported')"
最后启动 ComfyUI 并执行一份实际工作流。验收条件需要同时包含:
- 进程启动后仍持续运行;
- 日志没有导入异常;
- 工作流历史没有错误状态;
- 输出列表非空且产物可以打开。
只检查工作流是否进入历史记录会产生误判,失败执行同样可能留下历史项。
验证结果
验证分为三层:
| 层级 | 环境 | 结果 |
|---|---|---|
| schema 最小复现 | PyTorch 2.6.0 CPU | 复现 unsupported type list[int] |
| schema 最小复现 | PyTorch 2.8.0 CPU | 自定义算子注册成功 |
| 完整 GPU 镜像 | PyTorch 2.8.0、CUDA 12.8、ComfyUI v0.33.1 | ComfyUI 启动成功,工作流完成并生成真实产物 |
CPU 对照将问题收敛到 PyTorch 类型解析,无需反复构建大型镜像或租用 GPU。完整镜像验证覆盖了 comfy-kitchen、comfy.quant_ops、CUDA 和实际工作流,补足了最小复现无法证明的部分。
这项修复验证的是 PyTorch 2.8 组合。更高版本可能继续兼容,也可能引入新的 ComfyUI 或扩展节点问题;升级后仍应执行完整导入和实际工作流检查。将精确版本的 comfy_kitchen 与 comfy.quant_ops 导入加入镜像门禁,可以在发布前发现同类回归。
参考资料
喜欢这篇文章?
如果这篇文章帮到了你,可以请我喝杯咖啡,支持我继续写下去。
评论