用 Unsloth 训练你自己的 Deepseek-R1 推理模型,以下内容为豆包翻译 Train your own R1 reasoning model with Unsloth (GRPO) 的结果,原文地址见文末。
今天,我们非常激动地要在Unsloth中引入推理功能!DeepSeek的R1研究揭示了一个 “顿悟时刻”:R1-Zero通过使用群体相对策略优化(GRPO),在没有人类反馈的情况下,自主学会了分配更多思考时间。
我们对整个GRPO过程进行了优化,使其比Hugging Face + FA2少用80%的VRAM(显存)。这意味着,借助Qwen2.5(15亿参数),你仅用7GB的VRAM就能复现R1-Zero的 “顿悟时刻”。
主要细节
- 拥有15GB VRAM,Unsloth能让你将任何参数规模高达150亿的模型,如Llama 3.1(80亿)、Phi-4(140亿)、Mistral(70亿)或Qwen2.5(70亿),转变为推理模型。
- 最低配置要求:仅需7GB VRAM,你就能在本地训练自己的推理模型。
- Tiny-Zero团队令人惊叹,他们证明了使用Qwen2.5(15亿参数)可以实现 “顿悟时刻”,但这需要2块A100 GPU(160GB VRAM)。现在,借助Unsloth,你仅用一块7GB VRAM的GPU就能达到同样的效果。
- 以前,GRPO仅支持全量微调,而现在我们让它也适用于QLoRA和LoRA。
请注意,这不是对DeepSeek的R1蒸馏模型进行微调,也不是使用R1的蒸馏数据进行调整(Unsloth早已支持这些操作)。这是通过GRPO将标准模型转变为功能完备的推理模型。
GRPO的用例包括:如果你想创建一个带有奖励机制的定制模型(例如用于法律、医学领域等),GRPO可以提供帮助;如果你有输入和输出数据(如问题和答案),但缺少思维链或推理过程,GRPO能够神奇地为你生成推理过程,还有更多用途!
GRPO与 “顿悟时刻”
DeepSeek的研究人员在使用纯强化学习(RL)训练R1-Zero时,观察到了 “顿悟时刻”。模型在没有任何人类指导或预定义指令的情况下,通过重新评估初始方法,学会了延长思考时间。
在一个测试示例中,即便我们仅使用GRPO对Phi-4进行了100步训练,结果也十分明显。未使用GRPO的模型没有思考标记,而使用GRPO训练的模型不仅有思考标记,还给出了正确答案。
提示:9.11和9.9哪个更大?
使用GRPO训练后的Phi-4
<推理过程>为了确定9.11和9.9哪个更大,我们应该从左到右逐位比较这两个数字。
- 首先,比较个位上的数字:两个数字个位上都是9。
- 接着,比较十分位上的数字:9.11十分位上是1,9.9十分位上是9。因为1小于9,根据十分位的比较,9.11小于9.9。
- 为了严谨,再考虑百分位:9.11百分位上是1,9.9可以写成9.90,其百分位是0。即便比较百分位,1大于0,但由于十分位的比较已经确定9.11小于9.9,所以这一点无关紧要。
因此,9.9大于9.11。</推理过程><答案>9.9大于9.11。</答案>
未使用推理的Phi-4
9.11大于9.9。在比较小数时,要从左到右看数位。两个数的整数部分相同(都是9),所以接下来比较十分位上的数字。在9.11中,十分位是1,在9.9中,十分位是9。由于1小于9,你可能最初会认为9.9更大,但你还需要考虑9.11百分位上的1。当你把9.9写成9.90进行比较时,你会发现9.11大于9.90。因此,9.11大于9.9。
这种神奇的效果可以通过GRPO复现。GRPO是一种强化学习算法,与依赖价值函数的近端策略优化(PPO)不同,它无需价值函数就能高效优化响应。在我们的笔记本中,我们使用GRPO训练模型,旨在让模型自主开发自我验证和搜索能力,创造一个小型 “顿悟时刻”。
工作原理
- 模型生成一组响应。
- 每个响应根据正确性或由某些奖励函数创建的其他指标进行评分,而不是基于大语言模型奖励模型。
- 计算这组响应的平均得分。
- 将每个响应的得分与组平均得分进行比较。
- 强化模型,使其更倾向于得分更高的响应。
例如,假设我们希望模型解决以下问题:
- 1+1等于多少? >> 思考过程/解题步骤 >> 答案是2。
- 2+2等于多少? >> 思考过程/解题步骤 >> 答案是4。
以前,人们必须收集大量数据来填充解题步骤/思考过程。但是GRPO(DeepSeek使用的算法)或其他强化学习算法可以引导模型自动展现推理能力并生成推理痕迹。相反,我们需要创建良好的奖励函数或验证器。例如,如果模型给出正确答案,给它打1分;如果有单词拼写错误,扣0.1分,以此类推!我们可以提供众多函数来对过程进行奖励。
Unsloth中的GRPO
如果你在本地使用Unsloth的GRPO功能,请务必 “pip install diffusers” 安装diffusers库,因为它是一个依赖项。
请等待至少300步,奖励才会真正增加,并且请使用最新版本的vLLM。请记住,我们在Colab上的示例仅训练了1小时,所以结果并不理想。为了获得良好的效果,你至少需要训练12小时(这是GRPO的工作方式),但请记住这并非强制要求,你可以随时停止训练。
建议将GRPO应用于参数至少为15亿的模型,以便正确生成思考标记,因为较小的模型可能无法做到这一点。如果你使用的是基础模型,请确保你有聊天模板。Unsloth现在直接内置了GRPO训练损失跟踪功能,无需像wandb等外部工具。
[ 19/100 27:23 < 2:10:29, 0.01 its, Epoch 0.00/1]
Step Training Loss reward reward_std completion_length k1
1 0.000000 0.041667 0.064550 200.000000 0.000000
2 0.000000 0.125000 0.000000 200.000000 0.000000
3 0.000000 0.404500 0.960518 191.666672 0.000002
4 0.000000 0.104167 0.051031 200.000000 0.000002
5 0.000000 0.104167 0.051031 200.000000 0.000002
6 0.000000 0.044500 0.197184 200.000000 0.000002
7 0.000000 0.044167 0.145617 198.500000 0.000004
除了支持GRPO,我们随后还支持在线近端策略优化(Online DPO)、近端策略优化(PPO)和递归近端策略优化(RLOO)!更多细节可以在Keith的文章和博客中查看,其中包括他在Github上的分支,展示了他如何实现Online DPO。在Joey的推文上也可以看到Google Colab上GRPO更改的初稿!他们的贡献使我们也能够支持其他基于生成的强化学习方法。以下是Unsloth的Online DPO显存消耗与标准Hugging Face + FA2的对比图。
Unsloth与vLLM
- 吞吐量提升20倍,显存节省50% :你现在可以在微调流程中直接使用vLLM,这大大提高了吞吐量,并且让你能够同时对模型进行微调与推理。在1块40GB的A100 GPU上,使用Unsloth对Llama 3.2 30亿参数指令模型进行动态4位量化,预计每秒可处理4000个token。在16GB的Tesla T4 GPU(免费的Colab GPU)上,每秒可处理300个token。
- 减少内存占用 :我们还神奇地消除了同时加载vLLM和Unsloth时的双倍内存占用问题,对于Llama 3.1 80亿参数模型可节省约5GB内存,对于Llama 3.2 30亿参数模型可节省约3GB内存(这得益于Boris的启发)。Unsloth原本可以在1块48GB的GPU上对Llama 3.3 700亿参数指令模型进行微调,Llama 3.3 700亿参数占用40GB VRAM。如果不消除双倍内存占用,那么同时加载Unsloth和vLLM时,我们将需要至少80GB的VRAM。但使用Unsloth,你仍然可以在小于48GB VRAM的情况下进行微调,并在一个软件包中获得快速推理的优势!要使用快速推理功能,首先安装vllm,然后通过fast_inference参数实例化Unsloth:
pip install unsloth vllm
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/Llama-3.2-3B-Instruct",
fast_inference = True,
)
model.fast_generate(["Hello!"])
Unsloth中vLLM的相关发现
- 动态量化 :vLLM现在可以加载Unsloth的动态4位量化模型。就像我们的1.58位动态R1 GGUF格式一样,我们发现将某些层动态量化为4位,部分层量化为16位,能够在缩小模型大小的同时显著提高准确性。
- 参数自动选择 :我们自动选择多个参数,以兼顾内存、VRAM使用效率和最大吞吐量(如分块预填充token的数量、最大序列数等)。我们默认在vLLM中启用-O3优化并启用前缀缓存。我们发现,在旧GPU上使用Flashinfer实际上会慢10%;使用FP8 KV缓存虽然会使速度慢10%,但能使吞吐量翻倍。
- 加速训练 :我们通过解析状态字典而非从磁盘加载的方式,在vLLM中实现LoRA加载,这可以使你的GRPO训练速度提高1.5倍。目前一个活跃的研究方向是探索如何在vLLM中直接编辑LoRA适配器(我目前还不确定具体方法)。这有望大幅提升速度,因为我们现在做了很多不必要的GPU数据传输。
- 减少显存波动 :vLLM在批量生成时会出现奇怪的随机VRAM峰值。我们添加了一个批量生成函数来减少内存峰值。
感谢
非常感谢Keith、Edd、Datta、MrDragonFox和Joey对这个项目的出色帮助。当然,也要感谢Hugging Face的优秀团队,尤其是TRL团队、vLLM以及开源社区,是他们的贡献才让这一切成为可能。一如既往地,非常感谢大家使用并分享Unsloth。