声明:本文部分内容使用AI辅助生成,经人工编辑、审核和补充个人经验。
更新说明:本文最后更新于 2025-08-26。
Stable Diffusion工作流搭建踩坑记录
折腾Stable Diffusion两年多了,从本地单卡到多卡集群,从随便生成到工业化工作流,踩过的坑不计其数。记录一下从安装到生产环境部署的完整过程。
环境搭建
硬件选择
一开始用GTX 1060 6G,生成512x512都费劲。后来升级到RTX 3090 24G,体验天差地别。
| 显卡 | 显存 | 512x512速度 | 1024x1024 | LoRA训练 |
|---|---|---|---|---|
| GTX 1060 6G | 6GB | 30s/it | OOM | 不支持 |
| RTX 3060 12G | 12GB | 8s/it | 25s/it | 慢 |
| RTX 3090 24G | 24GB | 3s/it | 8s/it | 支持 |
| RTX 4090 24G | 24GB | 1.5s/it | 4s/it | 很快 |
| A100 40G | 40GB | 2s/it | 5s/it | 非常快 |
血泪教训:显存比速度更重要。12G是底线,24G才能玩得转。
安装WebUI
1 | # 克隆仓库 |
坑1:xformers安装失败
1 | ERROR: Could not find a version that satisfies the requirement xformers |
解决:
1 | # 方案1:用预编译包 |
坑2:模型加载报CUDA out of memory
24G显存加载SDXL都报错,后来发现是系统缓存占用了显存。
1 | # 清空显存缓存 |
| 启动参数 | 作用 | 适用场景 |
|---|---|---|
| –xformers | 加速注意力计算 | 推荐 |
| –medvram | 中显存优化 | 8-12G |
| –lowvram | 低显存优化 | 4-8G |
| –medvram-sdxl | SDXL中显存优化 | 12-16G |
| –no-half-vae | VAE用FP32 | 避免黑图 |
| –opt-sdp-attention | 替代xformers | xformers装不上 |
Docker部署
生产环境用Docker部署。
1 | FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 |
1 | # 构建和运行 |
坑3:Docker里GPU不可用
1 | RuntimeError: No CUDA GPUs are available |
解决:
1 | # 安装nvidia-docker2 |
模型管理
模型下载和整理
模型文件越来越大,管理是个问题。
1 | models/ |
坑4:模型格式混淆
1 | .ckpt 和 .safetensors 的区别: |
模型切换优化
频繁切换模型,每次都要加载几十秒。
1 | # 用API切换模型 |
优化:多实例部署,每个实例固定一个模型。
1 | # docker-compose.yml |
LoRA训练
环境准备
用kohya_ss训练LoRA,比WebUI内置的好用。
1 | git clone https://github.com/bmaltais/kohya_ss.git |
坑5:训练时显存不够
12G显存训练SDXL LoRA,直接OOM。
1 | # 优化方案1:用8bit Adam |
数据集准备
1 | dataset/ |
标注格式:
1 | # 001.txt |
坑6:触发词和常规描述混在一起
1 | # 错误:触发词藏在中间 |
训练参数调优
1 | { |
| 参数 | 说明 | 经验值 |
|---|---|---|
| network_dim | 网络维度 | 16-128,一般32 |
| network_alpha | 缩放因子 | 通常dim/2 |
| learning_rate | 学习率 | 1e-4 to 1e-3 |
| train_batch_size | 批次大小 | 显存允许越大越好 |
| num_train_epochs | 训练轮数 | 10-20 |
坑7:network_dim太大导致过拟合
dim=128训练出来,除了训练集里的姿势,其他姿势生成效果很差。
解决:
1 | { |
dim降到32,增加训练轮数,用余弦重启调度器。
训练效果评估
1 | # 用训练好的LoRA生成测试图 |
评估维度:
| 权重 | 风格强度 | 灵活性 | 适用场景 |
|---|---|---|---|
| 0.3-0.5 | 弱 | 高 | 轻微影响 |
| 0.6-0.8 | 中等 | 中 | 平衡 |
| 0.9-1.2 | 强 | 低 | 强风格 |
| 1.0+ | 过强 | 很低 | 可能崩坏 |
ControlNet使用
安装和配置
1 | # 在WebUI的Extensions里安装 |
API调用
1 | import requests |
坑8:ControlNet权重和CFG冲突
ControlNet权重设太高,CFG也太高,生成结果很僵硬。
解决:
| ControlNet类型 | 推荐权重 | 推荐CFG |
|---|---|---|
| Canny | 0.8-1.0 | 5-7 |
| OpenPose | 0.8-1.0 | 5-7 |
| Depth | 0.6-0.8 | 7-9 |
| LineArt | 0.8-1.0 | 5-7 |
多ControlNet组合
1 | # 同时用OpenPose + Canny |
坑9:多ControlNet显存爆炸
两个ControlNet同时用,显存直接翻倍。
解决:
1 | # 启动参数优化 |
批量生成优化
异步队列
生产环境需要批量生成,不能一个一个来。
1 | import asyncio |
多实例负载均衡
单卡生成太慢,多卡并行。
1 | import random |
生成参数模板
1 | # 预定义常用参数模板 |
生产环境部署
API服务封装
1 | from fastapi import FastAPI, HTTPException |
缓存优化
1 | import hashlib |
总结
折腾Stable Diffusion两年,最核心的经验:
- 显存是硬门槛:12G能玩,24G才能玩得爽,40G以上才能工业化
- 模型管理要规范:safetensors格式、目录结构、版本控制
- LoRA训练靠调参:dim、lr、数据质量,三个缺一不可
- ControlNet是神器:但权重要调,多ControlNet要省显存
- 批量生成要异步:队列+多实例+缓存,才能支撑生产环境
踩坑最多的地方:
- xformers装不上,生成速度慢3倍
- 模型格式不对,加载不了或者不安全
- LoRA过拟合,除了训练姿势其他都不会
- ControlNet权重太高,生成结果僵硬
- 批量生成不控制并发,显存OOM
SD的工作流搭建是个持续优化的过程,没有一劳永逸的方案。根据业务需求不断调整,才能找到最适合自己的流程。