跳到主要内容
ComfyUI:AI绘画与图像生成的高效工作流与效率提升指南 | 极客日志
Python
ComfyUI:AI绘画与图像生成的高效工作流与效率提升指南 目录 **简介:从WebUI到ComfyUI的范式转移** **ComfyUI 基础架构与安装** **节点式逻辑解析:核心工作流** **利用 ComfyUI 提升 Stable Diffusion 效率的策略** **高级工作流实战:ControlNet 与 IP-Adapter** **自动化与后端集成:Python API 调用** **Prompt 工程与动态提示词** **总结与展望*…
岁月神偷 发布于 2026/4/6 更新于 2026/5/21 54K 浏览目录
简介:从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.2 界面概览
ComfyUI 的界面主要由三个区域组成:
节点库(左侧) :按类别(Loaders, Sampling, Latent, Image 等)列出的所有可用节点。
画布(中间) :拖拽节点、连接线的区域。
队列/历史(右侧) :查看正在生成的任务、历史记录和生成的图片预览。
3. 节点式逻辑解析:核心工作流
要理解 ComfyUI,首先要理解最基础的'文生图'工作流。
3.1 基础文生图流程图
graph TD A --> --> C --> D --> E C --> E D --> E E --> F F --> F --> H style : ,stroke: ,stroke-width: style E fill: ,stroke: ,stroke-width: style G fill: ,stroke: ,stroke-width:
[Load Checkpoint<br>加载大模型]
B
[CLIP Text Encode<br>正向提示词]
A
[CLIP Text Encode<br>反向提示词]
A
[Empty Latent Image<br>设置分辨率与批次]
B
[KSampler<br>采样器核心]
[VAE Decode<br>潜空间解码]
G
[Save Image<br>保存图像]
[Preview Image<br>预览图像]
A
fill
#f9f
#333
2px
#bbf
#333
2px
#bfb
#333
2px
3.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 (采样器)
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 设置得过高(如 > 8),这会瞬间填满显存。
技巧 :保持 Batch Size = 1 或 2,但在工作流外层使用循环控制,或者简单地多次点击'Queue Prompt'。ComfyUI 能够在上一个图生成的瞬间显存回收并开始下一个,维持高 GPU 占用率而非高显存占用率。
4.2 使用 Tiled VAE 与 Tiled Diffusion (分块处理) 当生成高分辨率图像(如 4k+)或使用大模型(SDXL)时,显存往往是瓶颈。
处理方式 显存占用 (预估 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 允许你构建一条生产线,无需人工干预即可完成'生成 -> 放大 -> 润色 -> 保存'。
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 为其上色。
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 之前)。
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:#ff0000
5.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 服务
6.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)" 按钮直接获取" { " 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 lines
3D 渲染风格 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 poly
7.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 工作流文件。下载并分析这些文件是学习的最快途径。
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online