Форматы с плавающей запятой |
---|
IEEE 754 |
|
Другой |
Bfloat16 ( мозг с плавающей точкой) [1] [2] формат с плавающей точкой является компьютерным форматом числа занимая 16 бит в памяти компьютера ; он представляет широкий динамический диапазон числовых значений с использованием точки с плавающей запятой . Этот формат представляет собой усеченную (16-битную) версию 32-битного формата с плавающей запятой одинарной точности IEEE 754 (binary32) с целью ускорения машинного обучения и вычислений, близких к датчику . [3] Он сохраняет приблизительный динамический диапазон 32-битных чисел с плавающей запятой, сохраняя 8экспоненты , но поддерживает только 8-битную точность, а не 24-битное значение формата binary32. В большей степени, чем 32-разрядные числа с плавающей запятой одинарной точности, числа bfloat16 не подходят для целочисленных вычислений, но это не их предполагаемое использование. Bfloat16 используется для уменьшения требований к хранилищу и увеличения скорости вычислений алгоритмов машинного обучения. [4]
Формат bfloat16 используется в процессорах Intel AI , таких как Nervana NNP-L1000, процессорах Xeon ( расширения AVX-512 BF16) и ПЛИС Intel , [5] [6] [7] TPU Google Cloud , [8] [9] [10] и TensorFlow . [10] [11] ARMv8.6-A также поддерживает формат bfloat16. [12] С октября 2019 года AMD добавила поддержку этого формата в свои библиотеки ROCm . [13] На этих платформах 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 . [14]
Биты расположены следующим образом:
знак | экспонента (5 бит) | дробь (10 бит) | ||||||||||||||
┃ | ┌───────┐ | ┌───────────────── | ||||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 10 | 9 | 0 |
знак | экспонента (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 |
знак | экспонента (8 бит) | дробь (7 бит) | ||||||||||||||
┃ | ┌───────────── | ┌────────────┐ | ||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
15 | 14 | 7 | 6 | 0 |
знак | экспонента (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 |
знак | экспонента (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 |
знак | экспонента (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 |
Контраст с bfloat16 и одинарной точностью [ править ]
S | E | E | E | E | E | E | E | E | F | F | F | F | F | F | F | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж | ж |
Легенда [ править ]
- S: знак
- E: показатель степени
- F: дробь (конечная значимая ) в обоих форматах
- F: фракция (трейлинг мантисса) в одинарной точности только
Экспонентное кодирование [ править ]
Двоичная экспонента с плавающей запятой bfloat16 кодируется с использованием двоичного представления смещения с нулевым смещением 127; также известный как смещение экспоненты в стандарте IEEE 754.
- E мин = 01 H −7F H = −126
- E макс = FE H −7F H = 127
- Смещение экспоненты = 7F H = 127
Таким образом, чтобы получить истинную экспоненту, как определено двоичным представлением смещения, смещение 127 должно быть вычтено из значения поля экспоненты.
Минимальные и максимальные значения поля экспоненты (00 H и FF H ) интерпретируются особым образом, как в стандартных форматах IEEE 754.
Экспонента | Значащий ноль | Значащий и ненулевой | Уравнение |
---|---|---|---|
00 часов | ноль , −0 | субнормальные числа | (-1) signbit × 2 -126 × 0.significandbits |
01 H , ..., FE H | нормализованное значение | (−1) знаковый бит × 2 порядковых бита -127 × 1 значащих битов | |
FF H | ± бесконечность | NaN (тихо, сигнализирует) |
Минимальное положительное нормальное значение составляет 2 −126 ≈ 1,18 × 10 −38, а минимальное положительное (субнормальное) значение составляет 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .
Кодирование специальных значений [ править ]
Положительная и отрицательная бесконечность [ править ]
Так же, как в IEEE 754 , положительная и отрицательная бесконечность представлены соответствующими знаковыми битами , все 8 битов экспоненты установлены ( шестнадцатеричный FF ) и все биты значимости равны нулю. Явно,
val s_exponent_signcnd+ inf = 0_11111111_0000000-inf = 1_11111111_0000000
Не число [ править ]
Как и в IEEE 754 , значения NaN представлены любым битом знака, установленными всеми 8 битами показателя степени ( шестнадцатеричный FF ), а не всеми битами значащего нуля. Явно,
val s_exponent_signcnd+ NaN = 0_11111111_klmnopq-NaN = 1_11111111_klmonpq
где по крайней мере одно из 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 = 1c000 = 1 10000000 0000000 = −2
7f7f = 0 11111110 1111111 = (2 8 - 1) × 2 −7 × 2 127 ≈ 3,38953139 × 10 38 (максимальное конечное положительное значение с точностью bfloat16)0080 = 0 00000001 0000000 = 2 -126 ≈ 1,175494351 × 10 -38 (мин нормализованы положительное значение в точности и bfloat16 одинарной точности с плавающей точкой)
Максимальное положительное конечное значение нормального числа bfloat16 составляет 3,38953139 × 10 38 , немного ниже (2 24 - 1) × 2 - 23 × 2 127 = 3,402823466 × 10 38 , максимальное конечное положительное значение, представленное с одинарной точностью.
Нули и бесконечности [ править ]
0000 = 0 00000000 0000000 = 08000 = 1 00000000 0000000 = -0
7f80 = 0 11111111 0000000 = бесконечностьff80 = 1 11111111 0000000 = −infinity
Особые значения [ править ]
4049 = 0 10000000 1001001 = 3,140625 ≈ π (пи)3eab = 0 01111101 0101011 = 0,333984375 ≈ 1/3
NaN [ править ]
ffc1 = x 11111111 1000001 => qNaNff81 = x 11111111 0000001 => sNaN
См. Также [ править ]
- Формат с плавающей запятой половинной точности : 16-битное число с плавающей запятой с 1-битным знаком, 5-битной экспонентой и 11-битным значащим значением, как определено в IEEE 754
- ISO / IEC 10967 , Арифметика, не зависящая от языка
- Примитивный тип данных
- Minifloat
Ссылки [ править ]
- ^ Teich, Павел (2018-05-10). "Разрывая на части сопроцессор Google TPU 3.0 AI" . Следующая платформа . Проверено 11 августа 2020 .
Google изобрел собственный внутренний формат с плавающей запятой, названный «bfloat» от «плавающей запятой мозга» (от Google Brain).
- ^ Ван, Шибо; Канвар, Панкадж (23.08.2019). «BFloat16: секрет высокой производительности облачных TPU» . Google Cloud . Проверено 11 августа 2020 .
Этот настраиваемый формат с плавающей запятой называется «Brain Floating Point Format» или сокращенно bfloat16.
Название происходит от Google Brain, исследовательской группы по искусственному интеллекту в Google, где и была задумана идея этого формата.
- ^ Тальявини, Джузеппе; Мах, Стефан; Росси, Давиде; Маронджу, Андреа; Бенин, Лука (2018). «Платформа с плавающей точкой с высокой точностью для вычислений со сверхнизким энергопотреблением». Конференция и выставка «Дизайн, автоматизация и испытания в Европе» (ДАТА) 2018 . С. 1051–1056. arXiv : 1711.10374 . DOI : 10.23919 / DATE.2018.8342167 . ISBN 978-3-9819263-0-9. S2CID 5067903 .
- ^ Д-р Ян Катресс (2020-03-17). «Интел»: планы озера Купер: почему важен BF16? » . Проверено 12 мая 2020 .
Стандарт bfloat16 - это целевой способ представления чисел, которые дают диапазон полного 32-битного числа, но в размере данных 16-битного числа, сохраняя точность близкой к нулю, но немного более свободную с точностью, близкой к пределы стандарта. Стандарт bfloat16 имеет множество применений в алгоритмах машинного обучения, предлагая лучшую точность значений внутри алгоритма, предоставляя вдвое больше данных в любом заданном наборе данных (или удваивая скорость в этих разделах вычислений).
- ^ Хари Джонсон (2018-05-23). «Intel представляет Nervana Neural Net L-1000 для ускоренного обучения ИИ» . VentureBeat . Проверено 23 мая 2018 .
... Intel будет расширять поддержку bfloat16 на все наши линейки продуктов AI, включая процессоры Intel Xeon и Intel FPGA.
- ^ Майкл Фельдман (2018-05-23). «Intel излагает новую дорожную карту для портфеля ИИ» . ТОП500 суперкомпьютерных сайтов . Проверено 23 мая 2018 .
Intel планирует поддерживать этот формат во всех своих продуктах AI, включая линейки Xeon и FPGA.
- ^ Lucian Армаш (2018-05-23). «Intel запустит Spring Crest, свой первый процессор нейронной сети, в 2019 году» . Оборудование Тома . Проверено 23 мая 2018 .
Intel заявила, что NNP-L1000 также будет поддерживать bfloat16, числовой формат, который используется всеми игроками индустрии машинного обучения для нейронных сетей.
Компания также будет поддерживать bfloat16 в своих FPGA, Xeon и других продуктах машинного обучения.
Выпуск Nervana NNP-L1000 запланирован на 2019 год.
- ^ "Доступные операции TensorFlow | Cloud TPU | Google Cloud" . Google Cloud . Проверено 23 мая 2018 .
На этой странице перечислены API-интерфейсы TensorFlow Python и операторы графиков, доступные в Cloud TPU.
- ^ Эльмар Хаусманн (2018-04-26). «Сравнение Google TPUv2 с Nvidia V100 в ResNet-50» . Блог RiseML . Архивировано из оригинала на 2018-04-26 . Проверено 23 мая 2018 .
Для Cloud TPU Google рекомендовал использовать реализацию bfloat16 из официального репозитория TPU с TensorFlow 1.7.0.
Реализации как TPU, так и GPU используют вычисления со смешанной точностью в соответствующей архитектуре и хранят большинство тензоров с половинной точностью.
- ^ a b Авторы Tensorflow (23.07.2018). «ResNet-50 с использованием BFloat16 на ТПУ» . Google . Проверено 6 ноября 2018 .
- ↑ Джошуа В. Диллон, Ян Лэнгмор, Дастин Тран, Юджин Бревдо, Шринивас Васудеван, Дэйв Мур, Брайан Паттон, Алекс Алеми, Мэтт Хоффман, Риф А. Саурус (2017-11-28). Распределения TensorFlow (отчет). arXiv : 1711.10604 . Bibcode : 2017arXiv171110604D . Проверено 23 мая 2018 г.
Все операции в дистрибутивах TensorFlow численно стабильны для половинной, одинарной и двойной точности с плавающей запятой (как типы TensorFlow: tf.bfloat16 (усеченная с плавающей запятой), tf.float16, tf.float32, tf.float64).
Конструкторы классов имеют флаг validate_args для числовых утверждений
CS1 maint: несколько имен: список авторов ( ссылка ) - ^ "Расширения BFloat16 для Armv8-A" . community.arm.com . Проверено 30 августа 2019 .
- ^ "История версий ROCm" . github.com . Проверено 23 октября 2019 .
- ^ «Livestream Day 1: Stage 8 (Google I / O '18) - YouTube» . Google . 2018-05-08 . Проверено 23 мая 2018 .
Во многих моделях это прямая замена для поплавка-32.