формат чисел с плавающей запятой bfloat16
с плавающей запятой Форматы |
---|
ИЭЭЭ 754 |
|
Другой |
Альтернативы |
bfloat16 мозг с ( плавающей запятой ) [1] [2] с плавающей запятой формат — это формат компьютерных чисел, занимающий 16 бит в памяти компьютера ; он представляет широкий динамический диапазон числовых значений с использованием плавающей точки счисления. Этот формат представляет собой укороченную (16-битную) версию 32-битного формата чисел с плавающей запятой одинарной точности IEEE 754 (binary32) с целью ускорения машинного обучения и околосенсорных вычислений . [3] Он сохраняет приблизительный динамический диапазон 32-битных чисел с плавающей запятой, сохраняя 8 битов экспоненты , но поддерживает только 8-битную точность, а не 24-битную мантсу форматаbinary32. В большей степени, чем 32-битные числа с плавающей запятой одинарной точности, числа bfloat16 непригодны для целочисленных вычислений, но это не их предполагаемое использование. Bfloat16 используется для снижения требований к памяти и увеличения скорости вычислений алгоритмов машинного обучения. [4]
Формат bfloat16 был разработан Google Brain , исследовательской группой в области искусственного интеллекта Google. Он используется во многих процессорах, графических процессорах и процессорах искусственного интеллекта , таких как процессоры Intel Xeon ( расширения AVX-512 BF16), графические процессоры Intel Data Center, Intel Nervana NNP-L1000, FPGA Intel и [5] [6] [7] AMD Zen , AMD Instinct Google Cloud , графические процессоры NVIDIA, TPU , [8] [9] [10] AWS Inferentia, AWS Trainium, ARMv8.6-A , [11] и Apple M2 [12] и поэтому А15 чипы и новее. Многие библиотеки поддерживают bfloat16, например CUDA , [13] Библиотека математических ядер Intel oneAPI , AMD ROCm , [14] Оптимизация библиотек ЦП AMD, PyTorch и TensorFlow . [10] [15] На этих платформах bfloat16 также может использоваться в арифметике смешанной точности , где числа bfloat16 могут обрабатываться и расширяться до более широких типов данных.
формат чисел с плавающей запятой bfloat16
[ редактировать ]bfloat16 имеет следующий формат:
- Знаковый бит : 1 бит
- Ширина экспоненты : 8 бит
- мантиссы Точность : 8 бит (7 явно сохраненных с неявным ведущим битом ), в отличие от 24 битов в классическом формате с плавающей запятой одинарной точности.
Формат bfloat16, представляющий собой сокращенное 32-битное число с плавающей запятой одинарной точности IEEE 754 , обеспечивает быстрое преобразование в 32-битное число с плавающей запятой одинарной точности IEEE 754 и обратно; при преобразовании в формат bfloat16 биты экспоненты сохраняются, в то время как поле мантиссы может быть уменьшено путем усечения (что соответствует округлению в сторону 0 ) или других механизмов округления , игнорируя особый случай NaN . Сохранение битов экспоненты поддерживает диапазон 32-битного числа с плавающей запятой ≈ 10. −38 до ≈ 3 × 10 38 . [16]
Биты расположены следующим образом:
IEEE половинной точности, 16-битное число с плавающей запятой | ||||||||||||||||||||||||||||||||
знак | экспонента (5 бит) | дробь (10 бит) | ||||||||||||||||||||||||||||||
┃ | ┌────────┐ | ┌───────────────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||
15 | 14 | 10 | 9 | 0 | ||||||||||||||||||||||||||||
bfloat16 | ||||||||||||||||||||||||||||||||
знак | экспонента (8 бит) | дробь (7 бит) | ||||||||||||||||||||||||||||||
┃ | ┌────────────────┐ | ┌───────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||
15 | 14 | 7 | 6 | 0 | ||||||||||||||||||||||||||||
TensorFloat от NVidia (19 бит) | ||||||||||||||||||||||||||||||||
знак | экспонента (8 бит) | дробь (10 бит) | ||||||||||||||||||||||||||||||
┃ | ┌───────────────┐ | ┌────────────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||
18 | 17 | 10 | 9 | 0 | ||||||||||||||||||||||||||||
Формат AMD fp24 | ||||||||||||||||||||||||||||||||
знак | экспонента (7 бит) | дробь (16 бит) | ||||||||||||||||||||||||||||||
┃ | ┌─────────────┐ | ┌─────────────────────────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||
23 | 22 | 16 | 15 | 0 | ||||||||||||||||||||||||||||
Формат Pixar PXR24 | ||||||||||||||||||||||||||||||||
знак | экспонента (8 бит) | дробь (15 бит) | ||||||||||||||||||||||||||||||
┃ | ┌────────────────┐ | ┌──────────────────────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||
23 | 22 | 15 | 14 | 0 | ||||||||||||||||||||||||||||
одинарной точности IEEE 754, 32-битное число с плавающей запятой | ||||||||||||||||||||||||||||||||
знак | экспонента (8 бит) | дробь (23 бита) | ||||||||||||||||||||||||||||||
┃ | ┌────────────────┐ | ┌────────────────────────────────────────────────┐ | ||||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
31 | 30 | 23 | 22 | 0 |
Экспоненциальное кодирование
[ редактировать ]Двоичная экспонента с плавающей запятой bfloat16 кодируется с использованием двоичного представления смещения , при этом нулевое смещение равно 127; также известное как смещение экспоненты в стандарте IEEE 754.
- E min = 01 H −7F H = −126
- Emax H = FE 127 −7F H =
- Смещение показателя = 7F H = 127
Таким образом, чтобы получить истинный показатель степени, определенный в двоичном представлении смещения, смещение 127 необходимо вычесть из значения поля показателя степени.
Минимальное и максимальное значения поля показателя степени (00 H и FF H ) интерпретируются особым образом, как и в стандартных форматах IEEE 754.
Экспонента | Значимый ноль | Значимое и ненулевое | Уравнение |
---|---|---|---|
0000Ч | ноль , −0 | субнормальные числа | (−1) знаковый бит ×2 −126 × 0.значащие биты |
01 Ч , ..., ФЭ Ч | нормализованное значение | (−1) знаковый бит ×2 биты экспоненты - 127 × 1.значимые биты | |
ФФ Ч | ± infinity | NaN (тихо, сигнализация) |
Минимальное положительное нормальное значение равно 2. −126 ≈ 1.18 × 10 −38 а минимальное положительное (субнормальное) значение равно 2 −126−7 = 2 −133 ≈ 9.2 × 10 −41 .
Округление и преобразование
[ редактировать ]Наиболее распространенным вариантом использования является преобразование между IEEE 754binary32 и bfloat16. В следующем разделе описывается процесс преобразования и схема его округления при преобразовании. Обратите внимание, что существуют и другие возможные сценарии преобразования формата в bfloat16 или из него. Например, int16 и bfloat16.
- С бинарного32 на bfloat16. Когда bfloat16 был впервые представлен как формат хранения, [15] преобразование из IEEE 754binary32 (32-битная плавающая запятая) в bfloat16 представляет собой усечение ( округление в сторону 0 ). Позже, когда оно становится входом блоков матричного умножения, преобразование может иметь различные механизмы округления в зависимости от аппаратных платформ. Например, для Google TPU схема округления при преобразовании — округление до ближайшего четного; [17] ARM использует режим округления до нечетного, отличный от IEEE; [18] для NVIDIA он поддерживает преобразование чисел с плавающей запятой в точность bfloat16 в режиме округления до ближайшего четного. [19]
- С bfloat16 на бинарный32. Поскольку бинарный32 может представлять все точные значения в bfloat16, преобразование просто дополняет 16 нулей в битах мантиссы. [17]
Кодирование специальных значений
[ редактировать ]Положительная и отрицательная бесконечность
[ редактировать ]Как и в IEEE 754 , положительная и отрицательная бесконечность представлены соответствующими битами знака , всеми 8 установленными битами экспоненты (FF hex ) и всеми битами мантиссы, равными нулю. Явно,
val s_exponent_signcnd
+inf = 0_11111111_0000000
-inf = 1_11111111_0000000
Не число
[ редактировать ]Как и в IEEE 754 , значения NaN представлены либо знаковым битом, либо всеми 8 установленными битами экспоненты (FF hex ), а не всеми значащими битами, равными нулю. Явно,
val s_exponent_signcnd
+NaN = 0_11111111_klmnopq
-NaN = 1_11111111_klmnopq
где хотя бы один из k, l, m, n, o, p или q равен 1. Как и в IEEE 754, значения NaN могут быть тихими или сигнальными, хотя по состоянию на сентябрь 2018 г. неизвестных способов использования сигнализации bfloat16 NaN.
Дальность и точность
[ редактировать ]Bfloat16 предназначен для поддержки диапазона чисел от 32-битного формата с плавающей запятой одинарной точности IEEE 754 (binary32), при этом уменьшая точность с 24 бит до 8 бит. Это означает, что точность составляет от двух до трех десятичных цифр, а bfloat16 может представлять конечные значения примерно до 3,4 × 10. 38 .
Примеры
[ редактировать ]Эти примеры даны в битовом представлении , в шестнадцатеричном и двоичном формате , значения с плавающей запятой. Сюда входят знак, (смещенный) показатель и мантисса.
3f80 = 0 01111111 0000000 = 1 c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (28 − 1) × 2−7 × 2127 ≈ 3.38953139 × 1038 (max finite positive value in bfloat16 precision) 0080 = 0 00000001 0000000 = 2−126 ≈ 1.175494351 × 10−38 (min normalized positive value in bfloat16 precision and single-precision floating point)
Максимальное положительное конечное значение нормального числа bfloat16 составляет 3,38953139 × 10. 38 , чуть ниже (2 24 − 1) × 2 −23 × 2 127 = 3.402823466 × 10 38 , максимальное конечное положительное значение, представимое с одинарной точностью.
Нули и бесконечности
[ редактировать ]0000 = 0 00000000 0000000 = 0 8000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = infinity ff80 = 1 11111111 0000000 = −infinity
Особые значения
[ редактировать ]4049 = 0 10000000 1001001 = 3.140625 ≈ π ( pi ) 3eab = 0 01111101 0101011 = 0.333984375 ≈ 1/3
NaN
[ редактировать ]ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
См. также
[ редактировать ]- Формат с плавающей запятой половинной точности : 16-битное число с плавающей точкой, 1-битный знак, 5-битная экспонента и 11-битная мантисса, как определено IEEE 754.
- ISO/IEC 10967 , Независимая от языка арифметика
- Примитивный тип данных
- Минипоплавок
- Google Мозг
- Иск против Google за использование bfloat16 в ТПУ
Ссылки
[ редактировать ]- ^ Тейх, Пол (10 мая 2018 г.). «Разрывая AI-сопроцессор TPU 3.0 от Google» . Следующая платформа . Проверено 11 августа 2020 г.
Google изобрел свой собственный внутренний формат с плавающей запятой, названный «bfloat», что означает «мозг с плавающей запятой» (в честь Google Brain).
- ^ Ван, Шибо; Канвар, Панкадж (23 августа 2019 г.). «BFloat16: секрет высокой производительности облачных TPU» . Гугл облако . Проверено 11 августа 2020 г.
Этот пользовательский формат с плавающей запятой называется «Формат с плавающей запятой Brain» или для краткости «bfloat16». Название происходит от «Google Brain», исследовательской группы искусственного интеллекта в Google, где была задумана идея этого формата.
- ^ Тальявини, Джузеппе; Мах, Стефан; Росси, Давиде; Маронгиу, Андреа; Бенин, Лука (2018). «Трансточная платформа с плавающей запятой для вычислений со сверхнизким энергопотреблением». Конференция и выставка «Дизайн, автоматизация и испытания в Европе» 2018 (ДАТА) . стр. 1051–1056. arXiv : 1711.10374 . дои : 10.23919/ДАТА.2018.8342167 . ISBN 978-3-9819263-0-9 . S2CID 5067903 .
- ^ Доктор Ян Катресс (17 марта 2020 г.). «Разведка: Планы Купер-Лейк: Почему важен BF16?» . Проверено 12 мая 2020 г.
Стандарт bfloat16 — это целевой способ представления чисел, который дает диапазон полного 32-битного числа, но с размером данных 16-битного числа, сохраняя точность, близкую к нулю, но немного более свободный с точностью, близкой к пределы стандарта. Стандарт bfloat16 широко используется в алгоритмах машинного обучения, предлагая более высокую точность значений внутри алгоритма, одновременно обеспечивая удвоение объема данных в любом заданном наборе данных (или удвоение скорости в этих разделах вычислений).
- ^ Хари Джонсон (23 мая 2018 г.). «Intel представляет Nervana Neural Net L-1000 для ускоренного обучения ИИ» . ВенчурБит . Проверено 23 мая 2018 г.
...Intel будет расширять поддержку bfloat16 для всех наших линеек продуктов искусственного интеллекта, включая процессоры Intel Xeon и FPGA Intel.
- ^ Майкл Фельдман (23 мая 2018 г.). «Intel представляет новую дорожную карту для портфеля ИИ» . ТОП500 суперкомпьютерных сайтов . Проверено 23 мая 2018 г.
Intel планирует поддерживать этот формат во всех своих продуктах искусственного интеллекта, включая линейки Xeon и FPGA.
- ^ Люсиан Армасу (23 мая 2018 г.). «Intel выпустит Spring Crest, свой первый процессор нейронной сети, в 2019 году» . Аппаратное обеспечение Тома . Проверено 23 мая 2018 г.
Intel заявила, что NNP-L1000 также будет поддерживать bfloat16, числовой формат, который принимается всеми игроками отрасли машинного обучения для нейронных сетей. Компания также будет поддерживать bfloat16 в своих FPGA, Xeon и других продуктах машинного обучения. Выпуск Nervana NNP-L1000 запланирован на 2019 год.
- ^ «Доступные операции TensorFlow | Cloud TPU | Google Cloud» . Гугл облако . Проверено 23 мая 2018 г.
На этой странице перечислены API-интерфейсы TensorFlow Python и операторы графов, доступные в Cloud TPU.
- ^ Эльмар Хаусманн (26 апреля 2018 г.). «Сравнение TPUv2 от Google с V100 от Nvidia на ResNet-50» . Блог RiseML . Архивировано из оригинала 26 апреля 2018 г. Проверено 23 мая 2018 г.
Для Cloud TPU Google рекомендовал использовать реализацию bfloat16 из официального репозитория TPU с TensorFlow 1.7.0. Реализации как TPU, так и GPU используют вычисления смешанной точности в соответствующей архитектуре и хранят большинство тензоров с половинной точностью.
- ^ Перейти обратно: а б Авторы Tensorflow (23 июля 2018 г.). «ResNet-50 с использованием BFloat16 на ТПУ» . Google . Проверено 6 ноября 2018 г.
- ^ «Расширения BFloat16 для Armv8-A» . сообщество.arm.com . 29 августа 2019 года . Проверено 30 августа 2019 г.
- ^ «AArch64: добавить поддержку новых процессоров Apple · llvm/llvm-project@677da09» . Гитхаб . Проверено 8 мая 2023 г.
- ^ «Библиотека CUDA bloat16 Intrinsics» .
- ^ «История версий ROCm» . github.com . Проверено 23 октября 2019 г.
- ^ Перейти обратно: а б Джошуа В. Диллон, Ян Лэнгмор, Дастин Тран, Юджин Бревдо, Шринивас Васудеван, Дэйв Мур, Брайан Паттон, Алекс Алеми, Мэтт Хоффман, Риф А. Саурус (28 ноября 2017 г.). Распределения TensorFlow (отчет). arXiv : 1711.10604 . Бибкод : 2017arXiv171110604D . По состоянию на 23 мая 2018 г.
Все операции в распределениях TensorFlow численно стабильны при половинной, одинарной и двойной точности с плавающей запятой (как типы TensorFlow: tf.bfloat16 (усеченная плавающая запятая), tf.float16, tf.float32, tf.float64). Конструкторы классов имеют флаг validate_args для числовых утверждений.
{{cite report}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ «Прямая трансляция, день 1: этап 8 (Google I/O '18) — YouTube» . Google . 08 мая 2018 г. Проверено 23 мая 2018 г.
Во многих моделях это замена поплавку-32.
- ^ Перейти обратно: а б «Числовой формат bfloat16» . Гугл облако . Проверено 11 июля 2023 г.
В TPU схема округления при преобразовании округляется до ближайшего четного и переполняется до inf.
- ^ «Архитектура набора команд Arm A64» . Developer.arm.com . Проверено 26 июля 2023 г.
Использует режим округления от округления до нечетности, отличный от IEEE.
- ^ «1.3.5. Точное преобразование и перемещение данных Bfloat16» (PDF) . docs.nvidia.com . п. 199 . Проверено 26 июля 2023 г.
Преобразует число с плавающей точкой в точность nv_bfloat16 в режиме округления до ближайшего четного и возвращает nv_bfloat16 с преобразованным значением.