Проект PCST начинался с простого вопроса: почему 13 ГБ весов LLaMA-7B должны занимать именно столько? Автор поставил цель ужать модель до 2 ГБ, а в идеале — до одного, не прибегая к дообучению, дистилляции, pruning или изменению архитектуры. Только математика над уже готовыми весами и небольшая выборка текстов для калибровки. За время работы было проверено больше 60 методов и сотни конфигураций.

Мотивация приземлённая: локальная модель не требует постоянного доступа к облаку, не отправляет документы во внешний API и работает в закрытой сети. Если научиться воспроизводимо уменьшать модели в шесть-семь раз, то условные 100 ГБ превратятся в 14–17 ГБ, что уже можно представить на компьютере с 32 ГБ памяти. Но маленький файл сам по себе ничего не решает — важны ещё качество, скорость и пиковая память. Если при каждом умножении полностью восстанавливать исходную матрицу в FP32, компактный артефакт снова потребует десятки гигабайт RAM. Поэтому долгосрочная задача PCST — не архиватор весов, а представление, из которого можно выполнять inference напрямую.

МетрикаЗначение
Cosine logits0.999942
Relative error0.01140
Top-1 agreement100%
Top-10 overlap97.5%

В основе PCST лежит Product Quantization. Матрица режется на короткие векторы, и вместо каждого вектора сохраняется номер похожего центроида из небольшой кодовой книги. Размер складывается не только из индексов: нужно учитывать сами codebooks, scale-факторы, низкоранговые остатки, embedding, LM Head и метаданные контейнера. Один рецепт для всей сети не работает: матрицы Q, K, V, O, Gate, Up и Down по-разному переживают одну и ту же степень сжатия. Две одинаково устроенные матрицы на разных слоях могут вести себя совершенно по-разному. Поэтому вопрос «сколько бит дать модели?» заменили другим: «куда потратить следующий мегабайт, чтобы он принёс больше всего пользы?»

Итоговый артефакт занимает 2.05 GiB и уступает стандартной квантизации Q3_K_M по качеству и скорости.

Самый болезненный момент наступил 21 августа 2026 года. В NumPy-загрузчике нашлась ошибка ориентации GGUF-тензоров: матрица уже приходила в форме (out, in), а её ещё раз перекладывали через reshape там, где требовался transpose. Такие ошибки не приводят к падению программы — модель что-то считает, графики ползут, отдельные методы даже «побеждают». Только победы относятся к неправильно собранной сети. После исправления большую часть ранних результатов пришлось пометить как невалидные и начать заново. Чтобы больше не строить выводы на неисправном основании, Q8-forward проверили против независимой реализации llama.cpp на одинаковых токенах. Совпадение top-1 составило 100%, cosine logits — 0.999942, relative error — 0.01140, overlap top-10 — 97.5%. С тех пор в проекте действует правило: сначала докажи, что собственный декодер повторяет независимую реализацию, и только потом радуйся новым методам.

Итог оказался далёк от первоначальной цели. Одного гигабайта и качества Q8 получить не удалось. Текущий артефакт занимает 2.05 GiB и пока проигрывает обычной Q3_K_M и по качеству, и по скорости. Зато автор наткнулся на вещь, которая оказалась интереснее очередной красивой цифры: можно заметно улучшить восстановление отдельных весов и одновременно сделать всю модель глупее. Этот результат показывает, что локальные улучшения не всегда складываются в общий выигрыш, а методы, хорошо работающие на картинках, почти бесполезны для сырых весов.