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

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

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

快速入门

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

1

安装 Unsloth

如果您使用我们的 Colab 笔记本,请点击 运行时 > 全部运行。我们强烈建议您在开始之前查看我们的 微调指南

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

2

了解 GRPO 与奖励函数

在开始之前,建议先了解更多关于 GRPO、奖励函数及其工作原理的内容。阅读更多相关内容,包括 技巧与窍门 llama-parallel.

您还需要足够的显存。一般来说,模型参数大小 = 您所需的显存。在 Colab 中,我们使用其免费 16GB 显存的 GPU,可训练参数规模高达 16B 的任何模型。

3

配置期望的设置

我们已经为您预先选择了最佳设置以获得最佳结果,您也可以将模型更改为我们 支持的模型中列出的任意模型。如果您是初学者,不建议更改其他设置。

circle-check
4

数据准备

我们预先选择了 OpenAI 的 GSM8Karrow-up-right 数据集,该数据集包含中学水平的数学题,但您也可以将其更改为您自己的数据集或 Hugging Face 上的任何公开数据集。您可以在此处阅读更多关于 数据集的信息.

您的数据集仍应至少包含两列用于问题和答案对。不过答案不得揭示从问题推导出答案的推理过程。以下是一个示例:

我们将对数据进行结构化,以促使模型在给出答案之前阐述其推理。首先,我们将为提示和响应建立一个清晰的格式。

# 定义指示模型使用特定格式的系统提示
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 分。”这有助于根据质量标准改进输出。 查看示例 它们可能的样子 llama-parallel.

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

  • 问题: 来信

  • 答案: 发信

  • 奖励函数:

    • 如果答案包含所需关键字 → +1

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

    • 如果回复过长 → -1

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

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

6

训练您的模型

我们已为获得最佳结果预先选择了超参数,不过您可以更改它们。详细阅读 参数信息高级 GRPO 有关批处理、生成和训练参数的文档, 请阅读我们的指南!

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

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

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

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

  • max_steps:设置训练的总步骤数。

circle-check

您应该会看到奖励随着时间增加。我们建议至少训练 300 步,这可能需要约 30 分钟,但为了获得最佳结果,您应训练更长时间。

circle-exclamation

您还会看到示例答案,这使您能够观察模型的学习情况。有些答案可能包含步骤、XML 标签、尝试等,其想法是随着训练进行,模型会越来越好,因为它会得到越来越高的评分,直到我们得到带有长推理链的理想输出。

7

运行并评估您的模型

通过点击播放按钮来运行您的模型。在第一个示例中,答案通常没有推理,为了查看推理,我们需要先使用刚刚用 GRPO 训练的 LoRA 权重保存:

model.save_lora("grpo_saved_lora")
第一次推理示例运行没有推理。您必须加载 LoRA 并测试它以显示推理内容。

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

然后您可以按照我们的 此处指南.

将模型保存为 GGUF、Ollama 等格式。

8

如果您仍然无法得到任何推理,可能是因为训练步数太少或您的奖励函数/验证器并非最佳。

保存您的模型 llama-parallel

我们有多种保存微调模型的选项,但我们将重点介绍最简单和最受欢迎的方法,您可以在此处阅读更多关于

以 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"

为 llama.cpp 保存为 GGUF 格式 Unsloth 还支持以GGUF 格式 llama.cppOllama.

保存,使其与
    model.push_to_hub_gguf(
    "your-username/model-name",
    tokenizer,
    quantization_method=["q4_k_m", "q8_0", "q5_k_m"],
)

token="your-token", llama.cpp 一旦以 GGUF 格式保存,模型就可以使用

或在其他推理引擎中轻松部署于轻量级环境中。

视频教程

以下是一些由我们认为非常棒的出色 YouTuber 制作的视频教程!
非常适合学习如何准备数据集以及强化学习 + GRPO 基础背后的解释:本地在您自己的设备上运行 GRPO

最后更新于

这有帮助吗?