LoRA 训练指南
训练工具选择
AI-Toolkit
- 推荐模型: FLUX 系列
- 特点: 配置简单,YAML 配置文件驱动,社区活跃
- 显存需求: 12GB+(FLUX LoRA),8GB(开启优化后)
- 安装:
git clone https://github.com/ostris/ai-toolkit+ pip install - 优势: FLUX LoRA 训练的首选工具,更新快,支持最新技术
- 适用场景: FLUX 角色/风格 LoRA 训练
Kohya_ss(sd-scripts)
- 推荐模型: SDXL / SD 1.5
- 特点: 功能全面,参数丰富,社区成熟
- 显存需求: 8GB+(SDXL),6GB+(SD1.5)
- 安装: GUI 版本
kohya_ss,或命令行版sd-scripts - 优势: 参数控制最精细,文档和教程丰富,支持多种训练方式
- 适用场景: SDXL/SD1.5 各类 LoRA 训练,精细调参
FluxGym
- 推荐模型: FLUX
- 特点: 简化版 FLUX 训练,Web UI 操作
- 显存需求: 12GB+
- 安装: 一键脚本安装
- 优势: 界面友好,新手容易上手,预设配置合理
- 适用场景: FLUX LoRA 快速训练,新手入门
SimpleTuner
- 推荐模型: 多模型支持(FLUX/SDXL/SD3)
- 特点: 多模型统一框架
- 显存需求: 视模型而定
- 安装: pip install
- 优势: 一个工具支持多种模型,灵活性高
- 适用场景: 需要在多种模型间切换训练
工具选择建议
要训练什么模型的 LoRA?
├── FLUX
│ ├── 新手/快速 → FluxGym
│ └── 进阶/自定义 → AI-Toolkit
├── SDXL
│ └── Kohya_ss(首选)
├── SD 1.5
│ └── Kohya_ss(首选)
└── 多模型都要 → SimpleTuner
数据集准备
角色 LoRA 数据集
数量: 15-30 张图片
拍摄角度分布:
- 正面:5-8 张
- 45度侧面(左右):4-6 张
- 侧面(左右):2-4 张
- 俯视/仰视:2-4 张
- 全身/半身/特写各需覆盖
表情分布:
- 中性表情:5-8 张
- 微笑:3-5 张
- 其他表情(认真、惊讶等):3-5 张
背景要求:
- 优先使用统一白色/纯色背景(减少背景干扰)
- 如果是从已有图片抠图,确保背景干净
- 避免复杂背景与角色特征混淆
图片质量要求:
- 最小分辨率:512x512
- 推荐分辨率:1024x1024
- 清晰、无模糊、无水印
- 光照均匀,避免过曝/欠曝
风格 LoRA 数据集
数量: 30-50 张图片
内容多样性:
- 不同主题(人物、风景、物品、场景等)
- 不同构图(特写、全景、中景等)
- 统一风格但内容各异(这是关键)
避免:
- 重复构图(模型会学到构图而非风格)
- 混入不同风格的图片
- 质量参差不齐的图片
自动标注工具
| 工具 | 适用场景 | 标注类型 |
|---|---|---|
| BLIP-2 | 通用图片描述 | 自然语言描述 |
| WD14 Tagger | 动漫/插画 | 标签式(danbooru 标签) |
| Florence-2 | 通用图片 | 自然语言描述(详细) |
标注修正规则
自动标注后必须人工修正:
删除与训练目标无关的标签
- 训练角色 LoRA 时,删除背景描述标签(如
white background) - 删除质量标签(如
high quality,masterpiece)
- 训练角色 LoRA 时,删除背景描述标签(如
保留目标特征相关标签
- 角色 LoRA:保留发型、发色、瞳色、服装等固定特征
- 风格 LoRA:保留主题和内容标签,让模型学习风格而非内容
添加触发词(trigger word)
- 在每张图片的标注开头添加自定义触发词
- 例如:
shs_character, 1girl, long black hair, ... - 触发词应为罕见词汇组合,避免与已有概念冲突
正则化标注
- 角色 LoRA:使用
[触发词], [变化的内容描述]格式 - 即将固定特征绑定到触发词,变化内容正常标注
- 角色 LoRA:使用
8GB 显存训练配置
核心参数表
| 参数 | 角色 LoRA | 风格 LoRA | 说明 |
|---|---|---|---|
| LoRA rank | 8 | 16 | 角色特征简单用低 rank,风格复杂用高 rank |
| LoRA alpha | 8 | 16 | 通常等于 rank 值 |
| Batch size | 1 | 1 | 8GB 只能 batch 1 |
| Gradient checkpointing | 开启 | 开启 | 必须开启以节省显存 |
| Mixed precision | FP16 或 BF16 | FP16 或 BF16 | BF16 更稳定(需 Ampere+) |
| 学习率 | 1e-4 | 5e-4 | 角色用低学习率避免过拟合 |
| 学习率调度 | cosine | cosine | 余弦退火 |
| 训练步数 | 1000-3000 | 3000-5000 | 角色收敛快,风格需要更多步 |
| Optimizer | AdamW8bit | AdamW8bit | 8bit 优化器节省显存 |
| Max grad norm | 1.0 | 1.0 | 梯度裁剪 |
| Seed | 固定值 | 固定值 | 固定 seed 便于对比 |
| Save every N steps | 200 | 500 | 定期保存 checkpoint |
SDXL 额外参数(Kohya_ss)
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Resolution | 1024 | SDXL 原生分辨率 |
| Bucket resolution steps | 64 | 分桶步长 |
| Cache latents | 开启 | 缓存 VAE 编码减少显存 |
| Cache text encoder outputs | 开启 | 缓存文本编码减少显存 |
| Network dimension | 8-16 | 同 LoRA rank |
| Network alpha | 8-16 | 同 LoRA alpha |
FLUX 额外参数(AI-Toolkit)
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Resolution | 1024 | FLUX 原生分辨率 |
| Quantize model | 开启(FP8) | 量化底模节省显存 |
| Gradient accumulation | 4 | 模拟更大 batch |
| LoRA type | standard | 标准 LoRA |
显存优化技巧(8GB 专用)
- 开启 gradient checkpointing — 用计算换显存,必须开启
- 使用 8bit 优化器 — AdamW8bit 比标准 AdamW 省一半优化器显存
- 缓存 latents 和 text encoder 输出 — 避免每步重复编码
- FLUX 使用 FP8 量化 — 底模量化到 FP8 大幅降低显存
- 降低分辨率到 768 — 如果 1024 仍然 OOM
- 关闭 xformers 用 sdpa — PyTorch 2.0+ 的 SDPA 更省显存
训练评估
定期测试生成
- 每 200 步保存 checkpoint 并生成测试图
- 使用固定 seed + 固定 prompt 生成,便于对比
- 推荐测试 prompt 至少 3 组:
- 简单场景(仅触发词 + 简单描述)
- 中等场景(触发词 + 具体场景描述)
- 挑战场景(触发词 + 复杂场景/非训练集角度)
过拟合检测
过拟合信号:
- 测试图开始丢失多样性(不同 prompt 生成类似图片)
- 背景开始出现训练集中的元素
- 非目标特征被固化(如固定姿势、固定表情)
- 画面出现噪点或伪影增多
欠拟合信号:
- 触发词几乎没有效果
- 角色特征不明显
- 需要很高的 LoRA 权重(>1.0)才有效果
Checkpoint 对比方法
使用完全相同的参数:
- 相同 seed
- 相同 prompt
- 相同 LoRA 权重(建议 0.7-1.0)
- 相同采样器和步数
生成对比网格图(每个 checkpoint 生成同一组 prompt)
评估维度:
- 相似度: 与目标角色/风格的匹配程度
- 多样性: 不同 prompt 是否产生不同结果
- 质量: 是否有伪影、模糊、色彩异常
- 泛化性: 非训练集场景是否正常
推荐选择方法
- 排除明显过拟合的 checkpoint(多样性丧失)
- 排除明显欠拟合的 checkpoint(特征不明显)
- 在剩余 checkpoint 中选择相似度和多样性最佳平衡的
- 通常最佳 checkpoint 在总训练步数的 60%-80% 处
- 如果不确定,保留 2-3 个候选 checkpoint 做更多测试
训练日志关注指标
| 指标 | 正常范围 | 异常信号 |
|---|---|---|
| loss | 稳步下降后趋于平稳 | 突然上升或剧烈波动 |
| learning rate | 按调度器变化 | 恒定不变(调度器未生效) |
| 显存占用 | 稳定 | 持续增长(内存泄漏) |
| 训练速度 | 稳定(it/s) | 逐渐变慢 |