前言
LLM 训练通常包括预训练、微调和 RLHF。DPO 属于 RLHF 中的一种方法,相比 PPO 和 GRPO,其对硬件需求更低,显存占用更少。
硬件参考: 双卡 RTX 4070 12G、64G 内存、Ubuntu 24.04 系统。模型选择 QWEN-3vl-2B(多模态 SFT 后),无图片需求可下载纯语言模型。
注意: 本教程仅涉及 DPO 训练。请提前配置好环境并下载 LLaMA-Factory。若需分布式训练,请注意 LLaMA-Factory 对 DeepSpeed 版本的兼容性限制。
建议长期学习 LLM 的同学使用 Linux 系统,以减少 Windows 下常见的报错和显存不稳定问题。
LLaMA-Factory 简称 LF。
STEP1 从 Hugging Face 下载数据集
采用医疗 DPO 数据集。
from datasets import load_dataset
ds = load_dataset("HANI-LAB/Med-REFL-DPO", 'reasoning_enhancement')
print(ds['train'][:1])
数据加载正常。
STEP2 数据预处理
需要将源 Arrow 格式转为 LF 识别的 JSON 格式。官方规范如下:
[
{
"instruction": "人类指令",
"input": "人类输入",
"chosen": "优质回答",
"rejected": "劣质回答"
}
]
编写 Python 程序完成转换:
import json
from datasets import load_dataset
import os
def convert_arrow_to_json(dataset_path, output_json_path):
if 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=)
()

