Большие языковые модели требуют огромных объёмов памяти. Например, модель с 8 миллиардами параметров в формате FP16 занимает 24–27 ГБ памяти только для инференса (веса, кэш ключей-значений, буферы). Для полного обучения той же модели нужно уже 84–128 ГБ памяти. Даже с такими методами, как checkpointing активаций или offloading на CPU, требования остаются высокими, особенно для моделей с 70 миллиардами параметров.
Квантизация помогает снизить требования к памяти, уменьшая точность представления весов модели без значительной потери качества. В этой статье разберём основные форматы числовой точности, используемые в квантизации LLM, их особенности и ограничения. Также рассмотрим NF4 — ключевую инновацию из статьи про QLoRA, и разберём, зачем нужны такие методы, как блочная квантизация, двойная квантизация и квантизация по квантилям.
| Если вам интересна тема AI-агентов и внедрения нейросетей, заглядывайте в мой Telegram-канал ДругОпенсурса. Там я публикую свежие новости и разборы инструментов в числе первых. |
Начнём с краткого обзора LoRA — метода, который уже значительно сокращает требования к памяти и вычислениям при обучении LLM.
Представление чисел с плавающей точкой

В школе мы привыкли к десятичной научной нотации: число записывается как мантисса (дробная часть) и порядок (степень 10). Например, 3000 = 3 × 10³. Мантисса определяет точность, порядок — диапазон.
В компьютерах используются двоичные форматы: FP32, BF16 и другие. Число представляется как мантисса × 2^порядок. Мантисса и порядок записываются в двоичном виде.
FP32 («одинарная точность»)
-
1 бит на знак
-
8 бит на порядок
-
23 бита на мантиссу

Для представления отрицательных порядков используется смещение (bias). В FP32 оно равно 127. Например, порядок -1 хранится как 126 (127 — 1), а порядок +1 — как 128 (127 + 1). Это упрощает сравнение чисел.

Диапазон FP32:
-
Максимальное число: ≈ 3.4 × 10³⁸
-
Минимальное положительное число: ≈ 1.18 × 10⁻³⁸

FP16 («половинная точность»)
-
1 бит на знак
-
5 бит на порядок
-
10 бит на мантиссу

Диапазон FP16 значительно меньше: от ≈ 6.5 × 10⁻⁵ до ≈ 6.5 × 10⁴. Для глубокого обучения это проблема: градиенты и активации могут выходить за эти пределы (переполнение или потеря значимости). В статье «Mixed Precision Training» (ICLR 2018) предлагались обходные решения, например, масштабирование потерь, но они не всегда эффективны.
BF16

Решение проблемы диапазона: оставим 8 бит на порядок (как в FP32), но сократим мантиссу до 7 бит. Диапазон BF16 совпадает с FP32, поэтому при конвертации из FP32 в BF16 не требуется дополнительная настройка модели. Как показано в статье Facebook и Intel (2019), BF16 не уступает FP32 по качеству, в отличие от FP16.
Целочисленная квантизация: INT8
Впервые использована Google в 2018 году, затем адаптирована для NLP в модели Q8BERT (Intel Labs, 2019). Позволяет сократить размер модели в 4 раза и ускорить инференс за счёт целочисленной арифметики.
Как работает квантизация из FP32/BF16 в INT8
-
Задаём диапазон значений (например, симметричный от -M до +M). Предполагаем, что значения вне диапазона редки или неважны.
-
Определяем количество уровней квантизации: для INT8 это 2⁸ = 256.
-
Вычисляем шаг квантизации: шаг = диапазон / уровни.
-
Квантизуем число:
-
Делим на шаг
-
Округляем до ближайшего целого
Пример из Q8BERT:

-
Используются симметричные уровни от -127 до +127.
-
Масштабный коэффициент (scaling factor) вычисляется как M / 127.
Проблемы равномерной квантизации
Веса трансформеров распределены неравномерно: есть пик около нуля и длинные хвосты (приблизительно гауссово распределение). При равномерной квантизации:
-
Большинство уровней остаются пустыми.
-
Уровни около нуля перегружены, что приводит к большим ошибкам реконструкции.
Для INT8 с 256 уровнями это ещё терпимо. Для INT4 (16 уровней) проблема становится критической.
NF4: квантизация по квантилям
NF4 (NormalFloat 4-bit) предложена в статье про QLoRA. Основная идея: сделать так, чтобы в каждом уровне квантизации было одинаковое количество значений. Это оптимально с точки зрения теории информации.
Как работает NF4
-
Веса трансформеров центрированы вокруг нуля и распределены по нормальному закону.
-
Масштабируем их так, чтобы они соответствовали стандартному нормальному распределению N(0,1).
-
Вычисляем квантили для 16 уровней (INT4) с помощью функции квантилей стандартного нормального распределения.

Преимущества:
-
Работает даже при обучении (в отличие от INT4, которая ломает градиенты).
-
Оптимально распределяет ошибки квантизации.
Блочная квантизация и двойная квантизация
Проблема: если в тензоре есть выбросы, один масштабный коэффициент для всего тензора приводит к плохой квантизации.
Решение: разбить тензор на блоки и квантизовать каждый блок отдельно. Чем меньше блок, тем меньше ошибка квантизации, но тем больше нужно хранить масштабных коэффициентов.

Двойная квантизация
Проблема: масштабные коэффициенты для блоков хранятся в FP32 (32 бита на коэффициент). Для модели с миллиардами параметров это значительные накладные расходы.
Решение: квантизовать сами масштабные коэффициенты в INT8. Поскольку они меняются медленнее, чем веса, можно использовать больший размер блока (например, 256). Это сокращает накладные расходы с 0.5 до 0.127 бит на параметр.
LoRA: низкоранговая адаптация
Статья от Microsoft (2021): «LoRA: Low-Rank Adaptation of Large Language Models».
Идея: вместо полного дообучения модели дообучать только небольшую часть весов.
Как работает:
-
Веса трансформера (например, матрицы Wq, Wk, Wv) заморожены.
-
Добавляются две низкоранговые матрицы A и B (размерности M×r и r×N, где r << M, N).
-
При дообучении обновляются только A и B.
-
Результат добавляется к исходным весам: W + AB.
Преимущества:
-
Сокращает количество обучаемых параметров на несколько порядков.
-
Не добавляет задержку при инференсе.
QLoRA: квантизация + LoRA
QLoRA (2023) объединяет NF4, блочную двойную квантизацию и LoRA.

Характерные моменты:
-
Веса модели хранятся в NF4.
-
Все вычисления проводятся в BF16.
-
Для инференса веса деквантизуются в BF16.
-
Используется блочная двойная квантизация для масштабных коэффициентов.
Несколько ключевых шагов :
Память и оптимизаторы
Если памяти GPU не хватает, QLoRA использует страничные оптимизаторы от NVIDIA: данные автоматически перемещаются между CPU и GPU постранично.
Результаты
-
NF4 превосходит INT4 по качеству.
-
QLoRA почти не уступает LoRA по качеству, но требует значительно меньше памяти.
QA-LoRA: квантизация для инференса
Проблема QLoRA: при инференсе нужно деквантизовать веса в BF16, что замедляет работу. Кроме того, для NF4 нет аппаратных оптимизаций, поэтому даже обучение идёт медленнее.
Решение: QA-LoRA (2023). Использует стандартный INT4 для ускорения вычислений и получает квантизованную модель на выходе, пригодную для edge-устройств. Улучшает качество квантизации за счёт балансировки степеней свободы LoRA и квантизации.
Заключение
Квантизация — ключевой инструмент для работы с большими языковыми моделями. Методы вроде NF4 и QLoRA позволяют значительно сократить требования к памяти без потери качества. QA-LoRA решает проблему медленного инференса, открывая дорогу для развёртывания моделей на устройствах с ограниченными ресурсами.
ссылка на оригинал статьи https://habr.com/ru/articles/1035626/