背景与硬件准备
大模型训练通常包含预训练、微调(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):
# 加载数据集
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)} 条数据")
print(f"JSON 文件已保存到:{output_json_path}")
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 文件放入 LF 项目的 data 目录下。接着修改 dataset_info.json 配置文件,注册自定义数据集:
"MED_DPO": {
"file_name": "data/med_dpo.json",
"ranking": true,
"columns": {
"prompt": "instruction",
"query": "input",
"chosen": "chosen",
"rejected": "rejected"
}
}
注意路径需根据实际存放位置调整。
三、启动训练
在 LF 项目根目录下的 src 或 lm 文件夹中打开终端,执行以下命令启动 WebUI:
llamafactory-cli webui
在浏览器界面中进行参数配置。对于单卡用户无需勾选 DeepSpeed,多卡训练则必须开启。本次双卡环境约需 24G 显存,若显存紧张,可通过开启量化或缩短序列长度来优化。
训练过程耗时较长,且可能遇到环境依赖问题,保持耐心并关注日志输出是关键。
四、模型合并
训练结束后,在 Export 模块中选择训练好的权重文件路径,与原始基座模型进行合并,生成最终可用的模型文件。

