# 細粒度のFP8

Fine-grained FP8 quantization は、重みとアクティベーションを fp8 に量子化します。

- 重みは、各2Dブロックごとに8ビットに量子化されます（`weight_block_size=(128, 128)`）。
- アクティベーションは、トークンごとにグループ単位で8ビットに量子化されます。グループの値は入力チャネルの重みに一致します（デフォルトは128）。

FP8量子化により、[DeepSeek-V3](https://hf.co/papers/2412.19437)およびDeepSeek-R1のサポートが可能になります。

    

> [!TIP]
> Compute Capability>=9 (H100) をサポートする GPU が必要であり、GPU の CUDA バージョンと互換性のある PyTorch バージョンをインストールしてください。

Accelerate をインストールし、PyTorch を最新バージョンにアップグレードします。

```bash
pip install --upgrade accelerate torch
```

[FineGrainedFP8Config](/docs/transformers/main/ja/main_classes/quantization#transformers.FineGrainedFP8Config) クラスを作成し、[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) に渡して量子化します。重みは、実際の保存データ型に関わらず、デフォルトではフル精度（`torch.float32`）で読み込まれます。モデルの `config.json` ファイルで定義されたデータ型で重みをロードし、メモリ効率の最も良いデータ型を自動的に読み込むには、`dtype="auto"` を設定してください。

```py
from transformers import FineGrainedFP8Config, AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Meta-Llama-3-8B"
quantization_config = FineGrainedFP8Config()
quantized_model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto", device_map="auto", quantization_config=quantization_config)

tokenizer = AutoTokenizer.from_pretrained(model_name)
input_text = "What are we having for dinner?"
input_ids = tokenizer(input_text, return_tensors="pt").to(quantized_model.device.type)

output = quantized_model.generate(**input_ids, max_new_tokens=10)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

[save_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.save_pretrained) を使用して量子化モデルを保存し、[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) で読み込み直します。

```py
quant_path = "/path/to/save/quantized/model"
quantized_model.save_pretrained(quant_path)
model = AutoModelForCausalLM.from_pretrained(quant_path, device_map="auto")
```

## DeepGEMMの高速パス

Hopper (SM90+) および Blackwell (SM100+) GPU では、`weight_block_size=(128, 128)` かつ `activation_scheme="dynamic"` の場合、すべての FP8 linear が自動的に [kernels-community/deep-gemm](https://huggingface.co/kernels-community/deep-gemm) の [DeepGEMM](https://github.com/deepseek-ai/DeepGEMM) カーネルにディスパッチされます。DeepGEMM は Triton のフォールバックよりも 3〜6 倍高速です。これを有効にするには、[kernels](https://github.com/huggingface/kernels) パッケージをインストールまたはアップグレードしてください。

```bash
pip install -U kernels
```

DeepGEMM はシステムの `nvcc` を使用してカーネルを JIT コンパイルするため、完全な CUDA ツールキットのインストールが必要です。ランタイムのみのインストール（`nvcc` を含まない CUDA ライブラリ）では動作しません。ツールキットの最低バージョンはハードウェアによって異なり、Hopper (SM90) では 12.3 以降、Blackwell (SM100) では 12.9 以降が必要です。

Transformers は、`CUDA_HOME`、次に `CUDA_PATH`、次に `PATH` 上の `nvcc`、最後に `/usr/local/cuda` の順に確認してツールキットを探します。`nvcc` が検出されない場合は、`CUDA_HOME` をツールキットのルートに設定してください。

カーネルを読み込めない場合（`kernels`が不足している、GPUがサポートされていない、CUDAツールキットがない、または`nvcc`のバージョンが要求されるバージョンより古い）、Transformersは警告を一度ログに記録し、Tritonのfinegrained-fp8カーネルにフォールバックします。静的アクティベーション量子化は常にTritonパスで実行されます。

`TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1` を設定すると、DeepGEMM が利用可能であっても Triton のフォールバックを強制できます。これは FP8 linear のディスパッチにのみ影響し、`"deepgemm"` の experts バックエンドには影響しません。experts バックエンドは [set_experts_implementation()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.set_experts_implementation) で切り替えます。

MoEエキスパートの場合、DeepGEMMパスはオプトイン方式です。読み込み時に`experts_implementation="deepgemm"`（Blackwellでは`"deepgemm_megamoe"`）を渡すことで、エキスパートの行列積をDeepGEMM経由で処理するようにルーティングできます。すべてのオプションについては、[Experts backends](../experts_interface)ガイドを参照してください。

## UE8M0スケール形式

DeepSeek V4 形式のチェックポイントは、`float32` ではなく、パックされた `float8_e8m0fnu` 形式で FP8 の重みスケールを保存します。これらのチェックポイントは事前量子化されており、量子化設定で `scale_fmt="ue8m0"` が設定されています。DeepGEMM と Triton の両方のカーネルが UE8M0 スケールを読み取れるため、これらのチェックポイントはどちらのパスでも実行できます。

Blackwell (SM100+) では、DeepGEMM の experts カーネルは UE8M0 スケールのみをサポートしています。通常の `float32` スケール (`scale_fmt="float"`) を持つチェックポイントを使用すると、`ValueError` が発生します。`scale_fmt="ue8m0"` のチェックポイントを使用するか、`float32` スケールを直接サポートする `grouped_mm` または `batched_mm` で experts を実行してください。Hopper (SM90+) では、変換なしで DeepGEMM パス上で `float32` スケールをサポートしています。experts バックエンドのオプションについては、[Experts backends](../experts_interface) ガイドを参照してください。

