# 50万コンテキスト長のファインチューニング

Unslothでは、新しいアルゴリズムを導入しており、長文コンテキストのトレーニング限界を押し上げます。 **あらゆるLLMおよびVLM**のトレーニングでは、gpt-oss-20bのようなモデルが今や **500K以上のコンテキスト長** を単一の80GB H100 GPUで達成でき、以前の80Kと比べても精度の低下はありません。

到達可能なのは >**750Kのコンテキストウィンドウ** B200 192GB GPU上で。

> **我々の** [**80GB A100 Colabノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt_oss_\(20B\)_500K_Context_Fine_tuning.ipynb)**.**

で500Kコンテキストのgpt-oss-20bファインチューニングを試してください。

* **Unslothはメモリ使用パターン、速度、コンテキスト長の扱いを大幅に改善しました：** を **VRAM使用量を60%低減** 3.2倍長いコンテキスト [Unslothの新しい](#unsloth-loss-refactoring-chunk-and-fuse) 融合およびチャンク化されたクロスエントロピー
* 損失により、速度や精度の劣化なしに [**Unslothの**](#unsloth-gradient-checkpointing-enhanced)
* Gradient Checkpointing [における強化されたアクティベーションオフローディング](#tiled-mlp-unlocking-500k)と共に、

Stas Bekman（Snowflake）とのコラボレーションで**Tiled MLP**

<figure><img src="/files/c147167366ee7702aa0e69c163961abd7ea5a60c" alt="" width="563"><figcaption></figcaption></figure>

### によりコンテキストを2倍多く可能にします。

Unslothのアルゴリズムにより、gpt-oss-20b QLoRA（4bit）はH100上で290Kコンテキストが精度損失なしに可能になり、Tiled MLPを有効にすると500K以上に到達し、合計で > **6.4倍の長いコンテキスト長を実現します。**�� Unsloth損失の再構成：チャンク＆フューズ `新しい融合損失実装は` 動的シーケンスチャンク化 **を追加します：言語モデルヘッドのロジットやクロスエントロピーをシーケンス全体で一度に計算する代わりに、フラット化されたシーケンス次元に沿って扱いやすいスライスで処理します。これによりピークメモリが数GBから小さなチャンクサイズに切り詰められます。各チャンクは依然として**

<figure><img src="/files/5c87d2d63239f1ab2155790175623d6ecc1c9858" alt="" width="563"><figcaption></figcaption></figure>

torch.func.grad\_and\_value **を介した完全に融合された順伝播＋逆伝播を実行し、必要に応じてfloat32にアップキャストすることで混合精度の精度を保持します。** これらの変更はトレーニング速度や精度を劣化させません。

* 主要な革新は、
* チャンクサイズが実行時に自動的に選択される

ことです。 **利用可能なVRAMに基づいてチャンクサイズが選ばれます。** より多くの空きVRAMがあれば、より大きなチャンクが使用されてより高速な実行が可能になります

{% hint style="success" %}
より少ないVRAMの場合は、メモリ爆発を避けるためにチャンク数を増やします。 **これにより** 手動チューニングが不要になり **古いGPUや新しいGPU、ワークロードや異なるシーケンス長にわたってアルゴリズムの堅牢性を保ちます。**&#x81EA;動チューニングにより、
{% endhint %}

### より小さなコンテキストはより多くのVRAMを使用します

（チャンクが少ない） [不要なオーバーヘッドを避けるためです](https://unsloth.ai/blog/long-context) 。上記の図では、現実的なVRAM階層を反映するために損失チャンク数を調整しています。80GBのVRAMでは、これは>3.2×長いコンテキストをもたらします。 **🏁 UnslothのGradient Checkpointing拡張**我々の **0.1%** Unsloth Gradient Checkpointing

{% code expandable="true" %}

```python
アルゴリズムは、
2024年4月に導入され
    すぐに人気となり、現在では業界標準となり、ほとんどのトレーニングパッケージに統合されています。これはアクティベーションをCPU RAMにオフロードし、コンテキスト長を10倍にすることを可能にしました。我々の新しい拡張はCUDAストリームやその他の工夫を用い、精度に影響を与えずに最大で
    トレーニングのオーバーヘッドを追加します。以前は1〜3%のトレーニングオーバーヘッドを追加していました。
    # オリジナルのUnslothバージョン（2024年4月公開） - LGPLv3 ライセンス
        class Unsloth_Offloaded_Gradient_Checkpointer(torch.autograd.Function):
        @staticmethod
        @torch_amp_custom_fwd
            def forward(ctx, forward_function, hidden_states, *args):
        ctx.device = hidden_states.device
        saved_hidden_states = hidden_states.to("cpu", non_blocking = True)
        with torch.no_grad():

    すぐに人気となり、現在では業界標準となり、ほとんどのトレーニングパッケージに統合されています。これはアクティベーションをCPU RAMにオフロードし、コンテキスト長を10倍にすることを可能にしました。我々の新しい拡張はCUDAストリームやその他の工夫を用い、精度に影響を与えずに最大で
    output = forward_function(hidden_states, *args)
    ctx.save_for_backward(saved_hidden_states)
        ctx.forward_function, ctx.args = forward_function, args
        return output
        @torch_amp_custom_bwd
        def backward(ctx, dY):
            (hidden_states,) = ctx.saved_tensors
        hidden_states = hidden_states.to(ctx.device, non_blocking = True).detach()
        hidden_states.requires_grad_(True)
```

{% endcode %}

with torch.enable\_grad():

> **(output,) = ctx.forward\_function(hidden\_states, \*ctx.args)**

### torch.autograd.backward(output, dY)

return (None, hidden\_states.grad,) + (None,)\*len(ctx.args) [アクティベーションを生成され次第すぐにオフロードすることで、ピークアクティベーションフットプリントを最小化し、GPUメモリを必要なときに正確に解放します。これにより、単一のデコーダ層のアクティベーションが2GBを超えるような長文コンテキストや大きなバッチのトレーニングにおけるメモリ圧力が大幅に軽減されます。](https://x.com/StasBekman) したがって、Unslothの新しいアルゴリズムとGradient Checkpointingはほとんどの改善（3.2倍）に寄与しており、単一のH100で290kコンテキスト長のQLoRA GPT-OSSファインチューニングを可能にします。 [🔓 Tiled MLP：500K+の解放](https://arxiv.org/abs/2506.13996) Stas Bekmanの協力により、

**我々はSnowflakeのArctic Long Sequence Trainingの**

論文

{% hint style="success" %}
とブログ記事からTiled MLPを統合しました。 `TiledMLPはアクティベーションメモリを削減し、重いMLP投影の前にシーケンス次元に沿って隠れ状態をタイル化することではるかに長いシーケンス長を可能にします。`また、いくつかの利便性向上も導入しています： **タイル化された順伝播の再計算でRNG状態を保持するため、ドロップアウトやその他の確率的演算が順伝播と逆伝播の再生間で一貫します。これによりネストされたチェックポイント計算が安定し、数値的に同一に保たれます。**
{% endhint %}

**実装は名前や型が**

mlp **とされるモジュールを自動でパッチするので、**&#x4D;LPモジュールを持つほとんどのモデルがTiled MLPでそのままサポートされます。

<figure><img src="/files/84568a5fa6096472b37dbb9ff45269ff77f14a93" alt=""><figcaption></figcaption></figure>

留意すべきトレードオフ

<figure><img src="/files/6ee8748c2a5b5c53648a38cbafc5252886e45551" alt=""><figcaption></figcaption></figure>

TiledMLPは追加の順伝播を行う代わりにVRAMを節約します。これはチェックポイント化されたトランスフォーマーブロック内にあり、それ自体がチェックポイントスタイルで記述されているため、実質的にネストされたチェックポイントになります：1つの

MLPは今やステップごとに約3回の順伝播と1回の逆伝播を行います **。その代わりに、ほとんどの中間MLPアクティベーションをVRAMから除去しつつ、非常に長いシーケンスをサポートできます。**

**図は、長文コンテキストのトレーニングステップ中の単一デコーダ層の順伝播と逆伝播におけるアクティブメモリのタイムラインを、Tiled MLPなし（左）とあり（右）で比較しています。Tiled MLPがない場合、ピークVRAMはMLPの逆伝播中に発生します；Tiled MLPを使うとピークは融合損失計算に移動します。約40%低いVRAM使用量が観測され、融合損失が利用可能VRAMに基づいて自動的にチャンク化するため、より小さいGPUではTiled MLPのピークはさらに小さくなります。**

```py
model, tokenizer = FastLanguageModel.from_pretrained(
    ...,
    クロスエントロピー損失が新たなボトルネックでないことを示すため、チャンクサイズを動的に選ぶ代わりに固定し、チャンク数を倍にしました。これにより損失に関連するメモリスパイクが大幅に減少します。最大メモリはどちらの場合も逆伝播中に発生し、全体のタイミングは類似していますが、Tiled MLPは小さなオーバーヘッドを追加します：1つの大きなGEMMが多くの逐次的な行列積に分かれ、前述の追加の順伝播が発生します。
)
```

総じて、このトレードオフは価値があります：Tiled MLPなしでは長文コンテキストのトレーニングはおおよそ2×のメモリを必要とすることがありますが、 `Tiled MLPを使うと単一GPUで同じコンテキスト長に対してステップ時間の増加は約1.3×にとどまります。` を `UnslothでTiled MLPを有効にする：` unsloth\_tiled\_mlp = True, `設定するだけで、`unsloth\_tiled\_mlp = True

from\_pretrained [とするとTiled MLPが有効になります。Arctic論文と同じロジックに従い、我々は](https://github.com/deepspeedai/DeepSpeed/pull/7664) num\_shards = ceil(seq\_len/hidden\_size)

{% hint style="success" %}
を選びます。 `Tiled MLPを使うと単一GPUで同じコンテキスト長に対してステップ時間の増加は約1.3×にとどまります。`各タイルは、スループットとメモリ節約のバランスを取るためにモデルの隠れ次元と同じサイズのシーケンス長で動作します。
{% endhint %}

***

**我々はまた、Tiled MLPが実質的に3回の順伝播と1回の逆伝播を行うことをStas Bekmanと議論し、通常のGradient Checkpointingは2回の順伝播と1回の逆伝播であるのに対して、**

**我々の** [**80GB A100 Colabノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/gpt_oss_\(20B\)_500K_Context_Fine_tuning.ipynb)**.**

DeepSpeed [がDeepSpeed内のTiled MLP向けのドキュメント更新を提供しました。](https://www.reddit.com/r/unsloth/) 次回ファインチューニングがメモリ不足になったら、ぜひこれをオンにしてみてください：


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/jp/burogu/500k-context-length-fine-tuning.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
