Инженерия

FP8, FP4 и BF16: как устроены числовые форматы для ИИ

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

8 мин чтения

Выбор между FP8, FP4 и BF16 — это компромисс между памятью, скоростью и качеством. BF16 занимает два байта на значение и остаётся стандартом для обучения, а также для инференса, когда качество важнее всего. FP8 занимает один байт и широко используется для инференса на современных GPU. FP4 занимает полбайта, работает только с поблочным масштабированием и нативно поддерживается лишь новейшим оборудованием. В этом руководстве разобраны раскладка битов, форматы с поблочным масштабированием (NVFP4, MXFP4 и MXFP6), поддержка форматов разными GPU и то, как сделать выбор.

FP8, FP4 и BF16: краткое сравнение

Число с плавающей запятой состоит из знакового бита, битов экспоненты и битов мантиссы. В таблице перечислены форматы, которые встречаются в работе с ИИ, — от самого широкого к самому узкому.

ФорматБиты знака / экспоненты / мантиссыНаибольшее конечное значениеБайт на значениеТипичное применение
FP321 / 8 / 23≈ 3,4 × 10³⁸4Мастер-копия весов, состояние оптимизатора, накопление
TF321 / 8 / 10≈ 3,4 × 10³⁸4 в памятиМатричные вычисления FP32 на тензорных ядрах NVIDIA
BF161 / 8 / 7≈ 3,4 × 10³⁸2Обучение, инференс с высоким качеством
FP161 / 5 / 1065 5042Инференс; для обучения нужно масштабирование функции потерь (loss scaling)
FP8 E4M31 / 4 / 34481Веса и активации
FP8 E5M21 / 5 / 257 3441Градиенты при обучении в FP8
FP6 E2M3 / E3M21 / 2 / 3 и 1 / 3 / 27,5 и 280,75Веса с поблочным масштабированием (MXFP6)
FP4 E2M11 / 2 / 160,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 для градиентов.

Поскольку диапазон очень узкий, значения FP8 почти всегда сопровождаются масштабным коэффициентом: перед приведением к FP8 тензор масштабируется так, чтобы попасть в представимый диапазон, а масштаб сохраняется, чтобы значения можно было восстановить. Масштаб может задаваться на тензор, на канал, на токен или на блок. Гранулярность важна: при одном масштабе на тензор единственный выброс вынуждает выбрать крупный масштаб, и малые значения обращаются в ноль. Например, DeepSeek-V3 выпустили с весами в FP8 и отдельным масштабом для каждого блока 128 × 128; что это означает для памяти, показано в нашей статье о системных требованиях DeepSeek R1.

FP6, FP4 и поблочное масштабирование: NVFP4 и MXFP4

FP4 в раскладке E2M1 может представить только 0; 0,5; 1; 1,5; 2; 3; 4 и 6, а также соответствующие отрицательные значения. При таком малом числе уровней один масштаб на тензор безнадёжен. Форматы с поблочным масштабированием дают каждому небольшому блоку значений собственный масштаб, который хранится рядом с данными.

ФорматЭлементЗначений в блокеМасштаб блокаЭффективных бит на значение
NVFP4 (NVIDIA)FP4 E2M116FP8 E4M3 плюс один масштаб FP32 на тензор≈ 4,5
MXFP4 (OCP Microscaling)FP4 E2M1328-битная степень двойки (E8M0)≈ 4,25
MXFP6 (OCP Microscaling)FP6 E2M3 или E3M2328-битная степень двойки (E8M0)≈ 6,25
MXFP8 (OCP Microscaling)FP8 E4M3 или E5M2328-битная степень двойки (E8M0)≈ 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 может хранить 4-битные веса и разворачивать их до 16 бит перед умножением — на этом основаны методы квантования только весов, такие как GPTQ и AWQ, — но это экономит память и пропускную способность, а не вычисления.

GPUАрхитектураFP8FP6FP4
H100, H200HopperДаНетНет
L40SAda LovelaceДаНетНет
RTX 4090 (для справки: в аренду мы его не сдаём)Ada LovelaceДаНетНет
B200, B300Blackwell, Blackwell UltraДаДаДа
RTX PRO 6000, RTX 5090BlackwellДаДаДа
MI355XAMD CDNA 4ДаДа (MXFP6)Да (MXFP4)

GPU NVIDIA Blackwell для дата-центров — B200 и B300 — поддерживают и NVFP4, и форматы OCP MX. На практике FP8 — самая низкая точность с плавающей запятой, которую нативно выполняют тензорные ядра Hopper и Ada, а Blackwell и MI355X добавляют FP6 и FP4. Конкретный пример — в нашем сравнении H200 и B200. Все GPU нашей линейки серверов с одним GPU и 8-GPU-серверов поддерживают FP8 аппаратно.

Экономия памяти: расчёт

Для модели с 70B параметров — только веса:

ФорматБит на вес с учётом масштабовВесаГде помещается
BF1616≈ 140 ГБОдин B200 (180 ГБ) или B300 (288 ГБ)
FP88≈ 70 ГБОдин H100 впритык, один H200 с запасом
MXFP6≈ 6,25≈ 55 ГБОдин RTX PRO 6000 (96 ГБ), с местом для KV-кэша
NVFP4≈ 4,5≈ 39 ГБОдин RTX PRO 6000, с большим запасом для KV-кэша
MXFP4≈ 4,25≈ 37 ГБОдин RTX PRO 6000; также нативно на MI355X

Реальные чекпоинты получаются чуть больше, потому что эмбеддинги, выходной слой и веса нормализации часто остаются 16-битными. Ещё две вещи не уменьшаются вместе с весами: активации и KV-кэш, если только не квантовать и его. При декодировании, ограниченном пропускной способностью памяти, меньше байт на вес означает и меньше байт, которые нужно считать из памяти на каждый токен, поэтому пониженная точность не только экономит память, но и ускоряет генерацию. Полная методика расчёта — в статье о том, сколько видеопамяти (VRAM) нужно для LLM (больших языковых моделей).

Качество: веса, активации и KV-кэш

Квантовать можно три разные вещи, и ведут они себя по-разному.

  • Веса после обучения не меняются, поэтому их можно квантовать один раз, офлайн и аккуратно. 4-битное квантование только весов с 16-битными активациями (W4A16) — давно устоявшийся подход.
  • Активации меняются с каждым входом и содержат выбросы — несколько каналов, значения в которых по модулю намного больше, чем в остальных. Им нужно динамическое масштабирование или калибровка. Квантование и весов, и активаций в FP8 (W8A8) позволяет выполнять матричные умножения на тензорных ядрах FP8; W4A4 с NVFP4 или MXFP4 — самая агрессивная из распространённых схем.
  • KV-кэш можно хранить в FP8, чтобы вдвое сократить занимаемую им память, — это даёт больше одновременных запросов или более длинный контекст. В этом случае проверьте качество на длинных контекстах.

Калибровка — это прогон небольшого набора репрезентативных входных данных через модель, чтобы подобрать масштабы. Её автоматизируют такие инструменты, как NVIDIA TensorRT Model Optimizer, llm-compressor и AMD Quark. Оценивайте результат на важных для вас задачах, включая длинные контексты, математику и код, а не только по перплексии, и всегда сравнивайте с базовым вариантом в BF16. Чем меньше разрядность, тем сильнее результат зависит от конкретной модели и задачи.

В обучении подход консервативнее, чем в инференсе. Стандарт — смешанная точность с BF16; обучение в FP8 уже отработано на Hopper и Blackwell с помощью библиотек вроде Transformer Engine; обучение в 4 битах пока остаётся областью активных исследований.

Почему производители приводят цифры без разреженности и с разреженностью

В спецификациях обычно указаны два значения вычислительной мощности для каждого формата. Опубликованные производителями пиковые значения на один GPU:

GPUBF16: без / с разреженностьюFP8: без / с разреженностьюFP4: без / с разреженностью
H100, H200989 / 1 979 TFLOPS1 979 / 3 958 TFLOPSНе поддерживается
B2002,25 / 4,5 PFLOPS4,5 / 9 PFLOPS9 / 18 PFLOPS
B3002,25 / 4,5 PFLOPS4,5 / 9 PFLOPS13,5 / 18 PFLOPS
MI355X2,5 / 5,0 PFLOPS5,0 / 10,1 PFLOPS10,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?

Нет. GPU поколения Hopper, такие как H100 и H200, поддерживают FP8, но тензорных ядер для FP4 и FP6 у них нет — они появились в Blackwell. При этом на H100 всё же можно хранить 4-битные веса с помощью квантования только весов: это экономит память, но вычисления идут в 16 битах.

Чем NVFP4 отличается от MXFP4?

Оба формата хранят значения как 4-битные числа E2M1 с общим масштабом на блок. NVFP4 использует блоки по 16 значений с масштабом FP8 E4M3, а MXFP4 — блоки по 32 значения с масштабом в виде степени двойки, поэтому NVFP4 точнее подстраивается под каждый блок ценой чуть большего объёма хранения.

Сколько памяти экономит FP4 по сравнению с BF16?

Для весов — почти в четыре раза: модель 70B уменьшается примерно со 140 ГБ в BF16 до 37–39 ГБ в MXFP4 или NVFP4 с учётом поблочных масштабов. KV-кэш и активации считаются отдельно и уменьшаются, только если квантовать и их.

Стоит ли обучать модели в FP8?

Для больших запусков обучения на H100, H200 или GPU Blackwell формат FP8 может сократить трафик памяти и повысить производительность, а масштабирование берут на себя библиотеки вроде NVIDIA Transformer Engine. Сначала сверьте кривую функции потерь с запуском в BF16: BF16 остаётся надёжным вариантом по умолчанию.

Выделенные GPU с помесячной оплатой

Целые GPU от 449 $ в месяц, root-доступ, трафик включён. Оплата криптовалютой.

Смотреть GPU и цены Подберите GPU с помощью калькулятора видеопамяти

Развернуть GPU-сервер

Получите GPU-сервер уже в этом месяце.

Выберите конфигурацию, создайте аккаунт в той же форме и оплатите первый месяц с баланса. Гарантированная дата выдачи показывается до оплаты, а если мы её пропустим, вы получите полный возврат средств.

  • Гарантированная дата выдачи известна до оплаты
  • Отмена в любом месяце
  • Оплата криптовалютой, бонус до +50%

Вход в FullGPU

Управляйте GPU-серверами, балансом и счетами.

Впервые в FullGPU? Создать аккаунт