Что такое квантизация модели: точность и память связаны через представление чисел меньшим числом бит. Квантование весов, а иногда и активаций, уменьшает объём их представления. Документация Transformers приводит ориентир: модель на 8B в bf16 требует около 16 ГБ на веса, при 8 битах — около 8 ГБ, при 4 битах — около 4–5 ГБ. Меньшее число бит снижает точность, и каждый метод по-своему балансирует память, скорость и качество.
Механизм и его пределы
В простейшем линейном варианте число с плавающей точкой заменяется целым кодом и масштабом. Реальные методы могут использовать иные представления, группы и дополнительные параметры. В документации torchao описаны примитивы такого перехода — операция выбора параметров квантования (choose_qparams) и операция квантования (quantize), которая переводит тензор высокой точности в низкую по этим параметрам. Для статического варианта параметры выбирают по минимуму и максимуму из наблюдений, для динамического — по самому тензору в момент работы.
Разберём учебный пример. Возьмём масштаб s = 0.1 и правило q = round(x / s), восстановление даёт q × s. Значения [0.12, −0.26, 0.44] превращаются в коды [1, −3, 4], обратно — в [0.1, −0.3, 0.4]. Абсолютные ошибки: 0.02, 0.04, 0.04.
| Исходное x | Код q | Восстановленное q×s | Абсолютная ошибка |
|---|---|---|---|
| 0.12 | 1 | 0.1 | 0.02 |
| −0.26 | −3 | −0.3 | 0.04 |
| 0.44 | 4 | 0.4 | 0.04 |
Это ручной эталон для заданного правила. Здесь нет пограничных случаев округления и нет clipping, поэтому картина ровная. В реальной модели часть значений выходит за выбранный диапазон, и тогда ошибка на них резко растёт.
Ошибка представления меняет промежуточные вычисления и может влиять на результат следующих слоёв. Документация PyTorch отмечает, что посттренировочное квантование ниже 4 бит может давать серьёзную деградацию точности. Это утверждение про конкретный режим, и оно не означает, что любой низкий бит гарантированно ломает модель.
Второй предел — разделение трёх величин. Размер файла, занятая видеопамять и скорость работы связаны с квантованием по-разному. Документация Transformers описывает свой путь загрузки GGUF: большинство таких чекпоинтов в этой библиотеке распаковываются в полную точность. Это ограничение конкретного загрузчика, а другие движки могут выполнять вычисления с упакованными весами. Веса остаются упакованными только на MPS с установленным пакетом kernels, для Qwen3.5 и Qwen3.5 MoE. Следовательно, по одному размеру GGUF нельзя определить память конкретного процесса загрузки и выполнения.
Третий предел — служебные данные. Масштабы, zero-points, упаковка и метаданные в учебный расчёт не входят. Для 1000 условных весов чистые данные при 16 битах занимают 2000 байт, при 4 битах — 500 байт. Расчёт иллюстрирует арифметику бит. Размер готового GGUF включает дополнительные данные.
Учебный вход, артефакт и эталон проверки
Для практики нужен воспроизводимый вход. Возьмём одну модель в двух точностях и три задачи с заранее известными ответами.
- Т1: извлечь A-17 из строки «Код A-17».
- Т2: сложить 17 и 26, эталон — 43.
- Т3: вход
Извлеки дату из строки "Код A-17"; если даты нет, верни null; эталон — null.
Поля таблицы результатов: precision, device, context, peak_memory, latency, Т1–Т3, ошибки. Результаты заполняются после запуска, до запуска в таблице пусто. Три кейса не доказывают сохранение качества на всех задачах, они дают быстрый сигнал о явной поломке.
Эталон проверки — это не только ответы Т1–Т3. Сюда входит совпадение формата вывода, отсутствие лишнего текста вокруг ответа и стабильность при повторном запуске с тем же входом. Модель может дать верное число и сломать разбор ответа программным кодом.
Ниже — учебный шаблон протокола. Он задаёт структуру, которую читатель заполняет своими значениями.
Протокол проверки двух точностей одной модели
precision: [например, 8 бит]
device: [ваше устройство]
context: [длина контекста]
peak_memory: [замер после запуска]
latency: [замер после запуска]
Т1 (извлечь A-17 из "Код A-17"): [ответ]
Т2 (17 + 26, эталон 43): [ответ]
Т3 (извлечь дату из "Код A-17", если даты нет — null): [ответ]
ошибки: [что именно сломалось]
precision: [например, 4 бита]
device: [ваше устройство]
context: [длина контекста]
peak_memory: [замер после запуска]
latency: [замер после запуска]
Т1: [ответ]
Т2: [ответ]
Т3: [ответ]
ошибки: [что именно сломалось]
Этот протокол разделяет измеряемые величины: он разделяет память, скорость и качество и не смешивает их в одну оценку.
Структурная корректность и фактическая правильность
Эти две вещи расходятся при квантовании чаще, чем кажется. Структурная корректность означает, что модель загрузилась, выдала ответ в ожидаемом формате и не упала. Фактическая правильность означает, что ответ совпал с эталоном.
Документация Transformers описывает автоматический выбор квантователя: предварительно квантованный чекпоинт хранит quantization_config в своём config.json, и from_pretrained подхватывает его сам. Загрузка может пройти без ошибок, а качество ответов при этом измениться. Успешный запуск подтверждает структуру и ничего не говорит о фактах.
Практический порядок проверки такой. Сначала убеждаемся, что модель отвечает и формат разбирается. Затем сверяем ответы с эталонами. Затем смотрим на память и задержку. Смешивать эти шаги опасно: медленный, но верный ответ и быстрый, но неверный — разные диагнозы.
В документации torchao отмечено, что иногда квантование слоя делает его медленнее из-за накладных расходов. Там же приведён вариант, когда библиотека сама подбирает способ квантования для каждого слоя. Это подтверждает: структурная корректность и выигрыш в скорости — независимые свойства.
Для проверки фактической правильности полезно брать задачи с однозначным ответом. Сложение, извлечение подстроки, возврат null — такие кейсы легко сверить автоматически. Задачи со свободным текстом требуют ручной оценки и плохо подходят для быстрого сравнения точностей.
Первоисточники и границы утверждений
Внешние утверждения в этой статье опираются на документацию двух проектов.
Документация Transformers сообщает, что библиотека интегрирует более 20 методов квантования через from_pretrained(), и код загрузки остаётся одинаковым при смене метода. Часть методов, среди них AWQ, AutoRound, AQLM, compressed-tensors и GGUF, загружается только из чекпоинта: сначала модель квантуют библиотекой самого метода, затем результат загружают в Transformers. Для методов с собственной конфигурацией, например TorchAoConfig или BitsAndBytesConfig, калибровочный набор обычно не нужен, а GPTQ составляет исключение и калибруется на данных во время загрузки.
Документация bitsandbytes описывает библиотеку как лёгкую обёртку на Python вокруг функций аппаратного ускорителя. Она даёт слои Linear8bitLt и Linear4bit, заменяющие стандартные линейные слои PyTorch, и 8-битные версии оптимизаторов. Метод LLM.int8() динамически сохраняет повышенную точность для критичных вычислений, а QLoRA сжимает модель до 4 бит и добавляет небольшие обучаемые низкоранговые веса. Поддержка заявлена на GPU NVIDIA для CUDA версий 11.8–13.0, Intel XPU, Intel Gaudi (HPU) и CPU.
Документация torchao описывает стек квантования: базовые типы данных, примитивные операции, эффективные ядра и квантованный тензор как подкласс torch.Tensor с дополнительными метаданными вроде масштаба. Там же указано, что типы uint1–uint7 и int1–int7 в текущей реализации остаются заполнителями без рабочих операций, а производные типы вроде mxfp4 собираются из базовых.
Блог PyTorch приводит результаты для torchao: снижение пиковой видеопамяти на 73% для инференса Llama 3.1 8B при контексте 128K с квантованным KV-кэшем, ускорение 53.88% на Flux.1-Dev и 27.33% на CogVideoX-5b, а также запуск Llama 3.1 8B на полном контексте 128K менее чем в 18.9 ГБ видеопамяти при весах int4 и KV-кэше int8. Эти числа относятся к названным моделям и конфигурациям.
| Утверждение | Источник | Границы |
|---|---|---|
| 8B в bf16 ≈ 16 ГБ, 8 бит ≈ 8 ГБ, 4 бита ≈ 4–5 ГБ | документация Transformers | ориентир на веса |
| Более 20 методов через from_pretrained() | документация Transformers | единый код загрузки |
| Загрузка GGUF в Transformers обычно распаковывает веса | документация Transformers | конкретный путь загрузки; описано исключение MPS с kernels |
| CUDA 11.8–13.0, Intel XPU, Gaudi, CPU | документация bitsandbytes | заявленная поддержка |
| −73% пиковой VRAM, Llama 3.1 8B, 128K | блог PyTorch | названная конфигурация |
| uint1–uint7 и int1–int7 — заполнители | документация torchao | текущая реализация |
Версии, порты и ограничения одного продукта не переносятся на другой. Поддержка CUDA 11.8–13.0 относится к bitsandbytes и ничего не говорит о других библиотеках.
Случай, где подход не решает задачу
Квантование весов может не решить задачу, если память под веса не является узким местом. Другой случай — загрузчик распаковывает файл обратно в полную точность. Документация Transformers описывает такое поведение для большинства GGUF в своей интеграции. Вывод относится к этой библиотеке; его нельзя переносить на любой запуск GGUF.
Второй случай — рост задержки. В блоге PyTorch отмечено, что квантование слоя иногда делает его медленнее из-за накладных расходов. Модель занимает меньше памяти, а отвечает дольше. Для интерактивной задачи это ухудшение.
Третий случай — задачи, чувствительные к точности вычислений. Посттренировочное квантование ниже 4 бит может давать серьёзную деградацию, и тогда верные ответы на сложение или извлечение подстроки ещё не означают сохранения качества на длинных рассуждениях. Три учебных кейса ловят грубую поломку и пропускают тонкую.
Четвёртый случай — несовпадение цели. Квантование весов и квантование векторов в базе данных — разные задачи с разными инструментами. Подход не заменяет LoRA и дистилляцию: QLoRA сочетает 4-битные веса с обучаемыми низкоранговыми добавками, и это отдельная техника.
Проверять пользу стоит по своему сценарию. Если модель помещается в память без квантования и отвечает достаточно быстро, выигрыш может оказаться нулевым или отрицательным.
Как соотносятся PTQ, QAT и другие методы
Границы темы очерчены ясно. Квантование весов и активаций снижает точность представления чисел. Ошибка округления — его прямое следствие. Посттренировочное квантование (PTQ) применяется к готовой модели, обучение с учётом квантования (QAT) учитывает низкую точность в процессе тренировки. В блоге PyTorch приведён результат QAT: восстановление до 96% деградации точности на hellaswag.
Соседние темы отличаются по механизму. Прунинг удаляет или зануляет веса и связи; изменение структуры зависит от выбранного вида разреженности. Дистилляция обучает меньшую модель воспроизводить поведение большей. Квантование меняет формат хранения чисел и сохраняет структуру слоёв. Эти техники можно комбинировать: в блоге PyTorch описано совместное применение разреженности и квантования с ускорением 5% для инференса ViT-H.
Отдельно стоит квантование векторов в базах данных. Там сжимаются эмбеддинги для поиска, и метрики качества другие. Инструменты и термины пересекаются по названию, задачи различаются.
Практический вывод для читателя: определите, что именно ограничивает работу — размер файла, видеопамять, скорость или качество ответов. Квантование адресует часть этих ограничений, и замер до и после показывает, какие именно.
Частые вопросы
Что значит квантизация модели простыми словами?
Это хранение весов модели в меньшем числе бит вместо чисел с плавающей точкой высокой точности. Документация Transformers приводит ориентир: модель на 8B в bf16 занимает около 16 ГБ на веса, при 8 битах — около 8 ГБ, при 4 битах — около 4–5 ГБ. Экономия памяти достигается за счёт точности представления чисел. Каждый метод по-своему балансирует память, скорость и качество.
Квантизация и прунинг — это одно и то же?
Нет, механизмы разные. Квантование меняет формат хранения чисел и сохраняет структуру слоёв. Прунинг удаляет или зануляет веса и связи; структурный вариант может менять устройство слоёв. В блоге PyTorch описано совместное применение разреженности и квантования с ускорением 5% для инференса ViT-H. Эти техники дополняют друг друга.
Чем квантизация отличается от дистилляции?
Дистилляция обучает меньшую модель воспроизводить поведение большей. Квантование снижает точность представления чисел в уже существующей модели. QLoRA сочетает 4-битные веса с обучаемыми низкоранговыми добавками, и это отдельная техника. Смешивать эти подходы в одном термине не стоит.
Почему 4-битная модель не всегда быстрее 8-битной?
В блоге PyTorch отмечено, что квантование слоя иногда делает его медленнее из-за накладных расходов. Документация Transformers описывает распаковку большинства GGUF в своей интеграции: размер файла не определяет поведение всех загрузчиков. Скорость зависит от ядер, оборудования и конкретного слоя.
Как проверить качество после квантования?
Возьмите одну модель в двух точностях и набор задач с однозначными ответами. Подойдут извлечение подстроки, сложение и возврат null для отсутствующих данных. Заполните таблицу с полями precision, device, context, peak_memory, latency и результатами по каждой задаче. Три кейса ловят грубую поломку, тонкую деградацию они не показывают.
