1. Введение
Модели семейства RWKV с линейной по длине последовательности рекуррентной структурой привлекательны для локального запуска, но инструментов квантования для них заметно меньше, чем для трансформеров. В этой работе я описываю инструмент rwkv-quant, сжимающий RWKV-7 двумя готовыми пресетами, и систематически разбираю, где именно при квантовании теряется качество и как это зависит от размера модели.
Работа началась с наблюдения, которое противоречит обычной интуиции «чем больше модель, тем меньше относительная потеря». Пресет COMPRESSION на 2.9B показал +4.04% по перплексии против +2.85% на 1.5B. Выяснение причины заняло основную часть исследования и привело к набору результатов, которые я считаю полезными независимо от конкретного инструмента.
Вклад работы.
Локализация потерь. Разложение KL по группам матриц (leave-one-out) показывает, что на 2.9B вред сосредоточен в двух местах: выходной проекции нулевого блока (
o_projслоя 0) и таблице эмбеддинга. Хранение первой в bf16 стоит 0.5% файла и снимает 39% KL; перевод второй с 5 на 6 бит стоит 1.1% файла и снимает ещё 22% (раздел 4).Механизм и предсказуемость. Вход проблемной матрицы несёт массивный канал, но сама концентрация энергии вред не предсказывает: у 7.2B она выражена сильнее всех, а модель квантуется лучше всех. Я показываю, что три естественные локальные метрики ошибки не работают, и описываю метрику, которая работает: ошибка в остаточном потоке, умноженная на измеренное усиление (раздел 5).
Автоподбор битности по правилу «вред на байт», работающий в обе стороны (одна цена байта для повышения и понижения), с измерением по одной матрице за проход (раздел 6).
GPTQ на сетке пресета без изменения формата, ядер и размера файла; показано, что регуляризация важнее размера калибровки и что методы автоподбора и GPTQ складываются почти мультипликативно (раздел 7). GPTQ в пресете REDUCTION описан в разделе 8.
Сводка по шести размерам от 0.1B до 13.3B с доверительными интервалами, полученными парным бутстрэпом по окнам (раздел 9), и сравнение с GGUF и MLX при равном размере файла (раздел 10).
Методологические находки. Утечка калибровочного корпуса в оценочный набор и её измеренный масштаб (раздел 3.4); разброс результата GPTQ между численно эквивалентными реализациями и его количественная оценка (раздел 7.6); четыре инженерные ошибки, исказившие измерения (приложение A).
2. Связанные работы
Квантование с коррекцией ошибки. GPTQ (Frantar et al., 2022) квантует колонки матрицы по одной и разносит ошибку каждой на ещё не квантованные колонки через обратный гессиан входных активаций. Я переношу GPTQ на асимметричную суперблочную сетку (раздел 7) и симметричную сетку типа Q6_K (раздел 8). Формат файла и ядра при этом не меняются.
Взвешивание по активациям. AWQ и матрица важности imatrix в llama.cpp используют статистики активаций, чтобы защитить более важные каналы. В моём инструменте статистика активаций (AW, activation-weighted) определяет выбор масштаба и сдвига групп весов; без неё 4 бита в o_proj разрушают 2.9B (раздел 4.3).
Выбросы и массивные активации. Dettmers et al. (2022, LLM.int8()) описали выбросы признаков, концентрированные в нескольких каналах скрытого состояния, и их роль в деградации квантованных трансформеров. Sun et al. (2024) описали «массивные активации» — значения на порядки больше медианных в немногих каналах. Массивный канал на входе o_proj нулевого блока (раздел 4.3) — прямая родня этих явлений, но, как я покажу, его сила сама по себе не предсказывает вред.
3. Постановка и методика
3.1 Модели
Исследуется линейка RWKV-7 шести размеров. Для изоляции факторов использованы три пары: 0.4B/1.5B (одна глубина, ширина вдвое больше), 2.9B/7.2B (одна глубина L=32, ширина 2560 против 4096) и 7.2B/13.3B (одна ширина, глубина 32 против 61).
модель |
слоёв L |
ширина D |
голов H=D/64 |
D/L |
серии чекпоинтов |
|---|---|---|---|---|---|
0.1B |
12 |
768 |
12 |
64 |
g1d |
0.4B |
24 |
1024 |
16 |
42.7 |
g1d |
1.5B |
24 |
2048 |
32 |
85.3 |
g1d, g1h, g1j |
2.9B |
32 |
2560 |
40 |
80 |
g1h, g1j |
7.2B |
32 |
4096 |
64 |
128 |
g1j |
13.3B |
61 |
4096 |
64 |
67.2 |
g1j |
Итоговые таблицы (разделы 9–10) относятся к серии g1j; диагностика (раздел 4) частично использует g1d и g1h, это указано в тексте.
3.2 Пресеты
Инструмент rwkv-quant сжимает модель двумя пресетами.
REDUCTION (почти без потерь). Проекции (
proj) — 8 бит, симметричная раскладкаsym_awс группой 16 весов;cmix(каналовое микширование, FFN) — 6 бит; эмбеддинг и голова — 8 бит; LoRA-веткиw,a,v— 6 бит,g— 8 бит (блок 64). Сжатие около 2.1x.COMPRESSION (агрессивный). Проекции — 4 бита, асимметричная суперблочная раскладка
asym_sb6_awс группой 32;cmix— 4 бита, ноffn.key— 5 бит; эмбеддинг — 6 бит (в ранних измерениях 5, раздел 4.5); голова — 5 бит; LoRA-ветки те же, что в REDUCTION. Сжатие около 3.1x.
В раскладках с суффиксом _aw масштаб и сдвиг каждой группы подбираются поиском, взвешенным по среднему квадрату входной активации канала E[x²], то есть по статистике, снятой на калибровочном корпусе. Раскладка REDUCTION симметричная (масштаб на блок из 16 весов, без сдвига; int8-коды масштабов против одного fp16-множителя на суперблок из 16 блоков; 6 или 8 бит). Раскладка COMPRESSION (sb6) асимметричная суперблочная: блок из 32 весов, суперблок из 8 блоков (256 колонок); масштаб и сдвиг каждого блока хранятся 6-битными кодами qs и qm относительно двух fp16-множителей суперблока.
Не квантуются и хранятся в bf16 малые поканальные векторы (k_k, k_a, r_k), нормы и bias LoRA-веток. У таблицы эмбеддинга статистики активаций нет (её вход — индексы токенов), поэтому её сетка в обоих пресетах подбирается без AW-взвешивания; GPTQ эмбеддинг также не затрагивает.
Две правки, найденные в разделе 4, входят в финальный COMPRESSION: выходная проекция нулевого слоя (o_proj слоя 0) хранится в bf16, эмбеддинг — в 6 битах. Пресет без этих правок в тексте называется «базовым» (в логах compression_nol0).

Рис. 1. Конвейер quantize(). Статистика активаций E[x²] используется автоподбором, GPTQ и записью; результат автоподбора дописывается в конфиг (bits_overrides). Калибровка не зависит от платформы; формат и бэкенд отделены от неё.

Рис. 2. Битность матриц в пресетах REDUCTION и COMPRESSION. Выделены две фиксированные правки: o_proj слоя 0 в bf16 и эмбеддинг на 6 бит вместо 5 (раздел 4). Автоподбор (раздел 6) меняет биты отдельных матриц поверх пресета COMPRESSION.
3.3 Метрики и приборы
Основная метрика — KL(bf16‖квант) на токен: расхождение распределения следующего токена у квантованной модели от распределения bf16-модели. Эталонные логиты считаются в fp32 и сохраняются на диск (5.09 ГБ на модель). Вторая метрика — относительное изменение перплексии (Δppl, в процентах) к bf16-модели. Эталон принимается числом (оценка эталонного плеча), а не размером файла.
Используются два пути вычислений, и их абсолютные KL различаются, поэтому сравнивать можно только внутри одного прибора:
fake-путь (PyTorch): веса квантуются и тут же деквантуются, вычисления в плотных тензорах; работает на Mac (MPS) и на сервере (CUDA);
реальный путь (MLX): коды упакованы в формат
.rwkvqи читаются Metal-ядрами; только Mac.
Приборы перечислены в приложении C.
3.4 Оценочные наборы и утечка
Первый набор eval_corpus_multiling (en/ru/sr, 38 окон по 512 токенов) использовался в разделах 4–6 и оказался целиком лежащим внутри калибровочного корпуса пакета: общих 16-грамм 100%. Для метода, калибруемого по корпусу, это прямая утечка.
Масштаб утечки измерен на GPTQ (раздел 7), откалиброванном по корпусу пакета: на 1.5B выигрыш по KL текста составил −61.8% на старом наборе и −27.1% на чистом, то есть утечка завысила выигрыш в 2.3 раза. Код чист (одно окно из 24 содержит общие 16-граммы, 0.03%).
AW-статистика задета частично: её 23 окна по 512 токенов содержат 23.9% 16-грамм старого набора и пересекаются с 13 из 38 его окон. Абсолютные числа раздела 4 получены на тексте, по которому AW частично взвешивала поиск; направление смещения в пользу AW, величина не измерялась. Сравнения внутри раздела (какая матрица, какой бит) сделаны при одной и той же статистике, и смещение входит в оба плеча. Автоподбор утечкой не воспользовался: на 1.5B −16.1% на старом наборе и −17.6% на чистом.
Чистые наборы (ни одной общей 16-граммы ни с одним калибровочным корпусом):
eval_text_heldout: Википедия en/ru/sr, по 12 окон на язык (36 окон);eval_code_heldout: 24 окна Python/Swift (закрытый набор);eval_code_open: 48 окон (24 Python, 24 Swift) из открытых репозиториев автора.
Правило: любой калиброванный метод мерится только на чистых наборах, и перед замером проверяется, что пересечение 16-грамм калибровки с набором равно нулю. Разделы 4–5 и таблица выбора порога в разделе 6.3 измерены на старом наборе (в таблице раздела 6.3 окна не участвовали в выборе, но лежат внутри калибровочного корпуса); результат автоподбора перепроверен на чистых наборах в разделе 6.4. Разделы 7–10 используют только чистые наборы.
3.5 Статистика
Доверительные интервалы строятся парным бутстрэпом по окнам (20 000 повторов, окна ресэмплируются вместе для обоих сравниваемых плеч). При сравнении с чужими форматами то же самое делается для отношений KL. У KL полуширина 95%-интервала составляет 7–12% от значения. Дополнительно, для оценки разброса самого GPTQ между реализациями, использованы реплики с переставленным порядком окон калибровки (раздел 7.6).
4. Где теряется качество
Замечание о наборах. Измерения разделов 4 и 5 сделаны на первом оценочном наборе (раздел 3.4), частично пересекающемся с AW-статистикой. Абсолютные значения могут быть слегка смещены в пользу AW; сравнения между матрицами и битностями внутри раздела сделаны при одной статистике. Все дальнейшие результаты (разделы 6.4–10) получены на чистых наборах уже с найденными здесь правками в пресете.
Базовый вопрос: почему COMPRESSION на 2.9B деградирует сильнее, чем на 1.5B (+4.04% против +2.85% по ppl)?
4.1 Разложение потерь по группам матриц
Вклад группы матриц определяется методом leave-one-out: вклад = KL(всё квантовано) − KL(всё, кроме этой группы). Результаты для серии g1h, реальный путь (Mac, MLX):
группа |
1.5B: KL (доля) |
1.5B: ppl, п.п. |
2.9B: KL (доля) |
2.9B: ppl, п.п. |
|---|---|---|---|---|
|
0.00578 (16%) |
0.64 |
0.02368 (46%) |
1.82 |
|
0.01317 (37%) |
0.99 |
0.01035 (20%) |
0.63 |
эмбеддинг |
0.00120 (3%) |
0.07 |
0.00874 (17%) |
0.83 |
|
0.00442 (12%) |
0.43 |
0.00400 (8%) |
0.36 |
голова |
0.00440 (12%) |
0.39 |
0.00310 (6%) |
0.36 |
|
0.00443 (12%) |
0.37 |
0.00378 (7%) |
0.52 |
|
≤4% |
≤0.08 |
≤2% |
≤0.12 |
Сумма вкладов равна 101% и 107%, то есть группы почти аддитивны. На 2.9B выделяются две группы: o_proj (46% всего KL) и эмбеддинг (17%); на 1.5B их вклад скромный (16% и 3%), главный вклад даёт cmix.value.
Тот же разбор на сервере (fake-путь, серия g1j, базовый пресет compression_nol0) подтверждает картину:
модель |
базовый KL |
|
весь |
эмбеддинг |
|
голова |
|---|---|---|---|---|---|---|
1.5B |
0.050962 |
0.5% |
13% |
2.8% |
29% |
8.3% |
2.9B |
0.077513 |
39% |
45% |
30% |
— |
— |
7.2B |
0.022984 |
3.9% |
13% |
8.4% |
25% |
9.4% |

Рис. 3. Доли потерь KL по группам матриц (leave-one-out, реальный путь, серия g1h), 1.5B и 2.9B. Данные первой таблицы раздела.
4.2 Главная находка: o_proj нулевого слоя
На 2.9B 85–86% вклада всей группы o_proj приходится на одну матрицу: выходную проекцию нулевого блока. Прямой эксперимент (реальный путь, 2.9B, g1h) сравнивает базовый пресет с его вариантами, в которых отдельные части o_proj хранятся с большей точностью:
плечо |
KL |
ppl |
en / ru / sr |
прирост файла |
|---|---|---|---|---|
базовый |
0.052048 |
+4.04% |
+4.24 / +3.21 / +5.71 |
— |
|
0.031966 |
+2.43% |
+3.02 / +2.19 / +2.36 |
+9.4 МБ (+0.5%) |
|
0.051512 |
+4.07% |
≈ базовый |
+9.4 МБ |
весь |
0.046043 |
+3.54% |
ru хуже: 3.21→3.44 |
+26.2 МБ |
весь |
0.036305 |
+2.89% |
— |
+52.4 МБ |
Одна матрица 2560×2560 в bf16 возвращает 85% вклада группы o_proj за 0.5% файла и работает лучше, чем перевод всего o_proj в 6 бит за 2.8% файла. Контрольное плечо (слой 31) эффекта не даёт, то есть дело именно в нулевом слое. После правки 2.9B становится лучше 1.5B: +2.43% против +2.85%.
Та же правка на других масштабах (реальный путь):
пресет |
модель |
KL: базовый → с правкой |
ppl |
прирост файла |
|---|---|---|---|---|
COMPRESSION |
0.1B |
0.08960 → 0.08279 (−7.6%) |
+8.68% → +8.01% |
+0.8 МБ |
COMPRESSION |
0.4B |
0.04965 → 0.04891 (−1.5%) |
+4.31% → +4.28% |
+1.5 МБ |
COMPRESSION |
1.5B |
0.03599 → 0.03585 (−0.4%) |
+2.85% → +2.87% |
+6.0 МБ |
COMPRESSION |
2.9B |
0.05205 → 0.03197 (−39%) |
+4.04% → +2.43% |
+9.4 МБ |
REDUCTION |
0.4B / 1.5B |
без изменений |
— |
+1.0 / +3.9 МБ |
REDUCTION |
2.9B |
0.001635 → 0.001573 (−3.8%) |
+0.08% → +0.06% |
+6.1 МБ |
Значимы только эффекты на 0.1B и 2.9B: на 0.4B и 1.5B изменение кросс-энтропии не отличается от нуля. Поправка существенна лишь в COMPRESSION на 2.9B и, в меньшей степени, на 0.1B.
4.3 Механизм: массивный канал на входе o_proj слоя 0
Вход o_proj нулевого слоя несёт «массивный канал»: один-два канала на несколько порядков сильнее остальных по среднему квадрату активации E[x²].
модель |
max/медиана E[x²] |
доля энергии в 8 каналах |
номер канала |
|---|---|---|---|
0.1B g1d |
2 628 |
0.77 |
112 |
0.4B g1d |
22 580 |
0.91 |
53 |
1.5B g1d |
2 245 |
0.46 |
1202 |
1.5B g1h |
3 740 |
0.53 |
1202 |
1.5B g1j |
4 227 |
0.54 |
1202 |
2.9B g1h |
7 199 995 |
0.98 |
517 |
2.9B g1j |
7 564 462 |
0.98 |
517 |
7.2B g1j |
6 626 554 |
0.99 |
160 |
Номер канала один и тот же у всех серий одной ширины: 1202 у трёх серий 1.5B, 517 у двух серий 2.9B. Следовательно, это свойство ширины и архитектуры, а не конкретного прогона обучения.
Насколько AW-статистика держит эту матрицу, видно из плеча «o4s»: те же 4 бита, но поиск без AW, только в o_proj.
модель |
KL: базовый → без AW |
ppl |
|---|---|---|
1.5B |
0.035992 → 0.042974 |
+2.85% → +3.57% |
2.9B |
0.052048 → 0.340025 |
+4.04% → +37.2% |
На 2.9B AW держит почти всё: без неё 4 бита в o_proj разрушают модель.
4.4 Почему именно 2.9B, а не «все большие модели»
Ожидание «больше модель — меньше деградация» в целом верно: на 2.9B все обычные группы (r, k, v, cmix, голова, LoRA) уносят меньше, чем на 1.5B, даже в абсолютных числах. Выбиваются только o_proj и эмбеддинг.
Однако на 7.2B массивный канал выражен сильнее всех (99% энергии в восьми каналах), а квантуется эта модель лучше всех: базовый KL 0.023 против 0.078 у 2.9B и 0.051 у 1.5B (одна серия g1j, один прибор), и правка слоя 0 даёт там лишь −3.9%. Значит, сила массивного канала сама по себе не объясняет вред.
Прямой замер вреда от квантования одной матрицы (квантуется только o_proj слоя 0, остальное в bf16) на 2.9B и 7.2B:
KL |
‖Δx‖/‖x‖ на слое 0 |
пик по глубине |
|
|---|---|---|---|
2.9B |
0.020290 |
13% |
31% (слои 13–16) |
7.2B |
0.001427 |
3.4% |
6.7% (слой 13) |
Разница в 14 раз по KL создаётся в момент впрыска ошибки в остаточный поток, а не при её распространении: усиление вниз по глубине у обеих моделей близкое (2.4x и 2.0x к середине сети). Это подводит к вопросу, чем вред вообще предсказывается (раздел 5).

Рис. 4. Сила массивного канала (max/медиана E[x²]; серии g1j) и вред от квантования только o_proj слоя 0 на 2.9B и 7.2B. Сила канала почти одинакова, вред различается в 14 раз.
4.5 Второй адрес: эмбеддинг
На 2.9B эмбеддинг уносит 17% KL (серия g1h) и 30% (g1j), на 1.5B — 3%. Перевод эмбеддинга из 5 бит в 6 (реальный путь, поверх пресета с правкой слоя 0):
модель |
KL |
ppl |
en / ru / sr |
прирост файла |
|---|---|---|---|---|
2.9B, базовый |
0.031966 |
+2.43% |
+3.02 / +2.19 / +2.36 |
— |
2.9B, эмбеддинг в 6 бит |
0.024885 (−22%) |
+1.86% |
+2.33 / +1.66 / +1.82 |
+21.0 МБ (+1.13%) |
2.9B, эмбеддинг в bf16 |
0.024539 (−23%) |
+1.82% |
— |
+220 МБ |
1.5B, эмбеддинг в 6 бит |
0.034933 (−2.6%) |
+2.82% |
шум |
+16.8 МБ |
6 бит забирают 95% того, что даёт полный bf16, в десять раз дешевле. Восемь бит для эмбеддинга недоступны: суперблочная раскладка знает только 4, 5 и 6 бит. Обе правки вместе переводят 2.9B с +4.04% до +1.86% ценой примерно 1.6% файла.
Решение: эмбеддинг в 6 бит входит в COMPRESSION всегда. Пересчёт по записанным файлам (реальный путь, 38 окон, прежний файл меряется тем же прибором рядом):
модель |
ppl: было → стало |
KL: было → стало |
ΔCE, 95% ДИ |
прирост файла |
|---|---|---|---|---|
0.1B |
+8.00% → +7.50% |
0.0828 → 0.0780 |
значимо |
+6.3 МБ (+4.9%) |
0.4B |
+4.28% → +4.20% |
0.0489 → 0.0468 |
в шуме |
+8.4 МБ (+2.9%) |
1.5B |
+2.87% → +2.82% |
0.0359 → 0.0349 |
в шуме |
+16.8 МБ (+1.7%) |
2.9B |
+2.43% → +1.85% |
0.0320 → 0.0249 |
значимо |
+21.0 МБ (+1.1%) |
Цена правки — только байты файла: в COMPRESSION эмбеддинг разворачивается в плотный fp16 (gather применим лишь к симметричной раскладке), и на каждый токен читается одна строка таблицы.
4.6 Скорость
Скорость декода 2.9B измерена на двух файлах, собранных одним кодом и отличающихся только слоем 0 (bf16 против квантованной матрицы), с чередованием ABBA в одном процессе:
порядок загрузки |
разница |
|---|---|
файл без правки первым |
−0.40 мс/ток (−1.6%) |
файл с правкой первым |
−0.52 мс/ток (−2.2%) |
контроль A/A |
−0.02 [−0.13; +0.10] |
Файл с bf16-матрицей не медленнее, а быстрее, хотя читает на 9.4 МБ больше. Механизм не выяснен: одна матрица не должна давать полмиллисекунды, и я не утверждаю объяснения. Вывод, который из этого следует практически: правка слоя 0 не стоит скорости.
5. Что предсказывает вред от квантования матрицы
Раздел 4 показывает, что вред от квантования очень неравномерен между матрицами и что одна матрица с «массивным» входом может быть важнее целой группы. Возникает вопрос, можно ли предсказать такие матрицы заранее, не квантуя каждую по отдельности. Я проверил три естественных признака и все три отвергли.
Признак 1: концентрация энергии входа. Доля энергии в восьми каналах не предсказывает вред: 0.99 у 7.2B (вреда практически нет), 0.77 у 0.1B (вред есть), 0.91 у 0.4B (вреда нет).
Признак 2: диагональная ошибка выхода слоя
У нулевого слоя она наименьшая во всех пяти проверенных моделях. Причина понятна: AW-поиск минимизирует именно эту величину, то есть признак измеряет качество поиска, а не вред.
Признак 3: честная локальная ошибка впрыска ‖(W−Ŵ)X‖/‖WX‖ на настоящих активациях. На 2.9B максимум у ffn.value слоёв 15–19 (0.16), а o_proj слоя 0 не попадает даже в первую дюжину. Контроль: квантование только blocks.15.ffn.value даёт KL 0.000776 против 0.020290 у o_proj слоя 0, то есть в 26 раз меньше вреда при вчетверо большей локальной ошибке.
Вывод. Локальная ошибка нормирована не на то. Значима ошибка, внесённая в остаточный поток, умноженная на то, насколько последующие слои её усиливают. След ошибки слоя 15 затухает по глубине (4.9% → 2.2%), а след слоя 0 разгоняется (13% → 31%).
Признак, который работает. Ошибка подслоя в остаточном потоке ‖Δx‖²/‖x‖², умноженная на усиление G этой точки, где G измерено прямо: шумом ε = 1% в ту же точку и измерением KL на выходе. Ранговая корреляция с истинным одиночным вредом (KL при квантовании только этой матрицы): 0.977 (0.1B), 0.969 (1.5B), 0.920 (2.9B); верхние три матрицы на 2.9B совпадают. Слабости признака: вклад эмбеддинга через точку x₀ переоценён (изотропный шум не похож на настоящую ошибку), а внутренние матрицы слоя 0 недооценены (v_first не моделируется).
Для практического правила этот признак оказался не нужен. Правило платит за байт (раздел 6), и для него честнее всего прямой замер одиночного вреда каждой матрицы: один проход на матрицу, что по цене сопоставимо с измерением усиления G (2L+1 проходов).
6. Автоподбор битности: правило «вред на байт»
Фиксированный список правок («o_proj слоя 0 в bf16, эмбеддинг в 6 бит») плох тем, что проблемные матрицы у разных моделей разные. Ниже описано правило выбора битности по измерению, работающее в обе стороны.
6.1 Правило
Для матрицы m и шага её битности b → b′ задана величина
где KL берётся для модели, у которой квантована только эта матрица, против fp32-эталона. Шаг вверх выполняется, если e ≥ τ; шаг вниз — если e < τ. Один порог τ с обеих сторон означает одну цену байта: биты переезжают туда, где окупаются сильнее.
Стоимость матрицы в байтах считается как params·(b + 0.5)/8 (0.5 бита на вес — масштабы sb6) и 2·params для bf16. Лестница уровней — 4, 5, 6 бит и bf16. Шаг вниз допустим только до 4 бит (3-битной раскладки в формате нет); эмбеддинг вниз не идёт никогда. Подъёмы выбираются жадно по убыванию e, пока e ≥ τ. Для заданного бюджета файла (по умолчанию +0.5%) берётся наименьшее τ, при котором прирост байт укладывается в бюджет; оно ищется бисекцией по log τ. Если бюджет недостижим даже при самом большом τ, возвращается выбор при этом τ и пометка «недостижим».
Цель выбора — средний KL по 14 окнам калибровочного корпуса, взятым по языковой квоте en 4 / code 4 / ru 2 / sr 2 / zh 2 (веса языков пропорциональны числу окон; при необходимости веса можно задать явно).
6.2 Кандидаты и понижение
Первая версия ошибалась в выборе кандидатов, а не в признаке. Первоначально проверялись 12 верхних матриц по абсолютному вреду плюс концевые слои. Но правило платит за байт, а мелкие матрицы C×C (att.output и att.value средних и поздних слоёв) при умеренном вреде вчетверо дешевле cmix. Строгая граница снимает вопрос без предположений: шаг вверх не может снять больше одиночного вреда S матрицы, значит
По свипу одиночного вреда за пределами 12 кандидатов матриц с границей ≥ 5 оказалось 47 (1.5B), 61 (2.9B) и 59 (7.2B). Полный выбор при τ = 5 — 33 / 46 / 45 ключей вместо 12.
Вниз три бита не нужны. Лестница вниз (KL одной матрицы на бит ниже) показала, что шаги на 3 бита при e < 5 дают не более 0.9% файла (7.2B), обычно 0.2–0.6%. Дешёвые байты лежат в другом месте: ffn.key 5 → 4 в средних слоях (e = 1.9–3.5), а 4-битная раскладка в формате уже есть. Новая раскладка не нужна.
6.3 Выбор порога τ
Симметричное правило оказывается байт-нейтральным при τ ≈ 5–6: размер пресета был верным, неверным было распределение бит. Ниже — KL файла на 30 окнах, не участвовавших в выборе (но лежащих внутри калибровочного корпуса, раздел 3.4), парно к пресету по окнам; скорость — чередование ABBA в одном процессе на Mac.
Δ размера |
ΔKL, отложенные окна |
окон хуже |
Δ декода |
|
|---|---|---|---|---|
1.5B, прежний выбор (12 ключей, только вверх) |
+22.6 МБ |
−17.0% [−18.2; −15.8] |
0/30 |
+1.7% |
1.5B, sym τ=5 |
+6.8 МБ |
−18.8% [−20.3; −17.4] |
0/30 |
в шуме |
1.5B, sym τ=6 |
−2.6 МБ |
−13.5% [−15.1; −11.7] |
1/30 |
−0.5% |
1.5B, sym τ=7 |
−24.6 МБ |
−0.8% [−2.8; +1.2] |
13/30 |
−2.0% |
2.9B, прежний выбор |
+55.4 МБ |
−24.6% [−26.1; −23.1] |
0/30 |
+2.4% |
2.9B, sym τ=5 |
+16.9 МБ |
−25.7% [−28.4; −22.5] |
0/30 |
в шуме |
2.9B, sym τ=6 |
−8.5 МБ |
−19.2% [−21.6; −16.6] |
0/30 |
в шуме |
2.9B, sym τ=7 |
−49.2 МБ |
−6.5% [−9.0; −3.8] |
6/30 |
−2.4% |
7.2B, sym τ=5 |
+86.0 МБ |
−25.8% [−28.4; −23.6] |
0/30 |
не мерено |
7.2B, sym τ=6 |
−33.6 МБ |
−13.4% [−16.6; −10.2] |
0/30 |
не мерено |
7.2B, sym τ=7 |
−115.3 МБ |
−0.7% [−4.3; +2.8] |
12/30 |
не мерено |
τ = 5 даёт качество прежнего выбора за треть байт и без потери скорости; τ = 7 — качество пресета на файле на 2.5% меньше и на 2% быстрее. Скорость здесь не выводится из байт: прежний выбор добавлял 22.6 МБ и замедлял на 1.7%, а sym τ=5 добавляет 6.8 МБ и не замедляет, потому что байты сместились с матриц, читаемых на каждом токене, на другие.
Оговорка, которую данные сделали сами. В этом прототипе выбор делался по 8 окнам (3 ru / 3 en / 2 sr), и английский выигрывает меньше всех (7.2B, τ=6: en −7.7% против sr −19.4%; при τ=7 английский даже на 4.6% хуже пресета). То, что правило минимизирует, — это решение о целевых данных, а не деталь реализации.

Рис. 5. Выбор порога τ: изменение размера файла и KL на 30 отложенных окнах (парно к пресету, 95% ДИ). Данные таблицы выше.
6.4 Чистая оценка на моделях от 1.5B до 13.3B
Прибор: fake-путь на сервере, 36 окон чистого текста и 24 окна чистого кода, KL к bf16 тем же прибором (для 1.5B — замер на Mac). Бюджет +0.5% файла. Изменение относительно пресета без автоподбора:
модель |
KL текст |
en |
ru |
sr |
KL код |
Δppl текст |
Δppl код |
|---|---|---|---|---|---|---|---|
1.5B (Mac) |
−17.6% |
−17.9 |
−16.9 |
−18.0 |
−13.5% |
+3.88 → +3.25% |
+3.86 → +3.32% |
7.2B |
−20.7% |
−25.1 |
−16.1 |
−20.3 |
−13.6% |
+1.85 → +1.51% |
+1.22 → +0.86% |
13.3B |
−21.1% |
−23.4 |
−17.0 |
−22.5 |
−17.4% |
+1.14 → +0.86% |
+1.11 → +0.58% |
С ростом модели выигрыш не падает. Предсказание самого измерения на 13.3B завышено в 1.5 раза: предсказано −32.9%, измерено −21.1% (на 1.5B предсказание было близким). Поэтому, как и выше, результатом считается только замер записанного файла.
Полная таблица с парным бутстрэпом для шести моделей приведена в приложении B.1. Её итог: по KL автоподбор значимо лучше пресета на каждой модели и в каждом срезе; по ppl выигрыш не значим в двух клетках (текст на 0.4B и код на 2.9B). Слабое место — английский на 0.4B: KL −7.5%, три окна из двенадцати хуже пресета, ppl +0.46% [−0.25; +1.14].
6.5 Что выбирает автоподбор
Число матриц, у которых бит повышен или понижен (бюджет +0.5% файла):
модель |
вверх |
вниз |
что вниз |
|---|---|---|---|
0.1B |
47 |
1 |
— |
0.4B |
52 |
10 |
— |
1.5B |
46 |
16 |
— |
2.9B |
59 |
25 |
|
13.3B |
110 |
37 |
— |
Наверх идут в основном o_proj и v_proj (5 бит) и ffn.value. Бюджет +0.5% не выбирается целиком: правило упирается в τ, и прирост файла составляет 0.1–0.2% (на 0.4B размер даже уменьшается).
6.6 Измерение без лестниц и его цена
Уровни выше битности пресета измерять не нужно: KL одной матрицы убывает с битом почти одинаково у всех типов матриц и масштабов. Отношение r = KL(b+1)/KL(b) составляет 0.315 (proj), 0.313 (cmix.value), 0.317 (cmix.key) и 0.41 (голова), медианы по 500+ шагам на шести моделях от 0.1B до 13.3B. Выбор по формуле «измеренная база × rᵏ» даёт тот же КПД (процент снятого KL на мегабайт), что выбор по истинным лестницам, на всех проверенных масштабах. Предсказанный выигрыш при этом завышен (1.5B, τ=6: предсказано −19%, измерено −13%), поэтому отчёт правила служит ориентиром.
Цена измерения — один проход на матрицу на битности пресета и один на реализуемый шаг вниз. Проход возобновляется с чистого остаточного потока на входе слоя матрицы: слои до неё квантование не меняет, результат побитно тот же, что у полного прохода (проверено гейтом), а работы в среднем вдвое меньше. Прибор — fp32-модель с весами, хранящимися в bf16: апкаст точен, поэтому это та же fp32-модель при вдвое меньшей памяти; эталон считается тем же прибором в том же процессе, и пол KL равен нулю по построению.
6.7 Что правило не делает
Правило не спасает от отсутствия AW-статистики (раздел 4.3: без неё 2.9B разрушается) и не отменяет фиксированных правок пресета: o_proj слоя 0 и эмбеддинг в 6 бит остаются его стартовой точкой. На больших моделях измерение считается там, где хватает памяти, и переносится как файл со строгой подписью чекпоинта — так же, как imatrix для GGUF.
7. GPTQ на сетке пресета COMPRESSION
Замечание. Таблицы разделов 7.2–7.5 и приложения B получены серверным прототипом GPTQ. Итоговые числа по файлам, которые пишет библиотека, приведены в разделе 9; точечные значения прототипа и библиотеки различаются в пределах разброса реализаций (раздел 7.6). Все измерения этого раздела — на чистых наборах (раздел 3.4).
7.1 Метод
Я переношу GPTQ (Frantar et al., 2022) на асимметричную суперблочную сетку asym_sb6_aw:
масштаб и сдвиг суперблока (256 колонок) вычисляются в его начале, по уже поправленным весам, тем же AW-поиском, что используется при обычной записи (RTN);
колонки квантуются по одной;
ошибка каждой колонки разносится на ещё не квантованные через H⁻¹.
Проход последовательный: вход каждой матрицы снимается с модели, в которой предыдущие матрицы уже квантованы (порядок: r, k, v → o → ffn.key → ffn.value, голова в конце). Эмбеддинг — таблица поиска, GPTQ его не затрагивает. Формат файла, ядра и размер не меняются.
Проверки корректности: при диагональной H коды побитно равны RTN (проверка 0); файл, записанный библиотекой, побитно равен fake-пути GPTQ (гейт).
7.2 Регуляризация важнее размера калибровки
Первая версия: 48 окон корпуса пакета, демпфирование damp = 0.01. KL к RTN, чистый набор:
модель |
текст |
en |
код |
|---|---|---|---|
2.9B |
−21.1% |
−12.2 |
−37.9% |
7.2B |
+0.4% |
+13.6 |
−21.4% |
13.3B |
+4.7% |
+17.7 |
−21.4% |
На больших моделях английский текст стал хуже RTN. Причина — переобучение: 24.5 тыс. токенов на оценку H размером до 16384×16384. Это подтверждается двумя контрольными прогонами на 7.2B: damp 0.1 на тех же 48 окнах даёт −21.0% (en −17.1), а 82 окна при damp 0.01 дают лишь −4.9% (en +6.7). Дело именно в регуляризации, а не в числе окон.
7.3 Калибровочный корпус v2
600 окон по 512 токенов (307 тыс. токенов), собраны из открытых источников:
доля |
состав |
|---|---|
en 30% |
FineWeb-Edu |
ru 20% |
FineWeb-2, русская литература, oasst2 |
код 20% |
UltraData-Code, 6 языков, плюс открытый код проекта |
zh 10% |
FineWeb-2, novel_text |
sr 10% |
кириллица и латиница пополам |
рассуждения 10% |
дистилляции двух моделей |
Порядок окон — взвешенный круг между группами, поэтому любой префикс сохраняет доли. Окна, содержащие 16-граммы любого оценочного набора, выброшены.
7.4 Результаты: GPTQ против RTN
KL к RTN-пресету при damp 0.1 на чистых наборах (текст / en / ru / sr / код) и изменение Δppl:
модель |
окон |
KL |
Δppl текст |
Δppl код |
|---|---|---|---|---|
0.1B |
150 |
−33.6 / −34.7 / −30.6 / −35.8 / −35.8 |
+7.80 → +5.12% |
— |
1.5B |
150 |
−39.6 / −41.3 / −39.8 / −37.7 / −46.7 |
+3.91 → +2.63% |
+3.84 → +2.18% |
1.5B |
600 |
−42.2 / −40.2 / −42.5 / −43.9 / −49.9 |
+3.91 → +2.55% |
+3.84 → +1.85% |
2.9B |
150 |
−38.7 / −37.5 / −38.4 / −40.1 / −43.1 |
+2.78 → +1.69% |
+2.33 → +1.53% |
2.9B |
600 |
−42.5 / −42.2 / −42.6 / −42.7 / −46.4 |
+2.78 → +1.49% |
+2.33 → +1.04% |
7.2B |
150 |
−22.8 / −18.6 / −22.4 / −27.5 / −34.2 |
+1.85 → +1.44% |
+1.22 → +0.84% |
7.2B |
600 |
−28.8 / −25.4 / −27.2 / −33.8 / −38.5 |
+1.85 → +1.31% |
+1.22 → +0.76% |
13.3B |
150 |
−21.0 / −17.3 / −19.9 / −26.4 / −37.3 |
+1.14 → +1.13% |
+1.11 → +0.45% |
13.3B |
600 |
−28.8 / −26.4 / −27.8 / −32.6 / −38.5 |
+1.14 → +0.86% |
+1.11 → +0.69% |
Ни один язык ни на одной модели не хуже RTN. damp 0.1 оказался лучше 0.01 и на малых моделях: на 1.5B и 2.9B при 150 окнах разница составляет 5–7 п. Большим моделям нужно больше окон: переход 150 → 600 даёт +6–8 п. по тексту на 7.2B и 13.3B и +3–4 п. на 1.5B и 2.9B. Английский выигрывает меньше других языков на всех масштабах.
Парный бутстрэп по окнам (600 окон калибровки; приложение B.2) показывает, что GPTQ значимо лучше RTN по KL и по ppl на каждой модели, по тексту и по коду; хуже RTN по KL оказалось одно окно из 360 (7.2B, текст).
7.5 Вместе с автоподбором
Измеряется KL к пресету без обоих методов, 600 окон калибровки. «Произведение» — ожидание при независимости методов: (1 − выигрыш GPTQ) × (1 − выигрыш автоподбора).
модель |
KL текст |
произведение |
KL код |
Δppl текст |
Δppl код |
|---|---|---|---|---|---|
0.1B |
−62.3% |
−59.8% |
−63.1% |
+7.80 → +2.84% |
+6.83 → +2.68% |
0.4B |
−45.6% |
−47.9% |
−42.8% |
+4.43 → +2.72% |
+4.74 → +2.22% |
1.5B |
−52.0% |
−52.3% |
−55.1% |
+3.91 → +2.11% |
+3.84 → +1.49% |
2.9B |
−45.2% |
−53.4% |
−51.4% |
+2.78 → +1.28% |
+2.33 → +1.04% |
7.2B |
−42.5% |
−43.5% |
−44.9% |
+1.85 → +1.07% |
+1.22 → +0.46% |
13.3B |
−41.3% |
−43.9% |
−47.6% |
+1.14 → +0.58% |
+1.10 → +0.27% |
На пяти моделях из шести методы складываются почти мультипликативно, в пределах 3 п. Исключение — 2.9B: поверх GPTQ автоподбор добавляет лишь −4.7% по тексту (−9.2% по коду) вместо ожидаемых около −19%. Первая гипотеза (автоподбор на 2.9B тратит байты на o_proj слоя 0, а GPTQ уже чинит эту матрицу) оказалась неверной: o_proj слоя 0 хранится в bf16 в обоих пресетах и автоподбор её не трогает. Объяснение одними понижениями бит тоже неубедительно: доля понижений на 2.9B наибольшая, но на 13.3B лишь немного меньше, а сложение там почти мультипликативно. Затем выяснилось, что аномалия — артефакт пары прогонов прототипа (раздел 7.6): по файлам библиотеки автоподбор поверх GPTQ на 2.9B даёт −11.5% [−14.7; −8.2] и значим.
Важная деталь: измерение автоподбора делается при RTN. Прямая проверка зависимости — снять измерение по модели, в которой остальные матрицы уже прошли GPTQ, и сравнить выбор; она не проведена (раздел 11).
7.6 Воспроизводимость и разброс GPTQ
Детерминизм. Библиотечный GPTQ детерминирован: два прогона на разных картах и файл, собранный quantize() под нагрузкой сервера, побитно совпали (0.4B и 1.5B, REDUCTION, 144 тензора из 144).
Разброс между реализациями. Две численно эквивалентные реализации дают разные коды. Прототип брал верхний множитель Холецкого, библиотека — нижний с транспонированием; разница порядка 1e-15, но GPTQ разносит её по всей матрице. Итог файла библиотеки против прототипа, тем же прибором:
ΔKL, текст / код |
Δppl код |
|
|---|---|---|
1.5B COMPRESSION |
+1.1 / +4.2% |
+1.83 против +1.49% |
2.9B COMPRESSION |
−5.3 / +0.6% |
— |
0.4B COMPRESSION |
+0.2 / +0.1% |
— |
Знак случайный. Значит, у каждого одиночного GPTQ-числа есть погрешность «реализации» порядка ±5% KL и до ±0.35 п. ppl. Сравнения внутри этого разброса не доказаны.
Реплики. Чтобы измерить разброс, а не оценивать его по трём парам, библиотечный GPTQ повторён с переставленным порядком 600 окон калибровки: окна те же, меняется только порядок суммирования H, то есть возмущение того же рода, что смена множителя Холецкого. Файлы пишет quantize(), оценка — тот же прибор по записанному файлу; код здесь — открытый набор (48 окон). Умолчание COMPRESSION: 0.4B — 6 реплик, 1.5B и 2.9B — по 4; «только GPTQ» на 2.9B — 4 реплики.
модель, плечо |
KL текст: sd / размах |
KL код: sd / размах |
размах Δppl текст / код, п. |
|---|---|---|---|
0.4B, умолчание |
0.6% / 1.6% |
0.8% / 2.2% |
0.38 / 0.37 |
1.5B, умолчание |
1.3% / 2.8% |
1.4% / 2.9% |
0.19 / 0.15 |
2.9B, умолчание |
1.2% / 2.7% |
2.1% / 4.7% |
0.27 / 0.19 |
2.9B, только GPTQ |
0.6% / 1.5% |
1.3% / 2.9% |
0.28 / 0.13 |
Что из этого следует.
Погрешность одиночного GPTQ-числа внутри библиотеки — около ±1.5% KL (одно sd), размах до 3–5%. Это меньше прежней оценки ±5%, сравнивавшей библиотеку с прототипом. Исходный порядок окон из облака реплик не выделяется (отклонение от среднего по перестановкам в пределах ±2%).
По ppl разброс реплик сравним с интервалом по окнам: размах 0.15–0.4 п. при Δppl +1…+2.7%. Различия Δppl между плечами меньше 0.3 п. по одному файлу не доказаны.
Шум отдельного окна — 4–8% KL (медиана sd по репликам). Поэтому счёт «в скольких окнах хуже» при эффектах порядка 10% ненадёжен, а среднее по окнам устойчиво.
Автоподбор поверх GPTQ на 2.9B значим. Среднее по репликам, интервал — совместный бутстрэп по окнам и репликам: текст −11.5% [−14.7; −8.2], код −7.4% [−10.6; −3.8]; все 16 пар реплик дают выигрыш (текст от −12.8 до −9.2%). На 0.4B и 1.5B (одна реплика «только GPTQ») выигрыш по тексту −12…−13% и −12…−14%.
Методы складываются чуть хуже произведения, на 2.9B сильнее всего: отношение измеренного к произведению — 2.9B текст 1.09 [1.05; 1.13], код 1.11 [1.07; 1.16]; 0.4B 1.03–1.05; 1.5B 1.04–1.07 по тексту и около 1.0 по коду. Прежние 1.18 на 2.9B сложились из двух отклонений прототипа в разные стороны: «только GPTQ» у прототипа 0.01560 против 0.01601 у библиотеки (среднее реплик), умолчание — 0.01486 против 0.01417.
7.7 Стоимость
Время GPTQ на RTX 4090 при 600 окнах:
модель |
карт |
время |
|---|---|---|
1.5B |
1 |
42 мин |
2.9B |
1 |
81 мин |
7.2B |
2 |
2.6 ч |
13.3B |
4 |
4.7 ч |
Активации калибровки держатся на хосте (2 × окна × 511 × D × 4 байта), слои разнесены по картам.
На MacBook Air M4 16 ГБ без вентилятора, пресет REDUCTION, вызов quantize() целиком:
модель |
время |
пик памяти |
своп (изменение за прогон) |
|---|---|---|---|
0.1B |
17 мин |
7.7 ГБ |
+0 |
0.4B |
49 мин |
8.9 ГБ |
+0 |
1.5B |
2 ч 26 мин |
19.5 ГБ |
−1.4 ГБ |
На 1.5B пик превышает объём ОЗУ: macOS сжимает память, время на слой остаётся ровным (около 6 мин). Оценка «модель + активации», по которой библиотека решает, запускать ли GPTQ неявно, занижает пик в 2.4–3.4 раза. Файлы, собранные на Mac (цикл GPTQ на CPU), по реальному пути совпадают с серверными в пределах разброса реализаций (1.5B, Δppl по двум наборам: +0.20 / +0.06% против +0.27 / +0.04%).
8. GPTQ в пресете REDUCTION
REDUCTION хранит проекции, cmix и голову в симметричной раскладке типа Q6_K (раздел 3.2). GPTQ переносится на эту сетку так же, как на асимметричную: сетка суперблока строится в его начале по поправленным весам, дальше идёт тот же цикл. Проверка 0 при диагональной H — побитное равенство RTN на 6 и 8 битах. Калибровка — те же 600 окон, damp 0.1.
KL к RTN-REDUCTION на чистых наборах (текст / en / ru / sr / код) и Δppl. Время — на одной RTX 4090 при совместной загрузке карт другими прогонами, поэтому ориентировочное:
модель |
KL |
Δppl текст |
Δppl код |
время |
|---|---|---|---|---|
0.1B |
−22.4 / −28.7 / −19.5 / −20.6 / −27.9 |
+0.50 → +0.47% |
+0.60 → +0.48% |
14 мин |
0.4B |
−22.7 / −21.5 / −22.7 / −23.7 / −27.2 |
+0.29 → +0.21% |
+0.23 → +0.18% |
29 мин |
1.5B |
−28.4 / −24.5 / −29.1 / −31.4 / −32.1 |
+0.35 → +0.27% |
+0.07 → +0.05% |
43 мин |
2.9B |
−29.6 / −26.2 / −31.2 / −31.4 / −33.6 |
+0.15 → +0.09% |
+0.15 → +0.15% |
75 мин |
7.2B |
−21.1 / −12.6 / −23.6 / −27.3 / −24.3 |
+0.12 → +0.13% |
+0.09 → +0.09% |
2.4 ч, 2 карты |
13.3B |
−17.1 / −16.2 / −20.0 / −15.2 / −31.6 |
+0.07 → +0.07% |
+0.10 → +0.09% |
5.2 ч, 4 карты* |
* Время на 4 картах при совместной загрузке сервера другими прогонами.
Ни один язык ни на одной модели не хуже RTN по KL. Относительный выигрыш (−17…−30% по тексту) меньше, чем в COMPRESSION (−34…−42%): для 8 бит это ожидаемо, ошибка округления мала и компенсировать нечего. С размером модели выигрыш не растёт: на 7.2B и 13.3B он наименьший по тексту, а английский на 7.2B выигрывает всего −12.6%. По коду выигрыш держится на всех масштабах (−24…−34%).
Парный бутстрэп по окнам (приложение B.4) подтверждает, что выигрыш по KL значим везде, на каждом языке каждой модели; самая слабая граница — английский на 7.2B, верхний край интервала −4.8%. По окнам GPTQ хуже RTN по KL не более чем в одном окне из 36 (текст) или 24 (код).
Изменение ppl не различимо ни на одной модели: все интервалы накрывают ноль, их ширина ±0.1–0.15%, что сравнимо с самой деградацией REDUCTION (+0.1–0.5%). По знаку ppl чаще лучше: у четырёх моделей из шести точечная оценка по тексту отрицательна, у 7.2B и 13.3B — +0.01%. Два языка, где ppl наклоняется в худшую сторону:
английский на 7.2B: +0.10% [−0.04; +0.24], P(хуже) = 0.92 — не значимо;
русский на 13.3B: +0.11% [+0.03; +0.19], P(хуже) = 0.997 — значимо; KL этого же языка при этом −20.0% [−24.8; −15.6].
Это около 30 парных сравнений (6 моделей × 5 срезов) на уровне 95%. Одно ложное срабатывание в такой серии ожидаемо, поэтому единичный значимый случай не опровергает вывод, но он записан.
Решение: GPTQ включён по умолчанию и в REDUCTION. Довод: REDUCTION служит базой для QLoRA и векторных моделей (эмбеддеров), где важна верность скрытых состояний исходной модели, а не ppl. Сетка в библиотеке та же, упаковка общая с RTN; RTN-файл после рефакторинга побайтно прежний. Библиотечный GPTQ на 0.1B воспроизводит прототип точно: KL и CE совпадают до шестого знака.
Вывод. GPTQ в REDUCTION значимо приближает модель к bf16 по распределению (KL), но на этом наборе не даёт измеримого выигрыша по ppl. Для near-lossless пресета это выигрыш в верности исходной модели, а не в качестве на задаче; чтобы увидеть его по ppl, нужно на порядок больше окон. Байты при этом не меняются.
9. Итоговые результаты по шести размерам
Здесь шесть масштабов измерены так, как результат получит пользователь: файлы пишет quantize() библиотеки, оценка идёт по записанному файлу одним прибором на чистых наборах (36 окон текста и 48 окон открытого кода). Интервалы Δppl — парный бутстрэп по окнам, 95%. Файл GPTQ имеет тот же размер, что RTN-файл той же конфигурации. Автоподбор — бюджет +0.5% файла; GPTQ — 600 окон калибровки v2, damp 0.1. Жирным выделено умолчание библиотеки (quantize(preset="compression") включает автоподбор и GPTQ).
Размеры файлов (МБ и доля от bf16):
модель |
bf16 |
REDUCTION |
COMPRESSION + автоподбор |
|---|---|---|---|
0.1B |
382 |
191 (50.1%) |
134 (35.2%) |
0.4B |
902 |
434 (48.1%) |
299 (33.2%) |
1.5B |
3055 |
1439 (47.1%) |
997 (32.6%) |
2.9B |
5896 |
2743 (46.5%) |
1892 (32.1%) |
7.2B |
14400 |
6648 (46.2%) |
4576 (31.8%) |
13.3B |
26541 |
12178 (45.9%) |
8377 (31.6%) |
Качество:
модель |
плечо |
МБ |
KL текст |
KL код |
Δppl текст, % |
Δppl код, % |
|---|---|---|---|---|---|---|
0.1B |
REDUCTION |
191.3 |
0.00550 |
0.00555 |
+0.49 [+0.33; +0.65] |
+0.75 [+0.60; +0.90] |
0.1B |
REDUCTION + GPTQ (умолчание) |
191.3 |
0.00426 |
0.00399 |
+0.46 [+0.33; +0.59] |
+0.55 [+0.41; +0.69] |
0.1B |
COMPRESSION |
133.9 |
0.07420 |
0.06944 |
+7.76 [+6.81; +8.73] |
+6.61 [+5.84; +7.43] |
0.1B |
+ автоподбор |
134.4 |
0.04524 |
0.04011 |
+5.13 [+4.59; +5.66] |
+3.56 [+3.13; +3.98] |
0.1B |
+ GPTQ |
133.9 |
0.04838 |
0.04082 |
+4.95 [+4.33; +5.58] |
+3.60 [+3.11; +4.09] |
0.1B |
+ оба (умолчание) |
134.4 |
0.02864 |
0.02476 |
+2.76 [+2.28; +3.25] |
+2.47 [+2.18; +2.77] |
0.4B |
REDUCTION |
434.1 |
0.00313 |
0.00280 |
+0.28 [+0.16; +0.40] |
+0.21 [+0.11; +0.32] |
0.4B |
REDUCTION + GPTQ (умолчание) |
434.1 |
0.00242 |
0.00205 |
+0.20 [+0.10; +0.31] |
+0.19 [+0.11; +0.28] |
0.4B |
COMPRESSION |
301.2 |
0.04805 |
0.04264 |
+4.40 [+3.75; +5.07] |
+4.38 [+3.85; +4.90] |
0.4B |
+ автоподбор |
299.2 |
0.04038 |
0.03757 |
+4.19 [+3.67; +4.72] |
+3.56 [+3.07; +4.07] |
0.4B |
+ GPTQ |
301.2 |
0.02956 |
0.02564 |
+2.96 [+2.44; +3.48] |
+2.45 [+2.02; +2.91] |
0.4B |
+ оба (умолчание) |
299.2 |
0.02599 |
0.02306 |
+2.57 [+2.11; +3.04] |
+2.00 [+1.60; +2.42] |
1.5B |
REDUCTION |
1439.0 |
0.00239 |
0.00244 |
+0.35 [+0.22; +0.47] |
+0.13 [+0.02; +0.23] |
1.5B |
REDUCTION + GPTQ (умолчание) |
1439.0 |
0.00171 |
0.00162 |
+0.27 [+0.17; +0.37] |
+0.03 [-0.04; +0.10] |
1.5B |
COMPRESSION |
993.4 |
0.03779 |
0.04061 |
+3.90 [+3.40; +4.43] |
+3.85 [+3.40; +4.30] |
1.5B |
+ автоподбор |
996.5 |
0.03119 |
0.03597 |
+3.29 [+2.86; +3.72] |
+3.59 [+3.10; +4.08] |
1.5B |
+ GPTQ |
993.4 |
0.02135 |
0.02073 |
+2.54 [+2.13; +2.94] |
+1.76 [+1.44; +2.09] |
1.5B |
+ оба (умолчание) |
996.5 |
0.01831 |
0.01874 |
+1.98 [+1.55; +2.44] |
+1.69 [+1.28; +2.13] |
2.9B |
REDUCTION |
2743.3 |
0.00177 |
0.00180 |
+0.15 [+0.05; +0.26] |
+0.05 [-0.04; +0.14] |
2.9B |
REDUCTION + GPTQ (умолчание) |
2743.3 |
0.00125 |
0.00120 |
+0.09 [-0.01; +0.19] |
+0.05 [-0.02; +0.12] |
2.9B |
COMPRESSION |
1885.5 |
0.02708 |
0.02976 |
+2.77 [+2.33; +3.22] |
+2.63 [+2.21; +3.03] |
2.9B |
+ автоподбор |
1891.8 |
0.02192 |
0.02480 |
+2.12 [+1.65; +2.58] |
+2.18 [+1.77; +2.59] |
2.9B |
+ GPTQ |
1885.5 |
0.01610 |
0.01514 |
+1.75 [+1.42; +2.08] |
+1.30 [+1.02; +1.58] |
2.9B |
+ оба (умолчание) |
1891.8 |
0.01406 |
0.01394 |
+1.32 [+1.09; +1.56] |
+1.05 [+0.76; +1.34] |
7.2B |
REDUCTION |
6647.8 |
0.00119 |
0.00112 |
+0.12 [+0.04; +0.21] |
+0.11 [+0.04; +0.18] |
7.2B |
REDUCTION + GPTQ (умолчание) |
6647.8 |
0.00093 |
0.00081 |
+0.13 [+0.07; +0.20] |
+0.08 [+0.02; +0.14] |
7.2B |
COMPRESSION |
4555.0 |
0.01682 |
0.01686 |
+1.88 [+1.56; +2.20] |
+1.51 [+1.23; +1.79] |
7.2B |
+ автоподбор |
4576.0 |
0.01331 |
0.01437 |
+1.52 [+1.17; +1.87] |
+1.09 [+0.80; +1.40] |
7.2B |
+ GPTQ |
4555.0 |
0.01201 |
0.00978 |
+1.02 [+0.68; +1.37] |
+0.71 [+0.49; +0.94] |
7.2B |
+ оба (умолчание) |
4576.0 |
0.00992 |
0.00857 |
+0.95 [+0.68; +1.22] |
+0.67 [+0.48; +0.86] |
13.3B |
REDUCTION |
12178.4 |
0.00082 |
0.00090 |
+0.07 [+0.00; +0.13] |
+0.11 [+0.05; +0.16] |
13.3B |
REDUCTION + GPTQ (умолчание) |
12178.4 |
0.00068 |
0.00065 |
+0.07 [+0.02; +0.13] |
+0.10 [+0.05; +0.15] |
13.3B |
COMPRESSION |
8337.1 |
0.01128 |
0.01228 |
+1.15 [+0.87; +1.44] |
+1.12 [+0.85; +1.39] |
13.3B |
+ автоподбор |
8377.0 |
0.00889 |
0.01020 |
+0.88 [+0.64; +1.12] |
+0.75 [+0.53; +0.96] |
13.3B |
+ GPTQ |
8337.1 |
0.00814 |
0.00705 |
+0.83 [+0.59; +1.08] |
+0.38 [+0.21; +0.56] |
13.3B |
+ оба (умолчание) |
8377.0 |
0.00687 |
0.00615 |
+0.70 [+0.49; +0.93] |
+0.40 [+0.23; +0.57] |
Что видно.
Относительная деградация монотонно падает с размером модели в обоих пресетах. COMPRESSION, KL текста: 0.074 → 0.048 → 0.038 → 0.027 → 0.017 → 0.011. REDUCTION: 0.0055 → 0.0031 → 0.0024 → 0.0018 → 0.0012 → 0.0008. Аномалия 2.9B из раздела 4 после правок пресета (
o_projслоя 0, эмбеддинг в 6 бит) в этой линейке уже не видна. Потери умолчания COMPRESSION падают с размером и по Δppl: +2.76, +2.57, +1.98, +1.32, +0.95, +0.70% по тексту.Сжатие растёт с размером. Доля «неконтролируемых» тензоров (LoRA-ветки, малые тензоры, нормы) убывает: REDUCTION 50% → 46%, COMPRESSION 35% → 31.4%.
Оба метода окупаются сильнее всего на самой малой модели. На 0.1B умолчание снимает 62% KL пресета, на остальных 41–52% (раздел 7.5). Поэтому умолчание COMPRESSION на 0.4B (+2.57%) лучше голого пресета на 1.5B (+3.90%), а умолчание на 2.9B (+1.32%) — голого пресета на 7.2B (+1.88%).
Автоподбор почти не стоит байт. Прибавка составляет 0.1–0.2% файла; на 0.4B размер даже уменьшился. Бюджет +0.5% не выбирается целиком: правило упирается в τ.
О строгости монотонности. Для голых пресетов монотонность по размеру держится с запасом: интервалы KL соседних масштабов не пересекаются ни в REDUCTION, ни в COMPRESSION (по таблице прототипа). Для умолчания COMPRESSION она держится по точечным оценкам, но интервалы соседних масштабов пересекаются (например, KL текста 0.0279 [0.0263; 0.0296] у 0.1B против 0.0260 [0.0242; 0.0278] у 0.4B — по предварительной таблице прототипа — и аналогично у пары 1.5B/2.9B). Интервалы Δppl соседних масштабов в основном перекрываются; строго различимы далёкие масштабы, например 0.1B (+2.76 [+2.28; +3.25]) и 13.3B (+0.70 [+0.49; +0.93]).
Замена закрытого набора кода на открытый ни одного вывода не сдвинула: KL по двум наборам кода расходится в пределах 10%.

Рис. 6. Δppl относительно bf16 для шести размеров: RTN, автоподбор, GPTQ и их сочетание. Данные из таблицы итогов этого раздела.
10. Сравнение с GGUF и MLX при равном размере файла
Чужие форматы собраны из того же чекпоинта g1j и измерены тем же прибором, что мои файлы: их квантованные веса деквантуются и подставляются в эталонную модель, дальше — те же окна и та же KL к bf16.
GGUF:
llama-quantize, Q4_K_M и Q6_K с imatrix по тем же 600 окнам, что у моего GPTQ; деквантование —gguf-py. В этой сборке Q4_K_M держит голову в Q6_K, а LoRA — в F16.MLX: схема опубликованных файлов (affine, группа 64). int6 — всё в 6 бит; int4 — проекции и FFN в 4 бита, эмбеддинг, голова и LoRA в 6. Коды снимает сам
mx.quantize, деквантование на сервере побитно равноmx.dequantize.Мои файлы равного размера: сетка REDUCTION (симметричная, тип Q6_K) с 6 битами.
sym6— проекции, эмбеддинг и голова в 6 бит (размер int6);sym6h8— только проекции в 6 бит, эмбеддинг и голова в 8 (размер Q6_K). Автоподбора здесь нет: это не оптимизированные точки, а простейшая замена битности.
1.5B
формат |
МБ |
KL текст |
KL код |
Δppl текст, % |
Δppl код, % |
|---|---|---|---|---|---|
MLX int4 |
970.4 |
0.11642 |
0.12479 |
+12.71 [+11.43; +14.03] |
+12.14 [+11.14; +13.16] |
GGUF Q4_K_M (imatrix) |
990.1 |
0.03926 |
0.04049 |
+4.07 [+3.48; +4.72] |
+3.76 [+3.32; +4.21] |
мой COMPRESSION (умолчание) |
996.5 |
0.01831 |
0.01874 |
+1.98 [+1.54; +2.44] |
+1.69 [+1.28; +2.12] |
мой sym6, без GPTQ |
1272.3 |
0.00375 |
0.00402 |
+0.51 [+0.35; +0.67] |
+0.29 [+0.15; +0.43] |
мой sym6 + GPTQ |
1272.3 |
0.00260 |
0.00251 |
+0.31 [+0.17; +0.45] |
+0.16 [+0.04; +0.27] |
MLX int6 |
1272.4 |
0.00901 |
0.00971 |
+0.83 [+0.64; +1.03] |
+0.54 [+0.34; +0.75] |
GGUF Q6_K (imatrix) |
1336.1 |
0.00406 |
0.00426 |
+0.48 [+0.34; +0.61] |
+0.27 [+0.15; +0.39] |
мой sym6h8, без GPTQ |
1339.4 |
0.00304 |
0.00329 |
+0.41 [+0.27; +0.54] |
+0.21 [+0.07; +0.33] |
мой sym6h8 + GPTQ |
1339.4 |
0.00208 |
0.00207 |
+0.27 [+0.16; +0.38] |
+0.11 [+0.01; +0.22] |
мой REDUCTION (умолчание) |
1439.0 |
0.00171 |
0.00162 |
+0.27 [+0.17; +0.37] |
+0.03 [-0.04; +0.10] |
2.9B
формат |
МБ |
KL текст |
KL код |
Δppl текст, % |
Δppl код, % |
|---|---|---|---|---|---|
MLX int4 |
1824.2 |
0.50748 |
0.46978 |
+66.14 [+53.11; +81.85] |
+55.45 [+47.30; +64.44] |
GGUF Q4_K_M (imatrix) |
1875.8 |
1.37847 |
1.50555 |
+304.99 [+203.92; +497.81] |
+328.67 [+201.28; +647.98] |
мой COMPRESSION (умолчание) |
1891.8 |
0.01406 |
0.01394 |
+1.32 [+1.09; +1.56] |
+1.05 [+0.76; +1.34] |
мой sym6, без GPTQ |
2451.4 |
0.00288 |
0.00305 |
+0.27 [+0.12; +0.42] |
+0.16 [+0.05; +0.26] |
мой sym6 + GPTQ |
2451.4 |
0.00205 |
0.00206 |
+0.22 [+0.10; +0.34] |
+0.05 [-0.04; +0.15] |
MLX int6 |
2453.4 |
0.01514 |
0.01967 |
+1.16 [+0.75; +1.54] |
+1.67 [+1.33; +2.02] |
мой sym6h8, без GPTQ |
2535.3 |
0.00223 |
0.00239 |
+0.22 [+0.11; +0.34] |
+0.15 [+0.05; +0.25] |
мой sym6h8 + GPTQ |
2535.3 |
0.00155 |
0.00153 |
+0.20 [+0.10; +0.31] |
-0.01 [-0.11; +0.08] |
GGUF Q6_K (imatrix) |
2567.9 |
0.00512 |
0.00714 |
+0.33 [+0.11; +0.53] |
+0.63 [+0.42; +0.85] |
мой REDUCTION (умолчание) |
2743.3 |
0.00125 |
0.00120 |
+0.09 [-0.01; +0.19] |
+0.05 [-0.02; +0.12] |
Отношения KL «чужой формат / мой файл» (парный бутстрэп по окнам; значение > 1 означает, что мой файл точнее). В скобках — разница размера моего файла относительно чужого.
1.5B
чужой / мой |
размер моего |
KL текст |
KL код |
|---|---|---|---|
GGUF Q4_K_M (imatrix) / мой COMPRESSION (умолчание) |
+0.7% |
2.14 [1.98; 2.30] |
2.16 [2.05; 2.28] |
MLX int4 / мой COMPRESSION (умолчание) |
+2.7% |
6.36 [5.84; 6.92] |
6.66 [6.20; 7.14] |
MLX int6 / мой sym6 + GPTQ |
-0.0% |
3.47 [3.23; 3.74] |
3.86 [3.72; 4.01] |
MLX int6 / мой sym6, без GPTQ |
-0.0% |
2.40 [2.29; 2.53] |
2.42 [2.35; 2.49] |
GGUF Q6_K (imatrix) / мой sym6h8 + GPTQ |
+0.2% |
1.95 [1.82; 2.09] |
2.06 [1.95; 2.17] |
GGUF Q6_K (imatrix) / мой sym6h8, без GPTQ |
+0.2% |
1.34 [1.27; 1.40] |
1.29 [1.24; 1.35] |
MLX int6 / мой COMPRESSION (умолчание) |
-21.7% |
0.49 [0.45; 0.53] |
0.52 [0.48; 0.56] |
GGUF Q6_K (imatrix) / мой REDUCTION (умолчание) |
+7.7% |
2.37 [2.18; 2.58] |
2.63 [2.49; 2.76] |
MLX int6 / мой REDUCTION (умолчание) |
+13.1% |
5.27 [4.88; 5.71] |
5.98 [5.70; 6.28] |
2.9B
чужой / мой |
размер моего |
KL текст |
KL код |
|---|---|---|---|
GGUF Q4_K_M (imatrix) / мой COMPRESSION (умолчание) |
+0.9% |
98.06 [75.72; 129.80] |
108.00 [81.83; 149.56] |
MLX int4 / мой COMPRESSION (умолчание) |
+3.7% |
36.10 [29.93; 42.99] |
33.70 [29.72; 38.19] |
MLX int6 / мой sym6 + GPTQ |
-0.1% |
7.38 [6.57; 8.42] |
9.57 [8.71; 10.57] |
MLX int6 / мой sym6, без GPTQ |
-0.1% |
5.26 [4.72; 5.95] |
6.46 [5.93; 7.05] |
GGUF Q6_K (imatrix) / мой sym6h8 + GPTQ |
-1.3% |
3.31 [2.92; 3.76] |
4.65 [4.25; 5.09] |
GGUF Q6_K (imatrix) / мой sym6h8, без GPTQ |
-1.3% |
2.30 [2.08; 2.56] |
2.99 [2.75; 3.25] |
MLX int6 / мой COMPRESSION (умолчание) |
-22.9% |
1.08 [0.94; 1.26] |
1.41 [1.27; 1.57] |
GGUF Q6_K (imatrix) / мой REDUCTION (умолчание) |
+6.8% |
4.10 [3.63; 4.69] |
5.97 [5.45; 6.51] |
MLX int6 / мой REDUCTION (умолчание) |
+11.8% |
12.13 [10.62; 14.15] |
16.45 [14.99; 18.18] |
Что из этого следует.
При равном размере мой файл точнее в каждой паре. На 1.5B: против Q4_K_M — в 2.1 раза по KL, против Q6_K — в 2.0, против MLX int6 — в 3.5, против MLX int4 — в 6.4. На 2.9B: против Q6_K — в 3.3 раза, против MLX int6 — в 7.4, против MLX int4 — в 36; Q4_K_M там сломан (п. 4).
Часть отрыва даёт формат, часть — GPTQ. Без GPTQ моя 6-битная сетка уже лучше int6 в 2.4 раза (5.3 раза на 2.9B) и лучше Q6_K с imatrix в 1.34 раза (1.5B). На 4 битах иначе: голый пресет COMPRESSION равен Q4_K_M с imatrix (KL 0.0378 против 0.0393), и весь отрыв там даёт автоподбор вместе с GPTQ.
Разрыв с MLX растёт с размером модели. Причина —
o_projнулевого слоя (раздел 4): affine-схема квантует его наравне со всеми, и на 2.9B int4 разваливается (+66% ppl), а int6 теряет больше, чем мой файл на 23% меньше.Q4_K_M на 2.9B сломан. KL 1.38, +305% ppl по моему прибору. Это не артефакт подстановки весов: сам llama.cpp на том же файле даёт ppl 31.4 против 6.54 у Q6_K (wikitext-2, 12 окон по 512), тогда как на 1.5B та же сборка ведёт себя нормально (10.67 против 10.33). Ошибки весов при этом обычные, около 7.5%; наибольшая — у
o_projнулевого слоя (9.5%). То есть слабое место из раздела 4 воспроизводится в чужом формате и чужом движке, причём сильнее, чем в MLX int4.Оговорки. Отношения сняты на двух моделях одной линейки и на 36 + 48 окнах. imatrix и GPTQ получили одни и те же окна, но используют их по-разному. Точки
sym6не проверены на реальном пути Metal.

Рис. 7. Размер файла и KL(bf16‖квант) для 1.5B и 2.9B. Точки левее и ниже лучше. Значения KL сравнимы только внутри одного прибора.
11. Обсуждение и ограничения
Что я считаю главным. Качество квантованной модели определяется не равномерной ошибкой, а несколькими матрицами, ошибка которых вносится в остаточный поток в «усиливаемых» местах сети. Локальные метрики (концентрация входа, диагональная ошибка выхода, локальная ошибка впрыска) этого не видят (раздел 5). Практический вывод: битность нужно назначать по измеренному вреду на байт, а не по эвристике, и правило должно работать в обе стороны, иначе оно только раздувает файл.
Ограничения.
Утечка в диагностических разделах. Разделы 4–5 измерены на наборе, лежащем внутри калибровочного корпуса. Направление смещения (в пользу AW) известно, величина — нет. Выводы раздела 4 — сравнительные и при одной статистике; итоговые результаты получены на чистых наборах.
Метрика — KL и ppl, не задачи. Качество на downstream-задачах не измерялось.
Одна линейка чекпоинтов. Итоговые таблицы относятся к серии g1j; диагностика частично использует g1d и g1h.
Разброс GPTQ. У одиночного GPTQ-числа есть погрешность около ±1.5% KL (одно sd) и размах реплик по ppl 0.15–0.4 п.; различия Δppl меньше 0.3 п. по одному файлу не доказаны (раздел 7.6).
Зависимость от целевых данных. Автоподбор минимизирует KL на окнах выбора, и английский выигрывает меньше остальных языков на всех масштабах (раздел 6.3, раздел 7.4). Состав выбора — решение о целевых данных.
Предсказанный выигрыш завышен. Отчёт автоподбора завышает эффект (13.3B: предсказано −32.9%, измерено −21.1%), поэтому доверять следует только замеру файла.
Приборы не взаимозаменяемы. fake-путь и реальный путь дают разные абсолютные KL; перенос измерения между приборами (CUDA/fp64 и MPS/fp32) не проверен. Модели 7.2B и 13.3B на Mac не помещаются и оценены по файлу на сервере.
Измерение автоподбора делается при RTN, а не по модели с уже применённым GPTQ; прямая проверка (снять измерение после GPTQ и сравнить выбор) не проведена.
Не проверены точки
sym6на реальном пути Metal (раздел 10). Квота окон автоподбора (en 4 / code 4 / ru 2 / sr 2 / zh 2) выбрана по замеру на 1.5B g1j: при бюджете +0.5% прицел в один язык почти не давал выигрыша (en: −16.5% против −16.3%), а ручные приоритеты (en 0.4 / code 0.35) проигрывали почти везде; зависимость от модели и от бюджета не исследована.Нерешённое наблюдение о числе голов. Правка слоя 0 помогает ровно там, где число голов не является степенью двойки (12 у 0.1B и 40 у 2.9B против 16, 32 и 64 у остальных). Это совпадение на пяти точках; fake-путь воспроизводит эффект, значит дело не в Metal-ядрах. Проверка на 13.3B (H=64) ничего не решит: она предсказывает «ничего», что совместимо с любой причиной. Я привожу наблюдение как открытый вопрос, а не как результат.
Не выяснен механизм ускорения при хранении матрицы слоя 0 в bf16 (раздел 4.6).
12. Заключение
На примере RWKV-7 я показал, что аномалия «большая модель деградирует сильнее» при 4-битном квантовании объясняется двумя адресами: выходной проекцией нулевого блока и эмбеддингом. Фиксированные правки (одна матрица в bf16 и эмбеддинг в 6 бит) стоят около 1.6% файла и возвращают 2.9B в монотонную линейку. На них строятся автоподбор битности по правилу «вред на байт» и перенос GPTQ на ту же сетку: вместе они снижают потери по перплексии от +2.76% (0.1B) до +0.70% (13.3B) при 31.6–35.2% от размера bf16, а пресет REDUCTION с GPTQ даёт +0.46…+0.07% при 46–50%. При равном размере файла результат точнее GGUF и MLX на двух проверенных масштабах. Я также количественно описал два источника ошибок измерения, которые легко пропустить: утечку калибровочного корпуса в оценочный набор (завышение эффекта в 2.3 раза на GPTQ) и разброс GPTQ между численно эквивалентными реализациями.
Дальнейшая работа. Проверка на downstream-задачах; прямая проверка автоподбора по модели после GPTQ; эксперимент по гипотезе о числе голов на дополнительной точке; дообучение сжатых моделей (верхние слои и state-tuning над REDUCTION) вынесено в отдельную работу.
Литература
Frantar, E., Ashkboos, S., Hoefler, T., Alistarh, D. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers. 2022. arXiv:2210.17323.
Dettmers, T., Lewis, M., Belkada, Y., Zettlemoyer, L. LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale. 2022. arXiv:2208.07339.
Sun, M., Chen, X., Kolter, J. Z., Liu, Z. Massive Activations in Large Language Models. 2024. arXiv:2402.17762.
Lin, J., Tang, J., Tang, H., Yang, S., Dang, X., Han, S. AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration. 2023. arXiv:2306.00978.
Peng, B. et al. RWKV-7 «Goose» with Expressive Dynamic State Evolution. 2025.
llama.cpp (GGUF,
llama-quantize, imatrix). https://github.com/ggml-org/llama.cppMLX (
mx.quantize). https://github.com/ml-explore/mlx
Приложение A. Четыре инженерные ошибки, исказившие измерения
Запись за границей буфера в
torch.linalg.cholesky(upper=True)(torch 2.13, macOS). Ошибка портила уже упакованные коды и давала segfault в MPSGraph. Замена — нижний фактор с транспонированием, побитно тот же U. На CUDA/MKL бага нет.Точные нули в GPTQ. GPTQ обнуляет почти мёртвые строки точно. На нулевом суперблоке сдвиг
sb6считался как 0/0 и давал NaN. Эталонный гейт упаковки был снят с этим NaN и охранял дефект. Урок: побитный гейт охраняет поведение, а не правильность, поэтому к хешам нужны утверждения о свойствах (например, конечность значений).Слияние словарей.
dict(done, **overrides)отдаёт совпавшие ключи правому словарю. Выбор автоподбора затирал отметку «уже прошло GPTQ», и прямой проход квантовал GPTQ-веса повторно.Деквантование читателя округлялось в bf16. Для 8-битных кодов это вторая ошибка порядка 1/4 шага сетки: +2–3% KL у REDUCTION при чтении файла в PyTorch (на 1.5B +3.1% к fake-пути, при fp16-деквантовании +0.1%). Теперь деквантование идёт в fp16: та же память, в 8 раз точнее. Metal почти не затронут (≤ 0.04 п. ppl): линейные слои декодируются в ядрах, а bf16-округление было только у таблицы эмбеддинга и LoRA. Побочно пришлось поправить гейты, сверявшие упаковку с fake-путём записи: запись округляет fp32 в bf16 один раз, а цепочка fp32 → fp16 → bf16 даёт двойное округление; теперь такие гейты сверяют через
dtype=float32.
Приложение B. Таблицы парного бутстрэпа
Везде 20 000 повторов, окна ресэмплируются вместе для обоих плеч; числа в процентах, 95%-интервал в скобках. Серверный прибор; для 1.5B это отдельный серверный замер, поэтому точечные оценки отличаются от строки «Mac» в разделе 6.4 на доли пункта. Таблицы B.1–B.2 получены до перехода на файлы библиотеки (раздел 7); итоговые числа по файлам — раздел 9.
B.1 Автоподбор против пресета (изменение KL и ppl)
модель |
KL текст |
KL en |
KL код |
ppl текст |
ppl код |
|---|---|---|---|---|---|
0.1B |
−38.8 [−40.5; −37.1] |
−35.2 [−38.8; −31.0] |
−43.6 [−45.9; −41.1] |
−2.46 [−3.20; −1.72] |
−3.02 [−3.84; −2.24] |
0.4B |
−15.7 [−18.3; −12.9] |
−7.5 [−12.2; −3.1] |
−8.4 [−11.4; −4.8] |
−0.19 [−0.70; +0.31] |
−0.65 [−1.31; +0.00] |
1.5B |
−17.5 [−19.9; −15.1] |
−17.4 [−20.1; −14.8] |
−12.9 [−15.9; −9.8] |
−0.59 [−0.93; −0.24] |
−0.59 [−1.02; −0.15] |
2.9B |
−18.9 [−21.7; −16.0] |
−18.7 [−23.0; −14.5] |
−15.6 [−18.2; −12.8] |
−0.62 [−0.94; −0.30] |
−0.23 [−0.77; +0.33] |
7.2B |
−20.7 [−24.1; −17.5] |
−25.1 [−27.8; −22.6] |
−13.6 [−16.5; −10.8] |
−0.34 [−0.62; −0.05] |
−0.36 [−0.63; −0.06] |
13.3B |
−21.1 [−23.4; −18.9] |
−23.4 [−26.6; −20.0] |
−17.4 [−21.4; −13.8] |
−0.27 [−0.51; −0.05] |
−0.52 [−0.79; −0.25] |
По KL автоподбор значимо лучше пресета на каждой модели и в каждом срезе. По ppl выигрыш не значим в двух клетках: текст на 0.4B и код на 2.9B.
B.2 GPTQ против RTN на сетке COMPRESSION
модель |
KL текст |
KL en |
KL код |
ppl текст |
ppl код |
|---|---|---|---|---|---|
0.1B |
−34.3 [−35.9; −32.8] |
−38.7 [−41.1; −36.4] |
−37.3 [−40.6; −34.1] |
−2.60 [−3.22; −2.00] |
−2.40 [−3.44; −1.46] |
0.4B |
−38.2 [−40.7; −35.6] |
−32.4 [−36.5; −28.5] |
−37.2 [−40.5; −33.6] |
−1.31 [−1.91; −0.69] |
−2.36 [−2.81; −1.87] |
1.5B |
−42.2 [−44.9; −39.3] |
−40.2 [−45.5; −35.0] |
−49.9 [−52.6; −47.0] |
−1.31 [−1.71; −0.92] |
−1.91 [−2.61; −1.21] |
2.9B |
−42.5 [−45.3; −39.5] |
−42.2 [−46.2; −38.0] |
−46.4 [−50.3; −42.0] |
−1.26 [−1.67; −0.85] |
−1.26 [−1.84; −0.67] |
7.2B |
−28.8 [−32.5; −25.0] |
−25.4 [−29.8; −21.2] |
−38.5 [−42.0; −34.7] |
−0.53 [−0.80; −0.26] |
−0.46 [−0.87; −0.06] |
13.3B |
−28.8 [−32.1; −25.7] |
−26.4 [−31.6; −21.9] |
−38.5 [−42.6; −34.0] |
−0.28 [−0.53; −0.02] |
−0.41 [−0.81; −0.02] |
GPTQ значимо лучше RTN по KL и по ppl на каждой модели, по тексту и по коду.
B.3 Умолчание (автоподбор + GPTQ) против пресета и вклад автоподбора поверх GPTQ
Последний столбец — измеренное отношение KL, делённое на произведение отношений двух методов по отдельности; 1 означает независимость.
модель |
умолчание, KL текст |
умолчание, KL код |
умолчание, ppl текст |
автоподбор поверх GPTQ, KL текст / код |
измерено / произведение, текст / код |
|---|---|---|---|---|---|
0.1B |
−62.3 [−63.5; −61.0] |
−63.1 [−65.0; −61.1] |
−4.60 [−5.32; −3.88] |
−42.6 [−44.8; −40.1] / −41.1 [−43.7; −38.4] |
0.94 [0.91; 0.97] / 1.05 [1.00; 1.10] |
0.4B |
−45.6 [−48.7; −42.2] |
−42.8 [−46.2; −39.1] |
−1.64 [−2.20; −1.08] |
−12.1 [−15.5; −8.5] / −8.9 [−11.9; −5.6] |
1.04 [1.01; 1.08] / 1.00 [0.95; 1.04] |
1.5B |
−52.0 [−54.4; −49.3] |
−55.2 [−57.9; −52.1] |
−1.73 [−2.20; −1.27] |
−16.9 [−19.8; −14.3] / −10.5 [−13.7; −7.3] |
1.01 [0.97; 1.04] / 1.03 [0.98; 1.08] |
2.9B |
−45.2 [−49.4; −40.6] |
−51.4 [−55.7; −46.7] |
−1.46 [−1.92; −1.01] |
−4.7 [−10.4; +2.0] / −9.3 [−14.5; −3.0] |
1.18 [1.11; 1.25] / 1.08 [1.00; 1.16] |
7.2B |
−42.5 [−45.9; −39.0] |
−45.0 [−47.9; −41.6] |
−0.76 [−1.14; −0.39] |
−19.2 [−22.6; −15.5] / −10.5 [−13.9; −7.1] |
1.02 [0.96; 1.08] / 1.04 [0.98; 1.09] |
13.3B |
−41.3 [−44.7; −37.8] |
−47.6 [−51.5; −43.2] |
−0.55 [−0.79; −0.31] |
−17.5 [−21.2; −13.4] / −14.7 [−18.0; −11.1] |
1.05 [1.00; 1.10] / 1.03 [0.98; 1.10] |
Умолчание лучше пресета по KL на каждой модели, ни одно окно из 360 не хуже; ppl текста значимо лучше везде. Автоподбор поверх GPTQ значим на пяти моделях из шести; на 2.9B по тексту интервал накрывает ноль (в строке прототипа), на 0.4B не значим английский: −2.0% [−8.6; +4.1], 7 окон из 12 хуже. Строка 2.9B — артефакт пары прогонов прототипа (раздел 7.6).
B.4 GPTQ против RTN в пресете REDUCTION
модель |
KL текст |
KL en |
KL код |
ppl текст |
ppl код |
|---|---|---|---|---|---|
0.1B |
−22.4 [−25.1; −19.7] |
−28.7 [−32.6; −25.3] |
−27.9 [−30.2; −25.8] |
−0.03 [−0.16; +0.11] |
−0.13 [−0.28; +0.04] |
0.4B |
−22.7 [−25.6; −19.6] |
−21.5 [−26.1; −17.6] |
−27.2 [−30.4; −23.9] |
−0.08 [−0.22; +0.06] |
−0.04 [−0.15; +0.07] |
1.5B |
−28.4 [−32.0; −24.5] |
−24.5 [−31.5; −18.0] |
−32.1 [−35.0; −28.7] |
−0.08 [−0.18; +0.03] |
−0.02 [−0.16; +0.10] |
2.9B |
−29.6 [−33.0; −26.1] |
−26.2 [−32.8; −19.8] |
−33.6 [−36.5; −30.0] |
−0.06 [−0.16; +0.03] |
−0.00 [−0.13; +0.13] |
7.2B |
−21.1 [−25.0; −16.9] |
−12.6 [−19.6; −4.8] |
−24.3 [−30.0; −16.5] |
+0.01 [−0.06; +0.09] |
−0.00 [−0.10; +0.09] |
13.3B |
−17.1 [−20.3; −13.7] |
−16.2 [−21.1; −10.4] |
−31.6 [−36.2; −27.1] |
+0.01 [−0.05; +0.06] |
−0.01 [−0.09; +0.07] |
Приложение C. Приборы и вычислительная среда
прибор |
что меряет |
где работает |
|---|---|---|
|
KL(bf16‖квант) на fake-пути (torch), leave-one-out по группам, трассировка остаточного потока |
Mac (MPS), сервер (CUDA) |
|
то же, но реальная упаковка sb6 и MLX-кернели |
только Mac |
|
ppl и KL из логитов модели, загруженной из |
только Mac |
|
скорость декода двух файлов, чередование ABBA в одном процессе |
только Mac |
|
профиль входа o_proj по слоям (E[x²], концентрация) |
Mac, сервер |
|
локальная ошибка впрыска на настоящих активациях |
сервер |
Общие правила. Корпус eval_corpus_multiling (раздел 3.4) — для разделов 4–5; чистые наборы — для остальных. Эталон — логиты bf16-модели, посчитанные в fp32 и сложенные на диск (5.09 ГБ на модель). Эталон принимается числом, а не размером файла.
Вычислительная среда.
Mac M4 (16 ГБ, без вентилятора): реальный MLX-путь, скорость, ppl с файла. Потолок — 2.9B; 7.2B в fp32 (28.8 ГБ) недостижим.
Сервер 4×RTX 4090, 251 ГБ RAM, 16 ядер, 1.5 ТБ: fake-путь, эталоны, профили. fp32-эталон 2.9B собирается на карте за 4 минуты, 7.2B — на CPU за 25 минут (в 24 ГБ карты fp32 не влезает).
Metal-ядра (исходники Metal через
mx.fast.metal_kernel, 7 файлов вbackends/metal) на CUDA не компилируются, поэтому реальный путь на сервере не воспроизводится.
Доступность. Код: https://github.com/RafaelUI/rwkv-quant