概述
LLM 训练通常包含预训练、微调和 RLHF(人类反馈强化学习)环节。DPO(Direct Preference Optimization)是 RLHF 中的一种主流方法,相比 PPO 等方法对硬件需求更低,显存占用更少,适合资源有限的场景进行偏好优化。
硬件与环境
- 显卡:4070 12G * 2
- 内存:64G
- 操作系统:Ubuntu 24.04
- 模型:QWEN-3vl-2B(多模态 SFT 后模型,无图片输入需求可选纯语言模型)
注意:若使用分布式训练,请确认 LLaMA-Factory 支持的 DeepSpeed 版本。当前建议检查官方文档以适配最新 DeepSpeed 版本。
推荐使用 Linux 系统进行训练,Windows 环境在多卡训练时容易出现显存不稳定及报错问题。
步骤一:数据准备
从 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 格式的数据集。需编写脚本将源 Arrow 格式转换为 LF 识别的标准格式。
标准格式示例:
[
{
"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/dataset.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": "./data/med_dpo.json",
"ranking": true,
"columns": {
"prompt": "instruction",
"query": "input",
"chosen": "chosen",
"rejected": "rejected"
}
}
步骤三:启动训练
在 LLaMA-Factory 目录下启动 WebUI:
llamafactory-cli webui
在网页端配置参数:
- 单卡训练无需勾选 DeepSpeed,多卡训练建议选择 DeepSpeed。
- 本次训练约需 24G 显存,可通过开启量化或减少序列长度优化。
- 预计训练时间约 12 小时,期间需注意环境兼容性。
步骤四:模型合并
训练完成后,在 Export 模块选择训练好的权重文件与原始模型进行合并,生成最终可用模型。

