For the complete documentation index, see llms.txt. This page is also available as Markdown.

教程:使用 GRPO 训练你自己的推理模型

初学者指南:使用 Unsloth 和 GRPO 将类似 Llama 3.1(8B)的模型转换为推理模型。

DeepSeek 开发了 GRPO (组相对策略优化)来训练他们的 R1 推理模型。

快速开始

这些说明适用于我们预先制作好的 Google Colab 笔记本。如果你在本地安装 Unsloth,也可以把我们的笔记本复制到你喜欢的代码编辑器中。我们将使用以下任意笔记本:

Qwen3.5(4B) - 视觉 - 新

Gemma 3(4B) - 视觉 GSPO

Qwen3(4B) - 高级

Qwen3-VL-8B - 视觉 GSPO

1

安装 Unsloth

如果你使用我们的 Colab 笔记本,请点击 运行时 > 全部运行。我们非常建议你先查看我们的 微调指南 再开始。

如果在本地安装,请确保你拥有正确的 依赖项 并在 Linux 上使用 pip install unsloth ,或按照我们的 Windows 安装 说明。

2

了解 GRPO 和奖励函数

在开始之前,建议先进一步了解 GRPO、奖励函数以及它们的工作方式。阅读更多内容,包括 技巧与窍门 这里.

你还需要足够的 VRAM。一般来说,模型参数量 = 你需要的 VRAM 量。在 Colab 中,我们使用他们免费的 16GB VRAM GPU,可训练参数量最高达 16B 的任何模型。

3

配置所需设置

我们已经为你预先选择了最优设置以获得最佳效果,你也可以把模型改成我们 支持的模型中列出的任意一个。不建议初学者修改其他设置。

4

数据准备

我们已预先选择 OpenAI 的 GSM8K 数据集,其中包含小学数学题,但你也可以把它改成自己的数据集,或 Hugging Face 上任何公开数据集。你可以在此阅读更多关于 数据集的内容.

。你的数据集仍应至少包含 2 列,用于问题和答案对。不过,答案不能透露它是如何根据问题推导出来的。示例如下:

我们将把数据结构化,让模型在给出答案之前先阐述其推理过程。首先,我们将为提示和回复都建立清晰的格式。

# 定义系统提示,指示模型使用特定格式
SYSTEM_PROMPT = """
请按以下格式回复:
<reasoning>
...
</reasoning>
<answer>
...
</answer>
"""

XML_COT_FORMAT = """\
<reasoning>
{reasoning}
</reasoning>
<answer>
{answer}
</answer>
"""

现在,准备数据集:

import re
from datasets import load_dataset, Dataset


# 用于从不同格式中提取答案的辅助函数
def extract_xml_answer(text: str) -> str:
    answer = text.split("<answer>")[-1]
    answer = answer.split("</answer>")[0]
    return answer.strip()


def extract_hash_answer(text: str) -> str | None:
    if "####" not in text:
        return None
    return text.split("####")[1].strip()


# 准备 GSM8K 数据集的函数
def get_gsm8k_questions(split="train") -> Dataset:
    data = load_dataset("openai/gsm8k", "main")[split]
    data = data.map(
        lambda x: {
            "prompt": [
                {"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": x["question"]},
            ],
            "answer": extract_hash_answer(x["answer"]),
        }
    )
    return data


dataset = get_gsm8k_questions()

数据集通过提取答案并将其格式化为结构化字符串来完成准备。

5

奖励函数/验证器

奖励函数/验证器 让我们根据你提供的数据集知道模型表现得好不好。每次生成都会根据其得分与其他生成结果的平均值进行评估。你可以创建自己的奖励函数,不过我们已经为你预先选择了 Will 的 GSM8K 奖励函数。借此,我们有 5 种不同方式来奖励每次生成。

你可以将生成结果输入到像 ChatGPT 4o 或 Llama 3.1(8B)这样的 LLM 中,并设计一个奖励函数和验证器来评估它。例如,把生成结果喂给你选择的 LLM,并设定一条规则:"如果答案听起来太机械,就扣 3 分。" 这有助于根据质量标准优化输出。 查看示例 看看它们可能是什么样子 这里.

电子邮件自动化任务的奖励函数示例:

  • 问题: 传入邮件

  • 答案: 发出邮件

  • 奖励函数:

    • 如果答案包含必需的关键词 → +1

    • 如果答案与理想回复完全匹配 → +1

    • 如果回复太长 → -1

    • 如果包含收件人姓名 → +1

    • 如果存在签名块(电话、邮箱、地址)→ +1

6

训练你的模型

我们已预先选择了超参数以获得最优结果,不过你也可以修改它们。阅读关于 此处参数的全部内容。关于 高级 GRPO 在批处理、生成和训练参数方面的文档, 请阅读我们的指南!

这个 GRPOConfig 定义了训练的关键超参数:

  • use_vllm:启用 vLLM 的快速推理。

  • learning_rate:决定模型的学习速度。

  • num_generations:指定每个提示生成的完成数量。

  • max_steps:设置训练总步数。

你应该会看到奖励值随着时间上升。我们建议至少训练 300 步,这可能需要 30 分钟;不过为了获得最佳效果,你应该训练更久。

你还会看到示例答案,这能让你了解模型是如何学习的。有些可能带有步骤、XML 标签、尝试等;其思路是,随着训练进行,它会越来越好,因为它获得的分数会越来越高,直到我们得到想要的带有长推理链的输出。

7

运行并评估你的模型

点击播放按钮来运行你的模型。在第一个示例中,答案里通常没有推理;为了看到推理,我们需要先保存刚用 GRPO 训练好的 LoRA 权重,方法如下:

model.save_lora("grpo_saved_lora")
第一次推理示例运行没有推理内容。你必须加载 LoRA 并测试它才能揭示推理过程。

然后我们加载 LoRA 并测试它。我们的推理模型要好得多——不过并不总是正确,因为我们只训练了大约一小时;如果延长序列长度并训练更久,它会更好!

然后你可以按照我们的 这里的指南.

将模型保存为 GGUF、Ollama 等格式。如果你仍然没有得到任何推理结果,可能是训练步数太少,或者你的奖励函数/验证器并不理想。

8

保存你的模型

我们提供多种保存微调后模型的选项,但我们将重点介绍最简单、最受欢迎的方法,你可以在 这里

16 位精度保存

你可以使用以下命令以 16 位精度保存模型:

# 保存为 16 位精度
model.save_pretrained_merged("model", tokenizer, save_method="merged_16bit")

推送到 Hugging Face Hub

为了分享你的模型,我们将使用 push_to_hub_merged 方法把它推送到 Hugging Face Hub。这允许以多种量化格式保存模型。

# 推送到 Hugging Face Hub(需要令牌)
model.push_to_hub_merged(
    "your-username/model-name", tokenizer, save_method="merged_16bit", token="your-token"
)

以 GGUF 格式为 llama.cpp 保存

Unsloth 也支持保存为 GGUF 格式,使其兼容 llama.cpp 以及 Ollama.

model.push_to_hub_gguf(
    "your-username/model-name",
    tokenizer,
    quantization_method=["q4_k_m", "q8_0", "q5_k_m"],
    token="your-token",
)

一旦保存为 GGUF 格式,就可以使用 llama.cpp 在轻量级环境中轻松部署,或者用于其他推理引擎。

视频教程

这里有一些由出色的 YouTuber 制作的视频教程,我们认为它们非常棒!

非常适合了解如何准备数据集,以及强化学习 + GRPO 基础知识背后的解释
在你自己的设备上本地运行 GRPO

最后更新于

这有帮助吗?