用Unsloth训练自己的R1推理模型

DeepSeek 的 R1 研究揭示了一个“顿悟时刻”,其中 R1-Zero 通过使用群组相对策略优化 (GRPO) 自主学习分配更多思考时间而无需人工反馈。你就可以使用 Unsloth和Qwen2.5 (1.5B) 在仅 7GB 的 VRAM 上重现 R1-Zero 的“顿悟时刻”。

用Unsloth训练自己的R1推理模型

今天,我们很高兴在 Unsloth 中引入推理功能!DeepSeek 的 R1 研究揭示了一个“顿悟时刻”,其中 R1-Zero 通过使用群组相对策略优化 (GRPO) 自主学习分配更多思考时间而无需人工反馈。

我们增强了整个 GRPO 流程,使其使用的 VRAM 比 Hugging Face + FA2 少 80%。这样你就可以使用 Qwen2.5 (1.5B) 在仅 7GB 的 VRAM 上重现 R1-Zero 的“顿悟时刻”。

试用我们的免费 G​​RPO 笔记本:Colab 上的 Llama 3.1 (8B) 。对于具有其他模型(如 Phi-4)的 GRPO 笔记本,请访问我们的文档

1、主要细节

  • 借助 15GB VRAM,Unsloth 可让你将任何高达 15B 参数的模型(如 Llama 3.1 (8B)、Phi-4 (14B)、Mistral (7B) 或 Qwen2.5 (7B))转换为推理模型
  • 最低要求:仅 7GB VRAM 就足以在本地训练你自己的推理模型。
  • Tiny-Zero 的优秀团队证明,你可以使用 Qwen2.5 (1.5B) 实现自己的“啊哈”时刻 - 但它需要 2xA100 GPU(160GB VRAM)。现在,使用 Unsloth,你只需使用单个 7GB VRAM GPU 即可实现相同的“顿悟”时刻
  • 以前,GRPO 仅支持完全微调,但我们已使其与 QLoRA 和 LoRA 配合使用
  • 请注意,这不是对 DeepSeek 的 R1 蒸馏模型进行微调,也不是使用 Unsloth 已经支持的 R1 蒸馏数据进行调整。这是使用 GRPO 将标准模型转换为成熟的推理模型。
  • GRPO 的用例包括:如果你想制作带有奖励的定制模型(例如法律、医学等),那么 GRPO 可以提供帮助。

如果你有输入和输出数据(如问题和答案),但没有思路或推理过程,GRPO 可以神奇地为你创建推理过程!+ 更多

2、GRPO +“顿悟”时刻

DeepSeek 的研究人员在使用纯强化学习 (RL) 训练 R1-Zero 时观察到了“顿悟”时刻。该模型学会了通过重新评估其初始方法来延长其思考时间,而无需任何人工指导或预定义指令。

在一个测试示例中,尽管我们仅使用 GRPO 训练了 100 步的 Phi-4,但结果已经很明显了。没有 GRPO 的模型没有思考标记,而使用 GRPO 训练的模型有思考标记并且也有正确答案。

这种魔力可以通过 GRPO 重现,GRPO 是一种 RL 算法,可以有效地优化响应而无需价值函数,而不像依赖价值函数的近端策略优化 (PPO)。在我们的笔记本中,我们使用 GRPO 训练模型,旨在让它自主开发自己的自我验证和搜索能力 - 创造一个迷你“顿悟时刻”。

工作原理:

  • 模型生成响应组。
  • 每个响应都根据正确性或由某些设置奖励函数(而不是 LLM 奖励模型)创建的另一个指标进行评分。
  • 计算组的平均分数。
  • 每个响应的分数与组平均值进行比较。
  • 模型得到强化,以支持得分更高的响应。

例如,假设我们想要一个模型来解决:

  • 1+1 等于多少?>> 思维链/计算 >> 答案是 2。
  • 2+2 等于多少?>> 思维链/计算 >> 答案是 4。

最初,人们必须收集大量数据来填充计算/思路过程。但 GRPO(DeepSeek 使用的算法)或其他 RL 算法可以引导模型自动展示推理能力并创建推理轨迹。相反,我们需要创建良好的奖励函数或验证器。例如,如果它得到了正确的答案,就给它 1 分。如果某些单词拼写错误,则减 0.1。等等!我们可以提供许多函数来奖励这个过程。

3、Unsloth 中的 GRPO

如果在本地将 GRPO 与 Unsloth 一起使用,请 pip install diffusers,因为它是一个依赖项。

等待至少 300 步,奖励才会真正增加,请使用最新版本的 vLLM。请记住,我们在 Colab 上的示例只训练了一个小时,因此结果低于标准。为了获得良好的结果,你需要训练至少 12 个小时(这就是 GRPO 的工作原理),但请记住这不是强制性的,因为你可以随时停止。

建议将 GRPO 应用于参数至少为 1.5B 的模型,以正确生成思考令牌,因为较小的模型可能无法做到这一点。如果你使用的是基础模型,请确保有一个聊天模板。GRPO 的训练损失跟踪现在直接内置在 Unsloth 中,无需使用 wandb 等外部工具。

除了添加 GRPO 支持外,我们随后还支持在线 DPO、PPO 和 RLOO!更多详细信息可以在 Keith 的帖子博客中看到,其中包括有关他如何让在线 DPO 工作的 Github fork。 Joey 的推文中也可以看到 Google Colab 上 GRPO 更改的初稿!他们的贡献让我们也能够支持其他基于生成的 RL 方法。请参见下面的图表比较 Unsloth 的在线 DPO VRAM 消耗与标准 Hugging Face + FA2。

4、Unsloth x vLLM

20 倍吞吐量,50% VRAM 节省。

你现在可以在微调栈中直接使用 vLLM,这允许更大的吞吐量,并允许你同时对模型进行微调和推理!在 1x A100 40GB 上,使用 Unsloth 的 Llama 3.2 3B Instruct 的动态 4 位量化,预计每秒 4000 个令牌左右。在 16GB Tesla T4(免费 Colab GPU)上,你可以获得 300 个令牌/秒。

我们还神奇地消除了同时加载 vLLM 和 Unsloth 时的双倍内存使用量,从而为 Llama 3.1 8B 节省了 5GB 左右,为 Llama 3.2 3B 节省了 3GB(感谢 Boris 的启发)。 Unsloth 最初可以在 1x 48GB GPU 中微调 Llama 3.3 70B 指令,其中 Llama 3.3 70B 权重占用 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!"])

5、Unsloth 中的 vLLM 发现

  • vLLM 现在可以加载 Unsloth 动态 4 位量化。就像我们的 1.58 位动态 R1 GGUF 一样,我们表明,将某些层动态量化为 4 位,将某些层量化为 16 位可以显著提高准确性,同时保持模型较小。
  • 我们自动选择多个参数来考虑 RAM、VRAM 效率和最大吞吐量(例如分块预填充令牌的数量、最大序列数量等)。我们默认在 vLLM 中启用 -O3 并启用前缀缓存。我们发现旧 GPU 上的 Flashinfer 实际上慢了 10%。FP8 KV 缓存使速度慢了 10%,但吞吐量潜力增加了一倍。
  • 我们允许通过解析状态字典而不是从磁盘加载在 vLLM 中加载 LoRA - 这可以使您的 GRPO 训练运行速度提高 1.5 倍。一个活跃的研究领域是以某种方式直接编辑 vLLM 中的 LoRA 适配器(我还不确定如何操作)。这可以大大提高速度,因为我们现在正在进行不必要的 GPU 数据移动。
  • vLLM 会出现奇怪的随机 VRAM 峰值,尤其是在批量生成期间。我们添加了批量生成功能以减少内存峰值。

原文链接:Train your own R1 reasoning model with Unsloth

汇智网翻译整理,转载请标明出处