Квантизация. llm.. llm. llm-архитектура.. llm. llm-архитектура. llm-модели.. llm. llm-архитектура. llm-модели. искусственный интеллект.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация. Машинное обучение.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация. Машинное обучение. оптимизация.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация. Машинное обучение. оптимизация. оптимизация моделей.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация. Машинное обучение. оптимизация. оптимизация моделей. ускорение нейросетей.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация. Машинное обучение. оптимизация. оптимизация моделей. ускорение нейросетей. ШВМ.. llm. llm-архитектура. llm-модели. искусственный интеллект. квантизация. Машинное обучение. оптимизация. оптимизация моделей. ускорение нейросетей. ШВМ. Школа Высшей Математики.

Автор статьи: Марк Блуменау – Сотрудник научно-исследовательских институтов ФИАН, ИЗМИРАН, ИФТТ, преподаватель Школы Высшей Математики

Если вы кликнули на данную статью, то скорее всего вы знаете, что в последнее время появляется огромное количество нейронных сетей. Они находят применение везде: и в задачах компьютерного зрения (Computer Vision, CV), и в обработке естественного языка (Natural Language Processing, NLP), распознавания и генерации речи (Speech-To-Text, STT; Text-To-Speech, TTS). Но есть что-то, что объединяет их все: у любой нейронной сети есть веса. И нам их, очевидно, нужно хранить и применять. Так как мы это делаем?

Если вы хорошо слушали и не забыли школьную информатику, вы скажете: в битах! И будете абсолютно правы. А сколько бит надо на хранение? Если мы возьмем какую-то стандартную библиотеку для обучения нейронных сетей (например PyTorch) и будем обучать модель самым простым образом, мы будем использовать тип данных FP32, он же Single precision. На каждое число мы будем выделять 32 бита. Тем не менее, сейчас стремительно набрали популярность большие языковые модели (Large Language Model, LLM), и в них огромное количество параметров. Недавно вышедшая модель от DeepSeek содержит порядка 671 млрд параметров. Можно оценить количество памяти, которая нам понадобится, если хранить все эти числа в FP32:

671cdot 10^9 cdot (32 / 8) / 1024 / 1024 / 1024 approx 2500 text{ Gb.}

Здесь мы вспоминаем, что в одном байте 8 бит, а в килобайте 1024 байта. Очевидно, что для работы с таким монстром потребуется недешевый сервер, а то и несколько. Но в Интернете можно найти статьи о том, что эту модель можно пытаться запускать, имея всего 20 Гб оперативной памяти. Вы скажете, что можно подгружать веса по частям (и отчасти так и происходит), считать кусочек, подгружать следующие и так далее, но это будет очень медленно. Так как это проделывать не совсем в лоб и быстрее?

Для этого существует квантизация. Суть квантизации заключается в преобразовании весов и активаций нейронной сети из FP32 в представление с меньшей разрядностью (например, 8-битное целочисленное). Такой переход позволяет снизить объём памяти, необходимый для хранения модели, а также ускорить вычислительные операции. Конечно, её придумали гораздо раньше, чем появились LLM, но сейчас квантизация особенно стала популярной.

Но зачем тогда нам вообще FP32? Применение квантизации требует баланса между сокращением количества бит на число и сохранением точности модели. Сожмете веса в 1 бит — будете получать бред (не всегда, например см. https://arxiv.org/pdf/1603.05279). Сожмете в 16 бит — будет хуже помещаться в небольшой объем памяти. Давайте рассмотрим самые базовые идеи квантизации.

Рис.1 Визуализация количества бит в разных типах. Источник: https://www.baseten.co/blog/fp8-efficient-model-inference-with-8-bit-floating-point-numbers/

Рис.1 Визуализация количества бит в разных типах. Источник: https://www.baseten.co/blog/fp8-efficient-model-inference-with-8-bit-floating-point-numbers/

1. Что такое квантизация?

Квантизация представляет собой процесс отображения непрерывного множества вещественных чисел в конечное множество дискретных значений. Пусть x — исходное значение (например, вес нейронной сети). Самый простой вариант квантизации описывается следующей формулой:

Q(x)=round(frac{x}{S}),

где:
S — масштабный коэффициент, определяемый на основе статистики распределения, а round(cdot) — функция округления до ближайшего целого числа. В данном подходе отрицательные и положительные значения обрабатываются симметрично. Асимметричная квантизация даёт нам некую свободу и добавляет смещение Z для компенсации смещённого распределения значений (в частности, квантизованный 0 не 0 до квантизации):

Q(x)=round(frac{x}{S}) + Z,

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

2. Выбор масштаба

Хорошо, но как выбрать масштабный коэффициент? Самый простой способ для симметричной квантизации выглядит так: смотрим на все наши числа (обозначим X), выбираем из них два, минимум и максимум. Тогда определим S:

S=max(|min(X)|,|max(X)|).

В случае с асимметричной квантизацией всё сложнее. Нередко прибегают к исследованию распределения чисел, которые мы хотим квантизовать, более подробно, чем просто взятие минимума и максимума: считают медиану, стандартное отклонение и так далее. Часто можно встретить более сложную формулу для S:

S=frac{max(X) - min(X)}{2^b - 1},

где b — количество бит, которое будем использовать. Веса могут быть смещены в какую-то из сторон, и с этим придется считаться.

Рис. 2 Визуализация симметричной квантизации. Здесь . Источник: https://www.researchgate.net/figure/Quantization-from-FP32-to-INT8_fig1_363946099

Рис. 2 Визуализация симметричной квантизации. Здесь S=r. Источник: https://www.researchgate.net/figure/Quantization-from-FP32-to-INT8_fig1_363946099
Рис. 3 Разница в применени разной квантизации к одному набору весов и активаций. Affine quantization — берутся и  (для левой границы), и  (для правой). Источник: https://pytorch.org/blog/quantization-in-practice/

Рис. 3 Разница в применени разной квантизации к одному набору весов и активаций. Affine quantization — берутся и min(X) (для левой границы), и max(X) (для правой). Источник: https://pytorch.org/blog/quantization-in-practice/

3. Квантизация при обучении или после?

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

  • Пост-тренировочная квантизация (Post-Training Quantization, PTQ)

    Здесь всё просто, обучаем модель в привычном нам FP32, после чего применяем квантизацию и преобразовываем наши веса в понравившиеся нам INT4/INT8. Преимущества налицо: простая реализация и удобство при использовании стандартных инструментов. Минусы не совсем очевидны, но очень правдоподобны: если слишком агрессивно понижать количество бит, мы очень сильно потеряем в качестве.

  • Квантизационно-осведомленное обучение (Quantization-Aware Training, QAT, https://arxiv.org/abs/1712.05877)

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

При разработке и оптимизации нейронной сети с использованием квантизации следует отвечать на следующие вопросы:

  • Будет ли модель квантизована в будущем? Если да, стоит сразу смотреть в сторону QAT.

  • Надо ли квантизовать все веса? Некоторые слои более восприимчивы к квантизации. Например, первые и последние слои в сверточных сетях более чувствительны к квантизации (https://arxiv.org/pdf/1606.06160).

  • Если я выполняю PTQ, то подходит ли мне простая симметричная квантизация? Стоит строить распределения весов и активаций.

Рис. 4 Визуализация QAT. Источник: https://es.mathworks.com/matlabcentral/fileexchange/125420-quantization-aware-training-with-mobilenet-v2

4. Плюсы и минусы квантизации

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

Преимущества:

  • Сокращение объёма памяти, что особенно важно для развёртывания моделей на устройствах с ограниченными ресурсами.

  • Ускорение вычислений за счёт использования целочисленных операций, что позволяет снизить время инференса.

Недостатки:

  • Возможное ухудшение точности работы модели.

  • Увеличение сложности обучения при использовании QAT.

  • Необходимость тщательной настройки параметров квантизации для каждого слоя модели.

Если вы пользуетесь PyTorch, то есть несколько хороших гайдов для старта, например здесь (https://pytorch.org/tutorials/advanced/static_quantization_tutorial.html) рассматривается обучение MobileNetV2 с PTQ и QAT.

Есть и хорошая статья для подгружения в квантизацию поглубже, с примерами кода (https://pytorch.org/blog/quantization-in-practice/).

Ну и куда же без поста, где команда Unsloth упаковала DeepSeek R1 в 1.58 бит (log_2 (3)), чтобы запускать модель в 671 млрд параметров в 20 Гб оперативки (почти, за подробностями советую почитать пост целиком, там также описаны и некоторые трюки, которыми достигли результат).

Также не могу не поделиться репозиторием с неплохой коллекцией статей по квантизации: https://github.com/Zhen-Dong/Awesome-Quantization-Papers .

Автор: alexlyk314

Источник

Rambler's Top100