# メモリ効率の高いRL

Unslothにおけるより効率的な強化学習（RL）を、複数のアルゴリズム的改良とともにご紹介します：

* **文脈長が1.2〜1.7倍に増加** 遅延なし、追加メモリ使用なし！
* **RLトレーニング実行が10%高速化** 改良されたカーネルと非同期データ移動による
* **2倍高速 `torch.compile` 倍** モデル読み込み中に

Unsloth **既に** は、FA2を用いた他の全ての設定と比べてRLトレーニング速度を向上させ、コンテキストウィンドウを拡張し、VRAM使用量を50〜90%削減しますが、現在は [**Unslothのスタンバイ**](#unsloth-standby) がさらにこれを改善します。私たちのStandby機能は他の実装と比べて速度低下を独自に抑制し、時にはトレーニングをさらに高速化します！

現在、Qwen3-32B LoRA 16ビットは1x H100 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:最適化を有効にする方法

レイヤーとしてではありません。これが量子化を複雑にします。特にMoE/MLPエキスパートは20Bパラメータのうち約19Bを占めます。 **Unslothのスタンバイ** 機能を有効にするには、環境変数を設定します `UNSLOTH_VLLM_STANDBY` を任意のUnslothインポートより前に設定してください。次に `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, # ランクが大きいほど賢くなるが遅くなる
    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%を分割する必要があります。トレーニングモードから推論モードへの重み移動にはかなり時間がかかることがあります。

<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 スタンバイ

しかしさらに進められます — まずRLは推論→トレーニング→推論→トレーニング...と繰り返すことに着目します。

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

これは理論上、推論とトレーニングが別モードであるため、そのメモリ領域を再利用できることを意味します — ここで [vLLMのスリープモード機能](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インポートより前に、すべてのRL/GRPOトレーニング実行に以下を追加してください：

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

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

ここではGRPOのメモリ使用量とコンテキスト長をどのようにベンチマークしたかを示します。注意点として私たちは **プロンプトごとに2回の生成を行います。GRPOが機能するためには**サンプルの平均と分散を計算するために最低2回の生成が必要だからです。 **生成が2回ないと、1サンプルの標準偏差は0になります**。これにより、（報酬 - 平均）/ 標準偏差を使用するアドバンテージが **未定義になってしまいます**.

$$
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でのベースラインモードとスタンバイモードの違いが見られます。 <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チャンクで32KのKVCacheを収める、または16K KVCache + 16Kチャンクを収めるのに十分</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>約2-4Kチャンクで約28KのKVCache、または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倍小さい）。** 同様の設定でより長いシーケンス長はプロセスがOOMで失敗します。

<details>

<summary>Unsloth Standbyモードと非Standbyのベンチマークをクリックして表示</summary>

```
Standbyモード有効：

|===========================================================================|
|                  PyTorch CUDA メモリサマリ、デバイスID 0                  |
|---------------------------------------------------------------------------|
|            CUDA OOMs: 0            |        cudaMalloc リトライ: 0         |
|===========================================================================|
|        指標           | 現在使用量  | ピーク使用量 | 総割当     | 総解放     |
|---------------------------------------------------------------------------|
| 割り当てられたメモリ   |  32249 MiB |  43042 MiB | 128336 GiB | 128305 GiB |
|       large poolから    |  31415 MiB |  42165 MiB | 127204 GiB | 127173 GiB |
|       small poolから    |    834 MiB |   1184 MiB |   1132 GiB |   1131 GiB |
|---------------------------------------------------------------------------|
| アクティブメモリ       |  32249 MiB |  43042 MiB | 128336 GiB | 128305 GiB |
|       large poolから    |  31415 MiB |  42165 MiB | 127204 GiB | 127173 GiB |
|       small poolから    |    834 MiB |   1184 MiB |   1132 GiB |   1131 GiB |
|---------------------------------------------------------------------------|
| 要求されたメモリ       |  32199 MiB |  42987 MiB | 128176 GiB | 128145 GiB |
|       large poolから    |  31364 MiB |  42110 MiB | 127047 GiB | 127016 GiB |
|       small poolから    |    834 MiB |   1184 MiB |   1129 GiB |   1128 GiB |
|---------------------------------------------------------------------------|
| GPU予約メモリ         |  37644 MiB |  47504 MiB | 705806 MiB | 668162 MiB |
|       large poolから    |  36376 MiB |  46588 MiB | 682818 MiB | 646442 MiB |
|       small poolから    |   1268 MiB |   1284 MiB |  22988 MiB |  21720 MiB |
|---------------------------------------------------------------------------|
| 解放不可能メモリ      | 713142 KiB |   4633 MiB | 103206 GiB | 103205 GiB |
|       large poolから    | 525312 KiB |   4594 MiB | 101923 GiB | 101922 GiB |
|       small poolから    | 187830 KiB |    250 MiB |   1283 GiB |   1283 GiB |
|---------------------------------------------------------------------------|
| 割当数                |    3460    |    4809    |   15606 K  |   15603 K  |
|       large poolから    |     395    |     563    |    2812 K  |    2811 K  |
|       small poolから    |    3065    |    4270    |   12794 K  |   12791 K  |
|---------------------------------------------------------------------------|
| アクティブ割当         |    3460    |    4809    |   15606 K  |   15603 K  |
|       large poolから    |     395    |     563    |    2812 K  |    2811 K  |
|       small poolから    |    3065    |    4270    |   12794 K  |   12791 K  |
|---------------------------------------------------------------------------|
| GPU予約セグメント数   |     913    |     920    |   13260    |   12347    |
|       large poolから    |     279    |     305    |    1766    |    1487    |
|       small poolから    |     634    |     642    |   11494    |   10860    |
|---------------------------------------------------------------------------|
| 解放不可能な割当数    |     422    |     628    |    4766 K  |    4765 K  |
|       large poolから    |      66    |      92    |    1290 K  |    1289 K  |
|       small poolから    |     356    |     555    |    3476 K  |    3475 K  |
|---------------------------------------------------------------------------|
| オーバーサイズ割当    |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| オーバーサイズGPUセグメント |       0    |       0    |       0    |       0    |
|===========================================================================|


Standbyなし：

|===========================================================================|
|                  PyTorch CUDA メモリサマリ、デバイスID 0                  |
|---------------------------------------------------------------------------|
|            CUDA OOMs: 0            |        cudaMalloc リトライ: 0         |
|===========================================================================|
|        指標           | 現在使用量  | ピーク使用量 | 総割当     | 総解放     |
|---------------------------------------------------------------------------|
| 割り当てられたメモリ   |  32711 MiB |  52084 MiB | 142756 GiB | 142724 GiB |
|       large poolから    |  31877 MiB |  51207 MiB | 141499 GiB | 141467 GiB |
|       small poolから    |    834 MiB |   1184 MiB |   1257 GiB |   1256 GiB |
|---------------------------------------------------------------------------|
| アクティブメモリ       |  32711 MiB |  52084 MiB | 142756 GiB | 142724 GiB |
|       large poolから    |  31877 MiB |  51207 MiB | 141499 GiB | 141467 GiB |
|       small poolから    |    834 MiB |   1184 MiB |   1257 GiB |   1256 GiB |
|---------------------------------------------------------------------------|
| 要求されたメモリ       |  32572 MiB |  51658 MiB | 141898 GiB | 141866 GiB |
|       large poolから    |  31738 MiB |  50780 MiB | 140644 GiB | 140613 GiB |
|       small poolから    |    833 MiB |   1184 MiB |   1253 GiB |   1252 GiB |
|---------------------------------------------------------------------------|
| GPU予約メモリ         |  49552 MiB |  52188 MiB |  86354 MiB |  36802 MiB |
|       large poolから    |  48320 MiB |  51300 MiB |  84740 MiB |  36420 MiB |
|       small poolから    |   1232 MiB |   1232 MiB |   1614 MiB |    382 MiB |
|---------------------------------------------------------------------------|
| 解放不可能メモリ      |      0 B   |      0 B   |      0 B   |      0 B   |
|       large poolから    |      0 B   |      0 B   |      0 B   |      0 B   |
|       small poolから    |      0 B   |      0 B   |      0 B   |      0 B   |
|---------------------------------------------------------------------------|
| 割当数                |    3460    |    4809    |   17440 K  |   17437 K  |
|       large poolから    |     395    |     564    |    2742 K  |    2741 K  |
|       small poolから    |    3065    |    4270    |   14698 K  |   14695 K  |
|---------------------------------------------------------------------------|
| アクティブ割当         |    3460    |    4809    |   17440 K  |   17437 K  |
|       large poolから    |     395    |     564    |    2742 K  |    2741 K  |
|       small poolから    |    3065    |    4270    |   14698 K  |   14695 K  |
|---------------------------------------------------------------------------|
| GPU予約セグメント数   |       0    |       0    |       0    |       0    |
|       large poolから    |       0    |       0    |       0    |       0    |
|       small poolから    |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| 解放不可能な割当数    |       0    |       0    |       0    |       0    |
|       large poolから    |       0    |       0    |       0    |       0    |
|       small poolから    |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| オーバーサイズ割当    |       0    |       0    |       0    |       0    |
|---------------------------------------------------------------------------|
| オーバーサイズGPUセグメント |       0    |       0    |       0    |       0    |
|===========================================================================|
```

</details>

下の図はUnslothでのスタンバイ有効時と無効時のトレーニング比較を示しています。メトリクスのノイズを抑えるために3回の実行の平均を取っています。実際、十分に拡大すると、スタンバイを有効にすると速度が上がるのが見えることもあり、おそらく前述のメモリプレッシャーの低減が原因です。

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

### 以前のA100 40GB実験

以前のA100 40GB GPU上での実験（Qwen-2.5-3b-instruct、サンプルあたり生成8回）では、スタンバイなしでは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のプルリクエスト](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)  - 高度な 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: 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.
