FP8, FP4 и BF16: как устроены числовые форматы для ИИ
Каждое снижение точности вдвое во столько же раз сокращает память на параметр, а на GPU, рассчитанных на такой формат, как минимум удваивает пиковую производительность тензорных ядер. Разбираем, как устроены форматы, на каком оборудовании они работают и чем приходится жертвовать.

Выбор между FP8, FP4 и BF16 — это компромисс между памятью, скоростью и качеством. BF16 занимает два байта на значение и остаётся стандартом для обучения, а также для инференса, когда качество важнее всего. FP8 занимает один байт и широко используется для инференса на современных GPU. FP4 занимает полбайта, работает только с поблочным масштабированием и нативно поддерживается лишь новейшим оборудованием. В этом руководстве разобраны раскладка битов, форматы с поблочным масштабированием (NVFP4, MXFP4 и MXFP6), поддержка форматов разными GPU и то, как сделать выбор.
FP8, FP4 и BF16: краткое сравнение
Число с плавающей запятой состоит из знакового бита, битов экспоненты и битов мантиссы. В таблице перечислены форматы, которые встречаются в работе с ИИ, — от самого широкого к самому узкому.
| Формат | Биты знака / экспоненты / мантиссы | Наибольшее конечное значение | Байт на значение | Типичное применение |
|---|---|---|---|---|
| FP32 | 1 / 8 / 23 | ≈ 3,4 × 10³⁸ | 4 | |
| TF32 | 1 / 8 / 10 | ≈ 3,4 × 10³⁸ | 4 в памяти | Матричные вычисления FP32 на тензорных ядрах NVIDIA |
| BF16 | 1 / 8 / 7 | ≈ 3,4 × 10³⁸ | 2 | Обучение, инференс с высоким качеством |
| FP16 | 1 / 5 / 10 | 65 504 | 2 | Инференс; для обучения нужно масштабирование функции потерь (loss scaling) |
| FP8 E4M3 | 1 / 4 / 3 | 448 | 1 | Веса и активации |
| FP8 E5M2 | 1 / 5 / 2 | 57 344 | 1 | Градиенты при обучении в FP8 |
| FP6 E2M3 / E3M2 | 1 / 2 / 3 и 1 / 3 / 2 | 7,5 и 28 | 0,75 | Веса с поблочным масштабированием (MXFP6) |
| FP4 E2M1 | 1 / 2 / 1 | 6 | 0,5 | Веса и активации с поблочным масштабированием (NVFP4, MXFP4) |
Диапазон и точность: биты экспоненты и мантиссы
- BF16
сохраняет 8 бит экспоненты от FP32 и поэтому охватывает тот же диапазон, а мантиссу сокращает до 7 бит — это примерно две-три значащие десятичные цифры. Поскольку диапазон совпадает с FP32, при обучении не нужно масштабирование функции потерь, и именно поэтому в обучении BF16 во многом вытеснил FP16. - FP16 точнее (10 бит мантиссы), но его максимум — 65 504, а малые градиенты обращаются в ноль (underflow), поэтому для обучения в FP16 нужно масштабирование функции потерь.
- TF32
— не формат хранения. Это режим тензорных ядер, появившийся в поколении NVIDIA Ampere: он принимает входные данные в FP32, перемножает их с 10-битной мантиссой и накапливает результат в FP32. В PyTorch его разрешаетtorch.set_float32_matmul_precision("high").
Матричные умножения на тензорных ядрах принимают входные данные низкой точности, но накапливают результат в более высокой точности — обычно в FP32. Низкая точность касается того, что вы храните и передаёте, а накопление защищает сумму.
FP8: E4M3 и E5M2
FP8 существует в двух вариантах. У E4M3 выше точность, а максимум — 448, поэтому его используют для весов и активаций. E5M2 жертвует битом мантиссы ради диапазона — до 57 344, что подходит для градиентов при обучении в FP8. Например, Transformer Engine от NVIDIA в своём гибридном рецепте использует E4M3 в прямом проходе и E5M2 для градиентов.
FP6, FP4 и поблочное масштабирование: NVFP4 и MXFP4
FP4 в раскладке E2M1 может представить только 0; 0,5; 1; 1,5; 2; 3; 4 и 6, а также соответствующие отрицательные значения. При таком малом числе уровней один масштаб на тензор безнадёжен. Форматы с поблочным масштабированием дают каждому небольшому блоку значений собственный масштаб, который хранится рядом с данными.
| Формат | Элемент | Значений в блоке | Масштаб блока | Эффективных бит на значение |
|---|---|---|---|---|
| NVFP4 (NVIDIA) | FP4 E2M1 | 16 | FP8 E4M3 плюс один масштаб FP32 на тензор | ≈ 4,5 |
| MXFP4 (OCP Microscaling) | FP4 E2M1 | 32 | ≈ 4,25 | |
| MXFP6 (OCP Microscaling) | FP6 E2M3 или E3M2 | 32 | ≈ 6,25 | |
| MXFP8 (OCP Microscaling) | FP8 E4M3 или E5M2 | 32 | ≈ 8,25 |
Разницу между двумя форматами FP4 проще всего увидеть на одном блоке. Допустим, наибольшее по модулю значение в нём — 0,42. NVFP4 может выбрать масштаб, близкий к 0,42 / 6 = 0,07, и тогда 0,42 почти точно попадает на верхний код — 6. MXFP4 обязан использовать степень двойки: эталонное преобразование из спецификации OCP выбирает 2⁻⁴ = 0,0625, и 0,42 превращается в 6,72 — больше наибольшего кода, поэтому значение обрезается до 6 и декодируется как 0,375. Меньшие блоки и более гибкие масштабы позволяют NVFP4 точнее подстраиваться под каждый блок ценой лишней четверти бита на значение. Масштабы в виде степени двойки дешевле применять аппаратно, и они охватывают гораздо более широкий диапазон.
Какие GPU поддерживают какие форматы
| GPU | Архитектура | FP8 | FP6 | FP4 |
|---|---|---|---|---|
| H100, H200 | Hopper | Да | Нет | Нет |
| L40S | Ada Lovelace | Да | Нет | Нет |
| RTX 4090 (для справки: в аренду мы его не сдаём) | Ada Lovelace | Да | Нет | Нет |
| B200, B300 | Blackwell, Blackwell Ultra | Да | Да | Да |
| RTX PRO 6000, RTX 5090 | Blackwell | Да | Да | Да |
| MI355X | AMD CDNA 4 | Да | Да (MXFP6) | Да (MXFP4) |
Экономия памяти: расчёт
Для модели с 70B параметров — только веса:
| Формат | Бит на вес с учётом масштабов | Веса | Где помещается |
|---|---|---|---|
| BF16 | 16 | ≈ 140 ГБ | Один B200 (180 ГБ) или B300 (288 ГБ) |
| FP8 | 8 | ≈ 70 ГБ | Один H100 впритык, один H200 с запасом |
| MXFP6 | ≈ 6,25 | ≈ 55 ГБ | |
| NVFP4 | ≈ 4,5 | ≈ 39 ГБ | |
| MXFP4 | ≈ 4,25 | ≈ 37 ГБ | Один RTX PRO 6000; также нативно на MI355X |
Качество: веса, активации и KV-кэш
- Веса
после обучения не меняются, поэтому их можно квантовать один раз, офлайн и аккуратно. 4-битное квантование только весов с16-битными активациями (W4A16) — давно устоявшийся подход. - Активации меняются с каждым входом и содержат выбросы — несколько каналов, значения в которых по модулю намного больше, чем в остальных. Им нужно динамическое масштабирование или калибровка. Квантование и весов, и активаций в FP8 (W8A8) позволяет выполнять матричные умножения на тензорных ядрах FP8; W4A4 с NVFP4 или MXFP4 — самая агрессивная из распространённых схем.
можно хранить в FP8, чтобы вдвое сократить занимаемую им память, — это даёт больше одновременных запросов или более длинный контекст. В этом случае проверьте качество на длинных контекстах.KV-кэш
В обучении подход консервативнее, чем в инференсе. Стандарт — смешанная точность с BF16; обучение в FP8 уже отработано на Hopper и Blackwell с помощью библиотек вроде Transformer Engine; обучение в 4 битах пока остаётся областью активных исследований.
Почему производители приводят цифры без разреженности и с разреженностью
В спецификациях обычно указаны два значения вычислительной мощности для каждого формата. Опубликованные производителями пиковые значения на один GPU:
| GPU | BF16: без / с разреженностью | FP8: без / с разреженностью | FP4: без / с разреженностью |
|---|---|---|---|
| H100, H200 | 989 / 1 979 TFLOPS | 1 979 / 3 958 TFLOPS | Не поддерживается |
| B200 | 2,25 / 4,5 PFLOPS | 4,5 / 9 PFLOPS | 9 / 18 PFLOPS |
| B300 | 2,25 / 4,5 PFLOPS | 4,5 / 9 PFLOPS | 13,5 / 18 PFLOPS |
| MI355X | 2,5 / 5,0 PFLOPS | 5,0 / 10,1 PFLOPS | 10,1 PFLOPS (MXFP4) |
Значения с разреженностью предполагают структурированную разреженность. На GPU NVIDIA это схема 2:4: в каждой группе из четырёх последовательных весов два равны нулю, поэтому тензорные ядра могут пропускать половину умножений. Большинство LLM в инференсе работают без разреженности, поэтому планируйте, ориентируясь на значения без неё. Сравнивайте сопоставимое — одна громкая цифра может быть указана с разреженностью, а другая без неё — и проверяйте соотношение, а не принимайте его на веру: у B300 значения для FP4 (13,5 без разреженности и 18 с разреженностью) различаются не ровно в 2 раза. Пиковые значения — это потолок, которого реальные нагрузки достигают лишь частично. Обратите внимание и на закономерность в каждой строке: по этим данным производителей каждое снижение точности вдвое как минимум удваивает пиковую производительность без разреженности — это вторая половина аргументов в пользу FP8 и FP4.
Практические советы: какую точность выбрать
Предобучение и полное дообучение ( fine-tuning ):смешанная точность с BF16, при этом мастер-копия весов и состояние оптимизатора — в FP32. Для больших запусков на H100 и более новых GPU переходите на FP8, когда кривая функции потерь совпадёт с запуском в BF16.- Дообучение при ограниченном бюджете:
QLoRA — базовая модель хранится в 4-битном формате NF4, а обучаются16-битные адаптеры. - Инференс на Hopper или Ada (H100, H200, L40S):
веса и активации в FP8, плюс KV-кэш в FP8, когда нужно больше одновременных запросов. - Инференс на Blackwell (B200, B300, RTX PRO 6000, RTX 5090): начните с FP8, затем попробуйте NVFP4 там, где узким местом становятся память или пропускная способность, а ваши оценки качества это подтверждают.
- Инференс на MI355X: сначала FP8, затем MXFP4 или MXFP6 с той же проверкой.
В коде первые шаги совсем небольшие:
# PyTorch: allow TF32 tensor cores for FP32 matrix multiplications
torch.set_float32_matmul_precision("high")
# vLLM: quantize weights to FP8 at load time and keep the KV cache in FP8
vllm serve <model> --quantization fp8 --kv-cache-dtype fp8
Что бы вы ни выбрали, держите базовый вариант в BF16 и набор данных для оценки и проводите сравнение, прежде чем выпускать модель в продакшен. Калькулятор видеопамяти покажет, как каждый формат меняет требования к GPU, а наше руководство о лучшем GPU для инференса LLM сопоставляет размеры моделей с оборудованием.
Часто задаваемые вопросы
FP8 лучше, чем BF16?
FP8 занимает вдвое меньше памяти и, по данным производителей, на GPU с тензорными ядрами FP8 даёт вдвое большую пиковую производительность, чем BF16. BF16 точнее, поэтому он остаётся стандартом для обучения, а инференс в FP8 стоит проверять относительно базового варианта в BF16.
Поддерживает ли H100 формат FP4?
Чем NVFP4 отличается от MXFP4?
Сколько памяти экономит FP4 по сравнению с BF16?
Стоит ли обучать модели в FP8?
Для больших запусков обучения на H100, H200 или GPU Blackwell формат FP8 может сократить трафик памяти и повысить производительность, а масштабирование берут на себя библиотеки вроде NVIDIA Transformer Engine. Сначала сверьте кривую функции потерь с запуском в BF16: BF16 остаётся надёжным вариантом по умолчанию.
Выделенные GPU с помесячной оплатой


