stringtranslate.com

формат с плавающей точкой bfloat16

Формат с плавающей точкой bfloat16 ( brain floating point ) [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 GPU, Intel Nervana NNP-L1000, Intel FPGA , [5] [6] [7] AMD Zen , AMD Instinct , ГП NVIDIA, Google Cloud TPU , [8] [9] [10] AWS Inferentia, AWS Trainium, ARMv8.6-A , [11] и M2 от Apple [12] , а следовательно, и чипы A15 и более поздние. Многие библиотеки поддерживают bfloat16, такие как CUDA , [13] Intel oneAPI Math Kernel Library , AMD ROCm , [14] AMD Optimizing CPU Libraries, PyTorch и TensorFlow . [10] [15] На этих платформах bfloat16 также может использоваться в арифметике смешанной точности , где числа bfloat16 могут обрабатываться и расширяться до более широких типов данных.

формат с плавающей точкой bfloat16

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

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

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

Кодирование экспоненты

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

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

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

Минимальное положительное нормальное значение составляет 2 −126 ≈ 1,18 × 10 −38 , а минимальное положительное (субнормальное) значение составляет 2 −126−7 = 2 −133 ≈ 9,2 × 10 −41 .

Округление и преобразование

Наиболее распространенным вариантом использования является преобразование между IEEE 754 binary32 и bfloat16. В следующем разделе описывается процесс преобразования и схема округления при преобразовании. Обратите внимание, что существуют и другие возможные сценарии преобразования форматов в или из bfloat16. Например, int16 и bfloat16.

Кодирование специальных значений

Положительная и отрицательная бесконечность

Так же, как в IEEE 754 , положительная и отрицательная бесконечность представлены соответствующими им битами знака , все 8 битов экспоненты установлены (FF hex ), а все биты мантиссы равны нулю. Явно,

val s_exponent_signcnd+инф = 0_11111111_0000000-инф = 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с000 = 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 = −бесконечность

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

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

NaN-ы

ffc1 = x 11111111 1000001 => qNaN
ff81 = x 11111111 0000001 => sNaN

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

Ссылки

  1. ^ Teich, Paul (2018-05-10). «Tearing Apart Google’s TPU 3.0 AI Coprocessor». Следующая платформа . Получено 2020-08-11 . Google изобрела собственный внутренний формат с плавающей точкой под названием «bfloat» для «brain floating point» (в честь Google Brain).
  2. ^ Ван, Шибо; Канвар, Панкадж (2019-08-23). ​​"BFloat16: секрет высокой производительности облачных TPU". Google Cloud . Получено 2020-08-11 . Этот пользовательский формат с плавающей точкой называется "Brain Floating Point Format" или сокращенно "bfloat16". Название происходит от "Google Brain", что означает исследовательская группа по искусственному интеллекту в Google, где и возникла идея этого формата.
  3. ^ Tagliavini, Giuseppe; Mach, Stefan; Rossi, Davide; Marongiu, Andrea; Benin, Luca (2018). «Трансточная платформа с плавающей точкой для сверхнизкоэнергетических вычислений». Конференция и выставка «Проектирование, автоматизация и тестирование в Европе» 2018 г. (DATE) . стр. 1051–1056. arXiv : 1711.10374 . doi : 10.23919/DATE.2018.8342167. ISBN 978-3-9819263-0-9. S2CID  5067903.
  4. ^ Д-р Ян Катресс (2020-03-17). "Intel': Cooper lake Plans: Why is BF16 Important?" . Получено 2020-05-12 . Стандарт bfloat16 — это целевой способ представления чисел, которые дают диапазон полного 32-битного числа, но в размере данных 16-битного числа, сохраняя точность, близкую к нулю, но будучи немного более свободным с точностью, близкой к пределам стандарта. Стандарт bfloat16 имеет много применений внутри алгоритмов машинного обучения, предлагая лучшую точность значений внутри алгоритма, одновременно предоставляя удвоение данных в любом заданном наборе данных (или удвоение скорости в этих разделах вычислений).
  5. ^ Хари Джонсон (23.05.2018). "Intel представляет Nervana Neural Net L-1000 для ускоренного обучения ИИ". VentureBeat . Получено 23.05.2018 . ...Intel расширит поддержку bfloat16 на все наши линейки продуктов ИИ, включая процессоры Intel Xeon и ПЛИС Intel.
  6. ^ Майкл Фельдман (2018-05-23). ​​"Intel Lays Out New Roadmap for AI Portfolio". Сайты TOP500 Supercomputer . Получено 2018-05-23 . Intel планирует поддерживать этот формат во всех своих продуктах AI, включая линейки Xeon и FPGA.
  7. ^ Lucian Armasu (2018-05-23). ​​"Intel выпустит Spring Crest, свой первый процессор для нейронных сетей, в 2019 году". Tom's Hardware . Получено 2018-05-23 . Intel заявила, что NNP-L1000 также будет поддерживать bfloat16, числовой формат, который принимается всеми игроками отрасли МО для нейронных сетей. Компания также будет поддерживать bfloat16 в своих ПЛИС, Xeons и других продуктах МО. Nervana NNP-L1000 запланирован к выпуску в 2019 году.
  8. ^ "Доступные TensorFlow Ops | Cloud TPU | Google Cloud". Google Cloud . Получено 2018-05-23 . На этой странице перечислены API-интерфейсы TensorFlow Python и графовые операторы, доступные в Cloud TPU.
  9. ^ Эльмар Хаусманн (2018-04-26). "Сравнение 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. ^ ab Tensorflow Authors (2018-07-23). ​​"ResNet-50 с использованием BFloat16 на TPU". Google . Получено 2018-11-06 .
  11. ^ "Расширения BFloat16 для Armv8-A". community.arm.com . 29 августа 2019 . Получено 2019-08-30 .
  12. ^ "AArch64: добавить поддержку новых процессоров Apple · llvm/llvm-project@677da09". GitHub . Получено 2023-05-08 .
  13. ^ "Библиотека CUDA bloat16 Внутренние функции".
  14. ^ "История версий ROCm". github.com . Получено 2019-10-23 .
  15. ^ ab Joshua V. Dillon, Ian Langmore, Dustin Tran, Eugene Brevdo, Srinivas Vasudevan, Dave Moore, Brian Patton, Alex Alemi, Matt Hoffman, Rif A. Saurous (28.11.2017). TensorFlow Distributions (отчет). arXiv : 1711.10604 . Bibcode :2017arXiv171110604D. Дата обращения 23.05.2018. Все операции в TensorFlow Distributions численно стабильны при половинной, одинарной и двойной точности с плавающей точкой (как типы данных TensorFlow: tf.bfloat16 (усеченная плавающая точка), tf.float16, tf.float32, tf.float64). Конструкторы классов имеют флаг validate_args для числовых утверждений.{{cite report}}: CS1 maint: несколько имен: список авторов ( ссылка )
  16. ^ "Прямая трансляция, день 1: этап 8 (Google I/O '18) - YouTube". Google . 2018-05-08 . Получено 2018-05-23 . Во многих моделях это замена float-32
  17. ^ ab "Числовой формат bfloat16". Google Cloud . Получено 2023-07-11 . В TPU схема округления при преобразовании округляется до ближайшего четного и переполняется до inf.
  18. ^ "Arm A64 Instruction Set Architecture". developer.arm.com . Получено 2023-07-26 . Использует режим округления не-IEEE Round-to-Odd.
  19. ^ "1.3.5. Преобразование точности Bfloat16 и перемещение данных" (PDF) . docs.nvidia.com . стр. 199 . Получено 2023-07-26 . Преобразует число с плавающей точкой в ​​точность nv_bfloat16 в режиме округления до ближайшего четного и возвращает nv_bfloat16 с преобразованным значением.