模型训练 #
训练概述 #
训练 Stable Diffusion 模型可以让模型学习新的风格、角色或概念,实现个性化生成。
text
┌─────────────────────────────────────────────────────────────┐
│ 训练方法对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 方法 文件大小 显存需求 训练时间 灵活性 │
│ ───────────────────────────────────────────────────────── │
│ DreamBooth 2-6GB 16GB+ 数小时 高 │
│ LoRA 10-200MB 8GB+ 数小时 高 │
│ Textual Inv. ~20KB 8GB+ 数小时 中 │
│ Full Finetune 2-6GB 24GB+ 数天 最高 │
│ │
│ 推荐选择: │
│ ├── 个人用户: LoRA │
│ ├── 专业用户: DreamBooth 或 LoRA │
│ └── 研究/企业: Full Finetune │
│ │
└─────────────────────────────────────────────────────────────┘
训练准备 #
硬件要求 #
text
硬件配置建议:
最低配置(LoRA 训练):
├── GPU: NVIDIA RTX 3060 12GB
├── 内存: 16GB
├── 存储: 50GB SSD
└── 训练时间: 2-4 小时
推荐配置:
├── GPU: NVIDIA RTX 3080/3090/4090
├── 显存: 16GB+
├── 内存: 32GB
├── 存储: 100GB+ NVMe SSD
└── 训练时间: 1-2 小时
专业配置:
├── GPU: NVIDIA A100 或多卡
├── 显存: 40GB+
├── 内存: 64GB+
├── 存储: 500GB+ NVMe SSD
└── 训练时间: 30分钟-1小时
软件环境 #
text
软件准备:
1. Python 环境
├── 版本: Python 3.10
├── 虚拟环境: venv 或 conda
└── CUDA: 11.8 或 12.x
2. 训练工具
├── kohya_ss (推荐,图形界面)
├── sd-scripts (命令行)
├── LoRA Trainer (WebUI 扩展)
└── SimpleTuner (高级)
3. 依赖库
├── PyTorch 2.0+
├── diffusers
├── transformers
└── accelerate
安装示例:
# 创建环境
conda create -n sd-train python=3.10
conda activate sd-train
# 安装 PyTorch
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
# 克隆训练工具
git clone https://github.com/kohya-ss/sd-scripts
cd sd-scripts
pip install -r requirements.txt
数据集准备 #
数据收集 #
text
数据收集指南:
角色 LoRA:
├── 数量: 15-30 张
├── 要求:
│ ├── 不同角度(正面、侧面、背面)
│ ├── 不同表情
│ ├── 不同服装(可选)
│ └── 高清晰度
└── 避免:
├── 重复图片
├── 低质量图片
└── 过度滤镜
风格 LoRA:
├── 数量: 50-200 张
├── 要求:
│ ├── 风格一致
│ ├── 内容多样
│ ├── 高质量作品
│ └── 不同主题
└── 来源:
├── 艺术作品集
├── 插画网站
└── 自己创作
概念 LoRA:
├── 数量: 20-50 张
├── 要求:
│ ├── 主题一致
│ ├── 不同场景
│ └── 清晰展示概念
└── 示例:
├── 特定服装
├── 特定发型
└── 特定姿势
图片预处理 #
text
预处理步骤:
1. 统一格式
├── 格式: PNG 或 JPG
├── 色彩空间: RGB
└── 去除元数据(可选)
2. 调整分辨率
├── 最小边: 512px
├── 推荐: 512×512 或 768×768
└── 保持比例或裁剪
3. 质量筛选
├── 清晰度检查
├── 去除模糊图片
└── 去除重复图片
4. 文件命名
├── 有序命名
└── 例: 001.png, 002.png, ...
批量处理工具:
├── Photoshop 批处理
├── ImageMagick
├── Python PIL
└── BRISQUE 质量评估
图片标注 #
text
标注方法:
1. 自动标注
├── 使用 BLIP/DeepDanbooru
├── 生成初步描述
└── 人工审核修正
2. 手动标注
├── 每张图片对应 .txt 文件
├── 描述图片内容
└── 包含触发词
3. 标注内容
├── 触发词(必需)
├── 主要特征
├── 背景描述
└── 风格描述
标注示例:
┌─────────────────────────────────────────────────────────────┐
│ 图片: character_001.png │
│ │
│ 标注文件: character_001.txt │
│ 内容: │
│ ohwx character, silver hair, blue eyes, │
│ white dress, standing in garden, anime style, │
│ highly detailed │
│ │
│ ohwx character 是触发词 │
│ │
└─────────────────────────────────────────────────────────────┘
自动标注命令:
# 使用 BLIP
python finetune/make_captions.py --batch_size 8 /path/to/images
# 使用 DeepDanbooru
python finetune/tag_images_by_wd14_tagger.py --batch_size 8 /path/to/images
LoRA 训练 #
训练参数 #
text
核心训练参数:
Network Rank (维度):
├── 含义: LoRA 矩阵的秩
├── 范围: 4-256
├── 常用: 32, 64, 128
├── 影响:
│ ├── 越大表达能力越强
│ ├── 文件越大
│ └── 训练越慢
└── 推荐: 32-64 (角色), 64-128 (风格)
Network Alpha:
├── 含义: 缩放因子
├── 通常设为 Rank 或 Rank/2
├── 影响: 学习强度
└── 推荐: 等于 Rank
Learning Rate (学习率):
├── 含义: 参数更新步长
├── 常用: 1e-4 (0.0001)
├── 范围: 1e-5 到 1e-3
└── 调整策略:
├── 损失不下降: 降低
└── 学习太慢: 提高
Epochs (训练轮数):
├── 含义: 完整遍历数据集次数
├── 角色: 10-20
├── 风格: 20-50
└── 需要实验调整
Batch Size:
├── 含义: 每次训练的图片数
├── 常用: 1-4
├── 显存允许可增大
└── 推荐: 1-2 (显存有限)
kohya_ss 训练 #
text
kohya_ss 图形界面训练:
1. 启动界面
python kohya_gui.py
2. 设置路径
├── 模型: 预训练模型路径
├── 数据: 训练数据路径
└── 输出: LoRA 保存路径
3. 配置参数
├── 选择 LoRA 类型
├── 设置 Rank/Alpha
├── 设置学习率
└── 设置 Epochs
4. 开始训练
└── 点击开始按钮
推荐配置:
┌─────────────────────────────────────────────────────────────┐
│ 角色 LoRA 配置: │
│ ├── Base Model: SD 1.5 │
│ ├── Rank: 32 │
│ ├── Alpha: 32 │
│ ├── Learning Rate: 1e-4 │
│ ├── Epochs: 15 │
│ ├── Batch Size: 2 │
│ └── 图片数: 20 │
│ │
│ 风格 LoRA 配置: │
│ ├── Base Model: SD 1.5 │
│ ├── Rank: 64 │
│ ├── Alpha: 32 │
│ ├── Learning Rate: 5e-5 │
│ ├── Epochs: 30 │
│ ├── Batch Size: 2 │
│ └── 图片数: 100 │
└─────────────────────────────────────────────────────────────┘
命令行训练 #
text
sd-scripts 命令行训练:
训练命令示例:
accelerate launch --num_cpu_threads_per_process 8 train_network.py \
--pretrained_model_name_or_path="/path/to/model" \
--train_data_dir="/path/to/data" \
--output_dir="/path/to/output" \
--output_name="my_lora" \
--save_model_as=safetensors \
--prior_loss_weight=1.0 \
--max_train_epochs=15 \
--learning_rate=1e-4 \
--optimizer_type="AdamW8bit" \
--mixed_precision="fp16" \
--network_module=networks.lora \
--network_dim=32 \
--network_alpha=32 \
--train_batch_size=2 \
--save_every_n_epochs=5
参数说明:
├── pretrained_model_name_or_path: 基础模型路径
├── train_data_dir: 训练数据路径
├── output_dir: 输出路径
├── network_dim: Rank
├── network_alpha: Alpha
└── max_train_epochs: 训练轮数
DreamBooth 训练 #
DreamBooth 概述 #
text
DreamBooth 特点:
优势:
├── 效果更强
├── 学习更充分
├── 适合角色训练
└── 无需大量数据
劣势:
├── 文件大 (2-6GB)
├── 显存需求高
├── 训练时间长
└── 可能过拟合
适用场景:
├── 需要最强效果
├── 角色一致性要求高
└── 有足够硬件资源
DreamBooth 训练流程 #
text
DreamBooth 训练步骤:
1. 准备数据
├── 实例图片: 5-20 张
├── 类别图片: 自动生成或手动准备
└── 实例提示词: "a [class] [identifier]"
2. 设置参数
├── Instance prompt: "a sks person"
├── Class prompt: "a person"
├── Prior loss weight: 1.0
└── Learning rate: 1e-6 到 5e-6
3. 训练
├── 使用 diffusers 或 sd-scripts
└── 监控损失曲线
4. 测试和调整
├── 生成测试图像
├── 检查过拟合
└── 调整参数重新训练
训练命令示例:
accelerate launch train_dreambooth.py \
--pretrained_model_name_or_path="runwayml/stable-diffusion-v1-5" \
--instance_data_dir="/path/to/instance" \
--class_data_dir="/path/to/class" \
--output_dir="/path/to/output" \
--instance_prompt="a sks person" \
--class_prompt="a person" \
--num_class_images=200 \
--train_batch_size=1 \
--gradient_accumulation_steps=1 \
--learning_rate=1e-6 \
--lr_scheduler="constant" \
--max_train_steps=800
训练优化 #
防止过拟合 #
text
过拟合表现:
├── 训练图像被完全记住
├── 无法泛化到新场景
├── 生成结果僵硬
└── 缺乏变化
防止方法:
1. 减少训练步数
├── 降低 Epochs
└── 早停策略
2. 增加数据多样性
├── 更多训练图片
├── 不同场景和角度
└── 数据增强
3. 调整学习率
├── 降低学习率
└── 使用学习率调度
4. 使用正则化
├── Prior loss
└── Dropout
5. 监控验证集
└── 定期测试泛化能力
提高训练效果 #
text
效果优化策略:
1. 数据质量
├── 高质量图片
├── 清晰标注
└── 多样性
2. 参数调优
├── 网格搜索
├── 经验值参考
└── 逐步调整
3. 学习率调度
├── Constant: 恒定
├── Cosine: 余弦衰减
└── Linear: 线性衰减
4. 优化器选择
├── AdamW: 默认
├── AdamW8bit: 省显存
└── DAdaptation: 自适应
5. 混合精度
├── FP16: 推荐
├── BF16: 新显卡
└── 减少显存占用
显存优化 #
text
显存优化技巧:
1. 使用 8bit 优化器
└── AdamW8bit
2. 梯度检查点
└── --gradient_checkpointing
3. 混合精度训练
└── --mixed_precision="fp16"
4. 减小 Batch Size
└── 配合梯度累积
5. 使用 xformers
└── --xformers
6. 降低分辨率
└── 512×512 而非更高
配置示例:
├── Batch Size: 1
├── Gradient Accumulation: 4
├── Mixed Precision: fp16
├── Optimizer: AdamW8bit
└── Gradient Checkpointing: True
训练后处理 #
模型测试 #
text
测试流程:
1. 基础测试
├── 使用触发词生成
├── 检查特征是否学到
└── 测试不同权重
2. 泛化测试
├── 不同场景
├── 不同风格
└── 不同提示词组合
3. 对比测试
├── 与原模型对比
├── 与其他 LoRA 对比
└── 评估改进效果
4. 问题诊断
├── 过拟合: 减少训练
├── 欠拟合: 增加训练
└── 风格冲突: 调整权重
模型优化 #
text
模型优化方法:
1. 权重剪枝
├── 减小文件大小
└── 可能损失质量
2. 合并模型
├── 与基础模型合并
└── 方便分发
3. 多版本对比
├── 保存多个检查点
├── 选择最佳版本
└── 不同场景用不同版本
4. 元数据添加
├── 添加触发词信息
├── 添加训练参数
└── 方便使用
常见问题 #
训练失败 #
text
常见错误及解决:
CUDA Out of Memory:
├── 减小 Batch Size
├── 使用 8bit 优化器
├── 开启混合精度
└── 降低分辨率
NaN Loss:
├── 降低学习率
├── 检查数据质量
├── 使用 FP32
└── 检查标注文件
训练不收敛:
├── 调整学习率
├── 检查数据标注
├── 增加训练步数
└── 更换优化器
效果不佳 #
text
效果优化建议:
特征不明显:
├── 增加训练步数
├── 提高学习率
├── 增加 Rank
└── 检查触发词使用
过拟合:
├── 减少训练步数
├── 降低学习率
├── 增加数据多样性
└── 使用 Prior Loss
风格冲突:
├── 调整权重
├── 修改提示词
├── 使用不同基础模型
└── 重新训练
下一步 #
掌握训练技术后,继续学习:
最后更新:2026-04-05