
ComfyUI 产线实战从单节点到全流水线【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUIComfyUI 是一个模块化扩散模型执行引擎把加载模型、文本编码、采样、解码四步压成一张可以用 API 调用的节点图SDXL、Flux 和超分模型能接在同一条链路里跑。矛盾在跑了一段时间后出现节点一多显存、模型换出和任务排队都成了瓶颈任何一个没处理好都会拖垮吞吐。下面沿一条数据流把流水线、调度和性能优化按数据流动的顺序讲完。端到端流水线拆解从 Checkpoint 到出图的五个节点整体数据流如图所示checkpoint 加载器产出 MODEL、CLIP、VAE 三条线CLIP 产出条件张量 CONDITIONING采样器在潜空间去噪VAE 解码回像素域最后落盘。CheckpointLoaderSimple权重进入流水线的唯一入口。职责是把一个 checkpoint 文件读进来推断它的配置拆成 MODEL/CLIP/VAE 三个输出。源码在 nodes.py。这里我们没用diffusion_models、clip、vae 三目录分开加载的方案拆分方式灵活但节点数翻倍模型版本错配的概率也翻倍单文件 checkpoint 自洽运维成本最低。def load_checkpoint(self, ckpt_name): ckpt_path folder_paths.get_full_path_or_raise(checkpoints, ckpt_name) out comfy.sd.load_checkpoint_guess_config(ckpt_path, output_vaeTrue, output_clipTrue, embedding_directory...) return out[:3] # (MODEL, CLIP, VAE) # 上下文见 nodes.py:L634-L637关键参数 ckpt_name 由 folder_paths.py 扫描 checkpoints 目录自动补全不暴露绝对路径。数据从这里流出三条线MODEL 进采样器CLIP 进文本编码器VAE 直通解码器。CLIPTextEncode把提示词变成条件张量。职责是把正负两路 prompt tokenize 后编码成 CONDITIONING。源码在 nodes.py。取舍上编码走的是encode_from_tokens_scheduled而不是直接的 tokenize 加 encode这个调度接口是 SDXL 双编码器、多编码器模型的挂接点换模型时节点代码不用动。def encode(self, clip, text): tokens clip.tokenize(text) return (clip.encode_from_tokens_scheduled(tokens), ) # 上下文见 nodes.py:L73-L77需要把长提示词分段加权时不要改这个节点用下游的 ConditioningCombine、ConditioningAverage 等 transform 节点拼。CONDITIONING 本质是列表拼接节点是现成的。KSampler全流水线里唯一的计算大头。职责是把 latent 从纯噪声去噪到干净 latent可调参数是 steps、cfg、sampler、scheduler 四件套。源码在 nodes.py。def sample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise1.0): return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoisedenoise) # 上下文见 nodes.py:L1622-L1623参数取舍steps 默认 20我们压测里超过 25 基本看不到质量增益纯属浪费时间cfg 默认 8.0叠 LoRA 后建议降到 5 到 6避免纹理过饱和。denoise 是文生图和图生图的开关1.0 是全新生成低于 0.8 进入重绘模式。需要两段式去噪先粗后细就用同文件的 KSamplerAdvanced。VAEDecode回像素域的最后一跳。职责是把 latent 张量解码成像素图像。源码在 nodes.py。没有可调参数关键处理是 batch 维度的合并def decode(self, vae, samples): latent samples[samples] images vae.decode(latent) if len(images.shape) 5: # Combine batches images images.reshape(-1, images.shape[-3], images.shape[-2], images.shape[-1]) return (images, ) # 上下文见 nodes.py:L333-L340SaveImage输出的终止节点。职责是把图像写进 output 目录并推预览到前端。源码在 nodes.py。参数只有输出前缀 prefix 和压缩级别 compress_level默认 4没有取舍空间。它的价值是作为图的标准终止点换成视频保存或上传节点时上游全部不用动。这条流水线跑一次的产物大致如下SDXL 和 Flux 同时跑的时候显存怎么分具体场景白天用 SDXL 出商品图夜间用 Flux 做风格迁移同一张 24GB 卡。两个任务交替排队时最朴素的做法是模型常驻显存这必然 OOM。ComfyUI 的做法是按需换出新模型要加载时系统盘点显存里已有的模型按重要度排序踢掉不重要的。排序逻辑在 comfy/model_management.pycan_unload.append((-shift_model.model_offloaded_memory(), sys.getrefcount(shift_model.model), shift_model.model_memory(), i)) can_unload_sorted sorted(can_unload) # 上下文见 comfy/model_management.py:L863-L898三个排序键依次是已换出的显存量取负号优先保留已经在显存里的模型因为踢出去再重新加载代价大、引用计数队列里还有未执行节点引用的模型不能踢、模型总大小。同文件的load_models_gpu负责反向的加载先算出所需显存再触发上面的换出流程。模型热切换建立在这套机制之上LoRA 是补丁不是独立模型挂上摘下都不触发显存换出实现见 comfy/lora.py节点入口是 nodes.py 里的 LoraLoaderModelOnly。所以产线上的做法是基础模型固定、LoRA 热切换切换代价只有几百毫秒的矩阵运算而不是重新加载权重。要说边界这套换出策略适合多模型、串行或低并发。如果业务要求两个视频大模型同时驻留并行出图换出只会来回抖动应该一开始就拆卡或拆机器调度层没有魔法。量化省下的显存怎么花队列、量化、缓存的组合三者各管一段成本必须一起看队列管等待量化管装不装得下缓存管要不要重算。队列在 execution.py 中每个任务带编号和优先级API 侧从 server.py 的 /prompt 路由写入。压测环境5 任务并发、SDXL 与 Flux 混跑下基线 P95 等待约 2 分钟引入优先级队列和上面的显存换出后压到 40 秒左右代价是要先定好优先级分级规则交互调试 0、批量任务 5、可重试的低优任务 9否则高优任务照样卡。量化在 ComfyUI 里是一等公民启动参数在 comfy/cli_args.pyfpunet_group.add_argument(--fp8_e4m3fn-unet, actionstore_true, helpStore unet weights in fp8_e4m3fn.) # 上下文见 comfy/cli_args.py:L93-L105另有 --fp8_e4m3fn-text-enc完整的量化格式4bit 等布局、逐层混合精度文档在 QUANTIZATION.md。我们最终选 fp8 而不是 4bit4bit 省得更多但压测里商品图的纹理细节肉眼可见地掉客户投诉了fp8 是放弃一半节省、质量可接受的折中。缓存在 comfy_execution/caching.py 中按节点输入参数生成缓存键队列里两个任务经过同一节点且参数相同时第二次直接复用第一次的结果。命中率对业务形态非常敏感同模型、100 条提示词的创意批量任务命中率高因为 checkpoint 加载和编码结构能复用每个任务参数都不同的 A/B 实验命中接近零。优化前后对比单卡 4090 24GBSDXL 1024x10245 任务并发压测指标基线优化后代价显存稳态占用约 20GB约 14GB首帧加载慢约 2 秒fp8 即时反量化单图生成耗时约 45 秒约 38 秒边缘纹理细节略降需要质量验收队列 P95 等待约 2 分钟约 40 秒必须定义优先级分级否则高优任务仍会卡这组数字的代价集中在第一次请求上量化把部分存储成本转成了计算成本首帧延迟略增缓存只在参数重复时回本且要额外接受缓存表的内存占用。所以上线顺序我们定为先开队列零成本再上量化质量需过验收最后看命中率决定缓存的去留低于一成直接关掉。落地清单硬件、监控与回滚硬件最低配置以 SDXL 1024x1024 文生图为基准组件最低推荐GPURTX 4090 24GB 单卡A100 80GB可常驻双大模型内存32GB64GB磁盘500GB SSDNVMe模型目录单独分盘从开发到生产的三个关键动作工作流 JSON 带版本号存入对象存储代码只调队列 API回滚对象永远是明确的版本。用 extra_model_paths.yaml.example 配置共享模型目录多实例不重复下载权重。先用上面五个节点的最小链路验证产出正确再加分支节点。监控最低配置只看两条曲线显存占用和任务队列长度日志走 api_server/services/terminal_service.py 或进程 stdout 即可。回滚方式把 API 指向的工作流版本号回退一档权重本身是只读的不需要动。自定义扩展入口新节点照 custom_nodes/example_node.py.example 写输入输出类型用 comfy/comfy_types/node_typing.py 声明。节点的参数选项都定义在 INPUT_TYPES 字典里支持默认值、范围、惰性求值等修饰本方案适合多模型串行或低并发的图像产线高并发视频生成请先拆机器。下一步先跑通五节点最小链路再叠 LoRA 和量化。【免费下载链接】ComfyUIThe most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考