FP16, BF16, FP8

floating-point formats — форматы точности чисел в нейросетях

Раздел
Параметры
Обновлено
18.05.26

FP16, BF16 и FP8 — форматы хранения чисел с плавающей запятой в нейросетях. FP16 (16 бит) — старый стандарт точной тренировки, маленький диапазон. BF16 (16 бит) — тот же размер, но широкий диапазон значений, удобный для больших моделей. FP8 (8 бит) — новейший формат на Hopper H100 и Blackwell: вдвое меньше памяти, обучение и инференс в 2 раза быстрее. Выбор формата напрямую влияет на скорость, точность и потребление VRAM.

Коротко

Коротко. FP16, BF16, FP8 — это форматы чисел разной точности, которые используются в нейросетях. FP16 и BF16 занимают по 2 байта на параметр, FP8 — 1 байт. Разница между FP16 и BF16 — в раскладке битов: BF16 «жертвует точностью ради диапазона», и почти все современные большие модели тренируются именно в нём. FP8 — последнее поколение (Hopper, Blackwell), даёт ещё ×2 экономии и ускорения.

Что это такое

Сентябрь 2022-го. NVIDIA представляет Hopper H100. Главная фича — FP8-тензорные ядра: операция умножения матриц в 8-битной точности в два раза быстрее, чем в 16-битной. Гипоскейлеры тут же начинают переписывать тренировочные пайплайны.

К 2026-му картина такая:

  • FP32 — старый «полный» формат. Уже мало где используется в тренировке, разве что для аккумуляторов (накопление градиентов).
  • FP16 — половинная точность. Заметно быстрее, но узкий диапазон чисел. Любит overflow на больших значениях.
  • BF16 — Brain Float от Google. Тот же размер (16 бит), но раскладка как у FP32: широкий диапазон, чуть меньше точности.
  • FP8 — новейший формат, ×2 от 16-битного. Два варианта: E4M3 (точнее, для активаций) и E5M2 (шире, для градиентов).

Все они — компромисс между точностью (сколько знаков после запятой) и диапазоном (от какого до какого числа можно представить). FP16 точный, но узкий: уже число 100000 ему недоступно. BF16 «грубый», но представляет числа до 3.4 × 10³⁸ — как у FP32.

Как это работает

Любое число с плавающей запятой состоит из трёх частей:

  • Знак (1 бит) — плюс или минус.
  • Экспонента (несколько бит) — порядок величины.
  • Мантисса (остальные бит) — значимые цифры.

Раскладка:

Формат Знак Экспонента Мантисса Диапазон Точность
FP32 1 8 23 ±3.4×10³⁸ ~7 десятичных знаков
FP16 1 5 10 ±65 504 ~4 знака
BF16 1 8 7 ±3.4×10³⁸ ~3 знака
FP8 E4M3 1 4 3 ±448 ~1 знак
FP8 E5M2 1 5 2 ±57 344 ~1 знак

В современных GPU все эти форматы поддерживаются аппаратно: тензорные ядра умножают матрицы в нужной точности без эмуляции. Скорости — ×2 от FP32 для FP16/BF16, и ещё ×2 от 16-битного для FP8.

Пример на практике

ML-инженер тренирует LoRA для FLUX.dev на RTX 4090 (24 ГБ VRAM, поддерживает FP16 и BF16, FP8 — частично).

Попытка 1: FP16. Конфиг kohya_ss: mixed_precision: "fp16". Запускает тренировку. Через 200 шагов в логах:

Loss: 0.124 → nan

NaN — это «not a number». Градиент выскочил за пределы FP16 (±65 504), стал бесконечностью, всё развалилось.

Попытка 2: BF16. Меняет на mixed_precision: "bf16". Запуск проходит без NaN. Скорость та же, что у FP16 (тот же размер 16 бит). 1000 шагов за 35 минут.

Попытка 3: FP8 (через TransformerEngine). На RTX 4090 поддержка частичная. На H100 — полная. Тренирует ту же LoRA за 22 минуты — почти в 2 раза быстрее. Качество получившейся модели визуально неотличимо от BF16.

Для инференса (генерации картинок) FLUX.dev официально поставляется в нескольких форматах:

  • FP16 (flux1-dev.safetensors, 23 ГБ) — оригинал. Помещается с трудом даже в 24 ГБ VRAM.
  • FP8 (flux1-dev-fp8.safetensors, 11 ГБ) — половина места, разница в качестве минимальна.
  • NF4 (4 бита, 6 ГБ) — для слабых видеокарт. Заметная потеря, но запускается на 8 ГБ.

ComfyUI имеет настройку «Force FP8 in model loading» — она автоматически конвертирует FP16-чекпоинт в FP8 при загрузке. Это работает даже на RTX 30-серии и старше, хоть и без аппаратного ускорения.

С чем часто путают

  • FP16 и BF16 — одинаковый размер (16 бит), разная раскладка битов. BF16 шире по диапазону, FP16 точнее. Для нейросетей чаще нужен диапазон.
  • FP8 и INT8 — оба 8-битные, но FP8 — с плавающей запятой (хранит большие и малые числа), INT8 — целые (равномерные уровни). FP8 точнее для весов, INT8 проще в реализации.
  • Mixed Precision и FP16 — mixed precision это гибридный режим: веса в FP32, вычисления в FP16/BF16, аккумулятор в FP32. Не то же самое, что «всё в FP16».
  • FP16 и Half — Half это синоним FP16 в PyTorch/CUDA. То же самое.
  • NF4 и FP4 — NF4 (NormalFloat4) — это 4-битный формат с неравномерными уровнями, специально подобранными под распределение весов нейросетей. FP4 — классический формат с плавающей точкой.

Частые ошибки и заблуждения

  • «FP16 точнее FP32». Наоборот: FP16 — половина точности. Просто «полтона»-разница для нейросетей часто незаметна.
  • «BF16 всегда лучше FP16». Не всегда. На задачах с маленьким диапазоном значений (некоторые vision-модели, инференс готовой модели) FP16 даёт лучшее качество за счёт большей точности.
  • «FP8 — это будущее, переходить надо всем». Только если железо поддерживает. На RTX 30-серии и Apple Silicon FP8 эмулируется через FP16 — без выигрыша по скорости.
  • «FP16/BF16 тренировка ломает модель». Современный mixed precision стабилен. Используют его на 99% больших моделей: Llama, GPT, Stable Diffusion, FLUX.
  • «Можно просто конвертировать FP16 ↔ BF16». Можно, но не всегда без потерь. У FP16 точнее мантисса; число вроде 0.1234567 в FP16 хранится точнее, чем в BF16.

Связанные термины

  • Quantization — снижение точности ниже 16 бит (INT8, Q4, FP4).
  • Mixed Precision — гибридное использование разных форматов в одной тренировке.
  • VRAM — формат напрямую определяет, сколько памяти займёт модель.
  • Tensor Cores — специализированные блоки NVIDIA, ускоряют операции в FP16/BF16/FP8.
  • TransformerEngine — библиотека NVIDIA для тренировки в FP8.
  • Safetensors — формат, в котором эти типы данных хранятся.
  • Loss / Gradient — обычно требуют максимального диапазона, отсюда популярность BF16.

Частые вопросы

В каком формате тренировать LoRA для FLUX? BF16 — безопасный выбор. FP16 может ловить NaN на больших датасетах. FP8 — для H100 / RTX 50-серии, на RTX 40 поддержка есть, но не везде стабильна.

Почему FP8 не вытеснил BF16 для тренировки? FP8 на градиентах требует калибровки и осторожной работы со scale. Не все архитектуры стабильно тренируются в FP8 «из коробки». BF16 — проще и предсказуемее.

Можно ли запустить FP8-модель на RTX 3060? Технически да, через программную эмуляцию: ComfyUI «Force FP8» работает на всех GPU. Но без аппаратного ускорения скорость та же, что у FP16 — выигрывает только в VRAM (×2 экономии).

Что такое «E4M3» и «E5M2»? Два варианта FP8. E4M3 = 4 бита экспоненты, 3 мантиссы (точнее, для активаций). E5M2 = 5 экспоненты, 2 мантиссы (шире, для градиентов). NVIDIA TransformerEngine использует оба, переключаясь по ситуации.

FP16 это то же самое, что Half? Да, в большинстве фреймворков. PyTorch: torch.float16 и torch.half — одно и то же.

Почему BF16 называется «Brain Float»? Изобретён в Google Brain в 2018-м для TPU. Идея — взять экспоненту от FP32 (8 бит) и обрезать мантиссу до 7 бит. Получился «упрощённый FP32», который ведёт себя в нейросетях так же, но занимает половину места.

Главное

FP16, BF16 и FP8 — три формата для современных нейросетей. BF16 — стандарт тренировки больших моделей: широкий диапазон, нет проблем с NaN. FP16 — лучше для инференса готовой модели на старом железе. FP8 — топовый формат для H100 и Blackwell, ×2 ускорение тренировки и инференса. Выбор формата напрямую определяет, сколько модель занимает VRAM и насколько быстро работает. Для большинства практических задач: BF16 при тренировке, FP16/FP8 при инференсе — и не забывайте, что в ComfyUI и kohya_ss это управляется одной настройкой.