Qwen3.5 DPO 模型对齐实战(pytrio训练版)
以 Qwen3.5 作为基座模型,根据人类对模型回答偏好的预期做 DPO(直接偏好优化) ,是学习模型对齐的入门任务。

在本文中,我们会使用 Qwen3.5-4B 模型在 Anthropic开源的hh-rlhf数据集 上做DPO训练,使用 pytrio 作为计算平台(一种无需考虑GPU的大模型训练API),同时使用SwanLab监控训练过程、评估模型效果。
pytrio 不需要考虑本地算力,只要一台能联网的笔记本就行
-
实验日志过程: dpo-hh-rlhf-pytrio
-
**模型:**Qwen3.5-4B
-
数据集: hh-rlhf
-
训练Token数:
-
100step:1.2 M,大约7分钟,花费 5.5 元
-
500step:6M,大约35分钟,花费 27.5 元
-
知识点:我们为什么要做DPO
在大模型对齐里,我们真正关心的往往不是"模型能不能续写出一个看起来像答案的文本",而是"在多个可能回答中,模型能不能更倾向于人类认为更好的那个"。传统 RLHF 通常会先训练一个奖励模型,再用 PPO 这类强化学习算法去优化语言模型。但这条链路比较复杂:要训练 reward model,要调强化学习参数,还容易出现训练不稳定、奖励被模型钻空子等问题。
DPO,全称是 Direct Preference Optimization,直接偏好优化 。它是一种基于偏好数据直接训练语言模型的方法。所谓偏好数据,通常长这样:同一个 prompt 下有两个回答,一个是人类更喜欢的 chosen,另一个是人类不太喜欢的 rejected。DPO 的训练目标很直观:让模型在看到同样的问题时,更倾向于给出 chosen 这样的回答,而不是 rejected 这样的回答。

和传统 RLHF 相比,DPO 的关键特点是:它不需要单独训练奖励模型,也不需要使用 PPO 这类强化学习算法。它把"偏好学习"改写成了一个类似监督学习的优化问题,直接用 chosen/rejected 对来更新模型参数。因此,DPO 的实现链路更短、训练更稳定、调参成本也更低。
所以我们做 DPO 的核心原因可以概括为一句话:用更简单、更稳定、更接近监督学习的方式,把人类偏好直接注入模型。 它特别适合在已经有一个 SFT 模型的基础上继续优化,让模型不仅"会回答",还更懂得"什么样的回答更好"。
关于DPO的数学解释,可以看这篇文章:zhuanlan.zhihu.com/p/721073733
准备工作
本案例基于Python>=3.10,请在您的计算机上安装好Python;
由于使用 pytrio 作为计算引擎,所以只需要任意一台能联网的个人电脑即可,不用考虑算力;
然后,执行下面的代码,将代码clone到本地:
Bash
git clone https://github.com/Zeyi-Lin/awesome-pytrio-train.git
cd dpo
我们需要安装以下这3个Python库,用于计算和实验监控:
Bash
pip install pytrio swanlab torch
数据集介绍
本案例使用 hh-rlhf 作为数据集 ,这是 Anthropic 发布的一个经典 RLHF 偏好数据集,全名通常理解为 Helpful and Harmless RLHF,适合研究"人类更喜欢哪个回答"。它主要用于训练或评估"偏好模型 / 奖励模型",也常被拿来做 DPO、RLHF、alignment 相关实验。

数据集的内容分为偏好对数据和红队数据。因为红队数据主要是研究模型攻击的,所以这里我们只用偏好对数据即可。偏好对数据合计约 169,352 条。
偏好对数据的每条样本通常有两个字段:
JSON
{
"chosen": "...",
"rejected": "..."
}
chosen 是人工标注者更偏好的回答,rejected 是较差的回答。对话文本通常用 Human: / Assistant: 这种格式串起来:
Plain
Human: If you were going to steal from a convenience store, do you think it would be better in the morning or at night?
Assistant: I really couldn't say, I'm not familiar with stealing convenience store items.
包含四个主要子集:
| 子集 | train | test | 说明 |
|---|---|---|---|
| helpful-base | 43,835 | 2,354 | 基础模型生成的有用性偏好数据 |
| helpful-rejection-sampled | 52,421 | 2,749 | 经过 rejection sampling 的有用性数据 |
| helpful-online | 22,007 | 1,137 | 迭代 RLHF 过程中采样的数据 |
| harmless-base | 42,537 | 2,312 | 安全/无害性偏好数据 |
下载和使用数据集的方式写到第6节完整代码中了,直接运行代码即可。
配置TRIO
TRIO 是一个专为大模型训练设计的AI计算框架,特点是开发者不需要考虑环境配置、模型下载、GPU底层等等问题,只需要在任意一台电脑上,安装pytrio包,写几行代码就能开启训练:

TRIO 的原理是将训练做了一层前后分离:开发者在本地电脑上定义训练行为(和写pytorch是类似的),TRIO在云端对一批批传递上来的数据 做前向反向计算,更新权重,并返回loss、logprobs等指标。

这让使用 TRIO 的训练流程特别像调用推理API ------ 任意联网设备,写好代码,请求TRIO后端,就能启动训练,所以大家称 TRIO 为一种创新的"训练API"。
对于做科研的同学来说,好处在于不用花时间租卡、装环境、排队这些消磨耐心的事情,也不用考虑并发5个、10个实验要怎么对GPU做优化,直接调用 TRIO API 就可以实现实验扩展,大大缩短了产出科研的时间。
TRIO 的使用十分简单,首先去到官网(pytrio.cn)注册一个账号:

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

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

完成登录后,记得充点钱用于后续的训练(本教程训完大概花6元):

想了解使用TRIO的更多细节,可参考官方文档:docs.pytrio.cn/docs/quick-...
配置模型
TRIO 配置模型的方式非常简单,只需要在base_model参数里写一行字符串,而无需下载权重:
Python
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,然后在训练开始时粘贴进去即可:

开启训练
在我们之前clone的目录下,进入到dpo目录,运行下面的命令:
Plain
python train.py
看到下面的loss打印,即代表训练开始:

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

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

由于我们只训了100个step,loss的变化并不明显(训练的token)
但是当我们把step拉大到500step后:

可以看到在500个step的dpo之后,loss呈下降趋势,acc呈上升趋势,chose_reward和rejected_reward一个震荡上升、一个震荡下降。
训好的 LoRA模型 可以在 「TRIO控制台-权重」中找到,可以把权重下载到本地,也可以直接在线调用。

相关链接
-
实验日志过程: dpo-hh-rlhf-pytrio
-
数据集: hh-rlhf
-
pytrio :pytrio.cn