本文目录导读:

- 核心概念
- 方法一:使用
merge_lora.py脚本(适用于SD WebUI或基础Python环境) - 方法二:使用
diffusers库(Python代码级,最灵活) - 方法三:在ComfyUI中自动合并(无代码)
- 核心关键:权重比例(Ratio / Strength)
- 重要警告(必看!)
- 总结建议
LoRA合并权重”,我理解你大概率想问的是如何将LoRA权重合并到基础模型(Base Model)中,或者如何手动合成多个LoRA的权重。
这是一个在Stable Diffusion、LLM微调等领域非常常见的操作,以下是针对不同工具和场景的详细教程。
核心概念
LoRA是一种低秩适配技术,训练时,它不修改原模型参数,而是生成一对小的权重矩阵(通常称为 lora_up 和 lora_down)。
合并权重就是把这两个小矩阵的计算结果“加”回基础模型的原始权重矩阵中,得到一个“新的、完整的”模型。
使用 merge_lora.py 脚本(适用于SD WebUI或基础Python环境)
这是最传统、最直接的方法,适合单次合并。
- 准备文件:
- 基础模型文件(如
sd_xl_base_1.0.safetensors)。 - LoRA文件(如
my_style.safetensors)。
- 基础模型文件(如
- 运行脚本:
你可以使用SD WebUI自带的脚本或社区提供的脚本。
- 在SD WebUI中:
- 进入
Settings->Saving to。 - 找到
Pickle/NumPy/Safetensors类型的合并选项(通常靠下)。 - 勾选
Create a merged model when saving。 - 回到
Train页面,加载你的LoRA和基础模型,点击训练时通常会触发合并,或者直接运行特定的merge脚本。
- 进入
- 使用命令行脚本(推荐,更可控):
python networks/merge_lora.py \ --sd_model ./models/Stable-diffusion/base_model.safetensors \ --save_to ./models/Stable-diffusion/merged_model.safetensors \ --models ./models/Lora/my_lora.safetensors \ --ratios 0.8 # 权重比例,1.0为100% - 多LoRA合并:脚本可以同时传入多个
--models,并分别指定--ratios。
- 在SD WebUI中:
使用 diffusers 库(Python代码级,最灵活)
如果你在写代码,或者需要对合并过程做精细控制,这是最佳方法。
import torch
from diffusers import StableDiffusionPipeline
# 或者 for SDXL: from diffusers import StableDiffusionXLPipeline
from safetensors.torch import load_file
import os
# 1. 加载基础模型
base_model_id = "runwayml/stable-diffusion-v1-5" # 或本地路径
pipeline = StableDiffusionPipeline.from_pretrained(
base_model_id,
torch_dtype=torch.float16,
safety_checker=None
)
# 2. 加载LoRA权重
lora_path = "path/to/your/lora.safetensors"
lora_state_dict = load_file(lora_path)
# 注意:LoRA文件可能包含多个层,需要按照diffusers的格式处理
# 如果你使用的LoRA是标准的diffusers格式,可以直接用:
pipeline.load_lora_weights("path/to/lora.safetensors")
# 3. 手动合并(将LoRA权重冻结到基础模型中)
# 对于非标准格式或需要手动控制时:
for name, param in pipeline.unet.named_parameters():
if name in lora_state_dict:
# 这里的逻辑取决于LoRA的存储格式
# 标准LoRA通常有 'lora_down.weight' 和 'lora_up.weight'
param.data.add_(lora_state_dict[name] * 0.8) # 乘以权重系数
# 4. 保存合并后的模型
pipeline.save_pretrained("path/to/save_merged_model")
# 或者导出为单个safetensors文件(用于ComfyUI等)
from diffusers.utils import export_to_safetensors
export_to_safetensors(pipeline.unet, "merged_unet.safetensors")
在ComfyUI中自动合并(无代码)
ComfyUI拥有最直观的可视化LoRA合并方式。
- 加载LoRA:使用
Load LoRA节点。 - 设置强度:在
Load LoRA节点中,你可以设置strength_model和strength_clip。 - 多LoRA链式合并:
Load Checkpoint->Load LoRA 1->Load LoRA 2-> ... ->KSampler。- 将上一个LoRA节点的输出(
MODEL和CLIP)连接到下一个LoRA节点的输入。 - 注意:这只是运行时推理时的动态合并,并不是物理上合成一个新文件,如果你想要物理文件,请使用方法一或二。
核心关键:权重比例(Ratio / Strength)
- 0 (100%):LoRA效果完全生效,可能会覆盖基础模型风格。
- 5 - 0.7:均衡,保留基础模型特征的同时融入LoRA风格。
- < 0.3:微弱调整,适用于只修改细节(如纹理、小瑕疵)的LoRA。
- > 1.0:过拟合,容易产生扭曲、过饱和、伪影,慎用。
重要警告(必看!)
- 直接修改基础模型:一旦将LoRA权重合并进基础模型并保存,这个基础模型就被永久改变了,如果你需要原版基础模型,请提前备份。
- 精度问题:合并时会涉及浮点数计算。
float16(半精度)模型合并后可能会出现微小的颜色或细节差异。float32更准确但文件更大。 - LoRA兼容性:
- SD 1.5 的LoRA不能合并到 SD XL 的基础模型,反之亦然。
- 不同的微调模型(如
anything-v5和revAnimated)对同一LoRA的响应不同。
- 文件大小:合并后的模型文件大小等于基础模型的大小(通常2-7GB),而LoRA本身只有几十MB。
总结建议
- 临时用:在ComfyUI里链式加载多个LoRA,不合并,最安全、最灵活。
- 固定风格:用
merge_lora.py或diffusers永久合并成一个新模型,出图快。 - 新手:先从SD Web UI的
Settings里的Saving to勾选自动合并开始。
如果你能告诉我你用的是哪个工具(WebUI/ComfyUI/Auto1111/kohya_ss)以及什么模型(SD 1.5/SDXL/Flux),我可以给出更针对性的代码或截图。