Transformers documentation

FP8 de granularidade fina

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 de granularidade fina

A quantização FP8 de granularidade fina quantiza os pesos e as ativações para fp8.

  • Os pesos são quantizados para 8 bits para cada bloco 2D (weight_block_size=(128, 128)).
  • As ativações são quantizadas para 8 bits para cada grupo por token. O valor do grupo corresponde aos pesos no canal de entrada (128 por padrão).

A quantização FP8 permite o suporte a DeepSeek-V3 e DeepSeek-R1.

Você precisa de uma GPU com Compute Capability>=9 (H100) e instalar uma versão do PyTorch compatível com a versão do CUDA da sua GPU.

Instale o Accelerate e atualize para a versão mais recente do PyTorch.

pip install --upgrade accelerate torch

Crie uma classe FineGrainedFP8Config e passe-a para from_pretrained() para quantizá-la. Por padrão, os pesos são carregados em precisão completa (torch.float32), independentemente do tipo de dados real em que os pesos estão armazenados. Defina dtype="auto" para carregar os pesos no tipo de dados definido no arquivo config.json do modelo, carregando automaticamente o tipo de dados mais otimizado em termos de memória.

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))

Use save_pretrained() para salvar o modelo quantizado e recarregue-o com from_pretrained().

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

Caminho rápido do DeepGEMM

Em GPUs Hopper (SM90+) e Blackwell (SM100+), cada linear FP8 é despachado automaticamente para os kernels DeepGEMM de kernels-community/deep-gemm quando weight_block_size=(128, 128) e activation_scheme="dynamic". O DeepGEMM é de 3 a 6 vezes mais rápido que o fallback Triton. Instale ou atualize o pacote kernels para habilitá-lo.

pip install -U kernels

O DeepGEMM compila seus kernels em tempo de execução (JIT) usando o nvcc do sistema, portanto, é necessário ter o toolkit CUDA completo instalado. Uma instalação apenas de tempo de execução (bibliotecas CUDA sem o nvcc) não funcionará. A versão mínima do toolkit depende do hardware: 12.3 ou posterior no Hopper (SM90) e 12.9 ou posterior no Blackwell (SM100).

O Transformers localiza o toolkit verificando CUDA_HOME, em seguida CUDA_PATH, depois nvcc no seu PATH e, por fim, /usr/local/cuda. Defina CUDA_HOME para a raiz do toolkit caso o nvcc não seja detectado.

Se o kernel não puder ser carregado (faltando kernels, GPU não suportada, ausência do toolkit CUDA ou um nvcc mais antigo que a versão exigida), o Transformers registra um aviso uma única vez e recorre ao kernel finegrained-fp8 do Triton. A quantização estática de ativação permanece sempre no caminho do Triton.

Para forçar o fallback do Triton mesmo quando o DeepGEMM está disponível, defina TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1. Isso afeta apenas o despacho linear FP8 e deixa o backend de especialistas "deepgemm" intacto, que você alterna com set_experts_implementation().

Para os especialistas de MoE, o caminho DeepGEMM é opcional. Passe experts_implementation="deepgemm" (ou "deepgemm_megamoe" em Blackwell) no momento do carregamento para rotear as multiplicações de matrizes dos especialistas pelo DeepGEMM. Consulte o guia Backends de especialistas para o conjunto completo de opções.

Formato de escala UE8M0

Os checkpoints no estilo DeepSeek V4 armazenam as escalas de pesos FP8 no formato empacotado float8_e8m0fnu em vez de float32. Esses checkpoints são pré-quantizados e definem scale_fmt="ue8m0" em sua configuração de quantização. Tanto os kernels DeepGEMM quanto os kernels Triton leem escalas UE8M0, de modo que esses checkpoints funcionam em qualquer um dos caminhos.

No Blackwell (SM100+), os kernels de especialistas do DeepGEMM suportam apenas escalas UE8M0. Um checkpoint com escalas float32 simples (scale_fmt="float") gera um ValueError. Use um checkpoint com scale_fmt="ue8m0" ou execute os especialistas com grouped_mm ou batched_mm, que suportam escalas float32 diretamente. O Hopper (SM90+) suporta escalas float32 no caminho do DeepGEMM sem conversão. Consulte o guia Experts backends para as opções de backend de especialistas.

Update on GitHub