前言
大语言模型(LLM)训练通常包含预训练、微调和 RLHF 三个环节。DPO(Direct Preference Optimization)属于 RLHF 中的一种主流方法,相比 PPO 等方法,DPO 对硬件资源需求更低,显存占用更少,适合在有限环境下进行偏好优化。
硬件环境参考:
- GPU: RTX 4070 12GB x 2
- 内存:64GB
- 操作系统:Ubuntu 24.04
- 模型:Qwen-VL-2B(多模态任务微调后版本,纯文本任务可选用语言模型)
注意: 本文仅介绍 DPO 训练流程。请提前配置好环境并下载 LLaMA-Factory。若需使用分布式训练,请注意 LLaMA-Factory 目前对 DeepSpeed 版本的适配情况(建议确认当前支持的版本范围)。
系统建议: 虽然 Windows 可用于学习,但在多卡训练及显存稳定性方面,Linux 系统具有明显优势。建议长期学习者直接使用 Linux 环境以避免兼容性问题。
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 需要特定的 JSON 格式数据。官方规范如下:
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"chosen": "优质回答(必填)",
"rejected": "劣质回答(必填)"
}
]
编写 Python 脚本将 Arrow 格式转换为 JSON 格式:
import json
from datasets import 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()

