前言
LLM 训练通常包含预训练、微调及 RLHF 等环节。DPO 属于 RLHF 中的一种方法,关于 RLHF 主流方法有 PPO、DPO、GRPO 等。 由于 DPO 对硬件的需求最小,显存占用最低,因此我们优先采用 DPO 进行训练。
硬件信息
- 显卡:4070 12G * 2
- 内存:64G
- 操作系统:Ubuntu 24.04
- 模型:QWEN-3vl-2B(因该模型已进行过多模态任务 SFT,故选择 VL 模型;无图片输入需求的同学可下载纯语言模型)
本篇教程仅关于 DPO 训练,请提前配置好环境并下载 LLaMA-Factory。注意:若使用分布式训练,LLaMA-Factory 目前仅支持 DeepSpeed 1.0.0-1.6.0(截至当前版本尚未完成对 DeepSpeed 最新版本的适配)。
STEP 1 从 Hugging Face 下载数据集
这里采用 Hugging Face 中的一个医疗 DPO 数据集。
from datasets import load_dataset
ds = load_dataset("HANI-LAB/Med-REFL-DPO", "reasoning_enhancement")
print(ds['train'][:1])
加载成功后,数据格式如下所示:

STEP 2 数据预处理
由于需要使用 LLaMA-Factory 框架进行 DPO 训练,需要将源 Arrow 格式的文件转换为 LF 能识别的 JSON 格式。官方文档中的规范格式如下:
[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "chosen": "优质回答(必填)", "rejected": "劣质回答(必填)" } ]
编写 Python 程序完成格式对齐:
import json
datasets load_dataset
os
():
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=)
()
()
():
arrow_file_path =
output_json_path =
convert_arrow_to_json(arrow_file_path, output_json_path)
__name__ == :
main()



