前言
LLM 的训练流程通常包含预训练、微调(SFT)和强化学习(RLHF)。DPO 作为 RLHF 阶段的一种主流方法,相比 PPO 等方案,对显存的需求更低,更适合资源有限的场景。如果你之前了解过 PPO、DPO 或 GRPO 的区别,应该知道 DPO 在工程落地上的优势。
本次实战基于以下硬件环境:双卡 RTX 4070 (12G)、64G 内存,操作系统 Ubuntu 24.04。模型选用 Qwen-VL-2B(若你仅处理纯文本任务,可替换为语言模型)。
环境建议:虽然 Windows 也能跑,但在多卡训练时稳定性较差,容易遇到显存波动或奇怪的报错。WSL2 或其他替代方案也未能完全解决底层兼容问题。如果打算长期投入大模型研究,建议直接部署 Linux 系统,能少走很多弯路。
下文简称 LLaMA-Factory 为 LF。注意,当前版本 LF 对 DeepSpeed 的适配主要集中在 10.0-16.0 之间,若需使用分布式训练,请确认版本兼容性。
数据准备与格式转换
首先从 Hugging Face 获取数据集。这里以医疗领域的 DPO 数据集为例:
from datasets import load_dataset
ds = load_dataset("HANI-LAB/Med-REFL-DPO", 'reasoning_enhancement')
print(ds['train'][:1])
加载成功后,我们需要将源数据转换为 LLaMA-Factory 识别的 JSON 格式。官方规范如下:
[
{
"instruction": "人类指令",
"input": "人类输入",
"chosen": "优质回答",
"rejected": "劣质回答"
}
]
编写脚本完成 Arrow 到 JSON 的转换:
import json
import os
from datasets import load_dataset
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=)
()
__name__ == :
arrow_file_path =
output_json_path =
convert_arrow_to_json(arrow_file_path, output_json_path)

