ComfyUI 的底层框架核心是一个基于 有向无环图(DAG, Directed Acyclic Graph) 的节点化执行引擎。它通过将 AI 生成过程拆解为独立的计算单元(节点),并通过数据流连接这些单元,实现了极高的灵活性和模块化。
以下是 ComfyUI 工作流底层框架的核心架构解析:
1. 核心架构分层
ComfyUI 采用前后端分离的架构设计,主要包含三个层级:
- 前端交互层 (Frontend):
- 基于 Web 技术构建,提供可视化的画布。
- 负责节点的拖拽、连线、参数调整以及实时预览图像/视频。
- 将用户的操作转化为 JSON 格式的工作流定义发送给后端。
- 后端执行引擎 (Backend / Python Core):
- 节点调度器:解析前端传来的 JSON 工作流,构建执行图。
- 类型系统:严格定义节点间的输入输出数据类型(如
IMAGE,LATENT,CONDITIONING),确保数据流的正确性。 - 资源管理:负责模型加载、显存优化(如模型卸载、分块处理)和缓存机制。
- 计算与硬件层 (PyTorch Models & Devices):
- 实际运行 AI 模型(如 Stable Diffusion, Flux, WanVideo 等)。
- 直接调用 GPU/CPU 进行张量运算。
2. 节点化执行原理 (Node Graph Engine)
ComfyUI 的本质是一个可视化版的计算流水线。
- 节点 (Nodes):每个节点代表一个单一的操作单元或功能模块。例如:
- CheckpointLoaderSimple:仅负责加载模型权重。
- CLIPTextEncode:仅负责将文本转换为嵌入向量。
- KSampler:仅负责在潜空间进行去噪采样。
- VAEDecode:仅负责将潜变量解码为像素图像。
- 连线 (Links):定义了数据流动的方向和依赖关系。只有当上游节点的数据准备就绪且类型匹配时,下游节点才会被触发执行。
- JSON 工作流定义:整个工作流在底层被序列化为 JSON 对象,包含节点 ID、类型、参数配置以及连接关系。这种结构使得工作流极易保存、分享和版本控制。
3. 关键底层机制
3.1 类型系统与数据契约
ComfyUI 拥有严格的类型检查机制。每个节点通过 INPUT_TYPES 方法声明其所需的输入类型。系统在运行时会自动进行类型验证和转换,防止因数据类型不匹配导致的崩溃。常见的数据类型包括:
- IMAGE:像素图像数据。
- LATENT:潜空间张量(压缩后的图像表示)。
- CONDITIONING:文本编码后的条件向量。
- MASK:遮罩数据。
3.2 内存管理与优化
为了在有限显存下运行大模型,ComfyUI 底层实现了多种优化策略:
- 模型卸载 (Model Offloading):智能地在 GPU 和 CPU 之间移动模型权重,最大化 VRAM 利用率。
- 分块处理 (Tiling):对高分辨率图像或视频进行分块计算,降低单次内存需求。
- 缓存机制 (Caching):基于节点输入参数的哈希值实现智能缓存。如果输入未变化,系统会跳过重复计算,直接复用之前的结果,显著提升复杂工作流的效率。
- 异步资产扫描:在 v0.17.0 及更高版本中,引入了异步双阶段扫描和后台资产播种器,将资源扫描与主线程分离,加快启动速度并支持大规模资源管理。
3.3 扩展性与自定义节点
ComfyUI 允许开发者通过编写简单的 Python 类来创建自定义节点,无需修改前端代码。
- 标准化接口:自定义节点需遵循 INPUT_TYPES、FUNCTION 和返回值规范。
- 生态丰富:社区提供了数百个第三方节点库(如 ControlNet, LoRA, ADetailer, Video 生成等),极大地扩展了框架的能力边界。
4. 基础工作流的数据流向
以标准的文生图(Text-to-Image)为例,底层数据流向如下:
CLIP负责看懂文本、UNet负责画图、VAE负责上色与高清还原。CLIP(文本编码器):将你输入的文字(Prompt)翻译成AI能理解的数字特征。UNet(核心网络):在潜空间(Latent Space)中不断运算、去噪,逐步拼凑出画面的主体结构。VAE(变分自编码器):一个压缩/解压机,负责将抽象的潜空间特征还原为肉眼可见的完整像素图像。
- 模型加载:CheckpointLoader 加载 UNet, CLIP, VAE 权重。
- 文本编码:CLIPTextEncode 将提示词转换为 CONDITIONING 向量。
- 潜空间初始化:EmptyLatentImage 创建指定分辨率的初始噪声张量 (LATENT)。
- 去噪采样:KSampler 接收模型、条件向量和初始噪声,在潜空间进行迭代去噪,生成最终的高质量 LATENT。
- 图像解码:VAEDecode 将 LATENT 还原为像素空间的 IMAGE。
- 输出保存:SaveImage 将图像写入磁盘或返回给前端显示。

