Adapter 合并、多 LoRA 与续训

训练完成后,产物通常是 adapter 而非全量权重。本篇说明如何合并进基座、如何多任务切换、如何续训,以及如何与 05-01 对齐 衔接。

系列索引:微调技术路线导读


一、产物结构

1
2
3
4
lora-out/
├── adapter_config.json # r, alpha, target_modules
├── adapter_model.safetensors
└── (可选) README

基座权重仍从原始 MODEL_DIR 加载;adapter 通常 几十 MB–数百 MB


二、推理:挂载 adapter

1
2
3
4
5
6
7
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

base = AutoModelForCausalLM.from_pretrained(BASE_ID, torch_dtype="bfloat16", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(BASE_ID)
model = PeftModel.from_pretrained(base, ADAPTER_DIR)
model.eval()

与训练共用 同一 tokenizer / chat template01-01)。


三、合并进基座(merge)

将 LoRA 增量写入 (W_0),得到单一权重目录,便于不支持 PEFT 的框架:

1
2
3
4
model = PeftModel.from_pretrained(base, ADAPTER_DIR)
merged = model.merge_and_unload()
merged.save_pretrained("./merged-model")
tokenizer.save_pretrained("./merged-model")
场景 建议
单任务长期部署 merge 简化推理栈
多任务切换 不 merge,保留多个 adapter
继续 DPO 通常保留 adapter,policy 从 SFT adapter 初始化

注意:merge 后无法再单独卸掉 LoRA;保留 SFT adapter 备份再 merge。


四、多 LoRA 切换

1
2
3
model.load_adapter("./lora-task-a", adapter_name="task_a")
model.load_adapter("./lora-task-b", adapter_name="task_b")
model.set_adapter("task_a")

Ollama 可通过 Modelfile ADAPTER 挂载,见 Ollama 对外服务


五、续训(resume)

从已有 adapter 继续 SFT

1
2
3
4
5
6
7
8
9
10
11
from peft import PeftModel

base = AutoModelForCausalLM.from_pretrained(BASE_ID, ...)
model = PeftModel.from_pretrained(base, CHECKPOINT_DIR)

trainer = SFTTrainer(
model=model, # 已含 adapter
train_dataset=train_ds,
# 不要传 peft_config
args=SFTConfig(..., resume_from_checkpoint=True),
)
踩坑 对策
同时传 PeftModelpeft_config 只传已加载的 PeftModel
Trainable params = 0 检查 adapter 是否正确 load
遗忘通用能力 小 lr、少 epoch;或混合通用 SFT 数据

六、SFT → DPO 衔接

  1. SFT 结束 → 保存 adapter_sft/
  2. DPO:policy = 从 SFT adapter 加载;ref_model = SFT 权重冻结副本(全量或同 adapter 冻结)。
  3. DPO 后再存 adapter_dpo/;部署时可只挂最终 adapter。

详见 06-01 DPOTrainer


七、量化导出(简述)

路径 说明
merge → AWQ/GPTQ 第三方工具对 merged 权重量化
仅 adapter 部署 vLLM / Ollama 部分版本支持 LoRA 热挂
GGUF llama.cpp 工具链;需查是否支持 LoRA

训练用 QLoRA 4bit 基座 ≠ 部署必须 4bit。


八、小结

  • 开发迭代:保留 adapter,PeftModel 挂载。
  • 单任务上线:可选 merge_and_unload
  • 续训 / DPO:load adapter,勿重复 peft_config

下一步:06-01 DPOTrainer本地部署

-------------本文结束感谢您的阅读-------------