チュートリアル:gpt-oss をファインチューニングする方法

Unsloth を使って OpenAI gpt-oss をローカルで段階的にトレーニングする方法を学びます。

このスクリーンショット付きガイドでは、独自のカスタム gpt-oss モデルを次のいずれかでファインチューニングする方法を学びます: ローカルで あなたのマシン上で Unslotharrow-up-right または無料で Google Colabを使用して。セットアップからトレーニング済みモデルの実行と保存まで、プロセス全体を案内します。

circle-check

クイックスタート: 以下で gpt-oss-20b を無料でファインチューニング: Colab ノートブックarrow-up-right

Unsloth の gpt-oss ファインチューニングは、他のすべての FA2 実装と比べてトレーニングが1.5倍高速、VRAM 使用量を70%削減、文脈長が10倍に拡張され、精度の低下はありません。

  • QLoRA の要件: gpt-oss-20b = 14GB VRAM • gpt-oss-120b = 65GB VRAM。

  • BF16 LoRA の要件: gpt-oss-20b = 44GB VRAM • gpt-oss-120b = 210GB VRAM。

ローカルガイドColab ガイド

🌐 Colab gpt-oss ファインチューニング

このセクションでは、Google Colab を使用した gpt-oss のファインチューニングについて説明します(私たちの) ノートブック。また、gpt-oss ノートブックをお気に入りのコードエディタに保存して、私たちの ローカル gpt-oss ガイド.

1

を参照して進めることもできます。

Unsloth をインストールする(Colab 内) Colab では、セルをに類似しています。使用してください 上から下へ 最初の実行では「すべて実行」を行ってください。最初のセルは Unsloth(および関連依存関係)をインストールし、GPU/メモリ情報を表示します。セルがエラーを出した場合は、単に再実行してください。

2

gpt-oss と Reasoning Effort の設定

私たちは gpt-oss-20b を Unsloth の 線形化バージョン で読み込みます(他のバージョンは動作しないため)。

次のパラメータを設定してください:

  • max_seq_length = 1024

    • クイックテストや初期実験に推奨されます。

  • load_in_4bit = True

    • 使用する False LoRA トレーニング用(注:これを False に設定すると少なくとも43GBのVRAMが必要になります)。あなたは 必ず 次も設定してください model_name = "unsloth/gpt-oss-20b-BF16"

以下の例のような出力が表示されるはずです。注意:私たちは明示的に dtype から float32 に変更して、正しいトレーニング動作を確保します。

3

ファインチューニングのハイパーパラメータ(LoRA)

さて、トレーニングのハイパーパラメータを調整する時です。どのように、いつ、何を調整するかの詳細は、私たちの 詳細なハイパーパラメータガイド.

circle-info

を参照してください。過度の 過学習を避けるために、トレーニング損失を監視し、これらの値を高く設定しすぎないようにしてください。

このステップでは、パラメータ効率の良いファインチューニングのために LoRA アダプタを追加します。モデルのパラメータの約1%のみが訓練されるため、プロセスは大幅に効率化されます。

4

推論を試す

ノートブックには「 Reasoning Effort 」というセクションがあり、Colab での gpt-oss 推論の実行を示しています。このステップはスキップできますが、ファインチューニングが終わったら後でモデルを実行する必要があります。

5

データ準備

この例では、 HuggingFaceH4/Multilingual-Thinkingarrow-up-rightを使用します。このデータセットには、英語から他の4言語へ翻訳されたユーザー質問に由来するチェーン・オブ・ソート(思考の連鎖)推論例が含まれています。

これは OpenAI のファインチューニングクックブックで参照されているものと同じデータセットです。

多言語データセットを使用する目的は、モデルが複数言語にわたる推論パターンを学習し一般化できるようにすることです。

gpt-oss はモデルが行う推論の程度を制御する reasoning effort システムを導入しています。デフォルトでは推論努力は に設定されていますが、 reasoning_effort パラメータを設定して変更できます。 , または .

例:

tokenizer.apply_chat_template(
    text, 
    tokenize = False, 
    add_generation_prompt = False,
    reasoning_effort = "medium",
)

データセットをフォーマットするために、カスタマイズした gpt-oss プロンプトのバージョンを適用します:

from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)

最初の例を出力してデータセットを確認しましょう:

print(dataset[0]['text'])

gpt-oss のユニークな特徴の一つは、構造化された会話、推論出力、ツール呼び出しをサポートする OpenAI Harmony フォーマットarrow-up-right, を使用していることです。このフォーマットには次のようなタグが含まれます: <|start|> , <|message|> 、および <|return|> .

circle-info

🦥 Unsloth はチャットテンプレートを正しくなるよう修正しています。技術的な詳細はこの ツイートarrow-up-right を参照してください。

プロンプトや構造は自分のデータセットやユースケースに合わせて適用して構いません。詳細は私たちの データセットガイド.

6

を参照してください。

モデルをトレーニングする 最適な結果のために事前選択したトレーニングハイパーパラメータを用意していますが、特定のユースケースに応じて変更できます。私たちの.

ハイパーパラメータガイド num_train_epochs=1 を参照してください。 max_steps=None.

この例では処理を高速化するために60ステップで訓練します。フルのトレーニングを行う場合は、

7

を設定し、ステップ制限を無効にするには

を設定してください。

トレーニング中は損失が時間とともに減少しているかを監視してください。これによりトレーニングプロセスが正しく動作していることが確認できます。

推論:トレーニング済みモデルを実行する

8

いよいよファインチューニングしたモデルで推論を実行する時です。指示と入力は変更できますが、出力は空のままにしてください。

この例では、データセットと同じ構造を使ってシステムプロンプトに特定の指示を追加することで、フランス語で推論するモデルの能力をテストします。 これにより次のような出力が得られるはずです: モデルを保存/エクスポートする ファインチューニング済みモデルを保存するには、bf16 形式でエクスポートすることもできます、 私たちの オンデマンドの MXFP4 の逆量子化を使ったベースモデル を使用して save_method="merged_16bit" で保存するか、ネイティブの .

その を使用して MXFP4 Safetensors 形式でsave_method="mxfp4" GGUF を使って保存できます。

circle-check

形式への変換をはるかに高速にします。 を使用して 新機能:QLoRA でファインチューニングしたモデルを GGUF に保存またはマージして他のフレームワーク(例:Hugging Face、llama.cpp の GGUF)で使用できるようになりました。

gpt-oss モデルをファインチューニングした後、次のようにして 16 ビット形式にマージできます:

format にマージするには:

model.save_pretrained_merged(save_directory, tokenizer, save_method="mxfp4)

モデルをマージして直接 Hugging Face ハブへプッシュすることを好む場合:

  1. 最新の llama.cppGitHub で入手arrow-up-rightできます。下のビルド手順に従うこともできます。変更してください -DGGML_CUDA=ON から -DGGML_CUDA=OFF GPU がない場合や CPU 推論のみを行いたい場合は。

    apt-get update
    apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
    git clone https://github.com/ggml-org/llama.cpp
    cmake llama.cpp -B llama.cpp/build \
        -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
    cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split
    model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token, save_method="mxfp4")
  2. Llama.cpp への保存 を使用して cp llama.cpp/build/bin/llama-* llama.cp

    マージ済みモデルを変換する:
  3. python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned-mxfp4.gguf

    量子化モデルで推論を実行する:
        llama.cpp/llama-cli --model gpt-oss-finetuned-mxfp4.gguf \
        --jinja -ngl 99 --threads -1 --ctx-size 16384 \
         --temp 1.0 --top-p 1.0 --top-k 0 \

-p "The meaning to life and the universe is"

🖥️ ローカル gpt-oss ファインチューニング gpt-oss-20b この章ではローカルデバイスでの gpt-oss ファインチューニングについて説明します。ファインチューニングは14GB VRAMでも動作しますが、安定して信頼できるトレーニングを行うために少なくとも16GBの VRAM を用意することを推奨します。

circle-info

より簡単に使えるように、Colab の要素をローカル設定にダウンロードまたは組み込むことを推奨します。 ノートブック ローカルに Unsloth をインストールする

1

あなたのデバイスが

Unsloth 互換であることを確認し、詳細な インストールガイド を読むことができます。 また、私たちの.

Docker イメージ を使って Unsloth をインストールすることもできます。arrow-up-right.

注意: pip install unsloth はこのセットアップでは動作しません。最新の PyTorch、Triton および関連パッケージを使う必要があるため、次の特定のコマンドで Unsloth をインストールしてください:

# 最新の Torch、Triton、OpenAI の Triton カーネル、Transformers、Unsloth をインストールしています!
!pip install --upgrade -qqq uv
try: import numpy; install_numpy = f"numpy=={numpy.__version__}"
except: install_numpy = "numpy"
!uv pip install -qqq \
    "torch>=2.8.0" "triton>=3.4.0" {install_numpy} \
    "unsloth_zoo[base] @ git+https://github.com/unslothai/unsloth-zoo" \
    "unsloth[base] @ git+https://github.com/unslothai/unsloth" \
    torchvision bitsandbytes \
    git+https://github.com/huggingface/transformers \
    git+https://github.com/triton-lang/triton.git@05b2c186c1b6c9a08375389d5efe9cb4c401c075#subdirectory=python/triton_kernels
2

gpt-oss と Reasoning Effort の設定

私たちは gpt-oss-20b を Unsloth の 線形化バージョン (QLoRA ファインチューニングには他のバージョンは動作しません)。次のパラメータを設定してください:

  • max_seq_length = 2048

    • クイックテストや初期実験に推奨されます。

  • load_in_4bit = True

    • 使用する False LoRA トレーニング用(注:これを False に設定すると少なくとも43GBのVRAMが必要になります)。あなたは 必ず 次も設定してください model_name = "unsloth/gpt-oss-20b-BF16"

from unsloth import FastLanguageModel
import torch
max_seq_length = 1024
dtype = None

# 4bit 事前量子化モデルはダウンロードが4倍高速で OOM を防ぎます。
fourbit_models = [
    "unsloth/gpt-oss-20b-unsloth-bnb-4bit", # bitsandbytes 4bit 量子化を使用する20Bモデル
    "unsloth/gpt-oss-120b-unsloth-bnb-4bit",
    "unsloth/gpt-oss-20b", # MXFP4 フォーマットを使用する20Bモデル
    "unsloth/gpt-oss-120b",
] # 詳細は https://huggingface.co/unsloth を参照

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/gpt-oss-20b",
    dtype = dtype, # 自動検出の場合は None
    max_seq_length = max_seq_length, # 長いコンテキスト向けに任意で選択してください!
    load_in_4bit = True,  # メモリ削減のための4ビット量子化
    full_finetuning = False, # [NEW!] フルファインチューニングも利用可能になりました!
    # token = "hf_...", # ゲート付きモデルを使う場合は指定してください
)

以下の例のような出力が表示されるはずです。注意:私たちは明示的に dtype から float32 に変更して、正しいトレーニング動作を確保します。

3

ファインチューニングのハイパーパラメータ(LoRA)

さて、トレーニングのハイパーパラメータを調整する時です。どのように、いつ、何を調整するかの詳細は、私たちの 詳細なハイパーパラメータガイド.

circle-info

を参照してください。過度の 過学習を避けるために、トレーニング損失を監視し、これらの値を高く設定しすぎないようにしてください。

このステップでは、パラメータ効率の良いファインチューニングのために LoRA アダプタを追加します。モデルのパラメータの約1%のみが訓練されるため、プロセスは大幅に効率化されます。

model = FastLanguageModel.get_peft_model(
    model,
    r = 8, # 0より大きい任意の数を選択してください!推奨:8、16、32、64、128
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 16,
    lora_dropout = 0, # 任意をサポートしますが = 0 が最適化されています
    bias = "none",    # 任意をサポートしますが = "none" が最適化されています
    # [NEW] "unsloth" は VRAM を30%節約し、2倍大きなバッチサイズに対応します!
    use_gradient_checkpointing = "unsloth", # 非常に長いコンテキストには True または "unsloth"
    random_state = 3407,
    use_rslora = False,  # ランク安定化LoRAをサポートします
    loftq_config = None, # および LoftQ
)
4

データ準備

この例では、 HuggingFaceH4/Multilingual-Thinkingarrow-up-rightを使用します。このデータセットには、英語から他の4言語へ翻訳されたユーザー質問に由来するチェーン・オブ・ソート(思考の連鎖)推論例が含まれています。

これは OpenAI のファインチューニングクックブックで参照されているものと同じデータセットです。多言語データセットを使用する目的は、モデルが複数言語にわたる推論パターンを学習し一般化できるようにすることです。

def formatting_prompts_func(examples):
    convos = examples["messages"]
    texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]
    return { "text" : texts, }
pass

from datasets import load_dataset

dataset = load_dataset("HuggingFaceH4/Multilingual-Thinking", split="train")
データセットを使います

gpt-oss はモデルが行う推論の程度を制御する reasoning effort システムを導入しています。デフォルトでは推論努力は に設定されていますが、 reasoning_effort パラメータを設定して変更できます。 , または .

例:

tokenizer.apply_chat_template(
    text, 
    tokenize = False, 
    add_generation_prompt = False,
    reasoning_effort = "medium",
)

データセットをフォーマットするために、カスタマイズした gpt-oss プロンプトのバージョンを適用します:

from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
dataset = dataset.map(formatting_prompts_func, batched = True,)

最初の例を出力してデータセットを確認しましょう:

print(dataset[0]['text'])

gpt-oss のユニークな特徴の一つは、構造化された会話、推論出力、ツール呼び出しをサポートする OpenAI Harmony フォーマットarrow-up-right, を使用していることです。このフォーマットには次のようなタグが含まれます: <|start|> , <|message|> 、および <|return|> .

circle-info

🦥 Unsloth はチャットテンプレートを正しくなるよう修正しています。技術的な詳細はこの ツイートarrow-up-right を参照してください。

プロンプトや構造は自分のデータセットやユースケースに合わせて適用して構いません。詳細は私たちの データセットガイド.

5

を参照してください。

モデルをトレーニングする 最適な結果のために事前選択したトレーニングハイパーパラメータを用意していますが、特定のユースケースに応じて変更できます。私たちの.

ハイパーパラメータガイド num_train_epochs=1 を参照してください。 max_steps=None.

from trl import SFTConfig, SFTTrainer
trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    args = SFTConfig(
        per_device_train_batch_size = 1,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        # num_train_epochs = 1, # 1エポックの完全なトレーニングを設定する場合
        max_steps = 30,
        learning_rate = 2e-4,
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
        report_to = "none", # WandB等を使う場合は適宜変更
    ),
)

この例では処理を高速化するために60ステップで訓練します。フルのトレーニングを行う場合は、

6

推論:トレーニング済みモデルを実行する

を設定してください。

トレーニング中は損失が時間とともに減少しているかを監視してください。これによりトレーニングプロセスが正しく動作していることが確認できます。

messages = [
    {"role": "system", "content": "reasoning language: French\n\nYou are a helpful assistant that can solve mathematical problems."},
    {"role": "user", "content": "Solve x^5 + 3x^4 - 10 = 3."},
]
inputs = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt = True,
    return_tensors = "pt",
    return_dict = True,
    reasoning_effort = "medium",
).to(model.device)
from transformers import TextStreamer
_ = model.generate(**inputs, max_new_tokens = 2048, streamer = TextStreamer(tokenizer))

推論:トレーニング済みモデルを実行する

7

モデルを保存してエクスポートする

ファインチューニング済みモデルを保存するには、Safetensors 形式でエクスポートできます(私たちの新しい) ファインチューニング済みモデルを保存するには、bf16 形式でエクスポートすることもできます、 ベースモデル(gpt-oss のような)を LoRA マージプロセス中に扱います。これにより、 ファインチューニング済みモデルを bf16 形式でエクスポートすることが可能になります.

circle-check

gpt-oss モデルをファインチューニングした後、次のようにして 16 ビット形式にマージできます:

model.save_pretrained_merged(save_directory, tokenizer)

format にマージするには:

model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token)

モデルをマージして直接 Hugging Face ハブへプッシュすることを好む場合:

  1. 最新の llama.cppGitHub で入手arrow-up-rightできます。下のビルド手順に従うこともできます。変更してください -DGGML_CUDA=ON から -DGGML_CUDA=OFF GPU がない場合や CPU 推論のみを行いたい場合は。

    apt-get update
    apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
    git clone https://github.com/ggml-org/llama.cpp
    cmake llama.cpp -B llama.cpp/build \
        -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
    cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-gguf-split
    model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token, save_method="mxfp4")
  2. マージ済みモデルを変換および量子化:

    python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned.gguf
    llama.cpp/llama-quantize gpt-oss-finetuned.gguf  gpt-oss-finetuned-Q8_0.gguf Q8_0
  3. python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned-mxfp4.gguf

    llama.cpp/llama-cli --model gpt-oss-finetuned-Q8_0.gguf \
        llama.cpp/llama-cli --model gpt-oss-finetuned-mxfp4.gguf \
        --jinja -ngl 99 --threads -1 --ctx-size 16384 \
         --temp 1.0 --top-p 1.0 --top-k 0 \

🏁 以上です!

Unslothでgpt-ossをファインチューニングしました。現在、RLとGRPOの実装や、モデルの保存・実行の改善に取り組んでいますので、ご期待ください。

いつでも、お気軽に私たちの Discordarrow-up-right または Redditarrow-up-right にお越しください。サポートが必要な場合は遠慮なくどうぞ。

❓よくある質問(FAQ)

1. 後でHugging Face、llama.cppのGGUF、またはvLLMで使用するためにモデルをエクスポートできますか?

はい、今は可能です Unslothの新しいアップデートを使って、ファインチューニングしたgpt-ossを 保存/エクスポートできます!

2. gpt-ossでfp4やMXFP4トレーニングはできますか?

いいえ、現時点ではどのフレームワークもfp4やMXFP4トレーニングをサポートしていません。ただし、Unslothはこのモデルに対してQLoRAの4ビット微調整をサポートする唯一のフレームワークであり、VRAM使用量を4倍以上削減できます。

3. トレーニング後にモデルをMXFP4形式にエクスポートできますか?

いいえ、現時点ではどのライブラリやフレームワークもこれをサポートしていません。

4. gpt-ossで強化学習(RL)やGRPOを行えますか?

はい!Unslothは現在、GRPO/GSPOによるgpt-ossのRLをサポートしています。無料のKaggleノートブックで動作させ、RLにおいて最速の推論を達成しました。 詳細はこちらを参照してください


謝辞: 心からの感謝を Eyeraarrow-up-right このガイドへの貢献に感謝します!

最終更新

役に立ちましたか?