Открыть сервис

bfloat16

bfloat16 (сокращение от англ. brain floating point — «плавающая точка мозга») — это 16-битный формат представления чисел с плавающей запятой, разработанный корпорацией Google в 2017—2018 годах для использования в системах искусственного интеллекта и машинного обучения. Формат является усечённой версией стандартного 32-битного формата IEEE 754 (binary32, или float32) и сохраняет тот же диапазон значений, что и float32, но с меньшей точностью за счёт сокращения числа бит мантиссы.

История

Формат bfloat16 был впервые представлен в 2017 году как часть проекта Google Brain, направленного на оптимизацию вычислений в нейронных сетях. Основной проблемой, которую решал bfloat16, была высокая вычислительная нагрузка и объём памяти, требуемые для обработки 32-битных чисел с плавающей запятой в глубоком обучении. В то время уже существовал 16-битный формат IEEE 754 (binary16, или float16), однако его диапазон значений (максимум около 65 504) был недостаточен для многих задач машинного обучения, особенно при обучении с большими весами и градиентами. Это приводило к переполнениям и потере точности.

Google предложил альтернативный подход: взять 32-битное число float32 и «урезать» его мантиссу с 23 до 7 бит, оставив 8 бит на порядок и 1 бит на знак. Таким образом, bfloat16 сохраняет весь диапазон значений float32 (от ~1,17 × 10⁻³⁸ до ~3,4 × 10³⁸), но ценой снижения точности примерно до 3-4 десятичных знаков. Это делает формат идеальным для задач, где важнее широкий диапазон, чем высокая точность, что характерно для прямого и обратного распространения ошибок в нейронных сетях.

Первым коммерческим продуктом, поддерживающим bfloat16, стал тензорный процессор Google (TPU) второго поколения (Cloud TPU v2), выпущенный в 2018 году. Впоследствии поддержка формата была добавлена в процессоры Intel (начиная с архитектуры Cooper Lake, 2020 год), AMD (начиная с архитектуры Zen 4, 2022 год) и ARM (начиная с архитектуры ARMv8.6-A). В 2020 году bfloat16 был официально включён в стандарт IEEE 754-2019 как дополнительный формат.

Технические характеристики

Структура битового представления

Число в формате bfloat16 занимает 16 бит, которые делятся на три поля:

  • Бит знака (S): 1 бит (0 — положительное, 1 — отрицательное).
  • Порядок (E): 8 бит, смещённый на 127 (как в float32). Это позволяет представлять порядки от -126 до +127.
  • Мантисса (M): 7 бит, представляющая дробную часть числа. Неявная единица (скрытый бит) предполагается, как и в IEEE 754.

Формула для значения числа:

\[ (-1)^S \times 2^{(E-127)} \times (1 + M/2^7) \]

Сравнение с другими форматами

Параметрbfloat16float16 (IEEE 754)float32 (IEEE 754)
Размер (бит)161632
Биты порядка858
Биты мантиссы71023
Диапазон~1,17×10⁻³⁸ — 3,4×10³⁸~6,1×10⁻⁵ — 65 504~1,17×10⁻³⁸ — 3,4×10³⁸
Точность (десятичные знаки)~3,3~3,3~7,2
Особые значения+0, -0, +∞, -∞, NaN+0, -0, +∞, -∞, NaN+0, -0, +∞, -∞, NaN

Как видно из таблицы, bfloat16 и float16 имеют одинаковый размер, но разный диапазон и точность. float16 имеет более высокую точность (10 бит мантиссы против 7), но значительно меньший диапазон (5 бит порядка против 8). Для задач машинного обучения, где веса и градиенты могут варьироваться в широких пределах (например, от 10⁻⁶ до 10⁶), bfloat16 оказывается более надёжным, так как исключает переполнения.

Преобразование в float32

Одним из ключевых преимуществ bfloat16 является простота преобразования в float32 и обратно. Поскольку порядок bfloat16 совпадает с порядком float32, преобразование сводится к добавлению или удалению 16 нулевых бит мантиссы. Это позволяет реализовать аппаратное преобразование с минимальными задержками и энергопотреблением.

Применение

Машинное обучение и глубокое обучение

Основная область применения bfloat16 — обучение и инференс нейронных сетей. Формат используется для хранения весов, активаций и градиентов. Благодаря широкому диапазону, bfloat16 позволяет избежать переполнений при обучении больших моделей, таких как GPT-3 (175 миллиардов параметров) или BERT. При этом снижение точности (с 7 до 3 десятичных знаков) обычно не приводит к заметному ухудшению качества модели, так как нейронные сети устойчивы к шуму в младших битах.

bfloat16 также используется в смешанной точности (mixed precision training), где часть операций выполняется в float32, а часть — в bfloat16. Это позволяет ускорить обучение в 2-3 раза и снизить потребление памяти на 40-50% без потери точности.

Аппаратная поддержка

Формат bfloat16 поддерживается следующими типами оборудования:

  • Тензорные процессоры Google (TPU): все поколения, начиная с Cloud TPU v2.
  • Процессоры Intel: архитектуры Cooper Lake (Xeon 3-го поколения), Ice Lake, Sapphire Rapids и более новые.
  • Процессоры AMD: архитектура Zen 4 (Ryzen 7000, EPYC 9004) и более новые.
  • Процессоры ARM: архитектура ARMv8.6-A и более новые (например, Neoverse V1).
  • Графические процессоры NVIDIA: начиная с архитектуры Ampere (A100, RTX 30xx) — поддержка через расширение CUDA.
  • Графические процессоры AMD: начиная с архитектуры RDNA 3 (RX 7000).
  • Графические процессоры Intel: начиная с архитектуры Xe HPC (Ponte Vecchio).

Другие области

Помимо машинного обучения, bfloat16 находит применение в:

  • Научных вычислениях: для задач, где требуется широкий диапазон, но точность не критична (например, симуляции погоды, моделирование климата).
  • Обработке сигналов: в системах, где важна скорость обработки и энергоэффективность.
  • Финансовых расчётах: для быстрых приближённых вычислений (например, оценка рисков).

Преимущества и недостатки

Преимущества

  • Широкий диапазон: позволяет избежать переполнений при обучении больших моделей.
  • Простота преобразования: быстрая конвертация в float32 и обратно.
  • Энергоэффективность: 16-битные операции потребляют меньше энергии, чем 32-битные.
  • Совместимость: легко интегрируется в существующие алгоритмы машинного обучения.

Недостатки

  • Низкая точность: всего 3-4 десятичных знака, что может быть недостаточно для некоторых задач (например, для численного решения дифференциальных уравнений).
  • Ограниченная поддержка: не все процессоры и библиотеки поддерживают bfloat16 (хотя поддержка быстро растёт).
  • Отсутствие денормализованных чисел: в отличие от float32, bfloat16 не поддерживает денормализованные числа (субнормальные), что может приводить к потере точности при работе с очень малыми значениями.

Интересные факты

  • Название «bfloat16» происходит от проекта Google Brain, где «brain» (мозг) было ключевым словом. Формат был разработан как «мозг» для нейронных сетей.
  • bfloat16 часто называют «урезанным float32» (truncated float32), так как он буквально является float32 с отброшенными младшими 16 битами мантиссы.
  • В 2020 году компания Intel предложила расширение AVX-512 BF16, которое добавляет аппаратную поддержку операций с bfloat16 в процессоры x86.
  • Формат bfloat16 используется в проектах с открытым исходным кодом, таких как TensorFlow, PyTorch и JAX.

Источники

  • Google Cloud Blog. «Introducing bfloat16: A 16-bit floating point format for machine learning» (2018).
  • IEEE Standard 754-2019. «IEEE Standard for Floating-Point Arithmetic».
  • Intel Corporation. «Intel Architecture Instruction Set Extensions and Future Features» (2020).
  • NVIDIA Developer Documentation. «Mixed Precision Training with bfloat16» (2020).
  • AMD Developer Central. «AMD Zen 4 Architecture: bfloat16 Support» (2022).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →