Привет!
Задумывались, какую версию квантованной LLM выбрать: Q4_K_M, Q6_K или Q8_0? Насколько Q6_K хуже справляется с задачами по сравнению с Q8_0? И что вообще означают все эти буквы в суффиксах?

Примечание: это адаптированный перевод моей статьи на Medium. Перевод был сделан при помощи мозга, а не нейросетей или Google Translate.

Типичные муки выбора при загрузке квантованной LLM с Hugging Face
Типичные муки выбора при загрузке квантованной LLM с Hugging Face

В статье разберёмся, что означают суффиксы вроде Q4_K_M, почему Q4 ≠ int4, и как не потеряться на собеседовании, если спросят про тонкости квантования.
Давайте разбираться!

Как понимать суффиксы

Квантование — это всегда компромисс между точностью, скоростью и размером модели. Суффиксы вроде Q4_K_M помогают быстро понять, в какую сторону сдвинут этот баланс.

Что значат суффиксы:

  • Q — означает, что модель квантована. Если углубляться в конкретный метод квантования - GWQ (group-wise quantization), поскольку есть другие, на данный момент менее распространённые.

  • Цифра после Q (например, Q4) — количество бит на один вес

  • K — группировка весов (каждая группа имеет свой scale и zero-point)

  • 0 — без группировки (устаревшая схема)

  • S — small, низкая точность, выше скорость, но ниже качество

  • M — medium, средняя точность

  • L — large, высокая точность, самая медленная и точная

Что именно значит группировка (K и 0), разберём чуть позже.

Итак, давайте разберём, что конкретно означает суффикс Q4_K_M:

  • Q4 — квантованная модель с 4-битными весами

  • K — группировка весов (по 64 и более), с индивидуальным масштабом

  • M — средняя точность (оптимальный баланс между качеством и размером)

Веса

Что означает, что на один вес приходится 4 или 8 бит? Веса — это числовые параметры, определяющие, насколько сильно каждый вход влияет на выход нейрона. Именно они участвуют в каждом шаге инференса: умножаются, складываются и передаются дальше по слоям модели.

Цифра перед b в названии модели (например, Gemini-12b) указывает, сколько миллиардов весов в ней. Например, в Gemini-12b — 12 миллиардов весов, и при генерации одного токена может использоваться от 1 до 12 миллиардов весов в разных слоях сети. При обучении веса обычно сохраняются в формате Float32 или Float16 — то есть занимают 32 или 16 бит каждый.

как хранится Float32 (источник: puntoflotante.net)
как хранится Float32 (источник: puntoflotante.net)

Использовать такие модели в изначальном виде невозможно на обычном железе. Чтобы сделать модели легче, был введён процесс квантования — перевод весов из float в int с меньшим числом бит. Идея простая - уменьшить количество бит, в которых хранится значение каждого веса.

Казалось бы, можно просто обрезать Float32 до Int4 — но это не работает:

int8(0.123456) = 0

Наивное округление обнуляет значение и полностью теряет информацию. Даже если извлечь только мантиссу, она всё равно будет слишком длинной, чтобы уложиться в 4–6 бит — и точность резко упадёт.

Поэтому вместо грубого округления используют масштабирование (scale), нулевую точку (zero point) и группировку.

Пример:

Оригинальные веса: [0.11, 0.09, 0.12, 0.10, ..., 0.15]
Scale = 0.005
Zero point = 0.08
Квантованные значения: [6, 2, 8, 4, ..., 14]

В момент инференса веса восстанавливаются так:

вес = scale * квант + zero_point

При деквантовании (переводе int значений назад во float во время инференса) квантованные 6, 2, 8 становятся:

Как видим, даже при 4 битах на вес можно достичь приличной точности — благодаря масштабированию и группировке.
? Вывод: при Q4 квантовании мы НЕ просто сжимаем 32- и 16- битовые Float в Int4 - мы сохраняем метаданные для каждой группы, которые позволяют нам восстанавливать числа с высокой степенью точности.

Группировка (K и 0)

Масштаб (scale) и нулевая точка (zero point) вычисляются отдельно для каждой группы весов. Это позволяет эффективно сжать значения весов до 4–6 бит при минимальной потере точности. Обычно веса делятся на группы фиксированной длины — например, по 64 элемента подряд.

Возникает логичный вопрос: подбираются ли веса в группы по схожести значений?
Нет. Группы формируются не по значению весов, а по их порядку в памяти (или в тензоре модели). Это сохраняет структуру модели и эффективно работает с памятью GPU. Например, квантизатор может просто взять первые 64 значения из тензора и сформировать из них одну группу.

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


Это и означает суффикс K: группировка весов, обеспечивающая более точное и адаптивное квантование.
Если вместо K указано 0 (например, Q4_0), значит используется упрощённая схема без группировки: общий scale применяется ко всему тензору (или строке тензора). Это быстрее, но менее точно.

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

? Вывод: если есть выбор между K и 0, почти всегда стоит выбирать K. Модели с 0 подойдут только при жёстких ограничениях по железу.

Вместо итогов

Эта статья — лишь базовое введение в тему квантования нейросетевых моделей. Мы не затрагивали более продвинутые техники, такие как QAT (quantization-aware training), а также различия между статическим и динамическим квантованием.

Тем не менее, даже простое понимание суффиксов вроде Q4_K_M, Q6_K и Q8_0 уже даёт практическую опору при выборе модели под ваше оборудование и задачи.

? Конечно, теория — это лишь начало.

Чтобы по-настоящему разобраться в квантованных форматах, надо попробовать их в деле. Скачайте модели (например Qwen или Gemma) в форматах Q4_K_M, Q6_K, Q8_0. Прогоните их на сложных промптах. Сравните скорость, стабильность, качество отклика. Понять все оттенки квантования можно только одним способом — пропустить их через собственное железо.

Комментарии (5)


  1. whileTrueCry
    16.06.2025 18:10

    Для продакшена я бы рекомендовал Q6_K или Q8_0: в них баланс точности и скорости обычно оказывается оптимальным.


    1. GiantLynx Автор
      16.06.2025 18:10

      Всё так и есть. Я бы ещё добавил, что Q8_0 может быть предпочтительнее там, где нужна генерация кода или какой-нибудь серьёзный reasoning, Q6_K подошёл бы лучше для обычных чатботов или ассистентов, которые дают короткие ответы.


  1. Shannon
    16.06.2025 18:10

    M — средняя точность, L — низкая точность, выше скорость, но ниже качество

    L и S перепутаны. M - medium, L - large, S - small. Смысл значений S, M, L в том какие тензоры как будут квантованы.

    Упрощенно говоря, каждый слой модели состоит из 2 видов тензоров: это тензоры внимания attn текущего слоя и тензоры полносвязной сети ffn, основное тело модели.
    Указание Qx - где x число от 1 до 8, это квантование именно ffn тензоров.
    Указание S, M, L - означает, что важные тензоры внимания будут квантованы на 1, 2 или 3 шага выше, чем число X. Именно тензоры внимания определяют, на сколько квантованная модель будет качественной.

    Дальше идут IQ кванты.
    IQ - это квантование с использованием imatrix, матрицы важности. imatrix создается из обычного текстового файла, в который собирается типичное использование модели, примеры программирования, языка, фактов и т.д. Во время квантования те блоки, что откликаются на текст из этого файла, квантуются выше, те, которые ни на что не откликаются, получают более низкий квант. За счет этого уменьшается вес квантованной модели оставляя почти тоже качество. "Почти тоже" тут главное, так как важно, чтобы imatrix попала в ваш сценарий использования. Обычно матрица делается из английских слов, соответственно, русский язык может не особо хорошо перенести такое квантование, но обычно i-кванты нормально работают.

    Дальше идёт динамическое квантование, сейчас таких два: UD и R4.

    UD-...-XL - квантование Unsloth Dynamic 2.0. XL означает, что важные тензоры оставлены в очень высоком качестве. Поэтому даже UD 2-битное (UD-Q2_K_XL ) сравнимо с оригиналом по качеству, теряя всего несколько процентов на примере DeepSeek R1, будучи в 3.3 раза меньше по размеру (212гб против 700гб).

    https://arxiv.org/html/2505.02390v1
    https://arxiv.org/html/2505.02390v1

    R4 - это sota квантование от ikawrakow, уже известного ранее созданием хороших квантов, вроде IQ4_XS. Сейчас он создал форк ik_llama сосредоточившись на оптимизации CPU и гибридного GPU/CPU. R4 доступен только в ik_llama, но там есть возможность конвертации либо на лету, во время загрузки, либо скриптом. Также в ik_llama реализовано MLA, оригинальная технология DeepSeek, позволяющая в 11гб памяти засунуть 160к контекста. И другие оптимизации для MoE моделей DeepSeek, Qwen3, Llama4.

    R4 позволяет создать самый маленький квант R1 в мире, занимающий всего 130 гб и подходящий для домашних ПК 128гб + 1 GPU:

    Также ik_llama недавно добавил квантование iqN_rt, это Trellis квантование аналогичное QTIP, используемого в exl3. Trellis квантование находит оптимальные параметры для каждого блока позволяет ещё лучше сохранить свойства оригинальной модели при минимальном bpw, на графике это IQ2_KT. KLD лучше отображает снижение качества, чем PPL.

    RMS Δp показывает среднее отклонение показателей от Q8_0 кванта.
    RMS Δp показывает среднее отклонение показателей от Q8_0 кванта.


    1. GiantLynx Автор
      16.06.2025 18:10

      Спасибо за развёрнутый комментарий. Исправил про группы S, M, L.

      Но мне нигде не удалось найти инфомрацию, что Qx - отображает квантование тензоров ffn, а S, M, L - тензоров внимания, по крайней мере применительно к Group-wise квантованию. Есть ссылки, где почитать?

      IQ, R4 и UD — это отдельный интереснейший пласт. Наверное, это уже материал для отдельной статьи, спасибо за наводки!


      1. Shannon
        16.06.2025 18:10

        Не помню точно, где-то вот тут: https://github.com/ggml-org/llama.cpp/pull/1684
        Или вот тут: https://huggingface.co/docs/hub/gguf#quantization-types