AI Toolkit LoRA 模型合并:完整调参指南
【免费下载链接】ai-toolkitThe ultimate training toolkit for finetuning diffusion models项目地址: https://gitcode.com/GitHub_Trending/ai/ai-toolkit
AI Toolkit 内置 LoRA 模型合并流程:多个独立训练的权重文件按指定强度融合为单个 checkpoint,最终输出 bfloat16 或 fp16 文件。
三步完成 LoRA 模型合并(快速上手)
- 准备文件:用同一底模训练两个以上 LoRA,例如按 config/examples/train_lora_flex_24gb.yaml 得到
.safetensors文件。 - 写输入清单:合并输入是一个 JSON 数组,每项包含
path(文件位置)和strength(强度)两个字段。 - 执行命令:在项目根目录运行。
python ui_scripts/merge_loras.py \ --loras '[{"path": "output/lora_a.safetensors", "strength": 1.0}, {"path": "output/lora_b.safetensors", "strength": 0.5}]' \ --output output/merged_lora.safetensors \ --save_dtype bfloat16运行结束后会打印{"ok": true, "num_loras": 2, ...},合并结果写入--output指定路径。
合并机制(2 句话版本)
合并的核心是“先缩放、再相加”:每个 LoRA 的张量乘以自己的强度后,按 key 累加进同一个 state dict。在 AI Toolkit 模型融合的两条入口里,处理方式不同:扩展流程 extensions/example/ExampleMergeModels.py 中weight是相对值,会先归一化到总和为 1 再缩放权重:
total_weight = sum(m.weight for m in self.models_to_merge) weight_adjust = 1.0 / total_weight for model in self.models_to_merge: model.weight *= weight_adjustCLI 脚本里的strength则是绝对值、不做归一化,写配置时两种口径不能混用。
LoRA 权重融合配置指南(按场景)
双模型等权合并
- 改哪个字段:
--loras中两个条目的strength。 - 影响什么:两组权重以相同强度相加,输出风格约各占一半。
- 推荐值:1.0 / 1.0;若输出过强或色彩发闷,两者同时降到 0.7 / 0.7 再合并。
三模型以上不等权配置
- 改哪个字段:清单中每项的强度,数量不受限制;扩展配置里对应
weight字段。 - 影响什么:扩展流程会把 1.0 / 1.0 / 0.3 先归一化为 1/2.3、1/2.3、0.3/2.3 再应用;CLI 则按原值直接计算,字段写法参考 extensions/example/config/config.example.yaml。
- 推荐值:主体风格 1.0,辅助风格 0.3–0.5,避免弱项风格被强风格淹没。
精度与显存平衡
- 改哪个字段:
--save_dtype(默认 bfloat16)与--device(默认 cpu)。 - 影响什么:输出文件大小、精度,以及能否一次性跑完;合并全程按 float32 计算,只是最终落盘时转换。
- 推荐值:默认存 bfloat16 或 fp16;显存紧张时保持
--device cpu,更多显存管理见 toolkit/memory_management/。
进阶场景与已知限制
上述流程之外,多模型合并调参还有三个常见扩展方向:
- 🔧动态权重调整:继承 jobs/process/BaseExtensionProcess.py 写自定义流程,对不同张量施加不同强度曲线,适用于同一 LoRA 在部分层需要更强的场景。
- 条件激活:不合并,推理时靠宿主工具的多 LoRA 槽位按提示词启用,适用于几个 LoRA 只按题材按需使用的场景。
- 分层融合:在合并脚本中按 key 过滤 state dict(如只合并注意力相关层),适用于两个 LoRA 在特定层互相打架的场景。
已知限制:
- 输入必须同底模训练;同 key 张量 rank 不一致时只会零填充到最大维度,维度不兼容则直接报错。
- 合并是权重的线性加法而非再训练,无法修复 LoRA 之间的特征冲突,效果变差只能靠调强度弥补;示例扩展是整模型合并,仅面向 SD1.x/SD2.x。
常见问题
Q:合并后效果变差或风格发糊,怎么调?先把所有 strength 从 1.0 降到 0.5–0.7 重新合并;若只有某个 LoRA 过强,先按 config/examples/mod_lora_scale.yaml 把它的target_weight重标到 1.0,再参与合并。
Q:显存不够怎么办?保持默认--device cpu即可,脚本在 float32 下完成合并后从 CPU 落盘,只占用系统内存,不需要把模型放到 GPU。
Q:合并出的文件比预期大?检查--save_dtype是否误设为 fp32;默认 bfloat16 时文件大小与单个 LoRA 相当。
延伸资源:整体使用说明见 README.md;合并实现分别在 ui_scripts/merge_loras.py 与 extensions/example/,示例配置在 extensions/example/config/config.example.yaml。
【免费下载链接】ai-toolkitThe ultimate training toolkit for finetuning diffusion models项目地址: https://gitcode.com/GitHub_Trending/ai/ai-toolkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考