背景与硬件准备
大模型训练通常包含预训练、微调(SFT)和人类反馈强化学习(RLHF)三个阶段。DPO 作为 RLHF 的一种主流方法,相比 PPO 等方案对显存要求更低,更适合资源有限的场景进行偏好对齐。
本次实战环境如下:
- 硬件:双卡 RTX 4070 (12G*2),64G 内存
- 系统:Ubuntu 24.04
- 模型:Qwen-VL 系列(因涉及多模态任务,若无图片需求可选纯语言模型)
关于环境选择,强烈建议直接使用 Linux 系统进行训练。Windows 环境下常遇到显存不稳定及分布式训练报错问题,WSL2 虽能缓解但仍有局限。长期投入 LLM 开发的同学,一步到位到 Linux 能少走很多弯路。
本文简称 LLaMA-Factory 为 LF。需注意,若使用 DeepSpeed 进行分布式训练,LF 目前仅适配特定版本,配置时请留意兼容性。
一、数据准备
我们需要从 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 文件转换为 LF 识别的 JSON 格式:
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)

