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 с высокой точностью

Квантование FP8 с высокой детализацией квантует веса и активации до fp8.

  • Веса квантуются до 8 бит для каждого 2D-блока (weight_block_size=(128, 128)).
  • Активации квантуются до 8 бит для каждой группы на токен. Значение группы совпадает с весами во входном канале (по умолчанию 128).

Квантование FP8 обеспечивает поддержку DeepSeek-V3 и DeepSeek-R1.

Вам нужен GPU с Compute Capability>=9 (H100), а также установка версии PyTorch, совместимой с версией CUDA вашего GPU.

Установите 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

На GPU Hopper (SM90+) и Blackwell (SM100+) каждый FP8-линейный слой автоматически использует ядра DeepGEMM из kernels-community/deep-gemm, если заданы weight_block_size=(128, 128) и activation_scheme="dynamic". DeepGEMM работает в 3–6 раз быстрее, чем резервный вариант на Triton. Для включения этой возможности установите или обновите пакет kernels.

pip install -U kernels

DeepGEMM выполняет JIT-компиляцию своих ядер с помощью системного nvcc, поэтому необходимо установить полный CUDA toolkit. Установка только для времени выполнения (библиотеки CUDA без nvcc) не будет работать. Минимальная версия toolkit зависит от оборудования: 12.3 или новее для Hopper (SM90), 12.9 или новее для Blackwell (SM100).

Transformers находит набор инструментов, последовательно проверяя CUDA_HOME, затем CUDA_PATH, затем nvcc в переменной PATH, а затем /usr/local/cuda. Если nvcc не обнаружен, установите CUDA_HOME на корневой каталог набора инструментов.

Если ядро не удаётся загрузить (отсутствует kernels, неподдерживаемая GPU, отсутствует CUDA toolkit или nvcc старше требуемой версии), Transformers один раз записывает предупреждение в лог и переключается на ядро Triton finegrained-fp8. Статическая квантизация активаций всегда выполняется по пути Triton.

Чтобы принудительно использовать резервный вариант Triton, даже если DeepGEMM доступен, установите TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1. Это влияет только на диспетчеризацию FP8-линейных слоёв и не затрагивает бэкенд экспертов "deepgemm", который переключается с помощью set_experts_implementation().

Для экспертов MoE путь DeepGEMM включается явно. Передайте experts_implementation="deepgemm" (или "deepgemm_megamoe" на Blackwell) при загрузке, чтобы маршрутизировать матричные умножения экспертов через DeepGEMM. Полный список вариантов описан в руководстве Бэкенды для экспертов.

Формат масштаба UE8M0

Чекпоинты в стиле DeepSeek V4 хранят масштабы весов FP8 в упакованном формате float8_e8m0fnu, а не в 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+) поддерживает масштабы float32 в пути DeepGEMM без преобразования. См. руководство Бэкенды экспертов для вариантов бэкендов экспертов.

Update on GitHub