Нейронные сети, на основе которых строятся современные системы глубинного машинного самообучения и искусственного интеллекта, в большинстве случаев используют стандартный 32-разрядный формат чисел с плавающей запятой IEEE FP32. Это обеспечивает высокую точность вычислений и конечного результата, но требует использования больших объемов памяти и высокопроизводительных процессоров, потребляющих значительное количество энергии. В системах же с высокими требованиями к быстродействию и с ограниченными вычислительными ресурсами используются 8-разрядные целые числа со знаком INT8. Это позволяет получить высокую производительность систем искусственного интеллекта, принеся в жертву точность вычислений и конечного результата.
Для решения проблемы, связанной с компромиссом между производительностью систем искусственного интеллекта и разрядностью используемых чисел, специалисты Google Brain в свое время разработали специальный формат чисел с плавающей запятой, оптимизированный для глубинного самообучения и позволяющий получать результат с минимально возможными потерями точности. Этот формат, BF16 (BFloat16, Brain Float 16) уже нашел широкое применение в специальных аппаратных ускорителях, разработанных компаниями Google, Intel, ARM и др.
В чем же разница между форматами FP32 и BF16? Число с плавающей запятой в стандартном формате FP32 состоит из 1 знакового бита, определяющего знак числа (+ или -), после него следует 8-битная экспонента (степень числа), после которой идет 23-битная мантисса (само число). И в сумме набираются полные 32 разряда.
Для формата BF16 специалисты Google Brain предложили усечь мантиссу до 7 бит. Такой выбор был сделан далеко не случайно, проведенные эксперименты показали, что качество работы нейронных сетей намного более чувствительно к размеру экспоненты, нежели мантиссы. И вариант BF16 является самым приемлемым компромиссом.
Таким образом, число в BF16 состоит из одного знакового бита, 8-битной экспоненты и 7-битной мантиссы, что в сумме составляет полные 16 бит. Для проведения тензорных операций с числами в формате BF16 требуются гораздо меньшие вычислительные мощности, объемы памяти и энергетические затраты. Напомним нашим читателям, что тензор — это трехмерная матрица чисел, а умножение тензоров — это ключевая операция, на которой стоят все вычисления в системах искусственного интеллекта.
Можно задать вопрос, а почему бы не использовать в системах искусственного интеллекта стандартный усеченный формат чисел с плавающей запятой IEEE FP16? Ведь этот формат достаточно успешно используется во многих приложениях, связанных с компьютерной графикой и компьютерными играми. Число в формате FP16 выглядит следующим образом — один знаковый бит, 5-битная экспонента и 10-битная мантисса, что в сумме составляет полные 16 бит.
Сразу можно отметить, что усеченная экспонента определяет гораздо меньший динамический диапазон чисел, чем диапазон формата BF16, который почти равен диапазону FP32. Во-вторых, для преобразования числа FP32 в формат FP16 требуется достаточно сложная процедура, чем простейшая операция по усечению разрядности мантиссы, необходимая для преобразования FP32 в BF16. И, в-третьих, усеченная мантисса формата BF16 позволяет сделать шину блоков аппаратных умножителей меньше, чем необходимо для формата FP16. В результате этого сами блоки умножителей для формата BF16 в восемь раз меньше по занимаемой на кристалле чипа площади, чем умножители для FP32, и в два раза меньше, чем умножители для FP16.
И в заключение следует заметить, что формат BF16 является не единственным форматом, разработанным для систем искусственного интеллекта. В 2017 году компания Nervana предложила формат под названием Flexpoint, который должен был объединить все преимущества целых чисел с числами с плавающей запятой. По сути, этот формат представляет собой модификацию чисел с фиксированной запятой, которые состоят из двух целых чисел. Первое число представляет собой целую часть числа до запятой, второе — дробную часть числа (после запятой). Специалисты компании Nervana дополнили формат числа с фиксированной запятой еще и экспонентой, однако, для ускорения операций экспонента была одна для всех чисел, из которых состоит тензор. При таком подходе умножение тензоров могло быть произведено при помощи математики на основе очень быстрых целочисленных операций.
Но тут же возникла и проблема, связанная с узким динамическим диапазоном чисел, имеющих одну и туже экспоненту. Эта проблема сделала невозможным «взлет» формата Flexpoint и даже в первых ускорителях компании Nervana уже использовался формат BF16.