Qwen3.5 DPO 模型对齐实战(pytrio训练版)

Qwen3.5 DPO 模型对齐实战(pytrio训练版)

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

在本文中,我们会使用 Qwen3.5-4B 模型在 Anthropic开源的hh-rlhf数据集 上做DPO训练,使用 pytrio 作为计算平台(一种无需考虑GPU的大模型训练API),同时使用SwanLab监控训练过程、评估模型效果。

pytrio 不需要考虑本地算力,只要一台能联网的笔记本就行

  • 代码: awesome-pytrio-train

  • 实验日志过程: 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控制台-权重」中找到,可以把权重下载到本地,也可以直接在线调用。

相关链接

相关推荐
Token炼金师1 小时前
四段式淬炼:预训练、持续预训练、中训练、冷启动 SFT —— 课程学习与训练阶段编排
人工智能·深度学习·机器学习
荣码1 小时前
LangGraph多步工作流:Agent不够用的时候,我踩了4个坑
java·python
imuliuliang1 小时前
算法中的随机化思想及其复杂度收益评估的技术7
算法
RisunJan1 小时前
AI 前沿速报 · 周报第28周
人工智能
武子康1 小时前
调查研究-220 Batching 才是 GPU Serving 的第一性原理
人工智能·llm·gpu
dreamread1 小时前
2026盲派排法八字排盘软件怎么选:看排法口径、案例记录和学习边界
人工智能·软件工具·传统文化
曲幽1 小时前
从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战)
python·fastapi·web·async·httpx·client·await·requests·aiohttp
happyprince1 小时前
2026年07月07日全球AI前沿动态
人工智能·ai