训练完成后,产物通常是 adapter 而非全量权重。本篇说明如何合并进基座、如何多任务切换、如何续训,以及如何与 05-01 对齐 衔接。
系列索引:微调技术路线导读
一、产物结构
1 | lora-out/ |
基座权重仍从原始 MODEL_DIR 加载;adapter 通常 几十 MB–数百 MB。
二、推理:挂载 adapter
1 | from peft import PeftModel |
与训练共用 同一 tokenizer / chat template(01-01)。
三、合并进基座(merge)
将 LoRA 增量写入 (W_0),得到单一权重目录,便于不支持 PEFT 的框架:
1 | model = PeftModel.from_pretrained(base, ADAPTER_DIR) |
| 场景 | 建议 |
|---|---|
| 单任务长期部署 | merge 简化推理栈 |
| 多任务切换 | 不 merge,保留多个 adapter |
| 继续 DPO | 通常保留 adapter,policy 从 SFT adapter 初始化 |
注意:merge 后无法再单独卸掉 LoRA;保留 SFT adapter 备份再 merge。
四、多 LoRA 切换
1 | model.load_adapter("./lora-task-a", adapter_name="task_a") |
Ollama 可通过 Modelfile ADAPTER 挂载,见 Ollama 对外服务。
五、续训(resume)
从已有 adapter 继续 SFT:
1 | from peft import PeftModel |
| 踩坑 | 对策 |
|---|---|
同时传 PeftModel 与 peft_config |
只传已加载的 PeftModel |
| Trainable params = 0 | 检查 adapter 是否正确 load |
| 遗忘通用能力 | 小 lr、少 epoch;或混合通用 SFT 数据 |
六、SFT → DPO 衔接
- SFT 结束 → 保存
adapter_sft/。 - DPO:
policy= 从 SFT adapter 加载;ref_model= SFT 权重冻结副本(全量或同 adapter 冻结)。 - 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 或 本地部署。