python main.py --lowvram --reserve-vram
智能模型卸载机制
ComfyUI实现了基于引用计数的模型自动卸载逻辑,当显存不足时会优先卸载未使用的模型:
# 模型卸载实现(comfy/model_management.py L568-595)
def free_memory(memory_required, device, keep_loaded=[]):
# 按优先级排序可卸载模型
for x in sorted(can_unload):
i = x[-1]
logging.debug(f"Unloading {current_loaded_models[i].model.model.__class__.__name__}")
if current_loaded_models[i].model_unload(memory_to_free):
unloaded_model.append(i)
计算加速:从算法到硬件优化
注意力机制优化
ComfyUI提供多种注意力优化选项,可通过命令行启用:
# 注意力优化参数(comfy/cli_args.py L109-114)
attn_group = parser.add_mutually_exclusive_group()
attn_group.add_argument("--use-split-cross-attention", action="store_true", help="使用拆分交叉注意力优化")
attn_group.add_argument("--use-quad-cross-attention", action="store_true", help="使用二次交叉注意力优化")
attn_group.add_argument("--use-pytorch-cross-attention", action="store_true", help="使用PyTorch 2.0交叉注意力")
attn_group.add_argument("--use-flash-attention", action="store_true", help="使用FlashAttention")
Nvidia用户推荐启用xFormers加速:
python main.py --xformers
AMD用户(ROCm 6.4+)可启用PyTorch内置优化:
python main.py --use-pytorch-cross-attention
混合精度计算
通过调整模型精度可显著提升速度并降低显存占用:
# 精度设置参数(comfy/cli_args.py L63-70)
fpunet_group.add_argument("--fp16-unet", action="store_true", help="UNet使用FP16")
fpunet_group.add_argument("--bf16-unet", action="store_true", help="UNet使用BF16")
fpunet_group.add_argument("--fp8_e4m3fn-unet", action="store_true", help="UNet权重使用FP8")
推荐配置(Nvidia Ada Lovelace及以上):
python main.py --fp16-unet --bf16-vae --fp8_e4m3fn-text-enc
多GPU部署:设备管理与负载均衡
设备检测与配置
ComfyUI支持多种计算设备,包括Nvidia GPU、AMD GPU、Intel XPU等:
# 设备检测逻辑(comfy/model_management.py L169-188)
def get_torch_device():
if directml_enabled:
return directml_device
if cpu_state == CPUState.MPS:
return torch.device("mps")
if cpu_state == CPUState.CPU:
return torch.device("cpu")
else:
if is_intel_xpu():
return torch.device("xpu", torch.xpu.current_device())
elif is_ascend_npu():
return torch.device("npu", torch.npu.current_device())
elif is_mlu():
return torch.device("mlu", torch.mlu.current_device())
else:
return torch.device(torch.cuda.current_device())
多GPU配置方法
虽然ComfyUI目前未实现自动多GPU负载均衡,但可通过环境变量和命令行参数指定设备:
- 指定主GPU:
CUDA_VISIBLE_DEVICES=0 python main.py --highvram
ComfyUI 是目前最灵活的 Stable Diffusion 图形界面之一,它采用节点式工作流设计,让你可以像搭积木一样自由组合各种 AI 处理模块。很多新手初次打开 ComfyUI 时会被满屏的节点和连线劝退,但其实只要理解了核心概念,搭建一个基础的文生图工作流只需要 5 个关键节点。
本教程将带你从零开始,一步步搭建出你的第一个 ComfyUI 文生图工作流,并详细解释每个节点的作用与参数含义。
请确保你已经成功安装了 ComfyUI 并能正常启动。如果尚未安装,请先阅读我们的 环境搭建教程。
一、理解核心概念
在动手之前,我们需要了解 ComfyUI 工作流的三个核心要素:
- 节点(Node):每个节点代表一个独立的功能单元,如加载模型、编写提示词、采样生成等。
- 连线(Link):节点之间通过彩色连线传递数据,颜色对应数据类型(如黄色=MODEL、紫色=LATENT、绿色=CONDITIONING)。
- 执行顺序:ComfyUI 会根据连线关系自动推导执行顺序,无需手动排列。
二、五个关键节点详解
一个最基础的文生图工作流由以下 5 个节点组成:
2.1 Load Checkpoint(加载模型)
这是整个工作流的起点,负责加载 Stable Diffusion 的权重文件(.safetensors 或 .ckpt)。该节点会输出三个接口:
- MODEL:UNet 扩散模型,用于实际的图像去噪生成
- CLIP:文本编码器,将你的提示词转换为模型可理解的向量
- VAE:变分自编码器,负责潜空间与像素空间之间的转换
2.2 CLIP Text Encode(提示词编码)
你需要创建两个此节点,分别用于正向提示词(你想要的画面)和反向提示词(你不希望出现的元素)。它们接收 CLIP 输入,输出 CONDITIONING 数据。
2.3 Empty Latent Image(空白潜空间图像)
设置生成图片的尺寸(如 512×512、768×768)和批量大小。该节点输出一张纯噪声的潜空间图像作为采样的起点。
2.4 KSampler(K 采样器)
这是工作流的核心引擎,接收 MODEL、正向/反向 CONDITIONING 和 LATENT 四个输入,通过迭代去噪生成最终结果。关键参数包括:
seed:随机种子,决定生成结果的可复现性steps:采样步数,越高细节越丰富但耗时更长cfg:提示词引导系数,建议 7~12 之间sampler_name:采样算法,推荐euler_a或dpmpp_2mscheduler:调度器,通常选normaldenoise:去噪强度,文生图设为 1.0
2.5 VAE Decode(VAE 解码)
将 KSampler 输出的潜空间结果解码回像素图像,得到最终的 PNG/JPG 图片。
如果生成结果全黑或全灰,通常是 VAE Decode 节点的 VAE 输入未正确连接,或者加载的 Checkpoint 不包含内置 VAE。请检查连线是否完整。
三、通过 Python API 调用工作流
除了 GUI 操作,ComfyUI 还提供了 REST API,方便你用 Python 脚本批量提交生成任务。以下是完整的 API 调用示例:
import json
import urllib.request
# ComfyUI API 地址
COMFYUI_URL = "http://127.0.0.1:8188/prompt"
# 定义工作流 JSON(简化版文生图)
workflow = {
"3": {
"class_type": "KSampler",
"inputs": {
"seed": 42,
"steps": 20,
"cfg": 8.0,
"sampler_name": "euler_a",
"scheduler": "normal",
"denoise": 1.0,
"model": ["4", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["5", 0]
}
},
"4": {
"class_type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "v1-5-pruned.safetensors"
}
},
"5": {
"class_type": "EmptyLatentImage",
"inputs": {
"width": 512,
"height": 512,
"batch_size": 1
}
},
"6": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "beautiful landscape, sunset, mountains",
"clip": ["4", 1]
}
},
"7": {
"class_type": "CLIPTextEncode",
"inputs": {
"text": "blurry, low quality, watermark",
"clip": ["4", 1]
}
},
"8": {
"class_type": "VAEDecode",
"inputs": {
"samples": ["3", 0],
"vae": ["4", 2]
}
},
"9": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI_Output",
"images": ["8", 0]
}
}
}
# 发送请求到 ComfyUI
payload = json.dumps({"prompt": workflow}).encode("utf-8")
req = urllib.request.Request(
COMFYUI_URL,
data=payload,
headers={"Content-Type": "application/json"}
)
response = urllib.request.urlopen(req)
print(json.loads(response.read()))
上述代码中,每个数字键("3"、"4"...)代表一个节点 ID,class_type 指定节点类型,inputs 中的数组引用格式 ["节点ID", 输出索引] 表示连线关系。
四、自定义节点开发入门
如果现有节点无法满足需求,你可以编写自定义节点。以下是一个最简单的自定义节点模板:
# custom_nodes/my_custom_node.py
class MyCustomNode:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
"brightness": ("FLOAT", {
"default": 1.0,
"min": 0.0,
"max": 3.0,
"step": 0.05
}),
}
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "adjust_brightness"
CATEGORY = "MyCustomNodes"
def adjust_brightness(self, image, brightness):
# image 是 torch.Tensor, shape: [B, H, W, C]
result = (image * brightness).clamp(0.0, 1.0)
return (result,)
# 注册节点映射
NODE_CLASS_MAPPINGS = {
"MyCustomBrightness": MyCustomNode
}
NODE_DISPLAY_NAME_MAPPINGS = {
"MyCustomBrightness": "亮度调节 🔆"
}
将上述文件放入 ComfyUI/custom_nodes/ 目录,重启 ComfyUI 后即可在右键菜单的 MyCustomNodes 分类下找到「亮度调节 🔆」节点。
开发自定义节点时,建议使用 python main.py --listen 启动 ComfyUI,这样修改代码后只需刷新浏览器即可看到变化,无需完全重启。
五、总结与下一步
恭喜你!到这里你已经掌握了 ComfyUI 基础工作流的全部核心知识。让我们回顾一下要点:
- ComfyUI 的核心是节点 + 连线的数据流模型
- 文生图最少需要 5 个节点:Load Checkpoint → CLIP Encode ×2 → Empty Latent → KSampler → VAE Decode
- 可以通过 Python API 实现自动化批量生成
- 自定义节点扩展了 ComfyUI 的无限可能性
接下来推荐你学习以下内容来进一步提升:
- ControlNet 精确控制教程 — 用线稿/深度图引导 AI 生成
- LoRA 模型加载与微调指南 — 让 AI 学会特定风格或角色
- 高级采样器对比测试 — 找到最适合你的采样策略
「ComfyUI 的学习曲线虽然陡峭,但一旦跨过门槛,你会发现它比任何 WebUI 都更强大、更自由。」—— 社区创作者 @PixelDreamer