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

Unslothを使ってOpenAI gpt-ossをローカルで学習する方法を、ステップごとに学びましょう。

このガイドでは、スクリーンショット付きで、独自のカスタム gpt-oss モデルを次のいずれかでファインチューニングする方法を学びます。 ローカルで お使いのマシン上で Unsloth または無料で Google Colab。セットアップから、学習済みモデルの実行と保存まで、全工程を順を追って説明します。

クイックスタート: gpt-oss-20b を無料でファインチューニングするには、こちらをご利用ください: Colab ノートブック

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"

以下の例のような出力が表示されるはずです。注: 正しい学習動作を確保するため、明示的に dtypefloat32 に変更しています。

3

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

次は学習ハイパーパラメータを調整する時間です。どのように、いつ、何を調整するかについてより詳しく知りたい場合は、私たちの 詳細なハイパーパラメータガイド.

を避けるために 過学習、学習損失を監視し、これらの値を高くしすぎないようにしてください。

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

4

推論を試す

ノートブックには、 "Reasoning Effort" というセクションがあり、Colab 上で gpt-oss の推論を実行する例を示しています。この手順はスキップできますが、ファインチューニング完了後には、後でモデルを実行する必要があります。

5

データ準備

この例では、 HuggingFaceH4/Multilingual-Thinkingを使用します。このデータセットには、英語からさらに 4 つの言語へ翻訳されたユーザー質問に基づく chain-of-thought 推論例が含まれています。

これは OpenAI の fine-tuning cookbook で参照されているのと同じデータセットです。

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

gpt-oss では、モデルがどれだけ推論を行うかを制御する reasoning effort システムが導入されています。デフォルトでは reasoning effort は lowに設定されていますが、 reasoning_effort パラメータを low, medium または high.

例:

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 のユニークな特徴の 1 つは、 OpenAI Harmony 形式, を使用していることで、これは構造化された会話、推論出力、ツール呼び出しをサポートします。この形式には、次のようなタグが含まれます。 <|start|> , <|message|> 、および <|return|> .

🦥 Unsloth はチャットテンプレートを修正し、正しくなるようにしています。この ツイート で、私たちのテンプレート修正に関する技術的詳細を確認できます。

プロンプトや構造は、あなた自身のデータセットやユースケースに合わせて自由に調整してください。詳しい案内については、私たちの データセットガイド.

6

モデルを学習させる

最適な結果が得られるよう、学習ハイパーパラメータはあらかじめ選定されています。ただし、特定のユースケースに応じて変更できます。私たちの ハイパーパラメータガイド.

この例では、処理を速くするために 60 ステップだけ学習します。完全な学習を行うには、 num_train_epochs=1 に設定し、さらに max_steps=None.

学習中は、損失が時間とともに減少していることを確認してください。これは学習プロセスが正しく機能していることを示します。

7

推論: 学習済みモデルを実行する

次は、ファインチューニングしたモデルで推論を実行する時間です。instruction と input は変更できますが、output は空白のままにしてください。

この例では、データセットで使用したのと同じ構造に従って、システムプロンプトに特定の指示を追加し、モデルがフランス語で推論できるかをテストします。

以下のような出力になるはずです:

8

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

ファインチューニングしたモデルを保存するには、次の両方でエクスポートできます。 bf16 形式、 私たちの MXFP4 のオンデマンド逆量子化 ベースモデルを使い、 save_method="merged_16bit"またはネイティブな MXFP4 Safetensors 形式で、次を使用します save_method="mxfp4" .

この MXFP4 ネイティブマージ形式は、 bf16 形式と比較して大きな性能向上を提供します。ディスク容量を最大 75% 節約し、VRAM 消費を 50% 削減し、マージを 5〜10 倍高速化し、さらに GGUF 形式への変換を大幅に高速化します。

gpt-oss モデルのファインチューニング後、それを MXFP4 形式に次のようにマージできます:

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

モデルをマージして hugging-face hub に直接プッシュしたい場合:

model.push_to_hub_merged(repo_name, tokenizer=tokenizer, token= hf_token, save_method="mxfp4")

Llama.cpp への保存

  1. 最新の llama.cppGitHub こちらから取得してください。以下のビルド手順に従うこともできます。 -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
    cp llama.cpp/build/bin/llama-* llama.cpp
  2. 次を変換します MXFP4 マージ済みモデル:

    python3 llama.cpp/convert_hf_to_gguf.py gpt-oss-finetuned-merged/ --outfile gpt-oss-finetuned-mxfp4.gguf
  3. 量子化済みモデルで推論を実行する:

    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 "人生と宇宙の意味は"

🖥️ ローカル gpt-oss ファインチューニング

この章では、ローカルデバイスで gpt-oss をファインチューニングする方法を扱います。 gpt-oss-20b ファインチューニングは 14GB の VRAM でも動作可能ですが、安定した信頼性のある学習実行を確保するために、少なくとも 16GB の VRAM が利用可能であることを推奨します。

Colab の ノートブック をダウンロードするか、その要素をローカル環境に取り込んで使いやすくすることをおすすめします。

1

Unsloth をローカルにインストールする

お使いのデバイスが Unsloth 対応 であることを確認し、詳細な インストールガイド.

私たちの Docker イメージ.

なお、 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

# 4倍高速なダウンロード + OOM なしのために対応している 4bit 事前量子化モデル。
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_...", # gated モデルを使う場合はこれを使用
)

以下の例のような出力が表示されるはずです。注: 正しい学習動作を確保するため、明示的に dtypefloat32 に変更しています。

3

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

次は学習ハイパーパラメータを調整する時間です。どのように、いつ、何を調整するかについてより詳しく知りたい場合は、私たちの 詳細なハイパーパラメータガイド.

を避けるために 過学習、学習損失を監視し、これらの値を高くしすぎないようにしてください。

このステップでは、パラメータ効率の高いファインチューニングのために 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,  # rank stabilized LoRA をサポートしています
    loftq_config = None, # そして LoftQ
)
4

データ準備

この例では、 HuggingFaceH4/Multilingual-Thinkingを使用します。このデータセットには、英語からさらに 4 つの言語へ翻訳されたユーザー質問に基づく chain-of-thought 推論例が含まれています。

これは OpenAI の fine-tuning cookbook で参照されているのと同じデータセットです。多言語データセットを使う目的は、モデルが複数言語にまたがる推論パターンを学習し、一般化できるようにすることです。

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

gpt-oss では、モデルがどれだけ推論を行うかを制御する reasoning effort システムが導入されています。デフォルトでは reasoning effort は lowに設定されていますが、 reasoning_effort パラメータを low, medium または high.

例:

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 のユニークな特徴の 1 つは、 OpenAI Harmony 形式, を使用していることで、これは構造化された会話、推論出力、ツール呼び出しをサポートします。この形式には、次のようなタグが含まれます。 <|start|> , <|message|> 、および <|return|> .

🦥 Unsloth はチャットテンプレートを修正し、正しくなるようにしています。この ツイート で、私たちのテンプレート修正に関する技術的詳細を確認できます。

プロンプトや構造は、あなた自身のデータセットやユースケースに合わせて自由に調整してください。詳しい案内については、私たちの データセットガイド.

5

モデルを学習させる

最適な結果が得られるよう、学習ハイパーパラメータはあらかじめ選定されています。ただし、特定のユースケースに応じて変更できます。私たちの ハイパーパラメータガイド.

この例では、処理を速くするために 60 ステップだけ学習します。完全な学習を行うには、 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 などを使う場合はこれを使用
    ),
)

学習中は、損失が時間とともに減少していることを確認してください。これは学習プロセスが正しく機能していることを示します。

6

推論: 学習済みモデルを実行する

次は、ファインチューニングしたモデルで推論を実行する時間です。instruction と input は変更できますが、output は空白のままにしてください。

この例では、データセットで使用したのと同じ構造に従って、システムプロンプトに特定の指示を追加し、モデルがフランス語で推論できるかをテストします。

messages = [
    {"role": "system", "content": "推論言語: フランス語\n\nあなたは数学の問題を解ける有能なアシスタントです。"},
    {"role": "user", "content": "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

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

ファインチューニングしたモデルを保存するには、私たちの新しい MXFP4 のオンデマンド逆量子化 LoRA マージ処理中にベースモデル(gpt-oss など)を使用することで、Safetensors 形式でエクスポートできます。これにより、 ファインチューニングしたモデルを bf16 形式でエクスポートする.

gpt-oss モデルのファインチューニング後、それを 16-bit 形式に次のようにマージできます:

model.save_pretrained_merged(save_directory, tokenizer)

モデルをマージして hugging-face hub に直接プッシュしたい場合:

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

Llama.cpp への保存

  1. 最新の llama.cppGitHub こちらから取得してください。以下のビルド手順に従うこともできます。 -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
    cp llama.cpp/build/bin/llama-* llama.cp
  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. 量子化済みモデルで推論を実行する:

    llama.cpp/llama-cli --model gpt-oss-finetuned-Q8_0.gguf \
        --jinja -ngl 99 --threads -1 --ctx-size 16384 \
        --temp 1.0 --top-p 1.0 --top-k 0 \
         -p "人生と宇宙の意味は"

🏁 以上です!

これで Unsloth を使って gpt-oss をファインチューニングできました。現在、RL と GRPO の実装、およびより良いモデル保存と実行方法に取り組んでいるので、今後の更新をお楽しみに。

いつものように、必要であればぜひ私たちの Discord または Reddit にお立ち寄りください。お手伝いします。

❓FAQ(よくある質問)

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

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

2. gpt-oss で fp4 または MXFP4 学習はできますか?

いいえ、現在のところ fp4 または MXFP4 学習をサポートするフレームワークはありません。ただし Unsloth は、このモデルに対して QLoRA 4-bit ファインチューニングをサポートする唯一のフレームワークであり、VRAM 使用量を 4 倍以上削減できます。

3. 学習後にモデルを MXFP4 形式へエクスポートできますか?

いいえ、現在これをサポートするライブラリやフレームワークはありません。

4. gpt-oss で強化学習(RL)や GRPO はできますか?

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


謝辞: 心より感謝します Eyera このガイドへの貢献に!

最終更新

役に立ちましたか?