FP4
FP4 — это 4-битный формат чисел с плавающей точкой, обычно E2M1, в котором используются масштабы для блоков, чтобы уменьшить размер ИИ-моделей и ускорить их работу. Рассматриваются NVFP4, MXFP4, оборудование и код.
FP4 — формат чисел с плавающей запятой разрядностью 4 бита, используемый для хранения и вычисления весов и активаций нейронных сетей при квантовании моделей. В оборудовании и ПО для ИИ используется представление E2M1: один знаковый бит, два бита экспоненты и один бит мантиссы; оно позволяет представить только 0, ±0.5, ±1, ±1.5, ±2, ±3, ±4 и ±6. Каждое значение занимает вдвое меньше памяти, чем FP8, и вчетверо меньше, чем FP16 (половинная точность. Это особенно важно для больших языковых моделей и других моделей генеративного ИИ, в которых задержка инференса в основном обусловлена загрузкой весов из памяти. Нативные матричные вычисления FP4 появились в GPU Blackwell от NVIDIA и серии Instinct MI350 от AMD; FP4 используют как для инференса, так и всё чаще для обучения.
Как работает FP4#
Пятнадцати различных значений недостаточно, чтобы охватить диапазон реальных весов и активаций, поэтому в каждом практическом формате FP4 тензор разбивают на небольшие блоки и хранят общий масштаб для каждого блока. Масштаб выбирают так, чтобы наибольшая величина в блоке отображалась близко к максимальному значению E2M1, равному 6. Два основных формата отличаются размером блока и точностью масштаба:
- MXFP4: Определён в спецификации Microscaling (MX) проекта Open Compute Project. MXFP4 объединяет 32 значения под одним 8-битным масштабом — степенью двойки (E8M0). Эта открытая спецификация поддерживается разными производителями, включая серию MI350 от AMD и GPU Blackwell от NVIDIA.
- NVFP4: Формат NVIDIA объединяет 16 значений под одним масштабом FP8 (E4M3) и добавляет второй масштаб FP32 для каждого тензора. Меньшие блоки и более точные масштабы снижают ошибку квантования; по данным NVIDIA, на бенчмарках DeepSeek-R1-0528 потеря точности относительно FP8 составила не более 1%.
В приведённом ниже фрагменте тензор с несколькими выбросами округляется до значений E2M1: сначала с одним масштабом для всего тензора, затем с одним масштабом на 32 значения и на 16 значений — таковы размеры блоков MXFP4 и NVFP4:
import torch
# The eight non-negative values FP4 E2M1 can represent; the sign bit mirrors them
grid = torch.tensor([0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0])
torch.manual_seed(0)
x = torch.randn(4096)
x[::512] *= 20 # a few large outliers, as real weight and activation tensors have
# One shared scale for the whole tensor, then MXFP4-sized and NVFP4-sized blocks
for block in [4096, 32, 16]:
blocks = x.reshape(-1, block)
scale = blocks.abs().amax(dim=1, keepdim=True) / 6.0 # map each block's largest value to 6
nearest = ((blocks.abs() / scale).unsqueeze(-1) - grid).abs().argmin(dim=-1)
dequantized = grid[nearest] * blocks.sign() * scale
error = (dequantized.flatten() - x).abs().mean()
print(f"Block size {block:>4}: mean absolute error {error:.4f}")При едином масштабе для всего тензора выбросы настолько растягивают масштаб, что большинство обычных значений округляется до нуля; средняя абсолютная ошибка составляет 0.7238. Блоки из 32 и 16 значений ограничивают влияние каждого выброса одним блоком, поэтому в остальных блоках сохраняется точный масштаб, а ошибка падает до 0.0901 и 0.0747.
Инференс и обучение в FP4#
Для инференса движок инференса, например TensorRT, после обучения квантирует веса, а часто и активации, до FP4, выполняет матричные умножения в FP4 и накапливает результаты с более высокой точностью. Конфигурации NVFP4 и MXFP4 в TorchAO обеспечивают тот же рабочий процесс в PyTorch на поддерживаемых GPU. OpenAI выпустила gpt-oss-120b с весами смеси экспертов, дообученными в MXFP4, благодаря чему модель с 117 миллиардами параметров помещается на один GPU с 80 ГБ памяти.
Обучение в FP4 переносит обучение с смешанной точностью на 4 бита и сложнее инференса, поскольку диапазон градиентов и активаций меняется в ходе обучения. В исследовании предобучения в NVFP4 NVIDIA обучила модель с 12 миллиардами параметров на 10 триллионах токенов в NVFP4 и добилась сопоставимых с базовой FP8-моделью потерь при обучении и точности на последующих задачах. Для этого сочетались случайные преобразования Адамара, распределяющие выбросы, стохастическое округление градиентов и несколько слоёв с более высокой точностью.
Развёртывание моделей FP4#
Для нативной поддержки FP4 в тензорных ядрах требуются GPU NVIDIA Blackwell или новее, например B200 и GeForce RTX 50, либо ускорители AMD Instinct MI350 для MXFP4; GPU Hopper, например H100, ускоряют FP8, но не FP4. В таблице поддержки TensorRT указана поддержка точностей для каждого GPU. Точность нужно проверить после преобразования и до развёртывания модели, поскольку чувствительные слои и небольшие модели могут работать хуже. Если послетренировочного квантования недостаточно, точность можно восстановить с помощью квантования с учётом обучения. Экспорт Ultralytics YOLO26 в TensorRT собирает движки с FP16 и quantize=16 либо с INT8 и quantize=8 — это варианты пониженной точности, доступные для моделей YOLO.
FP4 и связанные форматы#
- FP8: У FP8 (E4M3 или E5M2) значительно больше различных значений и шире диапазон. Поскольку обучение FP8 широко используется для больших моделей, результаты FP4 обычно сравнивают именно с FP8.
- BFloat16: BF16 остаётся стандартным форматом для обучения и запуска больших моделей с полным качеством и использует в четыре раза больше битов, чем FP4.
- INT4: INT4 равномерно распределяет 16 уровней, тогда как FP4 выделяет больше уровней вблизи нуля, где сосредоточена большая часть весов и активаций. INT4 по-прежнему часто используют для сжатия только весов языковых моделей с помощью таких методов, как GPTQ и AWQ.
- Разъём AMD FP4: FP4 — также название не связанного с этим разъёма AMD для ноутбучных процессоров, используемого в мобильных APU поколения Carrizo, например FX-8800P.










