目录
- 简介:从WebUI到ComfyUI的范式转移
- ComfyUI 基础架构与安装
- 节点式逻辑解析:核心工作流
- 利用 ComfyUI 提升 Stable Diffusion 效率的策略
- 高级工作流实战:ControlNet 与 IP-Adapter
- 自动化与后端集成:Python API 调用
- Prompt 工程与动态提示词
- 总结与展望
1. 简介:从WebUI到ComfyUI的范式转移
在 AI 绘画的领域,Stable Diffusion (SD) 无疑是目前的基石。然而,随着模型体积的增大(如 SDXL, Flux)以及工作流复杂度的提升,传统的基于网页的界面(如 Automatic1111 WebUI)开始显露出局限性:页面刷新导致的卡顿、缺乏复杂的逻辑分支能力、难以进行批量自动化处理等。
ComfyUI应运而生。它是一个基于节点的图形用户界面(GUI),它的核心理念是将 AI 绘画的每一个步骤(加载模型、输入提示词、采样、VAE解码、保存图片)拆解为独立的“节点”,并通过连线的方式定义数据流向。
为什么选择 ComfyUI?
- 极致的效率:ComfyUI 采用异步排队机制,且复用显存极其高效,在相同硬件下生成速度通常优于 WebUI。
- 逻辑可视化:复杂的工作流(如图生图、ControlNet 多重控制)一目了然,便于调试。
- 可复用性与模块化:你可以将常用的节点组合保存,一键加载,或者将其封装为 API 供后端程序调用。
- 生态丰富:拥有庞大的社区支持,插件覆盖从 3D 生成到 视频制作的各个领域。
2. ComfyUI 基础架构与安装
2.1 安装指南
ComfyUI 的安装相对简单,推荐使用便携版本。
# 1. 克隆仓库 git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI # 2. 创建 Python 虚拟环境 (推荐) python -m venv venv # Windows 激活 venv\Scripts\activate # Linux/Mac 激活 source venv/bin/activate # 3. 安装依赖 pip install -r requirements.txt # 4. 下载主模型 (如 SDXL Base 1.0) # 将模型放入: checkpoints/sd_xl_base_1.0.safetensors # 5. 启动 python main.py --listen --port 81882.2 界面概览
ComfyUI 的界面主要由三个区域组成:
- 节点库(左侧):按类别(Loaders, Sampling, Latent, Image 等)列出的所有可用节点。
- 画布(中间):拖拽节点、连接线的区域。
- 队列/历史(右侧):查看正在生成的任务、历史记录和生成的图片预览。
3. 节点式逻辑解析:核心工作流
要理解 ComfyUI,首先要理解最基础的“文生图”工作流。
3.1 基础文生图流程图
graph TD A[Load Checkpoint<br>加载大模型] --> B[CLIP Text Encode<br>正向提示词] A --> C[CLIP Text Encode<br>反向提示词] A --> D[Empty Latent Image<br>设置分辨率与批次] B --> E[KSampler<br>采样器核心] C --> E D --> E E --> F[VAE Decode<br>潜空间解码] F --> G[Save Image<br>保存图像] F --> H[Preview Image<br>预览图像] style A fill:#f9f,stroke:#333,stroke-width:2px style E fill:#bbf,stroke:#333,stroke-width:2px style G fill:#bfb,stroke:#333,stroke-width:2px3.2 节点详解
1. Load Checkpoint (加载检查点)
这是一切的开始。它负责加载.safetensors或.ckpt格式的模型文件。
- 输出:
MODEL(模型信息),CLIP(文本编码器),VAE(变分自编码器)。
2. CLIP Text Encode (文本编码)
需要两个节点:
- 正向:描述你想要的画面,例如 “masterpiece, best quality, 1girl, cyberpunk style”。
- 反向:描述你不想要的内容,例如 “low quality, bad anatomy, blurry”。
3. Empty Latent Image (空潜空间图像)
定义画布的大小和生成的数量。
- Width/Height: 图像分辨率。
- Batch Size: 一次生成多少张(这是效率的关键)。
4. KSampler (采样器)
这是 AI 绘画的大脑,负责去噪过程。
- Seed (种子):决定随机性。
-1为随机。 - Steps (步数):通常 20-30 步足够,过高会降低效率。
- CFG (引导系数):提示词的遵循力度,通常 7.0 左右。
- Sampler Name: 推荐
DPM++ 2M Karras或Euler a。 - Scheduler (调度器): 推荐
Karras或Simple。
5. VAE Decode (解码)
将 KSampler 输出的“潜空间数据”(计算机理解的压缩信息)转换为人类可看的“像素数据”。
6. Save Image (保存)
将最终图像写入磁盘。
4. 利用 ComfyUI 提升 Stable Diffusion 的效率
ComfyUI 不仅仅是一个界面,它是一个优化引擎。以下是几种显著的效率提升策略。
4.1 批处理与显存优化
在 Automatic1111 中,批量生成往往会导致显存溢出(OOM)或速度急剧下降。ComfyUI 通过节点间的精准调度,优化了显存占用。
策略:调整 Batch Size 与 迭代次数
- 不要将
Batch Size设置得过高(如 > 8),这会瞬间填满显存。 - 技巧:保持
Batch Size = 1或2,但在工作流外层使用循环控制,或者简单地多次点击“Queue Prompt”。ComfyUI 能够在上一个图生成的瞬间显存回收并开始下一个,维持高 GPU 占用率而非高显存占用率。
4.2 使用 Tiled VAE 与 Tiled Diffusion (分块处理)
当生成高分辨率图像(如 4k+)或使用大模型(SDXL)时,显存往往是瓶颈。
表格:不同 VAE 处理方式的显存占用对比
| 处理方式 | 显存占用 (预估 SDXL 1024x1024) | 速度 | 画质损失 | 适用场景 |
|---|---|---|---|---|
| 标准 VAE | 12GB+ | 快 | 无 | 显卡充裕时 |
| Tiled VAE | 6GB - 8GB | 中 | 几乎无 | 显卡紧张、超大分辨率 |
| Tiled Diffusion | 4GB - 6GB | 慢 | 极低 | 4k/8k 壁纸生成 |
ComfyUI 实现代码逻辑 (JSON片段演示):
在使用 Tiled VAE 节点时,只需将标准 VAE Decode 替换为Tiled VAE Decode节点,并设置tile_size为 512 或 1024。
// 示例:将标准 VAE 替换为 Tiled VAE 的节点配置逻辑 { "class_type": "VAEDecode", // 原始节点 "inputs": { "samples": ["KSampler", 0], "vae": ["LoadCheckpoint", 2] } } // 变为: { "class_type": "Tiled VAE Decode", // 高效节点 "inputs": { "samples": ["KSampler", 0], "vae": ["LoadCheckpoint", 2], "tile_size": 512 // 关键参数:分块大小 } }4.3 工作流链式处理
ComfyUI 允许你构建一条生产线,无需人工干预即可完成“生成 -> 放大 -> 润色 -> 保存”。
Mermaid 流程图:自动化链式处理
graph LR subgraph Phase1_Generation [第一阶段: 基础生成] G1[Generate 512x512] --> G2[VAE Decode] end subgraph Phase2_Upscale [第二阶段: 智能放大] G2 --> U1[Image Upscale] U1 --> U2[Detail Fix Pass] end subgraph Phase3_Output [第三阶段: 输出] U2 --> S1[Save High Res] U2 --> S2[Preview] end style Phase1_Generation fill:#e1f5fe,stroke:#01579b style Phase2_Upscale fill:#fff9c4,stroke:#fbc02d style Phase3_Output fill:#e8f5e9,stroke:#2e7d32这种流程消除了人工保存图片、手动放入放大图、再手动输入提示词的繁琐过程。你只需点击一次“生成”,ComfyUI 就会像流水线一样源源不断地输出成品图。
5. 高级工作流实战:ControlNet 与 IP-Adapter
为了提升生成质量的可控性,我们需要引入外部控制信号。
5.1 ControlNet:精准构图
ControlNet 允许你使用边缘检测、深度图、姿态骨架等来约束图像生成。
实战场景:为线稿上色
假设你有一张黑白线稿,希望 AI 为其上色。
Prompt 示例:
Positive: masterpiece, best quality, vibrant colors, anime style, clean lines Negative: monochrome, grayscale, blurry, low quality工作流步骤:
- Load Image: 加载线稿图。
- ControlNet Apply: 加载 ControlNet 模型(如
control_v11p_sd15_scribble)。 - 连接: 将
Load Image连接到 ControlNet 的image输入端;将 ControlNet 的output连接到KSampler的positive或negative输入端(在 ComfyUI 中,ControlNet 通常作为一个辅助模型插入到 KSampler 之前)。
ComfyUI 关键节点逻辑:
graph LR Img[Load Image] --> CN[ControlNet Apply] Lora[Load Checkpoint] --> CN CN --> KS[KSampler] Txt[CLIP Encode] --> KS KS --> VAE[VAE Decode] VAE --> Save[Save Image] style CN fill:#ffcccb,stroke:#ff00005.2 IP-Adapter:图像提示词
IP-Adapter 是一个革命性的节点,它允许你使用一张或多张图片作为“风格参考”,而不需要复杂的 Prompt 描述。
优势:
- 极大减少了 Prompt 调试时间。
- 能够精准复制特定角色或画风。
代码/配置示例:
你需要安装ComfyUI_IPAdapter_plus插件。
# 伪代码逻辑演示:IP-Adapter 的数据流向 # Load Image -> IPAdapter (Model + Image) -> Apply KSampler # 节点配置参数示意 ipadapter_params = { "weight": 0.8, # 参考权重,0-1,越高越像参考图 "start": 0.0, # 开始介入的时间步 "end": 1.0, # 结束介入的时间步 "fold_net": False # 是否使用更轻量的网络 }6. 自动化与后端集成:Python API 调用
这是 ComfyUI 相比其他 SD 界面最大的优势:API First。ComfyUI 自带一个本地服务器,允许你通过 JSON 或 WebSocket 发送工作流并获取图片。这使得将 AI 生成功能集成到游戏、App 或自动化脚本中变得极其简单。
6.1 启动 API 服务
python main.py --listen6.2 Python 脚本调用示例
以下是一个完整的 Python 脚本,用于连接 ComfyUI,发送一个简单的文生图任务,并保存结果。
import json import random import urllib.request import websocket # pip install websocket-client import uuid # ComfyUI 服务地址 server_address = "127.0.0.1:8188" client_id = str(uuid.uuid4()) def queue_prompt(prompt): p = {"prompt": prompt, "client_id": client_id} data = json.dumps(p).encode('utf-8') req = urllib.request.Request(f"http://{server_address}/prompt" , data=data) return json.loads(urllib.request.urlopen(req).read()) def get_history(prompt_id): with urllib.request.urlopen(f"http://{server_address}/history/{prompt_id}") as response: return json.loads(response.read()) def get_image(filename, subfolder, folder_type): data = {"filename": filename, "subfolder": subfolder, "type": folder_type} url_values = urllib.parse.urlencode(data) with urllib.request.urlopen(f"http://{server_address}/view?{url_values}") as response: return response.read() # 这是一个简单的文生图 Prompt (JSON 格式) # 该 JSON 可以通过 ComfyUI 界面点击 "Save (API Format)" 按钮直接获取 prompt_text = """ { "3": { "inputs": { "seed": 0, "steps": 20, "cfg": 8, "sampler_name": "euler", "scheduler": "normal", "denoise": 1, "model": ["4", 0], "positive": ["6", 0], "negative": ["7", 0], "latent_image": ["5", 0] }, "class_type": "KSampler" }, "4": { "inputs": { "ckpt_name": "v1-5-pruned-emaonly.safetensors" }, "class_type": "CheckpointLoaderSimple" }, "5": { "inputs": { "width": 512, "height": 512, "batch_size": 1 }, "class_type": "EmptyLatentImage" }, "6": { "inputs": { "text": "cyberpunk city, neon lights, rain, masterpiece, best quality", "clip": ["4", 1] }, "class_type": "CLIPTextEncode" }, "7": { "inputs": { "text": "bad quality, blurry", "clip": ["4", 1] }, "class_type": "CLIPTextEncode" }, "8": { "inputs": { "samples": ["3", 0], "vae": ["4", 2] }, "class_type": "VAEDecode" }, "9": { "inputs": { "filename_prefix": "ComfyUI_API_Output", "images": ["8", 0] }, "class_type": "SaveImage" } } """ # 执行任务 prompt = json.loads(prompt_text) prompt_id = queue_prompt(prompt)["prompt_id"] print(f"Task queued. ID: {prompt_id}") # 轮询检查进度 (实际项目中推荐使用 WebSocket 监听) # 这里简化处理 import time time.sleep(10) # 等待生成完成,具体时间取决于硬件 # 获取图片历史并保存 # 注意:实际生产环境需要更复杂的逻辑来监听 WebSocket 的 execution_success 消息 history = get_history(prompt_id) for node_id in history[prompt_id]['outputs']: if 'images' in history[prompt_id]['outputs'][node_id]: for image_data in history[prompt_id]['outputs'][node_id]['images']: image = get_image(image_data['filename'], image_data['subfolder'], image_data['type']) with open(f"output_{image_data['filename']}", 'wb') as f: f.write(image) print(f"Image saved: output_{image_data['filename']}")7. Prompt 工程与动态提示词
ComfyUI 在处理 Prompt 时比简单的文本框更灵活。
7.1 使用 Text 节点组合
不要在一个节点里写完所有东西。利用字符串连接节点动态构建 Prompt。
- String Literal: “masterpiece, best quality”
- Text Concatenate: 将上述常量与用户输入的变量合并。
- Wildcard Manager (插件): 随机从文本文件中读取关键词(如随机选择天气、随机选择颜色)。
7.2 Prompt 示例库
风格化写实
Positive: (photorealistic:1.4), raw photo, 8k uhd, dslr, soft lighting, high quality, film grain, (hyperrealistic:1.2), 1girl, fashion portrait, looking at viewer Negative: (cartoon, anime, 3d render, illustration:1.3), painting, drawing, blur, lowres动漫风格
Positive: (anime style:1.2), vibrant colors, cel shading, makoto shinkai style, clouds, lens flare, 1girl, school uniform, standing in street Negative: (realistic:1.4), photograph, 3d, dark skin, messy lines3D 渲染风格
Positive: (3d render:1.3), unreal engine 5, octane render, cinema 4d, clay material, smooth texture, soft studio lighting, cute character, blind box style Negative: sketch, drawing, pencil, texture noise, low poly7.3 效率提示:动态 Prompt
在批量生成时,你可能希望保持构图不变,但改变画面主体。
方法:在 ComfyUI 中使用Primitive Node或者Impact Pack中的Wildcard Choose节点。
效果:无需停止生成,只需修改一个节点的值,后续生成的批次就会应用新的 Prompt。
8. 总结与展望
ComfyUI 代表了 AI 绘画工具的成熟化方向——从玩具变为生产力工具。
核心优势回顾
- 流线型工作:通过节点连接,消除了重复操作。
- 极高的资源利用率:Tiled 技术和精准的内存管理让 8GB 显卡也能跑 4K 大图。
- 强大的扩展性:无论是接入 ControlNet 还是使用 Python API,ComfyUI 都提供了底层的控制权。
学习建议
- 从简单开始:先跑通最基础的文生图。
- 善用 Manager:安装
ComfyUI-Manager插件,它是你扩展功能的入口。 - 参考社区:ComfyUI 的社区(如 Civitai, Reddit, GitHub)分享了海量的
.json工作流文件。下载并分析这些文件是学习的最快途径。