前言
LLM 训练通常包含预训练、微调及 RLHF 环节。DPO 作为 RLHF 的一种主流方法,相比 PPO 和 GRPO,对硬件资源的需求更低,显存占用更优,适合入门实践。
环境准备
本教程基于以下配置:双卡 RTX 4070 (12G)、64G 内存、Ubuntu 24.04。模型选用 QWEN-3vl-2B(若无需多模态功能,可切换为纯语言模型)。
关于系统选择,虽然 Windows 也能运行,但在多卡训练及显存稳定性上,Linux 具有显著优势。建议长期投入大模型学习的朋友直接部署 Linux 环境,减少排查底层报错的时间成本。
注意:LLaMA-Factory 目前对 DeepSpeed 的最新版本适配可能滞后,若需分布式训练,请确认版本兼容性。
步骤一:加载数据集
我们使用 Hugging Face 上的医疗 DPO 数据集。通过 datasets 库即可快速加载。
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 字段的结构。
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('arrow', data_files=dataset_path)
else:
dataset = load_dataset(dataset_path, name='reasoning_enhancement')
train_dataset = dataset['train']
output_data = []
for item in train_dataset:
if 'instruction' in item and 'chosen' in item and 'rejected' in item:
json_item = {
"instruction": item['instruction'],
"input": item.get('input', ''),
"chosen": item['chosen'],
"rejected": item['rejected']
}
output_data.append(json_item)
with open(output_json_path, 'w', encoding='utf-8') as f:
json.dump(output_data, f, ensure_ascii=False, indent=2)
print(f"转换完成!共处理了 {len(output_data)} 条数据")
if __name__ == "__main__":
arrow_file_path = "path/to/your/Reasoning Enhancement.arrow"
output_json_path = "med_refl_dpo.json"
convert_arrow_to_json(arrow_file_path, output_json_path)
完成数据集的标准化后,将获得的 JSON 文件复制到 LLaMA-Factory 的 data 目录下。
之后修改 dataset_info.json,增加自定义数据集配置:
{
"MED_DPO": {
"file_name": "/home/user/LLaMA-Factory/data/med_dpo.json",
"ranking": true,
"columns": {
"prompt": "instruction",
"query": "input",
"chosen": "chosen",
"rejected": "rejected"
}
}
}
步骤三:启动训练
在终端进入 LLaMA-Factory 目录,输入 llamafactory-cli webui 启动可视化界面。
在网页端设置参数时,由于是多卡训练,建议选择 DeepSpeed。单卡训练的同学不需要勾选此选项。本次训练大约需要 24G 显存,如果显存紧张,可以通过开启量化或者减少序列长度来优化。
训练过程可能需要数小时,期间若遇到环境不兼容问题,需耐心调整依赖版本。
步骤四:合并模型
训练完成后,在导出模块选择训练好的权重文件位置,与原始模型进行合并,生成最终可用的模型文件。

