Как сжать LLaMA-7B до 1 ГБ без дообучения: результаты 60+ экспериментов
В какой-то момент я посмотрел на 13 ГБ весов LLaMA-7B и задался простым вопросом: почему модель обязательно должна занимать именно столько? Можно не обучать уменьшенную версию заново, не создавать дистиллированную модель и не менять архитектуру, а попробовать найти более компактное математическое представление уже существующих "знаний".
Так начался эксперимент по сжатию LLaMA-7B до 1 ГБ. Изначальная цель была сформулирована достаточно жёстко: добиться результата без дообучения, pruning, дистилляции и перестройки Transformer-блоков. Разрешались только операции над готовыми весами, небольшая текстовая выборка для калибровки, анализ активаций, смена системы координат, низкоранговое разложение и различные варианты кодирования.
Проект получил название PCST и быстро превратился в полноценное исследование. За время работы было проверено более 60 подходов, протестированы сотни конфигураций, несколько вариантов модели и множество идей, которые выглядели многообещающе до первого запуска полноценного inference. Итог оказался неоднозначным: добиться одного гигабайта и качества уровня Q8 не получилось. Текущий артефакт занимает около 2,05 GiB и пока уступает стандартной Q3_K_M как по качеству, так и по скорости.
Тем не менее эксперименты дали важный результат. Улучшение восстановления отдельных весов ещё не означает, что вся языковая модель начнёт работать лучше. Иногда локальная точность растёт, а итоговая модель становится менее разумной. Именно этот разрыв между качеством отдельных операций и поведением всей сети оказался одной из главных проблем.
Зачем вообще уменьшать большую языковую модель
Локальная LLM полезна в ситуациях, когда нельзя или нежелательно отправлять документы во внешний API. Она может работать в закрытой сети, в лаборатории, небольшой компании или на персональном компьютере без постоянного доступа к облачным сервисам.
Здесь важен не только сам размер файла. Имеют значение скорость генерации, пиковое потребление памяти и возможность выполнять вычисления непосредственно в сжатом формате. Если при каждом умножении полностью восстанавливать матрицы в FP32, компактная модель быстро перестаёт быть компактной: для запуска снова потребуются десятки гигабайт оперативной памяти.
Поэтому оптимизация больших языковых моделей - это не просто создание меньшего архива. Необходимо разработать такое представление весов, из которого можно выполнять inference напрямую, не распаковывая всю модель перед каждым вычислением.
Теоретически метод, способный уменьшить модель в шесть-семь раз, мог бы превратить условные 100 ГБ в 14-17 ГБ. Это всё ещё значительный объём, но такую систему уже можно представить на компьютере с 32 ГБ оперативной памяти. Именно поэтому задачи, связанные с компрессией нейросетей и языковых моделей, имеют практический смысл даже тогда, когда идеальный результат в 1 ГБ недостижим.
Подробнее о подходе, ограничениях и промежуточных результатах можно узнать в материале о [сжатии LLaMA-7B без дообучения](https://habr.com/ru/articles/1080480/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1080480).
Ошибка, которая обнулила значительную часть экспериментов
Самый неприятный эпизод произошёл 21 августа 2026 года. В NumPy-loader обнаружилась ошибка обработки GGUF-тензоров. Матрица уже поступала в формате `(out, in)`, однако код повторно менял её представление через `reshape`, хотя в конкретном месте требовалась операция `transpose`.
Проблема была особенно опасной потому, что программа не завершалась с ошибкой. Модель продолжала что-то считать, графики менялись, а отдельные методы даже показывали улучшение. Но все эти "победы" относились к сети, собранной неправильно.
После исправления пришлось признать большую часть ранних результатов недействительными и начать проверку заново. Чтобы подобная ситуация не повторилась, Q8-forward сравнили с независимой реализацией llama.cpp на одинаковых последовательностях токенов.
Получились следующие значения:
- cosine similarity логитов - 0,999942;
- относительная ошибка - 0,01140;
- совпадение Top-1 - 100%;
- пересечение Top-10 - 97,5%.
После этого в проекте закрепилось обязательное правило: сначала нужно доказать, что собственный декодер воспроизводит поведение независимой реализации, и только затем оценивать новые методы сжатия. Иначе даже красивое улучшение может оказаться лишь убедительной ошибкой вычислительного конвейера.
Что удалось проверить
Одним из направлений стала квантизация LLaMA-7B без дообучения. Такой подход кажется наиболее прямым: значения весов переводятся в более компактное представление, а параметры квантизации подбираются по небольшой калибровочной выборке.
Однако равномерно уменьшать разрядность всех матриц невыгодно. Разные слои и даже разные блоки внутри одного слоя по-разному влияют на итоговое качество. Часть весов можно хранить в более агрессивном формате, а для чувствительных участков выделить дополнительные биты.
Эксперименты также показали, что методы, хорошо работающие для изображений, не обязательно подходят для сырых весов языковой модели. В нейросетях компьютерного зрения пространственная структура данных часто помогает восстановлению. У матриц Transformer другая природа: важны не только локальные значения, но и взаимодействие между слоями, направлениями признаков и активациями.
Отдельный интерес вызвали методы, которые дают более точное восстановление конкретной матрицы. Оказалось, что такой выигрыш может не переноситься на поведение модели в целом. Небольшая ошибка в одном месте иногда компенсируется последующими слоями, а слишком "точное" восстановление изменяет баланс вычислений и ухудшает генерацию.
Почему запуск на слабом компьютере остаётся сложной задачей
Идея запуска LLaMA на слабом компьютере упирается не только в размер весов. Даже модель на 2 ГБ может оказаться неудобной, если декодер постоянно тратит время на распаковку данных, а промежуточные буферы требуют большого объёма памяти.
Для практического применения нужны как минимум три свойства:
1. компактное хранение параметров;
2. выполнение операций непосредственно над сжатыми данными;
3. предсказуемое качество на длинных последовательностях и разных типах запросов.
В этом смысле сжатие весов напоминает не обычный архиватор, а разработку нового вычислительного формата. Нужно одновременно учитывать статистику параметров, особенности конкретного слоя, поведение активаций и стоимость операций на целевом оборудовании.
Полученный результат 2,05 GiB нельзя назвать финальной победой, однако он показывает направление дальнейшей работы. Вероятно, перспективнее не искать универсальный алгоритм для всех весов, а строить гибридную систему: чувствительные матрицы хранить с большей точностью, менее критичные - сжимать агрессивнее, а часть вычислений оптимизировать с учётом реального профиля активаций.
В конечном счёте сжатие LLaMA-7B до 1 ГБ оказалось не одной удачной формулой, а сложным компромиссом между размером, скоростью, памятью и качеством. Эксперимент подтвердил главное: уменьшить файл относительно просто, но сохранить полноценное поведение модели при прямом inference значительно труднее. Именно проверка всей системы, а не отдельных красивых метрик, определяет, работает ли метод на практике.

