起因
想生成产品配图,又不想把数据传 Midjourney / DALL-E。Stable Diffusion 是
开源文生图模型,本地一张 8GB+ 显存的卡能跑。
WebUI 老牌但 UI 笨重;ComfyUI 用 node-based 工作流(像 Blender 的节点编辑器),
更适合复杂 pipeline + 跨实验复用。
解决方案
装 ComfyUI
git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI
uv venv --python 3.12
source .venv/bin/activate
# CUDA 12.x
uv pip install torch torchvision --index https://download.pytorch.org/whl/cu124
uv pip install -r requirements.txt
# 起服务
python main.py --listen 0.0.0.0 --port 8188
# 浏览器打开 http://localhost:8188
第一次进去是空白画布。
装模型
ComfyUI 的目录结构:
ComfyUI/models/
├── checkpoints/ # 基础模型 (.safetensors)
├── loras/ # LoRA 微调(风格 / 角色)
├── vae/ # VAE 解码器
├── controlnet/ # ControlNet 模型
├── upscale_models/ # 超分模型
└── embeddings/ # textual inversion
从 civitai.com 或 HuggingFace 下:
cd models/checkpoints
# SDXL 1.0 base(6.5 GB)
wget https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
# 流行的写实风:Juggernaut XL(7 GB)
# 流行的二次元:Pony Diffusion XL(7 GB)
# 流行的快出图:SDXL Turbo(lightning 版,4 步出图)
第一个工作流
ComfyUI 默认工作流:Load Checkpoint → CLIP Text Encode (Prompt) →
CLIP Text Encode (Negative) → Empty Latent Image → KSampler → VAE Decode
→ Save Image.
右键画布 → Add Node → 选模块拖入。Connect 各节点 output → input。
prompt 例:
positive: a serene Japanese garden with cherry blossoms,
golden hour, ultra detailed, 8k
negative: ugly, blurry, watermark, low quality
KSampler 参数:
steps: 20-30(普通模型)/ 4-8(Turbo / Lightning)cfg: 7(普通) / 1-2(Turbo)sampler_name: dpmpp_2m_sde / euler_ancestralscheduler: karras / normal
Queue Prompt 跑一次。
工作流保存 / 分享
Save (JSON) 把整个 graph 存成 .json。
团队里"哪个工作流出图最好" → JSON 文件共享,对方 Load 即可复现。
ComfyUI 还把生成的 PNG 嵌入了 metadata:图片本身包含生成它的完整 workflow。
拖任意 PNG 到 ComfyUI 画布 → 自动还原工作流。神奇。
LoRA 风格切换
Load Checkpoint → Load LoRA → CLIP Text Encode → ...
Load LoRA 节点选 pony_anime_v3.safetensors,strength 0.7,
风格立刻切到该 LoRA 训练的风格。多个 LoRA 可以串联。
ControlNet(按草图 / 边缘 / 姿态约束)
Load Image → Canny Edge → Apply ControlNet (Advanced)
↓
Load Checkpoint → ... → KSampler (with controlnet conditioning) → ...
可以从一张参考图提取边缘 / 姿态 / 深度,让生成图保持同样构图。
广告 / 产品设计常用:用线稿生成 100 种渲染风格。
批量生成
KSampler 的 batch_size 设 4 → 一次跑出 4 张。
Save Image 节点自动命名 00001.png、00002.png。
Queue Prompt 多次连续跑:
Queue → 队列 5 → 跑完 5 批 = 20 张图
跑久后图片在 ComfyUI/output/。
效果
- 本地 RTX 4090:SDXL 1024×1024 单图 ~5s(30 steps),batch 4 ~15s
- SDXL Lightning:~1.5s 单图
- 月生成量 1k+ 张零成本
- 工作流文件版本化,"上次客户喜欢的那个风格" 一键复现
- 同组设计师共享 lora + 工作流 json,统一风格
性能 tips
- --lowvram flag 启动:8GB 卡能跑 SDXL(变慢但能跑)
- --use-pytorch-cross-attention:xformers 不兼容时的替代
- VAE FP16:
--fp16-vae减半解码显存 - TAESD:
models/vae_approx/预览快但质量低,调试用
与 WebUI / API 对比
| A1111 WebUI | ComfyUI | 商业 API | |
|---|---|---|---|
| UI | 表单 | Node graph | Prompt only |
| 工作流复用 | 弱 | 极强 | 无 |
| ControlNet / Inpaint | ✅ | ✅ | 部分 |
| 复杂 pipeline | 难 | 极易 | 不行 |
| 学习曲线 | 低 | 中 | 极低 |
| 性能 | 好 | 更好(无 Gradio overhead) | N/A |
简单文生图选 WebUI;任何"图 → 处理 → 再处理 → 多阶段"的工作流选
ComfyUI。
踩过的坑
-
CUDA OOM 但 nvidia-smi 显示有显存:PyTorch caching allocator
碎片。--gpu-only全部组件放 GPU,或者--cpu-vae把 VAE 移 CPU
(VAE decode 慢但省 2GB)。 -
首次加载某 model 极慢:safetensors 文件几 GB,第一次读盘 + 装入
GPU。后续 cache 命中秒级。 -
不同 model 的最佳 prompt 不一样:SDXL 跟 SD 1.5 prompt 风格完全
不同。每个 model 看 civitai 上的"showcase prompt"参考。 -
negative prompt 误用:写过多 negative(比如 "bad anatomy, ugly,
blurry, low quality, worst quality, ...")反而效果差。3-5 个核心
negative 就够。 -
生成的图有水印 / artifact:训练数据里有 watermark 的 model
常产出"假水印"。换 model 或在 prompt 加(watermark:1.5)进 negative。
登录后参与评论。