チュートリアル:GRPO で自分の推論モデルをトレーニングする

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

DeepSeekが開発した GRPOarrow-up-right (Group Relative Policy Optimization)でR1推論モデルを訓練します。

クイックスタート

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

gpt-oss-20barrow-up-right - や Dr. GRPO のような他のものに設定することもできる点に注意。

Qwen2.5-VLarrow-up-right - ビジョン GSPO

Gemma 3(4B)arrow-up-right - ビジョン GSPO

1

Unsloth をインストール

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

ローカルにインストールする場合は、正しい requirements を確認し、 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:
        function_works
    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 バッチ処理、生成、訓練パラメータに関する ガイドを読んでください!

その を構築する。RLアルゴリズムの種類は は訓練の主要なハイパーパラメータを定義します:

  • use_vllm:vLLMを使用した高速推論を有効化します。

  • learning_rate:モデルの学習速度を決定します。

  • num_generations:各プロンプトあたり生成される完了数を指定します。

  • max_steps = 60, # num_train_epochs = 1,:総訓練ステップ数を設定します。

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.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

最終更新

役に立ちましたか?