无法将LoRA权重合并至Flux Dev基础模型的解决方案咨询
解决SimpleTuner训练Flux LoRA无adapter_config.json的合并问题
方法1:手动创建adapter_config.json适配PEFT加载
PEFT的PeftModel依赖adapter_config.json识别LoRA参数配置,你可以根据SimpleTuner训练Flux的默认参数生成该文件:
- 在你的checkpoint文件夹下新建
adapter_config.json,内容如下(若训练时修改过r/alpha值,需同步调整对应字段):
{ "peft_type": "LORA", "task_type": "TEXT_TO_IMAGE_GENERATION", "r": 8, "lora_alpha": 16, "target_modules": [ "q_proj", "k_proj", "v_proj", "out_proj", "gate_proj", "up_proj", "down_proj" ], "lora_dropout": 0.05, "bias": "none", "modules_to_save": null, "inference_mode": true }
- 运行你原来的代码即可正常加载合并:
from peft import PeftModel from diffusers import FluxTransformer2DModel lora_path = "<path_to_checkpoint_folder>" base_model = FluxTransformer2DModel.from_pretrained("<local_path_to_flux_model>", subfolder='transformer') model = PeftModel.from_pretrained(base_model, lora_path) merged_model = model.merge_and_unload() # 保存合并后的模型 merged_model.save_pretrained("<path_to_save_merged_model>")
方法2:手动加载LoRA权重并合并(无需PEFT)
如果不想依赖PEFT框架,可直接读取safetensors权重文件,手动合并到基础模型:
import torch from safetensors.torch import load_file from diffusers import FluxTransformer2DModel # 加载基础模型 base_model = FluxTransformer2DModel.from_pretrained("<local_path_to_flux_model>", subfolder='transformer') # 加载LoRA权重 lora_weights = load_file("<path_to_checkpoint_folder>/pytorch_lora_weights.safetensors") # 遍历LoRA权重执行合并 for name, param in lora_weights.items(): if ".lora_A" in name: base_layer_name = name.replace(".lora_A", "") lora_A = param lora_B = lora_weights[name.replace(".lora_A", ".lora_B")] alpha = 16 # 训练默认alpha值,修改过则同步调整 scaling = alpha / 8 # 8是训练默认r值,修改过则同步调整 base_layer = base_model.get_submodule(base_layer_name) with torch.no_grad(): # LoRA合并公式:基础权重 += B*A*scaling base_layer.weight.data += torch.matmul(lora_B, lora_A) * scaling # 保存合并后的模型 base_model.save_pretrained("<path_to_save_merged_model>")
注意事项
- 若训练时自定义了
r(秩)或alpha参数,必须同步修改代码中对应数值,否则合并结果会失真。 - 合并完成后建议生成测试图片,验证模型效果是否符合预期。
内容的提问来源于stack exchange,提问作者user1875136
相关产品推荐
相关产品推荐

