基于Qwen3.5-4B模型和hh-rlhf数据集,利用pytrio平台与SwanLab监控完成DPO训练。100步1.2Mtoken耗时7分钟花费5.5元;500步6Mtoken耗时35分钟花费27.5元。实验验证了直接偏好优化在模型对齐中的有效性。
对于希望深入了解模型对齐的开发者来说,基于 Qwen3.5 进行 DPO 训练是一个理想的入门实践。本文将完整演示整个流程:采用 Qwen3.5-4B 模型,在 Anthropic 开源的 hh-rlhf 数据集上执行 DPO,计算平台使用 pytrio(一种将训练封装为 API 的工具),训练监控与评估通过 SwanLab 完成。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
在大模型对齐场景中,核心挑战在于:给定多个候选回答,模型能否准确识别出人类更偏好的那个。传统的 RLHF 方法需要先训练一个奖励模型,再通过 PPO 优化语言模型,整个链路较长,调参复杂,且容易遇到奖励欺骗等问题。
DPO(Direct Preference Optimization,直接偏好优化)采用更直接的方式解决该问题:基于偏好数据,将“更喜欢哪个回答”转化为类似监督学习的优化目标。偏好数据通常包含同一个提示下的两个回答——人类更喜欢的记为 chosen,不太好的记为 rejected。DPO 的目标直观明确:让模型在面对相同问题时,倾向于输出 chosen 风格的回答,而非 rejected 风格。

与传统 RLHF 相比,DPO 的核心优势在于:无需单独训练奖励模型,也不依赖 PPO 等强化学习算法。它将偏好学习改写为监督学习问题,直接利用 chosen/rejected 对更新参数。因此,实现路径更短,训练更稳定,调参成本也更低。
一句话总结:用更简单、更稳定的方式,将人类偏好直接注入模型。 在已有 SFT 模型的基础上,DPO 是进一步优化的理想选择——让模型不仅“会回答”,更懂得“怎样回答更好”。
本案例基于 Python ≥ 3.10,请确保本地已安装 Python。由于使用 pytrio 作为计算引擎,仅需一台能联网的普通电脑即可,无需担心算力问题。
首先,将代码克隆到本地:
git clone
cd dpo
然后安装以下三个 Python 库:
pip install pytrio swanlab torch
本案例使用 hh-rlhf 数据集。该数据集由 Anthropic 发布,是经典的 RLHF 偏好数据集,全称常称为 Helpful and Harmless RLHF,专门用于研究“人类更偏好哪个回答”,非常适合 DPO、RLHF 以及对齐相关实验。

数据集包含偏好对数据和红队数据。红队数据主要用于模型攻击研究,本文仅使用偏好对数据,共计约 169,352 条。
偏好对数据中每条样本包含两个字段:
{
"chosen": "...",
"rejected": "..."
}
chosen 是人工标注者更偏好的回答,rejected 是相对较差的回答。对话文本通常采用 Human: / Assistant: 格式拼接:
Human: If you were going to steal from a convenience store, do you think it would be better in the morning or at nightAssistant: I really couldn't say, I'm not familiar with stealing convenience store items.
数据集包含四个主要子集:
| 子集 | 训练集 | 测试集 | 说明 |
|---|---|---|---|
| helpful-base | 43,835 | 2,354 | 基础模型生成的有用性偏好数据 |
| helpful-rejection-sampled | 52,421 | 2,749 | 经过拒绝采样的有用性数据 |
| helpful-online | 22,007 | 1,137 | 迭代 RLHF 过程中采样的数据 |
| harmless-base | 42,537 | 2,312 | 安全/无害性偏好数据 |
数据集的下载与使用方法已集成在第6节的完整代码中,直接运行即可。
TRIO 是一款专为大模型训练设计的 AI 计算框架。其最大特点是开发者无需操心环境配置、模型下载、GPU 底层等问题——只需在任意电脑上安装 pytrio 包,编写几行代码即可开始训练。

其原理是将训练过程前后分离:开发者在本地定义训练行为(类似编写 PyTorch 代码),TRIO 在云端对批量上传的数据进行前向反向计算、更新权重,并返回 loss、logprobs 等指标。

这样一来,训练流程变得类似于调用推理 API——任何联网设备,写好代码,请求后端,即可启动训练。因此,许多人将 TRIO 称为一种创新的“训练 API”。
对于科研人员而言,优势尤为突出:无需租用 GPU、配置环境、排队等待,也无需在同时运行多个实验时纠结资源分配,直接调用 API 即可扩展实验规模,显著缩短产出周期。
TRIO 的使用非常简单。首先访问官网(pytrio.cn)注册账号:

注册完成后,在「总览」页面复制 API Key:

然后在本地环境执行:
trio login
粘贴 API Key,按回车即可完成登录:

登录后,建议向账户充值以便后续训练(本教程全部完成约需 6 元):

更多使用细节可参考 TRIO 官方文档。
TRIO 配置模型非常简单,只需在 base_model 参数中填写一行字符串,无需下载权重:
training_client = service_client.create_lora_training_client(
base_model="Qwen/Qwen3.5-4B",
rank=32,
)
切换模型同样仅需修改字符串,无需等待下载和部署。截至本文发布时,支持的模型包括 Qwen3.5-4B 和 Qwen3.6-27B。
使用 SwanLab 监控训练过程并评估模型效果。

如果首次使用 SwanLab,需要先到 swanlab.cn 注册账号,在用户设置页面复制 API Key,然后在训练开始时粘贴即可。

在之前克隆的目录下,进入 dpo 文件夹,运行:
python train.py
看到以下 loss 打印,即表示训练已开始:

训练完成后,权重可在 TRIO 控制台的「权重」选项卡中找到:

在 SwanLab 上查看最终训练结果:

仅训练 100 步时,loss 变化不明显(训练 token 量较小)。
将步数增加到 500 后:

可见经过 500 步 DPO 训练,loss 呈下降趋势,acc 呈上升趋势,chose_reward 和 rejected_reward 分别呈现震荡上升和下降,符合预期。
训练好的 LoRA 模型可在「TRIO 控制台 - 权重」中获取,支持下载到本地或直接在线调用。
