Эффективный формат чисел для нейросетей
Недавно узнал про существование Block Floating Point формата чисел. Его прикол в том, что он хорошо подходит для перемножения матриц. Значит, и для применения нейросетей. Реализация BlockFP на уровне железа должна ускорить инференс на порядки (и разработка такого железа сейчас уже ведется).
Напоминание про обычный Floating Point формат. Каждый элемент представлен
- экспонентой (range): насколько большие числа могут быть представлены (~ длина линейки)
- мантиссой (precision): точность (~ плотность и количество засечек на линейке)
Существует ещё Fixed Point формат, в котором только мантисса, а коэффициент масштабирования фиксирован для всех элементов.
Грубо говоря, Floating Point формат это гибко, точно, медленно, а Fixed Point - не гибко, но очень эффективно. Так вот BlockFP это нечто среднее: одна экспонента используется для блока элементов (последняя строчка на картинке). Получается и динамический range, и эффективное умножение на fixed point процессорах.
Для матричного перемножения двух блоков нужно только
- вычислить новую экспоненту за одну операцию перемножения
- матрично умножить fixed-point числа
А ещё у нейросетей внутри линейных слоев числа чаще всего как раз одного порядка, что делает этот формат ещё более подходящим 👍
Статья от Microsoft про аналогичный формат данных
Post #36
657

- 🔥 9
- 👍 6