Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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]

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

Контраст с bfloat16 и одинарной точностью [ править ]

Легенда [ править ]

  •   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.

Минимальное положительное нормальное значение составляет 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

Ссылки [ править ]

  1. ^ Teich, Павел (2018-05-10). "Разрывая на части сопроцессор Google TPU 3.0 AI" . Следующая платформа . Проверено 11 августа 2020 . Google изобрел собственный внутренний формат с плавающей запятой, названный «bfloat» от «плавающей запятой мозга» (от Google Brain).
  2. ^ Ван, Шибо; Канвар, Панкадж (23.08.2019). «BFloat16: секрет высокой производительности облачных TPU» . Google Cloud . Проверено 11 августа 2020 . Этот настраиваемый формат с плавающей запятой называется «Brain Floating Point Format» или сокращенно bfloat16. Название происходит от Google Brain, исследовательской группы по искусственному интеллекту в Google, где и была задумана идея этого формата.
  3. ^ Тальявини, Джузеппе; Мах, Стефан; Росси, Давиде; Маронджу, Андреа; Бенин, Лука (2018). «Платформа с плавающей точкой с высокой точностью для вычислений со сверхнизким энергопотреблением». Конференция и выставка «Дизайн, автоматизация и испытания в Европе» (ДАТА) 2018 . С. 1051–1056. arXiv : 1711.10374 . DOI : 10.23919 / DATE.2018.8342167 . ISBN 978-3-9819263-0-9. S2CID  5067903 .
  4. ^ Д-р Ян Катресс (2020-03-17). «Интел»: планы озера Купер: почему важен BF16? » . Проверено 12 мая 2020 . Стандарт bfloat16 - это целевой способ представления чисел, которые дают диапазон полного 32-битного числа, но в размере данных 16-битного числа, сохраняя точность близкой к нулю, но немного более свободную с точностью, близкой к пределы стандарта. Стандарт bfloat16 имеет множество применений в алгоритмах машинного обучения, предлагая лучшую точность значений внутри алгоритма, предоставляя вдвое больше данных в любом заданном наборе данных (или удваивая скорость в этих разделах вычислений).
  5. ^ Хари Джонсон (2018-05-23). «Intel представляет Nervana Neural Net L-1000 для ускоренного обучения ИИ» . VentureBeat . Проверено 23 мая 2018 . ... Intel будет расширять поддержку bfloat16 на все наши линейки продуктов AI, включая процессоры Intel Xeon и Intel FPGA.
  6. ^ Майкл Фельдман (2018-05-23). «Intel излагает новую дорожную карту для портфеля ИИ» . ТОП500 суперкомпьютерных сайтов . Проверено 23 мая 2018 . Intel планирует поддерживать этот формат во всех своих продуктах AI, включая линейки Xeon и FPGA.
  7. ^ Lucian Армаш (2018-05-23). «Intel запустит Spring Crest, свой первый процессор нейронной сети, в 2019 году» . Оборудование Тома . Проверено 23 мая 2018 . Intel заявила, что NNP-L1000 также будет поддерживать bfloat16, числовой формат, который используется всеми игроками индустрии машинного обучения для нейронных сетей. Компания также будет поддерживать bfloat16 в своих FPGA, Xeon и других продуктах машинного обучения. Выпуск Nervana NNP-L1000 запланирован на 2019 год.
  8. ^ "Доступные операции TensorFlow | Cloud TPU | Google Cloud" . Google Cloud . Проверено 23 мая 2018 . На этой странице перечислены API-интерфейсы TensorFlow Python и операторы графиков, доступные в Cloud TPU.
  9. ^ Эльмар Хаусманн (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 используют вычисления со смешанной точностью в соответствующей архитектуре и хранят большинство тензоров с половинной точностью.
  10. ^ a b Авторы Tensorflow (23.07.2018). «ResNet-50 с использованием BFloat16 на ТПУ» . Google . Проверено 6 ноября 2018 .
  11. Джошуа В. Диллон, Ян Лэнгмор, Дастин Тран, Юджин Бревдо, Шринивас Васудеван, Дэйв Мур, Брайан Паттон, Алекс Алеми, Мэтт Хоффман, Риф А. Саурус (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: несколько имен: список авторов ( ссылка )
  12. ^ "Расширения BFloat16 для Armv8-A" . community.arm.com . Проверено 30 августа 2019 .
  13. ^ "История версий ROCm" . github.com . Проверено 23 октября 2019 .
  14. ^ «Livestream Day 1: Stage 8 (Google I / O '18) - YouTube» . Google . 2018-05-08 . Проверено 23 мая 2018 . Во многих моделях это прямая замена для поплавка-32.