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) \]
Сравнение с другими форматами
| Параметр | bfloat16 | float16 (IEEE 754) | float32 (IEEE 754) |
|---|---|---|---|
| Размер (бит) | 16 | 16 | 32 |
| Биты порядка | 8 | 5 | 8 |
| Биты мантиссы | 7 | 10 | 23 |
| Диапазон | ~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 →