# RL における FP16 と BF16 の比較

### Float16 と Bfloat16 の比較

次のタイトルの論文がありました「**トレーニングと推論の不一致を FP16 で克服する**" <https://arxiv.org/pdf/2510.26788> 強化学習を行う際に、bfloat16 よりも float16 の精度を使用する方が劇的に優れていることを示しています。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Frec4qe1aQS0xyMzGvS9c%2Fimage.png?alt=media&#x26;token=2137e766-0f1f-48ec-b25f-2292d6f149f4" alt=""><figcaption></figcaption></figure>

実際、生成が長くなるほど、bfloat16 を使用した場合の悪化が大きくなります：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FWs7ioB2lraTbDbUCOAnn%2Fimage.png?alt=media&#x26;token=ac2b4f8e-210f-4bcc-bcbb-6e68f80781a6" alt=""><figcaption></figcaption></figure>

我々は調査を行い、 **float16 の方がより安定していることを確認しました** bfloat16 よりも勾配ノルムがはるかに小さいことが見られます。詳細は <https://x.com/danielhanchen/status/1985557028295827482> および <https://x.com/danielhanchen/status/1985562902531850472>

{% columns %}
{% column width="50%" %}

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FhvQ1W5wtV6TTfsetp7y2%2FG44d7ZFbIAANBBd.jpg?alt=media&#x26;token=35181a07-de3e-4321-b54e-4436b4a201ff" alt=""><figcaption></figcaption></figure>

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2F62HkxnGcaKvxnSxbZMZu%2FG44c20SbwAAGo8j.jpg?alt=media&#x26;token=e0c7ecb8-6f0c-4ecf-b1a0-50f1b2a9a807" alt=""><figcaption></figcaption></figure>
{% endcolumn %}

{% column width="50%" %}

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fsi18IkGqE4IuUvzroyHh%2FG44ix5FbQAM0L5l.jpg?alt=media&#x26;token=bc3b97ce-5df4-4b69-aa50-a8e339f21601" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

### :exploding\_head:A100 のカスケードアテンションのバグ

以下によれば <https://x.com/RichardYRLi/status/1984858850143715759> および <https://yingru.notion.site/When-Speed-Kills-Stability-Demystifying-RL-Collapse-from-the-Training-Inference-Mismatch-271211a558b7808d8b12d403fd15edda>古い vLLM バージョン（0.11.0 より前）では A100 や類似の GPU に対してアテンション機構が壊れていました。vLLM をアップデートしてください！また、Unsloth の強化学習中に古い vLLM バージョンを検出した場合、vLLM ではデフォルトでカスケードアテンションを無効にしています。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FnkCLRVIIGLADXBSCe58e%2Fimage.png?alt=media&#x26;token=6669642f-8690-44bf-b2de-6aa89acf2332" alt=""><figcaption></figcaption></figure>

ハードウェアが変わると結果も変わり、より新しく高価な GPU の方が推論側とトレーニング側の KL 差が小さくなります：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FaroTTz68zzyofy6nagtH%2Fimage.webp?alt=media&#x26;token=3be09506-b8a0-42eb-8d17-af72496a9cd1" alt=""><figcaption></figcaption></figure>

### :fire:Unsloth RL での float16 の使用

Unsloth の GRPO および RL で float16 精度を使用するには、次のように設定するだけです `dtype = torch.float16` あとはこちらで処理します！

{% code overflow="wrap" %}

```python
from unsloth import FastLanguageModel
import torch
max_seq_length = 2048 # より長い推論履歴には増やせます
lora_rank = 32 # ランクが大きいほど賢くなりますが遅くなります

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Qwen3-4B-Base",
    max_seq_length = max_seq_length,
    load_in_4bit = False, # LoRA 16bit用はFalse
    fast_inference = True, # vLLM の高速推論を有効にする
    max_lora_rank = lora_rank,
    gpu_memory_utilization = 0.9, # メモリ不足の場合は値を下げてください
    
    dtype = torch.float16, # torch.float16、torch.bfloat16 を使用可能
)
```

{% endcode %}
