参考:
DPO(Direct Preference Optimization,直接偏好优化)-CSDN博客
为你整理了基于 LLaMA-Factory 的完整微调流程。这两篇文档分别涵盖了 SFT(监督微调) 和 DPO(直接偏好优化) 两个核心阶段。
将流程梳理为三个主要阶段,并提供了流程图描述 、核心步骤 以及关键配置参数。
📊 整体流程图 (PPT 核心图示)
建议在 PPT 的第一页放置此流程图,概括整个技术路径:
+---------------------+
| 1. 环境准备 |
| - Python >= 3.11 |
| - LLaMA-Factory |
+----------+----------+
|
v
+---------------------------------------------------+
| 2. 阶段一:SFT (监督微调) |
| - 数据预处理 (JSON -> Alpaca格式) |
| - 训练命令 (LoRA微调) |
| - 输出:LoRA 适配器模型 |
+---------------------------------------------------+
|
v
+---------------------------------------------------+
| 3. 阶段二:DPO (直接偏好优化) [可选] |
| - 数据准备 (Preference Pair: chosen/rejected) |
| - 训练命令 (基于SFT后的模型继续训练) |
| - 输出:对齐人类偏好的模型 |
+---------------------------------------------------+
|
v
+---------------------------------------------------+
| 4. 阶段三:模型合并与部署 |
| - 合并 (Base Model + LoRA) |
| - 转换 (HF -> GGUF) |
| - 量化 (Q4_K_M 等) |
| - 推理 (llama.cpp / API) |
+---------------------------------------------------+
🛠️ 第一阶段:SFT (监督微调)
参考文档: 《文本类LoRA微调验证》
1. 环境搭建
-
Python 版本: 必须 >= 3.11 (文档中特别强调 3.10 不兼容)。
-
安装命令:
git clone https://gitee.com/strakMan/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"
2. 数据预处理
- 数据格式: 需要转换为 Alpaca 格式(Instruction, Input, Output)。
- 数据增强 (DA): 可以通过代码逻辑随机替换指令模板,增加数据多样性。
- 文件位置: 将处理好的
train.json放入LLaMA-Factory/data/目录。
3. 注册数据集
在 data/dataset_info.json 中添加你的数据集配置:
"my_maintenance_data": {
"file_name": "train_qwen3_4b.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
4. 训练命令 (SFT)
llamafactory-cli train \
--model_name_or_path /path/to/Qwen3-4B-Instruct \
--dataset my_maintenance_data \
--template qwen \
--finetuning_type lora \
--lora_target q_proj,k_proj,v_proj,o_proj \
--output_dir output/qwen3-4b-sft \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--learning_rate 2e-4 \
--num_train_epochs 3.0 \
--fp16
⚖️ 第二阶段:DPO (直接偏好优化)
参考文档: 《DPO(Direct Preference Optimization,直接偏好优化)》
注:DPO 通常在 SFT 之后进行,用于让模型回答更符合人类偏好(更好 vs 更坏)。
1. DPO 数据准备
-
核心格式: 必须是 Preference Pair (偏好对)。
-
JSONL 结构: 每行一个 JSON 对象,包含
chosen(好回答) 和rejected(坏回答)。{ "instruction": "解释什么是机器学习", "chosen": "机器学习是AI的核心...", "rejected": "机器学习是一种技术。" }
2. 注册 DPO 数据集
在 data/dataset_info.json 中注册,并标记 ranking: true:
"my_dpo_full": {
"file_name": "dpo_train_full.jsonl",
"ranking": true, // 关键标识
"formatting": "alpaca",
"columns": {
"instruction": "instruction",
"chosen": "chosen",
"rejected": "rejected"
}
}
3. 训练命令 (DPO)
-
基础模型: 使用 SFT 合并后的模型 或 SFT 的 LoRA 路径。
-
命令示例:
llamafactory-cli train \ --stage dpo \ --model_name_or_path /path/to/sft-merged-model \ # 或者是 base model + resume_from_checkpoint --dataset my_dpo_full \ --template qwen \ --finetuning_type lora \ --lora_rank 8 \ --output_dir output/qwen3-4b-dpo \ --beta 0.1 \ # DPO 特有参数 --fp16
📦 第三阶段:模型合并与量化部署
参考文档: 两篇文档的结尾部分均有涉及
1. 模型合并 (Merge)
将 LoRA 适配器合并到基座模型中。
-
配置文件 (
merge_config.yaml):model_name_or_path: /path/to/base/model adapter_name_or_path: output/qwen3-4b-sft # SFT输出的LoRA路径 template: qwen finetuning_type: lora export_dir: models/qwen3-4b-merged -
执行命令:
llamafactory-cli export merge_config.yaml
2. 转换为 GGUF 格式
为了在 CPU 或 llama.cpp 中运行,需要转换格式。
-
转换 (FP16):
python convert_hf_to_gguf.py models/qwen3-4b-merged --outfile qwen3-4b-f16.gguf --outtype f16 -
量化 (压缩):
./llama-quantize qwen3-4b-f16.gguf qwen3-4b-Q4_K_M.gguf Q4_K_M
3. 推理验证
使用量化后的模型进行推理:
./llama-cli -m qwen3-4b-Q4_K_M.gguf -p "你的问题" -n 128
- 架构图: 使用最上方的流程图作为总览。
- 对比页: 可以做一个 SFT vs DPO 的对比表格(SFT 是教会模型怎么做,DPO 是教会模型哪个更好)。
- 参数页: 重点展示
dataset_info.json的配置格式,这是最容易出错的地方。 - 结果页: 展示 Loss 曲线下降图(文档中提到 Loss 从 0.4 降到 0.25 是收敛良好的表现)。