チュートリアル:GRPO で独自の推論モデルを学習する

Unsloth と GRPO を使って、Llama 3.1(8B)のようなモデルを推論モデルに変換する初心者向けガイド。

DeepSeek が開発した GRPOarrow-up-right (Group Relative Policy Optimization)は彼らの R1 推論モデルを訓練するためのものです。

クイックスタート

これらの手順は、事前作成済みの Google Colab 用 ノートブックです。Unsloth をローカルにインストールする場合は、これらのノートブックを好みのコードエディタにコピーすることもできます。以下のいずれかのノートブックを使用します:

1

Unslothをインストールする

Colab ノートブックを使用している場合は、クリックしてください Runtime > Run all。開始する前にぜひこちらを確認することを強くお勧めします: ファインチューニング ガイド

ローカルにインストールする場合は、正しい 依存関係 を確認し、 pip install unsloth Linux 上で使用するか、私たちの Windows インストール 手順に従ってください。

2

GRPO と報酬関数について学ぶ

始める前に、GRPO、報酬関数、およびそれらの仕組みについて詳しく学ぶことをお勧めします。以下を含む詳細をお読みください: ヒントとコツ こちら.

また、十分な VRAM が必要です。一般的に、モデルのパラメータ数 = 必要な VRAM の量です。Colab では、無料の 16GB VRAM GPU を使用しており、パラメータが最大 16B のモデルまで訓練できます。

3

希望の設定を構成する

最適な結果が得られるように事前に最適な設定を選択しており、モデルは私たちの サポートされているモデルの中からお好きなものに変更できます。初心者の場合は他の設定を変更することはお勧めしません。

circle-check
4

データ準備

事前に OpenAI の GSM8Karrow-up-right データセットを選択しています。これは学内レベルの数学問題を含みますが、独自のデータセットや 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:総訓練ステップ数を設定します。

circle-check

報酬が時間とともに増加するのが確認できるはずです。最低でも 300 ステップは訓練することをお勧めします(所要時間は約 30 分)が、最適な結果のためにはより長く訓練するべきです。

circle-exclamation

訓練中のモデルがどのように学習しているかを確認できるサンプル回答も表示されます。ステップや XML タグ、試行などを含むものがあり、訓練が進むにつれてより良くなっていき、長い推論チェーンを伴う望ましい出力が得られるようにスコアが上がっていきます。

7

モデルを実行して評価する

再生ボタンをクリックしてモデルを実行します。最初の例では通常回答に推論が含まれておらず、推論を確認するにはまず GRPO で訓練した LoRA 重みを保存する必要があります:

model.save_lora("grpo_saved_lora")
最初の推論例には推論がありません。LoRA を読み込んでテストすることで推論を明らかにする必要があります。

その後 LoRA を読み込みテストします。私たちの推論モデルはかなり優れていますが、訓練時間が約 1 時間程度しかなかったため常に正しいわけではありません。シーケンス長を延ばしてより長く訓練すればさらに良くなります!

その後、モデルを 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"
)

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",
)

GGUF 形式で保存すれば、軽量な環境で簡単にデプロイでき、 llama.cpp や他の推論エンジンで使用することができます。

ビデオチュートリアル

ここでは素晴らしい YouTuber の方々が作成したビデオチュートリアルをいくつか紹介します。彼らは素晴らしい内容を提供しています!

データセットの準備方法や強化学習+GRPO の基本の説明を学ぶのに最適です
ローカルでの GRPO(自分のデバイス上)

最終更新

役に立ちましたか?