# FP8 с высокой точностью

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

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

Квантование FP8 обеспечивает поддержку [DeepSeek-V3](https://hf.co/papers/2412.19437) и DeepSeek-R1.

    

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

Установите Accelerate и обновите PyTorch до последней версии.

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

Создайте класс [FineGrainedFP8Config](/docs/transformers/main/ru/main_classes/quantization#transformers.FineGrainedFP8Config) и передайте его в [from_pretrained()](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel.from_pretrained) для квантования. По умолчанию веса загружаются в полной точности (`torch.float32`), независимо от фактического типа данных, в котором они хранятся. Установите `dtype="auto"`, чтобы загружать веса в тип данных, определённый в файле `config.json` модели, и автоматически использовать наиболее оптимальный по памяти тип данных.

```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/ru/main_classes/model#transformers.PreTrainedModel.save_pretrained) для сохранения квантованной модели и загрузите её с помощью [from_pretrained()](/docs/transformers/main/ru/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

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

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

DeepGEMM выполняет JIT-компиляцию своих ядер с помощью системного `nvcc`, поэтому необходимо установить полный набор CUDA. Установка только для времени выполнения (библиотеки CUDA без `nvcc`) не будет работать. Минимальная версия набора инструментов зависит от оборудования: 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()](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel.set_experts_implementation).

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

## Формат масштаба 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 без преобразования. См. руководство [Бэкенды экспертов](../experts_interface) для вариантов бэкендов экспертов.

