Формат с плавающей точкой 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, являясь укороченным 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
ffc1 = x 11111111 1000001 => qNaN ff81 = x 11111111 0000001 => sNaN
Google изобрела собственный внутренний формат с плавающей точкой под названием «bfloat» для «brain floating point» (в честь Google Brain).
Этот пользовательский формат с плавающей точкой называется "Brain Floating Point Format" или сокращенно "bfloat16". Название происходит от "Google Brain", что означает исследовательская группа по искусственному интеллекту в Google, где и возникла идея этого формата.
Стандарт bfloat16 — это целевой способ представления чисел, которые дают диапазон полного 32-битного числа, но в размере данных 16-битного числа, сохраняя точность, близкую к нулю, но будучи немного более свободным с точностью, близкой к пределам стандарта. Стандарт bfloat16 имеет много применений внутри алгоритмов машинного обучения, предлагая лучшую точность значений внутри алгоритма, одновременно предоставляя удвоение данных в любом заданном наборе данных (или удвоение скорости в этих разделах вычислений).
...Intel расширит поддержку bfloat16 на все наши линейки продуктов ИИ, включая процессоры Intel Xeon и ПЛИС Intel.
Intel планирует поддерживать этот формат во всех своих продуктах AI, включая линейки Xeon и FPGA.
Intel заявила, что NNP-L1000 также будет поддерживать bfloat16, числовой формат, который принимается всеми игроками отрасли МО для нейронных сетей. Компания также будет поддерживать bfloat16 в своих ПЛИС, Xeons и других продуктах МО. Nervana NNP-L1000 запланирован к выпуску в 2019 году.
На этой странице перечислены API-интерфейсы TensorFlow Python и графовые операторы, доступные в Cloud TPU.
Для Cloud TPU Google рекомендовал использовать реализацию bfloat16 из официального репозитория TPU с TensorFlow 1.7.0. Реализации TPU и GPU используют вычисления со смешанной точностью на соответствующей архитектуре и хранят большинство тензоров с половинной точностью.
Все операции в TensorFlow Distributions численно стабильны при половинной, одинарной и двойной точности с плавающей точкой (как типы данных TensorFlow: tf.bfloat16 (усеченная плавающая точка), tf.float16, tf.float32, tf.float64). Конструкторы классов имеют флаг validate_args для числовых утверждений.
{{cite report}}
: CS1 maint: несколько имен: список авторов ( ссылка )Во многих моделях это замена float-32
В TPU схема округления при преобразовании округляется до ближайшего четного и переполняется до inf.
Использует режим округления не-IEEE Round-to-Odd.
Преобразует число с плавающей точкой в точность nv_bfloat16 в режиме округления до ближайшего четного и возвращает nv_bfloat16 с преобразованным значением.