90% весов нейросети - мусор. И на этом строят бизнес
Возьмите любую большую языковую модель и загляните внутрь. Там миллиарды чисел - весов, которые определяют, как модель думает. И почти все они выглядят так: 0.0003, -0.0007, 0.0001. Микроскопические значения, которые по отдельности не значат почти ничего. Но каждое из них хранится как полноценное 16-битное число с плавающей точкой.
Получается, что основную часть видеопамяти и денег вы тратите на хранение чисел, которые несут минимум информации. И вот тут начинается интересное - потому что на сжатии этого мусора уже выросла целая индустрия, которая позволяет крутить серьёзные модели там, где они физически не должны помещаться.
Откуда вообще берётся лишний вес
Веса нейросети - это просто числа, которые задают силу связи между нейронами. У каждого соединения свой коэффициент важности: насколько сильно один нейрон влияет на другой. Во время обучения эти числа подкручиваются крошечными шагами, вроде +0.0003. Чтобы такие микрошаги не терялись, точность нужна высокая - отсюда и 16 бит на каждый вес.
Проблема в том, что после обучения эта точность уже не нужна в таком объёме. Модель обучилась, шаги закончились, а избыточная разрядность осталась. Каждый вес продолжает занимать 16 бит, хотя для работы хватило бы куда меньшего.
Считаем на пальцах. Модель на 7 миллиардов параметров в FP16 весит около 14 ГБ. Большинство потребительских видеокарт её просто не вмещают - там ещё нужно место под контекст и промежуточные вычисления. То есть у вас на руках модель, которую некуда положить.
Кстати, если вы только начинаете знакомство с нейросетями - на платформе SYNTX.AI очень удачно можно протестировать все самые современные модели.
Что делает квантизация
Идея простая. Берём 16-битные веса и пересчитываем их в 4 или 8 бит. Чисел столько же, но каждое теперь занимает в разы меньше места.
Цифры по той же модели на 7B. В FP16 - около 14 ГБ. В 8-битном формате - примерно 7 ГБ. В 4-битном Q4_K_M - около 4.4 ГБ. Та самая модель, которая не лезла в видеокарту, теперь спокойно работает на карте с 8 ГБ памяти, да ещё и с запасом под контекст.
Экономия памяти при переходе на 4 бита - порядка 70-75% против FP16. И это не лабораторный фокус, а стандартная практика. Когда вы делаете ollama pull llama3.1:8b, Ollama качает именно квантованный файл в формате GGUF.
А качество не разваливается?
Вот это главный вопрос, который останавливает людей. Логика подсказывает: если выкинуть точность, модель поглупеет.
На деле потери меньше, чем кажется. На уровне Q4_K_M разница с полной точностью FP16 составляет порядка 1-3% по бенчмарку MMLU. В большинстве практических задач это незаметно - модель отвечает так же, просто весит втрое меньше.
Работает это потому, что большие модели устойчивы к огрублению весов. Маленькие сети чувствительны к каждому числу, а у больших избыточность встроена в саму архитектуру. Часть точности можно убрать, и модель этого почти не замечает.
Отдельная хитрость в том, что грубить можно с умом. Формат GGUF режет не все слои одинаково. Буква K_M в названии Q4_K_M означает, что слоям внимания, которые сильнее всего влияют на качество, оставляют больше бит, а остальное жмут сильнее. Поэтому Q4_K_M почти всегда выгоднее, чем равномерное сжатие.
Где это уже приносит деньги
Самый прямой эффект - на железе. Без квантизации модель на 70 миллиардов параметров требует несколько ускорителей A100. После сжатия в 4 бита та же модель запускается на одной RTX 4090. Разница между "нужен серверный кластер" и "хватит одной геймерской видеокарты" - это и есть основная экономика всей темы.
Дальше - запуск на CPU и на телефонах. В одном из исследований Llama 3.2 на 3 миллиарда параметров после 4-битного сжатия похудела с 6 ГБ до 1.88 ГБ - почти 69% - и поехала на обычном Android. Для продукта это значит, что часть ИИ-функций можно держать прямо на устройстве, без облака и без оплаты за каждый запрос.
И самое приятное - порог входа низкий. Это не переобучение модели с нуля за сотни тысяч долларов. Готовую модель сжимают математическими методами, иногда буквально одной строкой кода через библиотеку bitsandbytes с флагом load_in_4bit=True. Несколько часов на одной видеокарте вместо месяцев и кластера.
Но есть НО
Теперь честно про то, где квантизация ломается. Это не серебряная пуля, и продавать её как магию не стоит.
Первое - обрыв качества ниже 4 бит. До четырёх бит деградация плавная и предсказуемая. Ниже трёх - падение нелинейное и резкое. Q2 и Q3 для серьёзных задач брать не нужно, там модель начинает заметно тупить. Реальный рабочий минимум - 4 бита.
Второе - нельзя сжимать уже сжатое. Если взять Q8 и дожать до Q4, ошибки начинают накапливаться. Квантовать нужно всегда из исходных весов в полной точности, иначе получите мусор на выходе.
Третье - выбросы. В больших трансформерах есть отдельные веса-выбросы, которые при наивном сжатии ломают всю модель. Поэтому простое обрезание до 8 бит может обвалить качество, и приходится брать методы, которые такие выбросы обрабатывают отдельно.
Четвёртое - зоопарк форматов. GPTQ, AWQ, GGUF, bitsandbytes - у каждого свой формат и свой инструментарий. Выберете не тот под свой движок инференса - и оно просто не заведётся. Совместимость надо проверять заранее, а не после деплоя.
Что в итоге выбирать
Если у вас потребительское железо и нужен баланс качества и памяти - берите Q4_K_M через GGUF. Это стандарт по умолчанию, работает в Ollama, LM Studio и llama.cpp, заводится даже на CPU.
Если задача чувствительна к точности и память позволяет - поднимайтесь до Q8, разница с полной моделью становится совсем незаметной.
Если нужно впихнуть очень большую модель туда, куда она не лезет никак - тогда смотрите в сторону агрессивных 2-3 битных методов вроде AQLM, но с открытыми глазами: качество просядет, и брать это стоит только когда альтернатива - не запустить модель вообще.
А вот идея считать сразу в трёх состояниях, минус один, ноль и плюс один, никуда не делась. Тернарные сети вроде BitNet обещают тот же эффект, но заложенный в модель с самого обучения. Пока это эксперимент на CPU, а не готовое решение. Но направление то же самое - перестать хранить мусор там, где можно хранить смысл.