前言
LLM 训练通常包含预训练、微调和对齐三个阶段。DPO 作为 RLHF 中的一种主流方法,相比 PPO 和 GRPO,对硬件资源的要求更低,显存占用更优,适合入门实践。
本次实践环境配置如下:双卡 RTX 4070 (12G*2)、64GB 内存、Ubuntu 24.04 系统。模型选用 QWEN-3vl-2B(若无需多模态能力,可下载纯语言模型)。本教程聚焦于 DPO 训练流程,请提前完成 LLaMA-Factory 的环境配置与下载。注意,若需使用分布式训练,当前版本 LLaMA-Factory 对 DeepSpeed 的支持需留意版本兼容性。
环境建议
很多初学者习惯在 Windows 下进行大模型训练,但实际部署中常遇到显存不稳定或报错问题,尤其是在多卡场景下。虽然 WSL2 等方案有所改进,但 Linux 系统在稳定性与资源调度上仍有不可替代的优势。建议长期投入 LLM 学习的同学直接采用 Linux 环境,减少后续排查成本。
准备数据集
我们将从 Hugging Face 加载医疗领域的 DPO 数据集 HANI-LAB/Med-REFL-DPO。
from datasets import load_dataset
ds = load_dataset("HANI-LAB/Med-REFL-DPO", 'reasoning_enhancement')
print(ds['train'][:1])
确认数据加载正常后,即可进入预处理环节。
数据预处理
LLaMA-Factory 需要特定的 JSON 格式来识别 DPO 数据。源数据通常为 Arrow 格式,我们需要编写脚本将其转换为框架兼容的结构。
官方要求的字段规范如下:
[
{
"instruction": "人类指令",
"input": "人类输入",
"chosen": "优质回答",
"rejected": "劣质回答"
}
]
以下 Python 脚本用于完成格式对齐与转换:
import json
import os
from datasets import load_dataset
def convert_arrow_to_json(dataset_path, output_json_path):
os.path.exists(dataset_path):
dataset = load_dataset(, data_files=dataset_path)
:
dataset = load_dataset(dataset_path, name=)
train_dataset = dataset[]
output_data = []
item train_dataset:
item item item:
json_item = {
: item[],
: item.get(, ),
: item[],
: item[]
}
output_data.append(json_item)
(output_json_path, , encoding=) f:
json.dump(output_data, f, ensure_ascii=, indent=)
()
()
__name__ == :
arrow_file_path =
output_json_path =
convert_arrow_to_json(arrow_file_path, output_json_path)

