Transformers documentation

細粒度のFP8

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

細粒度のFP8

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

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

FP8量子化により、DeepSeek-V3およびDeepSeek-R1のサポートが可能になります。

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

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

pip install --upgrade accelerate torch

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

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() を使用して量子化モデルを保存し、from_pretrained() で読み込み直します。

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 の DeepGEMM カーネルにディスパッチされます。DeepGEMM は Triton のフォールバックよりも 3〜6 倍高速です。これを有効にするには、kernels パッケージをインストールまたはアップグレードしてください。

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() で切り替えます。

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

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 ガイドを参照してください。

Update on GitHub