Bfloat16 формат с плавающей запятой - Википедия - bfloat16 floating-point format

В bfloat16 (Мозг Плавающая точка)[1][2] формат с плавающей точкой это формат номера компьютера занимающий 16 бит в память компьютера; он представляет собой широкий динамический диапазон числовых значений с помощью плавающая точка счисления. Этот формат является усеченной (16-битной) версией 32-битной Формат IEEE 754 с плавающей запятой одинарной точности (binary32) с целью ускорение машинное обучение и близкосенсорные вычисления.[3] Он сохраняет приблизительный динамический диапазон 32-битных чисел с плавающей запятой, сохраняя 8 биты экспоненты, но поддерживает только 8-битную точность, а не 24-битную значимое формата binary32. В большей степени, чем 32-битные числа с плавающей запятой одинарной точности, числа bfloat16 не подходят для целочисленных вычислений, но это не их предполагаемое использование. Bfloat16 используется для уменьшения требований к хранилищу и увеличения скорости вычислений алгоритмов машинного обучения.[4]

Формат bfloat16 используется в Intel Процессоры AI, Такие как Nervana ННП-Л1000, Xeon процессоры (AVX-512 BF16) и Intel ПЛИС,[5][6][7] Google Cloud ТПУ,[8][9][10] и TensorFlow.[10][11] ARMv8.6-A также поддерживает формат bfloat16.[12] По состоянию на октябрь 2019 г. AMD добавила поддержку формата в свой ROCm библиотеки.[13]

bfloat16 формат с плавающей запятой

bfloat16 имеет следующий формат:

Формат bfloat16, будучи усеченным IEEE 754 одинарной точности 32-битное число с плавающей запятой, позволяет быстро преобразование к и от 32-битного числа с плавающей запятой одинарной точности IEEE 754; при преобразовании в формат bfloat16 биты экспоненты сохраняются, в то время как поле значимости может быть уменьшено путем усечения (что соответствует округлить в сторону 0 ), игнорируя NaN особый случай. Сохранение разрядов экспоненты поддерживает диапазон 32-битных чисел с плавающей запятой ≈ 10−38 до ≈ 3 × 1038.[14]

Биты расположены следующим образом:

IEEE половинная точность 16-битное с плавающей запятой
знакэкспонента (5 бит)дробь (10 бит)
  ┃┌────────────┐┌─────────────────────────┐
 0  0  1  1  0  0  0  1  0  0  0  0  0  0  0  0 
15141090
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 
313023220
bfloat16
знакэкспонента (8 бит)дробь (7 бит)
  ┃┌─────────────────────┐┌────────────────┐
 0  0  1  1  1  1  1  0  0  0  1  0  0  0  0  0 
1514760
TensorFloat от NVidia
знакэкспонента (8 бит)дробь (10 бит)
  ┃┌────────────────────┐┌────────────────────────┐
 0  0  1  1  1  1  1  0  0  0  1  0  0  0  0  0  0  0  0 
18171090
Формат 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 
232216150

Контраст с bfloat16 и одинарной точностью

SEEEEEEEEFFFFFFFжжжжжжжжжжжжжжжж

Легенда

  •   S: знак
  •   F: дробь (конечная значимое ) в обоих форматах
  •   f: дробь (конечная значимая) в одинарная точность Только

Экспонентное кодирование

Двоичная экспонента с плавающей запятой bfloat16 кодируется с использованием смещение-двоичный представление с нулевым смещением 127; также известный как смещение экспоненты в стандарте IEEE 754.

Таким образом, чтобы получить истинную экспоненту, как определено двоичным представлением смещения, смещение 127 должно быть вычтено из значения поля экспоненты.

Минимальное и максимальное значения поля экспоненты (00ЧАС и FFЧАС) интерпретируются особым образом, как в стандартных форматах IEEE 754.

ЭкспонентаЗначащий нольЗначащий и ненулевойУравнение
00ЧАСнуль, −0субнормальные числа(−1)знак×2−126× 0. Значащие биты
01ЧАС, ..., ИПЧАСнормализованное значение(−1)знак×2экспонента бит-127× 1. Значащие биты
FFЧАС±бесконечность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

где хотя бы один из к, л, м, н, о, п, или же 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 = (28 − 1) × 2−7 × 2127 ≈ 3.38953139 × 1038 (максимальное конечное положительное значение с точностью bfloat16) 0080 = 0 00000001 0000000 = 2−126 ≈ 1.175494351 × 10−38 (минимальное нормализованное положительное значение в точности bfloat16 и с плавающей запятой одинарной точности)

Максимальное положительное конечное значение нормального числа bfloat16 составляет 3,38953139 × 1038, чуть ниже (224 − 1) × 2−23 × 2127 = 3.402823466 × 1038, максимальное конечное положительное значение, представимое с одинарной точностью.

Нули и бесконечности

0000 = 0 00000000 0000000 = 08000 = 1 00000000 0000000 = −0
7f80 = 0 11111111 0000000 = бесконечностьff80 = 1 11111111 0000000 = −infinity

Особые ценности

4049 = 0 10000000 1001001 = 3,140625 ≈ π (pi) 3eab = 0 01111101 0101011 = 0,333984375 ≈ 1/3

NaNs

ffc1 = x 11111111 1000001 => qNaNff81 = x 11111111 0000001 => sNaN

Смотрите также

Рекомендации

  1. ^ Тейч, Пауль (2018-05-10). "Разрушение сопроцессора Google TPU 3.0 AI". Следующая платформа. Получено 2020-08-11. Google изобрел свой собственный внутренний формат с плавающей запятой, названный «bfloat» от «плавающей запятой мозга» (после Google Brain).
  2. ^ Ван, Шибо; Канвар, Панкадж (23.08.2019). «BFloat16: секрет высокой производительности облачных TPU». Google Cloud. Получено 2020-08-11. Этот настраиваемый формат с плавающей запятой называется «Brain Floating Point Format» или сокращенно bfloat16. Название происходит от Google Brain, исследовательской группы по искусственному интеллекту в Google, где и была задумана идея этого формата.
  3. ^ Тальявини, Джузеппе; Мах, Стефан; Росси, Давиде; Маронджу, Андреа; Бенин, Лука (2018). «Прецизионная платформа с плавающей запятой для вычислений со сверхнизким энергопотреблением». Конференция и выставка «Дизайн, автоматизация и испытания в Европе» (ДАТА) 2018. С. 1051–1056. arXiv:1711.10374. Дои:10.23919 / ДАТА 2018. 8342167. ISBN  978-3-9819263-0-9.
  4. ^ Д-р Ян Катресс (17 марта 2020 г.). «Интел»: планы озера Купер: почему важен BF16? ». Получено 2020-05-12. Стандарт bfloat16 - это целевой способ представления чисел, которые дают диапазон полного 32-битного числа, но с размером данных 16-битного числа, сохраняя точность близкой к нулю, но немного более свободную с точностью около пределы стандарта. Стандарт bfloat16 имеет множество применений в алгоритмах машинного обучения, предлагая лучшую точность значений внутри алгоритма, предоставляя вдвое больше данных в любом заданном наборе данных (или удваивая скорость в этих разделах вычислений).
  5. ^ Хари Джонсон (23.05.2018). «Intel представляет Nervana Neural Net L-1000 для ускоренного обучения ИИ». VentureBeat. Получено 2018-05-23. ... Intel будет расширять поддержку bfloat16 на наши линейки продуктов AI, включая процессоры Intel Xeon и Intel FPGA.
  6. ^ Майкл Фельдман (23.05.2018). «Intel излагает новую дорожную карту для портфеля ИИ». ТОП500 суперкомпьютерных сайтов. Получено 2018-05-23. Intel планирует поддерживать этот формат во всех своих продуктах AI, включая линейки Xeon и FPGA.
  7. ^ Лучиан Армасу (23.05.2018). «Intel выпустит Spring Crest, свой первый процессор нейронной сети, в 2019 году». Оборудование Тома. Получено 2018-05-23. Intel заявила, что NNP-L1000 также будет поддерживать bfloat16, числовой формат, который используется всеми игроками индустрии машинного обучения для нейронных сетей. Компания также будет поддерживать bfloat16 в своих FPGA, Xeon и других продуктах машинного обучения. Выпуск Nervana NNP-L1000 запланирован на 2019 год.
  8. ^ "Доступные операции TensorFlow | Cloud TPU | Google Cloud". Google Cloud. Получено 2018-05-23. На этой странице перечислены API-интерфейсы TensorFlow Python и операторы графиков, доступные в Cloud TPU.
  9. ^ Эльмар Хаусманн (26.04.2018). "Сравнение Google TPUv2 с Nvidia V100 в ResNet-50". Блог RiseML. Архивировано из оригинал на 2018-04-26. Получено 2018-05-23. Для Cloud TPU Google рекомендовал использовать реализацию bfloat16 из официального репозитория TPU с TensorFlow 1.7.0. Реализации как TPU, так и GPU используют вычисления со смешанной точностью в соответствующей архитектуре и хранят большинство тензоров с половинной точностью.
  10. ^ а б Авторы Tensorflow (23.07.2018). «ResNet-50 с использованием BFloat16 на ТПУ». Google. Получено 2018-11-06.
  11. ^ Джошуа В. Диллон, Ян Лэнгмор, Дастин Тран, Юджин Бревдо, Шринивас Васудеван, Дэйв Мур, Брайан Паттон, Алекс Алеми, Мэтт Хоффман, Риф А. Саурус (28 ноября 2017 г.). Распределения TensorFlow (отчет). arXiv:1711.10604. Bibcode:2017arXiv171110604D. Проверено 23 мая 2018 г. Все операции в дистрибутивах TensorFlow численно стабильны для половинной, одинарной и двойной точности с плавающей запятой (как типы TensorFlow: tf.bfloat16 (усеченная с плавающей запятой), tf.float16, tf.float32, tf.float64). Конструкторы классов имеют флаг validate_args для числовых утвержденийCS1 maint: несколько имен: список авторов (связь)
  12. ^ «Расширения BFloat16 для Armv8-A». community.arm.com. Получено 2019-08-30.
  13. ^ "История версий ROCm". github.com. Получено 2019-10-23.
  14. ^ «Прямая трансляция, день 1: этап 8 (Google I / O '18) - YouTube». Google. 2018-05-08. Получено 2018-05-23. Во многих моделях это прямая замена float-32.