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.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

细粒度 FP8

细粒度 FP8 量化将权重和激活值量化为 fp8。

  • 权重按每个 2D 块量化为 8 位(weight_block_size=(128, 128))。
  • 激活值按每个 token 的每个组量化为 8 位。组大小与输入通道的权重一致(默认为 128)。

FP8 量化支持 DeepSeek-V3 和 DeepSeek-R1。

您需要一个计算能力 >=9(H100)的 GPU,并安装与您的 GPU 的 CUDA 版本兼容的 PyTorch 版本。

安装 Accelerate 并升级到 PyTorch 的最新版本。

pip install --upgrade accelerate torch

创建一个 FineGrainedFP8Config 类并将其传递给 from_pretrained() 以进行量化。默认情况下,无论权重实际存储的数据类型如何,权重都会以全精度(torch.float32)加载。设置 dtype="auto" 可以按模型 config.json 文件中定义的数据类型加载权重,从而自动加载最节省内存的数据类型。

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 线性层都会自动调度到来自 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 路径。

若要强制使用 Triton 回退方案,即使 DeepGEMM 可用,请设置 TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1。此设置仅影响 FP8 线性层调度,不会改动 "deepgemm" 专家后端,后者可通过 set_experts_implementation() 进行切换。

对于 MoE 专家,DeepGEMM 路径需要显式启用。在加载时传入 experts_implementation="deepgemm"(在 Blackwell 上则传入 "deepgemm_megamoe"),即可将专家的矩阵乘法路由至 DeepGEMM。有关完整的选项列表,请参阅 Experts backends 指南。

UE8M0 缩放格式

DeepSeek V4 风格的检查点以打包的 float8_e8m0fnu 格式存储 FP8 权重缩放因子,而非 float32。这些检查点已预先量化,并在其量化配置中设置了 scale_fmt="ue8m0"。DeepGEMM 和 Triton 内核均支持读取 UE8M0 缩放因子,因此这些检查点可以在任意一条路径上运行。

在 Blackwell(SM100+)上,DeepGEMM 专家内核仅支持 UE8M0 缩放因子。使用普通 float32 缩放因子(scale_fmt="float")的检查点会引发 ValueError。请使用 scale_fmt="ue8m0" 检查点,或者使用 grouped_mm 或 batched_mm 运行专家层,它们直接支持 float32 缩放因子。Hopper(SM90+)在 DeepGEMM 路径上无需转换即可支持 float32 缩放因子。有关专家后端选项,请参阅 专家后端 指南。

Update on GitHub