> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/jp/meru/reinforcement-learning-rl-guide/memory-efficient-rl.md).

# メモリ効率の高いRL

Unsloth における、複数のアルゴリズム的改良を備えた、より効率的な強化学習（RL）を紹介できることを嬉しく思います：

* **コンテキスト長が 1.2〜1.7 倍に増加** 速度低下も追加メモリ使用もなしで！
* **RL の学習実行が 10% 高速化** 改良されたカーネルと非同期データ移動により
* **2倍高速 `torch.compile` 倍** モデル読み込み時に

Unsloth **すでに** FA2 を使う他のすべての構成と比べて、RL の学習速度、コンテキストウィンドウを向上させ、VRAM 使用量を 50〜90% 削減しますが、今では [**Unsloth の Standby**](#unsloth-standby) さらにこれを改善します。Standby 機能は、他の実装に比べて速度低下を独自に抑え、場合によっては学習をさらに高速化します！

今では、Qwen3-32B LoRA 16-bit は 1xH100 80GB GPU 上で、以前の 3,600 から 6,144 のコンテキスト長を達成できます（**1.7倍長い**）。Llama-3.1-8B QLoRA 4bit は、以前の 42,000 から 47,500 の長さを達成できます（1.13倍長い）。

各種カーネル最適化により RL 実行を 10% 高速化し、学習モードから推論モードへ切り替える際の CPU と GPU 間の LoRA 通信チャネルを削除しました。さらに、独自の `torch.compile` フラグを使って vLLM のロールアウトを 10% 高速化し、コンパイル時間を 2倍短縮しました。

## :sparkles:最適化を有効にする方法

を有効にするには **Unsloth の Standby** 機能を有効にするには、環境変数を設定してください `UNSLOTH_VLLM_STANDBY` Unsloth を import する前に。その後、 `gpu_memory_utilization = 0.95` を設定すれば完了です！

```python
import os
os.environ["UNSLOTH_VLLM_STANDBY"] = "1"

from unsloth import FastLanguageModel
import torch
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Qwen3-8B-Base",
    max_seq_length = 2048, # より長い推論トレースのために増やせます
    load_in_4bit = False, # LoRA 16bit の場合は False
    fast_inference = True,
    max_lora_rank = 32, # rank が大きいほど賢いが、遅い
    gpu_memory_utilization = 0.95,
)
```

## :mortar\_board:もう不要 `gpu_memory_utilization`!

Unsloth の新しい RL 改善により、これを調整したり設定したりする心配は一切不要です `gpu_memory_utilization` 今後は GPU 使用率の 90% または 95% に設定するだけでよくなります。100% は小さなテンソル用の空き領域が必要なため残念ながら動作しません。以前は 30% から 95% まで調整する必要がありましたが、もう不要です！最大値に設定しておけば、あとは Unsloth が処理します！

## :interrobang:なぜ RL はこんなにメモリを使うのですか？

GRPO（および多くの RL 変種）は、主に vLLM によって動作する生成に大きく依存しています。しかし、これは大きなコストを伴います。なぜなら、重み、アクティベーション、KV キャッシュのために常時 **GPU メモリが必要だからです**.

{% columns %}
{% column %}
推論には大量の VRAM が必要

<figure><img src="/files/01a56560a9fe97e593d2b510558df261fc296a51" alt=""><figcaption></figcaption></figure>
{% endcolumn %}

{% column %}
一方で学習でも VRAM を使います！

<figure><img src="/files/b8f1f58ab91b09172450a18065c830f730d221e5" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

つまり RL では、GPU 上に 2 セットの VRAM / メモリを同時に保持する必要があります：

1. 推論エンジン（モデル重み、KV キャッシュを保持）
2. 学習エンジン（モデル重み、アクティベーション、勾配、オプティマイザ状態を保持）

現在の RL フレームワークでは、80GB GPU に対して推論 50%、学習 50% の 50/50 分割が必要です。そして、学習モードから推論モードへ重みを移すにはかなり時間がかかることがあります。

<table><thead><tr><th width="251.51666259765625">80GB GPU</th><th>推論エンジン（50%）</th><th>学習エンジン（50%）</th></tr></thead><tbody><tr><td>モデル重み</td><td>16GB</td><td>16GB</td></tr><tr><td>KV キャッシュ</td><td>24GB</td><td></td></tr><tr><td>アクティベーション、勾配、オプティマイザ状態</td><td></td><td>24GB</td></tr></tbody></table>

以前の Unsloth バージョンでも、すでに上記を賢く最適化していました。というのも、 **vLLM の重み領域を直接共有し、モデル重みの二重メモリ使用をなくしているからです**。たとえば 16GB の空きができ、それをコンテキスト長の増加や生成速度の向上に使えます。また、メモリ移動が不要なので、学習が高速化します。

| 80GB GPU               | 推論エンジン（50%）          | 学習エンジン（50%）         |
| ---------------------- | -------------------- | ------------------- |
| モデル重み                  | **16GB 共有**          | **<<< 共有**          |
| KV キャッシュ               | 24GB + 8GB= **32GB** |                     |
| アクティベーション、勾配、オプティマイザ状態 |                      | 24GB + 8GB=**32GB** |

## 🦥Unsloth Standby

しかし、さらに進められます。RL はまず推論、その後学習、その後また推論、その後また学習、という流れで進むことに注目してください。

<figure><img src="/files/540240ccc1be7e6921ecf8ae94102e1aabbd9bba" alt=""><figcaption></figcaption></figure>

つまり、推論と学習は別モードなので、理論上は推論と学習のメモリ領域を再利用できます。ここで [vLLM の sleep mode 機能](https://docs.vllm.ai/en/latest/features/sleep_mode.html#rlhf-weight-updates) が登場し、2つのオプションがあります：

1. `level = 1` 重みを CPU にコピーして KV キャッシュを削除します
2. `level = 2` 重みを削除し、KV キャッシュも削除します

ただし、Unsloth では重みについて vLLM のメモリ領域を共有していることを思い出してください。つまり、KV キャッシュを削除し、重みの削除は無視する新しい方法が必要です。これを Unsloth Standby と呼びます。

| 80GB GPU                                                                                                                                                | 推論エンジン      | 学習エンジン                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ---------------------- |
| モデル重み                                                                                                                                                   | **16GB 共有** | **<<< 共有**             |
| <p><mark style="background-color:purple;"><strong>多目的</strong></mark></p><p><mark style="background-color:purple;"><strong>64GB の領域</strong></mark></p> | KV キャッシュ    | アクティベーション、勾配、オプティマイザ状態 |

これを有効にするには、Unsloth を import する前に、すべての RL / GRPO 学習実行に以下を追加するだけです：

```python
import os
os.environ["UNSLOTH_VLLM_STANDBY"] = "1"
```

## 🧪パフォーマンス実験

ここでは、GRPO のメモリ使用量とコンテキスト長をどのようにベンチマークしたかが分かります。なお、 **プロンプトごとに 2 回生成しています。GRPO を機能させるには**、サンプル平均と分散を計算するために少なくとも 2 回の生成が必要だからです。 **2 回の生成がないと、1 サンプルの標準偏差は 0 になります**. すると、これを使う優位性（advantage）: (reward - mean)/std **が未定義になります**.

$$
Z=\frac{r\_i - \mu}{\sqrt{\frac{1}{n}\sum(r\_i-\mu)^2}} \\
Z\_{n=1}=\frac{r\_1 - \mu}{\sqrt{\frac{1}{1}\sum(r\_1-\mu)^2}}=\frac{0}{0}=\text{undefined}
$$

つまり、GRPO に限って言えば、Qwen-3 32B の最大コンテキスト長 6,144 は、実際には 2 回生成を掛けた 12,288 の長さに相当します。

以下では、Llama-3.1 8B について LoRA（16bit）と QLoRA（4bit）の両方での実験を示します：

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

**学習時間の差に気づいても、大きなものではありません**。同条件での比較では、学習時間の低下が 1% 未満、あるいは逆に高速化することもありましたが、これは誤差の範囲だと考えられます。

また、メモリ圧力の低下により高速化が起こりうると考えており、CUDA メモリアロケータ側でのメモリ整理が少なくて済む可能性があります。

<figure><img src="/files/ed0f0666b315231eb0148530e869ce726479995a" alt=""><figcaption></figcaption></figure>

上の画像では、Qwen 3 4B に対する単一の T4 GPU での baseline と standby モードの違いが見えます。 <mark style="background-color:green;">**vllm の**</mark><mark style="background-color:green;">**&#x20;**</mark><mark style="background-color:green;">**`gpu_memory_utilisation`**</mark><mark style="background-color:green;">**&#x20;**</mark><mark style="background-color:green;">**を 0.95 まで引き上げても、学習に影響する心配はありません**</mark>。つまり、より長いコンテキスト長のシーケンスを格納でき、より多くのシーケンスを処理できます。たとえば最初のケースでは、学習が許すなら 32K 長のシーケンスを格納・処理するのに十分なメモリがありますが、以前は 2K を超える入力は収まらず、OOM（メモリ不足）を引き起こす可能性がありました。

<table data-full-width="true"><thead><tr><th>実験</th><th>設定</th><th>ステータス</th><th>GPU メモリ使用量</th><th>コメント</th></tr></thead><tbody><tr><td><ol><li><a href="https://colab.research.google.com/drive/18CssBY5C0mStnLvu2Hlt4aFLoPugRG0K?usp=sharing">u0.95gen2ga1s Qwen3_(4B)-GRPO.ipynb</a></li></ol></td><td><p><code>standby True</code></p><p><code>vllm_gpu_util 0.95</code></p><p><code>num_gen 2</code></p><p><code>grad_acc_steps 2</code></p></td><td>40 ステップ / 40 分で実行</td><td><p>14.5 GiB（vllm_gpu_util による設定）</p><p><br></p></td><td>2〜4K のチャンク、あるいは 16K KVCache + 16K チャンクのような構成で 32K KVCache を収めるのに十分</td></tr><tr><td><ol start="2"><li><a href="https://colab.research.google.com/drive/1q0TOUychygfreI2wKpg51sqnRhs5cYnX?usp=sharing">u9ge2ga2s Qwen3_(4B)-GRPO.ipynb</a></li></ol></td><td><p><code>standby True</code></p><p><code>vllm_gpu_util 0.9</code></p><p><code>num_gen 2</code></p><p><code>grad_acc_steps 2</code></p></td><td>40 分で 32 ステップ実行</td><td>13.8 GiB（…による設定）</td><td>約 28K の KVCache を 2〜4K のチャンク、あるいは 15K KVCache + 15K チャンク程度で収めるのに十分</td></tr><tr><td><ol start="3"><li><a href="https://colab.research.google.com/drive/12Uw8y5beLzPtx11mCWCYyh9Z_PEHHdId?usp=sharing">u9ge2ga2ns Qwen3_(4B)-GRPO.ipynb</a></li></ol></td><td><p><code>standby False</code></p><p><code>vllm_gpu_util 0.9</code></p><p><code>num_gen 2</code></p><p><code>grad_acc_steps 2</code></p></td><td>モデルは読み込めるが、バッチサイズ 1 でも収まらず学習できない</td><td>OOM</td><td><br></td></tr><tr><td><ol start="4"><li><a href="https://colab.research.google.com/drive/1GwTlaP5CLsW-BcE1LqZWkz6S8VTWYdJ2?usp=sharing">u8ge2ga2ns Qwen3_(4B)-GRPO.ipynb</a></li></ol></td><td><p><code>standby False</code></p><p><code>vllm_gpu_util 0.8</code></p><p><code>num_gen 2</code></p><p><code>grad_acc_steps 2</code></p></td><td>モデルは読み込めるが、バッチサイズ 1 でも収まらず学習できない</td><td>OOM</td><td><br></td></tr><tr><td><ol start="5"><li><a href="https://colab.research.google.com/drive/1IuSUNzEBTiURK-vbTQuRDuUl0Ya2pz2t?usp=sharing">u7ge2ga2ns Qwen3_(4B)-GRPO.ipynb</a></li></ol></td><td><p><code>standby False</code></p><p><code>vllm_gpu_util 0.7</code></p><p><code>num_gen 2</code></p><p><code>grad_acc_steps 2</code></p></td><td><p>問題なく学習</p><p>28 ステップで 39 分</p></td><td>約 15.1GiB</td><td>少しでも長い入力は colab で OOM になる</td></tr><tr><td><ol start="6"><li><a href="https://colab.research.google.com/drive/1RY7HwpZ0luJT70OyLJ6zXKZQ2COdT9QJ?usp=sharing">u7gen2ga2s Qwen3_(4B)-GRPO.ipynb</a></li></ol></td><td><p><code>standby True</code></p><p><code>vllm_gpu_util 0.7</code></p><p><code>num_gen 2</code></p><p><code>grad_acc_steps 2</code></p></td><td><p>問題なく学習</p><p>29 ステップで 40 分</p></td><td>13GiB だが、ほとんどの時間は 10〜11GB 前後</td><td>同じ設定で、ここでは 2GiB、つまり 15% のメモリを節約しています。<br>より長いシーケンスではさらに大きくなる可能性があります</td></tr></tbody></table>

### H100 実験

| モデル                  | GPU                   | シーケンス長 | 生成数 | 勾配累積ステップ数 |
| -------------------- | --------------------- | ------ | --- | --------- |
| Qwen2.5-14B-Instruct | NVIDIA H100 80GB PCIe | 32,768 | 8   | 4         |

以下の折りたたみ可能な結果では、ピークメモリ使用量に 9GiB の差があることが分かります（なお、私たちの場合、GPU メモリ使用量は 90% の時間でピークメモリ使用量と同じです）。 **参考までに、TRL と LoRA を使うと、同じバッチサイズを維持したままでは、最大でもコンテキスト長 1024 の 8B パラメータモデルしか微調整できませんでした（32分の1）。** より長いシーケンス長のもの（同様の設定）は、OOM によりプロセスが失敗します。

<details>

<summary>Unsloth Standby モードあり vs. なしのベンチマークをクリックして表示</summary>

```
Standby モード有効：

|===========================================================================|
|                  PyTorch CUDA メモリ概要, デバイス ID 0                 |
|---------------------------------------------------------------------------|
|            CUDA OOM: 0            |        cudaMalloc 再試行: 0         |
|===========================================================================|
|        指標         | 現在使用量  | ピーク使用量 | 総割り当て | 総解放量 |
|---------------------------------------------------------------------------|
| 割り当て済みメモリ   |  32249 MiB |  43042 MiB | 128336 GiB | 128305 GiB |
|       大きいプールから |  31415 MiB |  42165 MiB | 127204 GiB | 127173 GiB |
|       小さいプールから |    834 MiB |   1184 MiB |   1132 GiB |   1131 GiB |
|---------------------------------------------------------------------------|
| アクティブメモリ     |  32249 MiB |  43042 MiB | 128336 GiB | 128305 GiB |
|       大きいプールから |  31415 MiB |  42165 MiB | 127204 GiB | 127173 GiB |
|       小さいプールから |    834 MiB |   1184 MiB |   1132 GiB |   1131 GiB |
|---------------------------------------------------------------------------|
| 要求メモリ           |  32199 MiB |  42987 MiB | 128176 GiB | 128145 GiB |
|       大きいプールから |  31364 MiB |  42110 MiB | 127047 GiB | 127016 GiB |
|       小さいプールから |    834 MiB |   1184 MiB |   1129 GiB |   1128 GiB |
|---------------------------------------------------------------------------|
| GPU 確保メモリ      |  37644 MiB |  47504 MiB | 705806 MiB | 668162 MiB |
|       大きいプールから |  36376 MiB |  46588 MiB | 682818 MiB | 646442 MiB |
|       小さいプールから |   1268 MiB |   1284 MiB |  22988 MiB |  21720 MiB |
|---------------------------------------------------------------------------|
| 再解放不可メモリ     | 713142 KiB |   4633 MiB | 103206 GiB | 103205 GiB |
|       大きいプールから | 525312 KiB |   4594 MiB | 101923 GiB | 101922 GiB |
|       小さいプールから | 187830 KiB |    250 MiB |   1283 GiB |   1283 GiB |
|---------------------------------------------------------------------------|
| 割り当て回数         |    3460    |    4809    |   15606 K  |   15603 K  |
|       大きいプールから |     395    |     563    |    2812 K  |    2811 K  |
|       小さいプールから |    3065    |    4270    |   12794 K  |   12791 K  |
|---------------------------------------------------------------------------|
| アクティブ割り当て   |    3460    |    4809    |   15606 K  |   15603 K  |
|       大きいプールから |     395    |     563    |    2812 K  |    2811 K  |
|       小さいプールから |    3065    |    4270    |   12794 K  |   12791 K  |
|---------------------------------------------------------------------------|
| GPU 確保セグメント  |     913    |     920    |   13260    |   12347    |
|       大きいプールから |     279    |     305    |    1766    |    1487    |
|       小さいプールから |     634    |     642    |   11494    |   10860    |
|---------------------------------------------------------------------------|
| 再解放不可割り当て   |     422    |     628    |    4766 K  |    4765 K  |
|       大きいプールから |      66    |      92    |    1290 K  |    1289 K  |
|       小さいプールから |     356    |     555    |    3476 K  |    3475 K  |
|---------------------------------------------------------------------------|
| 過大割り当て         |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| 過大 GPU セグメント  |       0    |       0    |       0    |       0    |
|===========================================================================|


Standby なし：

|===========================================================================|
|                  PyTorch CUDA メモリ概要, デバイス ID 0                 |
|---------------------------------------------------------------------------|
|            CUDA OOM: 0            |        cudaMalloc 再試行: 0         |
|===========================================================================|
|        指標         | 現在使用量  | ピーク使用量 | 総割り当て | 総解放量 |
|---------------------------------------------------------------------------|
| 割り当て済みメモリ   |  32711 MiB |  52084 MiB | 142756 GiB | 142724 GiB |
|       大きいプールから |  31877 MiB |  51207 MiB | 141499 GiB | 141467 GiB |
|       小さいプールから |    834 MiB |   1184 MiB |   1257 GiB |   1256 GiB |
|---------------------------------------------------------------------------|
| アクティブメモリ     |  32711 MiB |  52084 MiB | 142756 GiB | 142724 GiB |
|       大きいプールから |  31877 MiB |  51207 MiB | 141499 GiB | 141467 GiB |
|       小さいプールから |    834 MiB |   1184 MiB |   1257 GiB |   1256 GiB |
|---------------------------------------------------------------------------|
| 要求メモリ           |  32572 MiB |  51658 MiB | 141898 GiB | 141866 GiB |
|       大きいプールから |  31738 MiB |  50780 MiB | 140644 GiB | 140613 GiB |
|       小さいプールから |    833 MiB |   1184 MiB |   1253 GiB |   1252 GiB |
|---------------------------------------------------------------------------|
| GPU 確保メモリ      |  49552 MiB |  52188 MiB |  86354 MiB |  36802 MiB |
|       大きいプールから |  48320 MiB |  51300 MiB |  84740 MiB |  36420 MiB |
|       小さいプールから |   1232 MiB |   1232 MiB |   1614 MiB |    382 MiB |
|---------------------------------------------------------------------------|
| 再解放不可メモリ     |      0 B   |      0 B   |      0 B   |      0 B   |
|       大きいプールから |      0 B   |      0 B   |      0 B   |      0 B   |
|       小さいプールから |      0 B   |      0 B   |      0 B   |      0 B   |
|---------------------------------------------------------------------------|
| 割り当て回数         |    3460    |    4809    |   17440 K  |   17437 K  |
|       大きいプールから |     395    |     564    |    2742 K  |    2741 K  |
|       小さいプールから |    3065    |    4270    |   14698 K  |   14695 K  |
|---------------------------------------------------------------------------|
| アクティブ割り当て   |    3460    |    4809    |   17440 K  |   17437 K  |
|       大きいプールから |     395    |     564    |    2742 K  |    2741 K  |
|       小さいプールから |    3065    |    4270    |   14698 K  |   14695 K  |
|---------------------------------------------------------------------------|
| GPU 確保セグメント  |       0    |       0    |       0    |       0    |
|       大きいプールから |       0    |       0    |       0    |       0    |
|       小さいプールから |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| 再解放不可割り当て   |       0    |       0    |       0    |       0    |
|       大きいプールから |       0    |       0    |       0    |       0    |
|       小さいプールから |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| 過大割り当て         |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| 過大 GPU セグメント  |       0    |       0    |       0    |       0    |
|===========================================================================|
```

</details>

下の画像は、Unsloth における standby と non-standby の学習を比較したものです。指標にノイズが入らないよう 3 回の実行で平均しています。実際、十分に拡大すると、standby を有効にするとさらに高速になることが分かるはずです。前述のとおり、メモリ圧力が減るためだと考えられます。

<figure><img src="/files/99dcf0ddbad031a028d26cd4aeeb9e85ef1ce8eb" alt=""><figcaption></figcaption></figure>

### 以前の A100 40GB 実験

以前、A100 40GB GPU 上で Qwen-2.5-3b-instruct と 1 サンプルあたり 8 生成を使った実験では、standby なしだと、GRPO 学習（モデルは 16bit で読み込み、LoRA、学習可能なのは重みのみ）で収められるのは 6K のシーケンス長まででした。standby 機能を使うと、10K 以上を収めることができました！ **比較すると、TRL では同じバッチサイズを保ったままでは、最大でも 1K までのコンテキスト長しか得られません。**

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

## :tada:その他の最適化

現在はより良いコンパイルフラグを選択し、コンパイル時間を 50% 以上短縮しています。また、任意の vLLM バージョンに対して動的にパッチを当て、 `gc.collect` をより良く処理できるようにしました。これは後方互換性のためで、こちらの [vLLM の pull request](https://github.com/vllm-project/vllm/pull/21146)に触発されています。これによりコンパイル時間は 2 分から 40 秒未満に短縮されます。

また、 `torch.compile` フラグを最適化し、いくつかのフラグを有効化しようとしましたが、残念ながら `combo_kernels` および `multi_kernel` は vLLM 0.10 と Torch 2.8/2.9 nightly では正しく動作せず、 `coordinate_descent_tuning` はすべてのカーネルの自動チューニングを劇的に遅くしました。以前は 1 分未満でコンパイルできましたが、有効化すると 13 分以上かかり、性能向上はごくわずかでした。

## :books:GRPO ノートブック

すべての GRPO ノートブックでは、Unsloth Standby がデフォルトで有効になっており、すべての最適化も有効です。こちらを参照してください <https://docs.unsloth.ai/get-started/unsloth-notebooks> すべての GRPO ノートブックについては、または以下を試してください：

* [**Qwen3 (4B)**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen3_\(4B\)-GRPO.ipynb) **-** Advanced GRPO LoRA
* [**DeepSeek-R1-0528-Qwen3 (8B)**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/DeepSeek_R1_0528_Qwen3_\(8B\)_GRPO.ipynb) （多言語ユースケース向け）
* [Gemma 3 (1B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_\(1B\)-GRPO.ipynb)
* [Llama 3.2 (3B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Advanced_Llama3_2_\(3B\)_GRPO_LoRA.ipynb) - Advanced GRPO LoRA
* [Llama 3.1 (8B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_\(8B\)-GRPO.ipynb)
* [Phi-4 (14B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Phi_4_\(14B\)-GRPO.ipynb)
* [Mistral v0.3 (7B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Mistral_v0.3_\(7B\)-GRPO.ipynb)
* [Qwen2.5 (3B)](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_\(3B\)-GRPO.ipynb)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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/meru/reinforcement-learning-rl-guide/memory-efficient-rl.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.
