Новости

Тысячи слов технической информации! Обязательное к прочтению руководство по количественному анализу для инженеров LLM. Наглядные иллюстрации показывают, как сжимать большие модели.

2024-07-31

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Новый отчет мудрости

Редактор: Редакционный отдел

[Введение в новую мудрость] Столкнувшись с постепенно расширяющейся шкалой параметров LLM, разработчики и исследователи, не имеющие H100, придумали множество способов компенсировать это, и технология «количественной оценки» является одним из них. В этом визуальном руководстве используются различные иллюстрации, чтобы всесторонне обобщить основные понятия и отраслевые методы «количественной оценки».

Большие языковые модели (LLM) часто слишком велики для запуска на оборудовании потребительского уровня. Эти модели могут иметь более миллиардов параметров и часто требуют графических процессоров с большим объемом памяти для ускорения процесса вывода.

Поэтому все больше и больше исследований начинают фокусироваться на том, как уменьшить модель, например, улучшая методы обучения или используя адаптеры. Один из основных методов в этой области называется квантованием.

Инженер машинного обучения Маартен Гроотендорст написал сообщение в блоге, в котором конкретно знакомит с технологией количественной оценки в контексте языкового моделирования и исследует связанные концепции одну за другой с помощью визуальных методов, чтобы помочь нам построить интуитивное понимание технологии.


В этом сообщении блога Маартен исследует различные методы, варианты использования и принципы количественной оценки.

Оглавление и содержание статьи показаны на рисунке ниже. В основном в ней представлены два метода количественной оценки после обучения (PTQ) и обучения с учетом квантования (QAT). Читателям с базовыми знаниями в области ИИ рекомендуется перейти к этой статье. непосредственно к части симметричного квантования:


Часть первая: «Проблема» LLM

«Большие языковые модели» велики по количеству параметров модели, обычно достигая миллиардов по масштабу (в основном веса).

Мало того, что затраты на хранение этих параметров довольно высоки, но объем вычислений на этапе вывода также велик.

Во время вывода значение активации представляет собой произведение входных данных и веса, поэтому чем больше весов, тем больше значение активации.


Поэтому мы хотим максимально эффективно представлять миллиарды значений, минимизируя тем самым пространство, необходимое для хранения параметров.

Давайте начнем с самого начала и рассмотрим, как представляются значения перед оптимизацией.

Как представлять числовые значения

Числовые значения обычно хранятся в виде чисел с плавающей запятой (или просто чисел с плавающей запятой): положительное или отрицательное число с десятичной точкой.

Эти значения представлены двоичными цифрами в каждом бите.

Стандарт IEEE-754 описывает, как цифры каждой цифры представляют определенное значение. В частности, существует три сопоставления: знак, показатель степени или десятичное число (мантисса).


Эти три части можно объединить для вычисления представленного значения на основе набора битовых значений:


Чем больше цифр используется, тем точнее числовое значение. Например, форма FP32 может быть точной до большего числа цифр после десятичной точки, чем FP16:


предел памяти

Чем больше цифр доступно, тем не только точнее значение, но и шире диапазон значений, которые могут быть представлены.


Учитывая номер бита и представление, диапазон значений, которые могут быть представлены, называется динамическим диапазоном, а расстояние между двумя соседними значениями называется точностью.


Отличительной особенностью этого представления является то, что мы можем вычислить, сколько памяти требуется устройству для хранения заданного значения.

Поскольку каждый байт в памяти содержит 8 бит, мы можем создать базовую формулу для большинства форм чисел с плавающей запятой:


В реальных приложениях существует гораздо больше факторов, которые влияют на объем графики/памяти, необходимый для вывода, например размер контекста и архитектура модели.

Теперь представьте, что у нас есть модель с 70 миллиардами параметров. Большинство моделей представляются с использованием 32-битных чисел с плавающей запятой (часто называемых полной точностью), для загрузки модели требуется 280 ГБ памяти.


Но если все параметры можно выразить в виде 16-битных чисел с плавающей запятой, требуемый объем памяти можно напрямую уменьшить на один раз.

Поэтому очень привлекательно минимизировать количество представлений параметров модели (не только для вывода, но и для обучения).

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

Мы хотим уменьшить количество цифр, используемых для представления значения, сохранив при этом точность... Вот тут-то и пригодятся методы квантования.

Часть 2: Введение в количественную оценку

Теперь мы знаем, что целью квантования является снижение точности параметров модели с более высокой разрядности (например, 32-битных чисел с плавающей запятой) до более низкой разрядности (например, 8-битных целых чисел).


При уменьшении количества бит, представляющих исходные параметры, обычно происходит некоторая потеря точности (детализации).

Чтобы сделать этот эффект более интуитивным, мы можем использовать цвета фотографии в качестве аналогии. Например, выберите любое изображение (слева), но используйте только 8 цветов (справа):


Обратите внимание, что увеличенный файл cookie выглядит более «зернистым», чем оригинал.

Аналогично, основная цель квантования — уменьшить количество битов (цветов), необходимых для представления исходных параметров, сохраняя при этом как можно большую точность исходных параметров.

Общие типы данных

Во-первых, давайте посмотрим на распространенные типы данных и влияние их использования вместо 32-битного представления (так называемого представления полной точности или FP32).

FP16

Во-первых, это пример перехода от 32-битной к 16-битной (так называемой половинной точности или FP16) плавающей запятой:


Диапазон возможных значений для FP16 гораздо меньше, чем для FP32.

БФ16

Чтобы получить числовой диапазон, аналогичный исходному FP32, bfloat 16 был введен как «усеченный тип FP32»:


BF16 использует то же количество бит, что и FP16, но добавляет экспоненциальный бит, поэтому может получать более широкий диапазон значений и часто используется в области глубокого обучения.

ИНТ8

По мере дальнейшего уменьшения количества бит представление становится ближе к целому числу, а не к числу с плавающей запятой. Например, переход от FP32 к INT8, который имеет всего 8 бит, составляет только 1/4 от исходного количества бит:


Каждый раз, когда количество бит уменьшается, выполняется преобразование для «сжатия» исходного представления FP32 в меньшее количество битов.

Но в реальной работе нам не нужно отображать весь диапазон FP32 [-3.4e38, 3.4e38] в INT8. Нам просто нужно найти способ сопоставить диапазон данных фактических параметров модели с INT8.

Общие методы сжатия/отображения включают симметричное квантование и асимметричное квантование, оба из которых являются линейным отображением.

Далее мы обсудим метод квантования от FP32 до INT8.

Симметричное квантование

При симметричном квантовании диапазон исходного значения с плавающей запятой отображается в симметричный диапазон с центром в нуле в пространстве квантования, где нуль является средней точкой диапазона до и после квантования.

Это означает, что исходный ноль в пространстве с плавающей запятой равен нулю после отображения в квантованное пространство.


Типичным примером симметричного квантования является квантование по абсолютному максимуму (absmax).

Учитывая список значений, мы берем наибольшее абсолютное значение (α) в качестве диапазона для выполнения линейного отображения.


[-127, 127] представляет собой ограниченный диапазон, а неограниченный диапазон — [-128, 127] в зависимости от метода квантования.

Поскольку это линейная карта с центром в нуле, формула проста.

Сначала рассчитайте масштабный коэффициент(ы), используя следующую формулу:

- b — количество байтов, которые мы хотим квантовать до (8)

- α – наивысшее абсолютное значение

Затем мы используем s для квантования входа x:


Как показано на рисунке выше, максимальное абсолютное значение α равно 10,8. При сопоставлении FP32 с INT8 получается следующая формула:


Если вы хотите восстановить исходные значения FP32, вы также можете использовать ранее вычисленные масштабные коэффициенты для обратного квантования.


Сначала квантовать, а затем деквантовать, чтобы восстановить исходное значение. Весь процесс выглядит следующим образом:


Вы можете видеть, что некоторые значения, такие как 3,08 и 3,02, оба равны 36 при квантовании до INT8. Поэтому при деквантовании обратно в FP32 они теряют некоторую точность и перестают быть различимыми.

Эта разница между исходным значением и обратным квантованным значением называется ошибкой квантования. Обычно, чем меньше битов имеет результат квантования, тем больше ошибка.


асимметричное квантование

В отличие от симметричного квантования, асимметричное квантование не является симметрией с нулевым центром. Вместо этого он сопоставляет минимальное (β) и максимальное (α) значения диапазона с плавающей запятой с минимальным и максимальным значениями квантованного диапазона соответственно.

Метод, который мы здесь исследуем, называется нулевым квантованием.


Обратите внимание, как изменилась позиция 0. Вот почему это называется асимметричным квантованием. В диапазоне [-7,59, 10,8] максимальное и минимальное значения находятся на разном расстоянии от 0.

Из-за смещения положения нулевой точки нам необходимо вычислить нулевую точку в диапазоне INT8 для выполнения линейного отображения. Как и раньше, нам также необходимо вычислить масштабный коэффициент(ы), но используя разницу в диапазоне INT8 [-128, 127].


Это немного сложно, поскольку для перемещения весов необходимо рассчитать нулевую точку (z) в диапазоне INT8.

Как и раньше, заполним формулу:


Чтобы деквантовать квантованное значение из INT8 обратно в FP32, нам нужно использовать ранее вычисленный масштабный коэффициент (s) и нулевую точку (z).

В противном случае деквантование выполняется просто:


Если мы поместим симметричное и асимметричное квантование рядом, мы быстро увидим разницу между этими двумя методами:


На изображении выше мы можем видеть характеристику нулевого центра при симметричном квантовании и смещение при асимметричном квантовании.

Сопоставление диапазона и отсечение (обрезка)

В предыдущем примере мы исследовали, как сопоставить диапазон значений заданного вектора с низкоразрядным представлением. Хотя это позволяет отображать весь диапазон векторных значений, у него есть один серьезный недостаток, а именно выбросы.

Представьте, что у вас есть вектор, содержащий следующие значения:


Значение, которое намного больше всех остальных, можно считать выбросом. Если мы отобразим весь диапазон векторов, все малые значения будут отображены в одно и то же представление младшего порядка и потеряют свою различимость:


Это метод absmax, который использовался ранее.То же самое происходит при асимметричном квантовании без ограничения.

Вместо этого мы можем выбрать обрезку определенных значений. Под обрезкой подразумевается установка другого динамического диапазона исходных значений, чтобы всем выбросам было присвоено одно и то же значение.

В примере ниже мы вручную установили динамический диапазон на [-5, 5], и все значения за пределами этого диапазона будут сопоставлены с -127 или 127, независимо от их фактического значения:


Основное преимущество этого подхода заключается в том, что ошибка квантования для невыбросов значительно снижается. Однако это приведет к увеличению ошибки квантования выбросов.

Калибровка

В приведенном выше примере мы случайным образом устанавливаем динамический диапазон на [-5, 5], но решение должно быть принято посредством процесса «калибровки», чтобы найти подходящий диапазон, который охватывает как можно больше значений, минимизируя при этом ошибку квантования.

Конкретное выполнение этапов калибровки различно для разных типов параметров.

Веса (и смещения)

Мы можем думать о весах и отклонениях большой языковой модели (LLM) как о статических значениях, поскольку они известны до запуска модели. Например, файл Llama 3 размером около 20 ГБ состоит в основном из весов и смещений.

Поскольку количество переменных смещения (миллионы) значительно меньше весов (миллиарды), смещения обычно сохраняют более высокую точность (например, INT16), в то время как основная работа по квантованию сосредоточена на весах.

Для известных статических весов методы калибровки для выбора диапазона включают:

- Вручную выбрать процентили диапазона ввода

- Оптимизация среднеквадратической ошибки (MSE) между исходными и квантованными весами.

- Минимизировать энтропию между исходным значением и квантованным значением (расхождение KL)


Например, выбор процентиля приводит к поведению обрезки, аналогичному тому, что мы видели ранее.

значение активации

Входные данные, которые постоянно обновляются в большой языковой модели, часто называют активациями.


Их называют значениями активации, потому что они обычно проходят через некоторую функцию активации, например сигмовидную или релу.

В отличие от весов, активации изменяются в зависимости от входных данных во время вывода, и поэтому их трудно точно определить количественно.

Поскольку эти значения обновляются после каждого скрытого слоя, их конкретные значения не известны на этапе вывода, пока входные данные не пройдут через модель.


В целом существует два метода калибровки весов и активаций, применяемых на разных этапах модели:

- Квантование после обучения (PTQ)

- Как следует из названия, это количественная оценка после тренировки.

- Обучение с учетом квантования (QAT)

- Квантование во время обучения/тонкой настройки

Часть 3: Количественная оценка после обучения (PTQ)

Квантование после обучения (PTQ) — один из самых популярных методов квантования. Он количественно определяет параметры модели (включая веса и значения активации) после завершения обучения модели.

Квантование весов может использовать симметричное квантование или асимметричное квантование.

Однако количественная оценка значений активации требует этапа вывода для получения их основного распределения, поскольку мы заранее не знаем их диапазон.

Существует две формы квантования значений активации:

- динамическое квантование

- статическое квантование

динамическое квантование

После прохождения данных через скрытый слой собираются значения его активации и сравниваются максимальное значение (α) и минимальное значение (β) каждого слоя:


Распределение этих активаций затем используется для расчета значений нулевой точки (z) и масштабного коэффициента (s), необходимых для квантованного вывода:


Этот процесс повторяется каждый раз, когда данные проходят через новый сетевой уровень. Следовательно, каждый слой имеет свои собственные независимые значения z и s, что позволяет использовать другую схему квантования.

статическое квантование

В отличие от динамического квантования, статическое квантование не вычисляет нулевую точку (z) и масштабный коэффициент (s) во время вывода, а вычисляет эти значения перед выводом.

Чтобы найти эти значения, мы используем набор калибровочных данных и вводим его в модель, чтобы собрать базовые распределения значений активации.


Как только эти распределения собраны, можно рассчитать значения s и z, необходимые для количественной оценки во время вывода.

В фактическое время вывода значения s и z не пересчитываются, а используются глобально для всех активаций для их квантования.

В целом, динамическое квантование, которое вычисляет значения s и z для каждого скрытого слоя, имеет тенденцию быть более точным. Однако это может увеличить время вычислений, поскольку эти значения необходимо рассчитывать в каждый момент времени вывода.

Напротив, статическое квантование, хотя и не такое точное, как динамическое квантование, выполняется быстрее, поскольку ему заранее известны значения s и z, используемые для квантования.

4-битное количественное поле

Квантование ниже 8-бит всегда было проблемой, поскольку ошибка квантования увеличивается с каждым потерянным битом. К счастью, есть несколько умных способов уменьшить количество бит до 6, 4 или даже 2 бит (хотя уменьшать количество бит ниже 4 бит обычно не рекомендуется).

Мы рассмотрим два распространенных метода HuggingFace:

- GPTQ (полная модель работает на графическом процессоре)

- GGUF (возможно, выгружает слои в ЦП)

GPTQ

Можно сказать, что GPTQ — один из самых известных в практических приложениях методов 4-битного квантования.

Он использует асимметричное квантование и обрабатывает его слой за слоем, обрабатывая каждый слой независимо, прежде чем перейти к следующему слою:


В этом процессе послойного квантования сначала преобразуются веса слоев в обратные матрицы Гессе. Обратная матрица Гессиана является второй производной функции потерь модели и представляет чувствительность выходных данных модели к каждому изменению веса.

Проще говоря, он по существу показывает важность (обратную важность) весов в каждом слое.

Меньшие веса значений в матрице Гессе более важны, поскольку небольшие изменения этих весов могут привести к значительным изменениям в производительности модели.


В обратной матрице Гессиана более низкие значения представляют более «важные» веса.

Далее мы квантоваем и деквантуем первую строку весовой матрицы:


Этот процесс позволяет нам вычислить ошибку квантования (q), которую мы можем взвесить, используя ранее вычисленное обратное значение Гессиана (h_1).

По сути, мы создаем взвешенную квантованную ошибку, основанную на важности весов:


Затем мы перераспределяем эту взвешенную ошибку квантования на другие веса строки. Это помогает поддерживать общую функциональность и производительность сети.

Например, если мы сделаем это для второго веса (т. е. x_2=0,3), мы умножим ошибку квантования (q) на обратный гессиан второго веса (h_2) и добавим к нему:


Далее продолжаем ту же операцию для третьего веса в данном ряду:


Этот процесс перераспределения взвешенной ошибки квантования q повторяется до тех пор, пока все значения не будут квантованы.

Этот метод работает, потому что веса обычно связаны друг с другом. Следовательно, если вес имеет ошибку квантования, соответствующий вес будет соответствующим образом обновлен с помощью обратного гессиана.

ГГУФ

Хотя GPTQ является хорошим методом квантования для запуска всей модели большого языка (LLM) на графическом процессоре, при отсутствии соответствующих аппаратных условий любой уровень LLM также можно выгрузить в процессор через GGUF.

Это эквивалентно одновременному запуску модели на ЦП и графическом процессоре, чтобы восполнить нехватку видеопамяти (VRAM).

Метод квантования GGUF часто обновляется и зависит от конкретного количества бит квантования, но основной принцип заключается в следующем.

Сначала веса данного слоя делятся на «суперблоки», каждый из которых содержит набор «субблоков». Из этих «субблоков» мы вычисляем масштабный коэффициент(ы) и значение альфа:


Чтобы квантовать данный «субблок», вы можете использовать упомянутое ранее квантование absmax, умножив заданный вес на коэффициент масштабирования (s_sub):


Масштабный коэффициент s_sub вычисляется с использованием информации в «субблоке», но квантуется с использованием информации s_super в «суперблоке»:


Таким образом, это поблочное квантование использует масштабный коэффициент «суперблока» (s_super) для квантования масштабного коэффициента «субблока» (s_sub).

Уровень квантования каждого масштабного коэффициента может быть разным, и масштабные коэффициенты «суперблока» обычно имеют более высокую точность, чем масштабные коэффициенты «субблока».

Чтобы проиллюстрировать это, давайте рассмотрим несколько уровней квантования (2-битный, 4-битный и 6-битный):


В зависимости от типа квантования также требуется дополнительное минимальное значение (m) для настройки нулевой точки, они квантоваются так же, как и масштабный коэффициент (s).

Часть 4: Тренинг количественной осведомленности (QAT)

Третья часть описывает, как квантовать модель после обучения. Недостатком этого метода является то, что он не учитывает реальный тренировочный процесс.

Вот тут-то и пригодится тренинг количественной осведомленности (QAT). В отличие от количественной оценки после обучения (PTQ), цель QAT — изучить процесс квантования во время обучения.


QAT имеет тенденцию быть более точным, чем PTQ, поскольку квантование уже учитывается в процессе обучения. Вот как это работает:

В процессе обучения вводится так называемое «ложное» квантование. Например, сначала квантуйте веса в INT4, а затем деквантуйте их обратно в FP32:


Этот процесс позволяет модели учитывать ошибку квантования при расчете потерь и обновлении весов на этапе обучения.

Как показано на рисунке ниже, QAT пытается исследовать значение потерь в случае «широких» минимумов, чтобы уменьшить ошибки квантования, поскольку «узкие» минимумы часто приводят к большим ошибкам квантования.


Предполагая, что квантование не учитывается во время обратного распространения ошибки, процесс градиентного спуска выберет вес с наименьшим значением потерь. Однако если оно находится в «узком» минимуме, это приведет к большим ошибкам квантования.

Напротив, если мы рассмотрим квантование, в «широких» минимумах будет выбран другой вес обновления с гораздо меньшей ошибкой квантования.


Таким образом, хотя метод PTQ имеет низкое значение потерь при высокой точности (например, FP32), QAT также имеет низкое значение потерь при низкой точности (например, INT4), чего мы и добиваемся.

1-битная эра: BitNet

Ранее мы видели, что снижение точности квантования до 4 бит уже весьма незначительно, но что, если мы уменьшим ее еще больше?

Здесь на помощь приходит BitNet: он представляет веса модели в виде одного бита, либо -1, либо 1, и делает это путем внедрения процесса квантования непосредственно в архитектуру Transformer.

Архитектура Transformer является основой большинства LLM и состоит из вычислений с использованием линейных слоев:


Эти линейные слои обычно представляются с более высокой точностью, например FP16, и именно там находится большая часть весов.

BitNet заменяет эти линейные слои слоями BitLinear:


Слои BitLinear работают так же, как обычные линейные слои, умножая веса на значения активации для расчета выходных данных.

Но разница в том, что слой BitLinear использует только 1 бит для представления веса модели и использует INT8 для представления значения активации:


Слои BitLinear, такие как обучение с учетом квантования (QAT), выполняют своего рода «фальшивое» квантование во время обучения, чтобы проанализировать эффект квантования весов и активаций:


Давайте разберемся с BitLinear шаг за шагом.

количественное определение веса

Во время обучения веса сохраняются как INT8, а затем квантуются до 1 бита с использованием базовой стратегии, называемой функцией Signum.

По сути, он перемещает распределение весов по центру на 0, затем присваивает всем значениям меньше 0 значение -1 и всем значениям больше 0 значение 1:


Кроме того, он отслеживает значение β (среднее абсолютное значение), которое мы будем использовать позже в процессе обратного квантования.

Активационное квантование

Для количественной оценки активаций BitLinear включает метод абсолютного максимального значения (absmax) для преобразования активаций из FP16 в INT8, поскольку они требуют матричного умножения (×) с более высокой точностью.


Кроме того, он отслеживает значение α (максимальное абсолютное значение), которое мы будем использовать позже в процессе деквантования.

обратное квантование

Мы отслеживаем α (максимальное абсолютное значение активаций) и β (среднее абсолютное значение весов), что поможет нам деквантовать активации обратно в FP16.

Выходные активации масштабируются с использованием {α, γ}, чтобы деквантовать их до исходной точности:


Этот процесс относительно прост и позволяет представить модель только двумя значениями: -1 или 1.

При таком подходе авторы заметили, что по мере увеличения размера модели разрыв в производительности между 1-битным обучением и обучением FP16 становится все меньше и меньше.

Однако это касается только более крупных моделей (>30B параметров), разрыв между моделями меньшего размера по-прежнему велик.

Все LLM имеют разрядность 1,58 бита.

Чтобы решить упомянутые ранее проблемы масштабируемости, был представлен BitNet 1.58b.

В этом новом подходе каждый вес модели может быть не только равен -1 или 1, но также может принимать значение 0, что делает каждую переменную троичной.

Интересно, что добавление 0 — это простая операция, которая значительно улучшает BitNet и ускоряет процесс вычислений.

0 мощность

Почему добавление 0 является значительным улучшением?

Это связано с умножением матриц!

Во-первых, давайте изучим основные принципы умножения матриц.

При вычислении вывода мы умножаем весовую матрицу на входной вектор. Вот визуализация умножения первой строки первого слоя весовой матрицы:


Это умножение включает в себя два действия: умножение одного веса на входные данные, а затем их все сложение.

Напротив, BitNet 1.58b удается избежать процесса умножения, поскольку трехзначные веса по сути говорят вам следующее:

- 1: я хочу добавить это значение

- 0: мне не нужно это значение

- -1: я хочу вычесть это значение

Итак, если ваши веса квантованы до 1,58 бит, вам просто нужно выполнить сложение:


Это не только значительно ускоряет вычисления, но и позволяет фильтровать признаки.

Установка данного веса на 0 эквивалентна игнорированию входных данных, а не добавлению или вычитанию входного значения, например, 1-битному.

Количественная оценка

Для выполнения весового квантования BitNet 1.58b использует квантование среднего абсолютного значения (absmean), вариант квантования максимального абсолютного значения (absmax), который мы видели ранее.

Он просто сжимает распределение весов и использует абсолютное среднее значение (α) для количественной оценки значений. Затем округлите их до -1, 0 или 1:


По сравнению с BitNet, квантование активации такое же, за исключением одного аспекта: вместо масштабирования активаций до диапазона [0, 2ᵇ⁻¹] мы используем метод максимального абсолютного значения для масштабирования до [-2ᵇ⁻¹, 2ᵇ⁻¹] .

Подводя итог, можно сказать, что 1,58-битное квантование в основном включает в себя два метода:

- Добавьте 0, чтобы создать трехзначное представление [-1, 0, 1]

- Абсолютное среднее количественное определение весов

В документе BitNet содержится такой вывод: «13B BitNet b1.58 более эффективен, чем 3B FP16 LLM, с точки зрения задержки, использования памяти и энергопотребления».


Адрес статьи: https://arxiv.org/abs/2402.17764.

Имея всего 1,58 бита с вычислительной эффективностью, мы получаем облегченную модель.

Использованная литература:

https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization