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

我们增强了整个 GRPO 过程,使其使用的 VRAM 比 Hugging Face + FA2 少 80%。这使您能够仅使用 7GB 的 VRAM 和 Qwen2.5(1.5B)重现 R1-Zero 的“顿悟时刻”。

尝试我们的免费 GRPO notebook:Colab 上的 Llama 3.1(8B)

有关其他模型(如 Phi-4)的 GRPO 笔记本,请访问我们的文档

💡 主要细节

使用 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 蒸馏模型或使用 R1 的蒸馏数据进行微调,Unsloth 已经支持。这是将标准模型转换为完整的推理模型,使用 GRPO。

GRPO 的用例包括:如果您想制作一个带有奖励的定制模型(例如法律、医学等),那么 GRPO 可以提供帮助。

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

🤔 GRPO + “顿悟时刻”

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

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

image-20250207215848510

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

它是如何工作的:

  1. 模型生成一组响应。

  2. 每个响应根据正确性或由某个设定的奖励函数创建的其他指标进行评分,而不是 LLM 奖励模型。

  3. 计算该组的平均分。

  4. 将每个响应的分数与组平均分进行比较。

  5. 模型被强化以偏向于得分更高的响应。

作为一个例子,假设我们希望模型解决:

1+1 等于多少? » 思维链/推理过程 » 答案是 2。

2+2 等于多少? » 思维链/推理过程 » 答案是 4。

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

🦥 Unsloth 中的 GRPO

如果您在本地使用 GRPO 和 Unsloth,请“pip install diffusers”,因为它是一个依赖项。

等待至少 300 步以使奖励实际增加,并请使用最新版本的 vLLM。请记住,我们在 Colab 上的示例仅训练了一个小时,因此结果不佳。为了获得良好的结果,您需要至少训练 12 小时(这就是 GRPO 的工作方式),但请记住,这不是强制性的,您可以随时停止。

建议将 GRPO 应用于至少 1.5B 参数的模型,以正确生成思考 token,因为较小的模型可能无法生成。如果您使用基础模型,请确保您有一个聊天模板。GRPO 的训练损失跟踪现在直接内置于 Unsloth 中,消除了对外部工具(如 wandb 等)的需求。

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

image-20250207220219486

✨ Unsloth x vLLM

20 倍的吞吐量,50% 的 VRAM 节省:

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

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

vLLM 在 Unsloth 中的发现

vLLM 现在可以加载 Unsloth 动态 4 位量化。就像我们的 1.58 位动态 R1 GGUF 一样,我们展示了动态量化某些层到 4 位和某些层到 16 位可以显著提高准确性,同时保持模型小巧。

我们自动选择多个参数以考虑 RAM、VRAM 效率和最大吞吐量(如预填充 token 的数量、最大序列数等)。我们默认在 vLLM 中启用 -O3,并启用前缀缓存。我们发现 Flashinfer 在旧 GPU 上实际上慢了 10%。FP8 KV 缓存使事情变慢 10%,但吞吐量潜力翻倍。

我们允许通过解析状态字典而不是从磁盘加载来在 vLLM 中加载 LoRA——这可以使您的 GRPO 训练运行快 1.5 倍。一个活跃的研究领域是如何直接编辑 vLLM 中的 LoRA 适配器(我还不确定如何做到)。这可以大大提高速度,因为我们现在正在进行不必要的 GPU 数据移动。

vLLM 在批量生成时会奇怪地出现随机的 VRAM 峰值。我们添加了一个批量生成函数以减少内存峰值。