Qwen-3-Coder-Next— модель с 80 миллиардами параметров и весом159,4 ГБ. Примерно столько RAM потребовалось бы для её запуска, и это ещё без учёта длинного контекстного окна.И эта модель не считается большой моделью!По слухам, у frontier-моделей более триллиона параметров, для которых понадобилось бы минимум2 ТБоперативной памяти. Последний раз я видел столько RAM в одной машине— никогда.
Но что если я скажу, что можно сделать LLM в 4 раза меньше и в 2 раза быстрее — достаточно, чтобы запускать весьма мощные модели на ноутбуке, — при потере точности всего 5–10%?
В этом и заключается магия квантизации.
В этой статье вы узнаете:
- Почему параметры модели делают её такой большой
- Как работает точность чисел с плавающей точкой и чем жертвуют модели
- Как сжимать числа с плавающей точкой с помощью квантизации
- Как измерить потерю качества модели после квантизации
Если вы уже знаете, что такое параметры и как хранятся числа с плавающей точкой, можете сразуперейти к квантизации.
Что делает большие языковые модели такими большими?
Параметры, которые также называют «весами», составляют большую часть того, чем LLMявляетсяв памяти или на диске. В своей статье окешировании промптовя писал, что LLM — это «огромный граф из миллиардов тщательно выстроенных операций». Как выглядят эти графы? Начнём с простейшего примера: 1 вход, 1 параметр, 1 выход.
Сам по себе он выглядит незамысловато, но это фундаментальный строительный блок современного AI. Он принимает входное значение2.0, умножает на параметр0.5и получает выход1.0.
Настоящие LLM, однако, намного больше. На практике у них миллиарды таких параметров. Один из способов, которым они становятся такими большими, — наличие «слоёв». Вот как это выглядит.
Два узла посередине — это слой. Оба показывают1.0, потому что у обоих соединений параметр равен0.5, то есть они представляют результат2.0 *0.5. Каждое соединение между двумя узлами получает свой параметр — итого 4 параметра. Когда 2 соединения приходят в один узел, значения складываются. Чтобы получить выходное значение1.5, складываем1.0 *1.0и0.5 * 1.0.
Это всего лишь 6 параметров — до миллиардов современных LLM ещё далеко. Пример ниже содержит 2 входа, 3 слоя и 2 выхода, итого 64 параметра.
Современные LLM имеют сотни тысяч входов и выходов, десятки слоёв, каждый с тысячами узлов, плотно связанных между собой. Всё это перемножается и даётмиллиарды, а иногдатриллионыпараметров.
Как компьютеры хранят числа?
Компьютеры работают с1и0, которые называются «битами». Вот как выглядит целое число (integer) в битовом представлении.
Каждый бит представляет степень двойки, и сумма этих значений даёт итоговое число.
Целые числа удобны тем, что онидискретны. Между 1 и 3 ровно одно число: 2. Компьютеры без труда представляют дискретные значения.
Сложнее становится, когда речь заходит о десятичных дробях. Сколько дробных чисел существует между 1 и 3? Бесконечно много. Компьютеры не могут представить бесконечное количество значений.
Поэтому компьютеры идут на компромисс. Они гарантируют точность до определённого количества значимых цифр, а всё остальное — на основе наилучшего приближения.
Например, 32-битные числа с плавающей точкой охватывают диапазон ±3,40×10³⁸ с точностью до 7 значимых цифр. Для этого 32 бита делятся на 3 части: 1 знаковый бит, 8 бит экспоненты и 23 бита мантиссы. Больше бит экспоненты — шире диапазон; больше бит мантиссы — больше значимых цифр.
Движение влево-вправо исследует весь диапазон значений. Кнопки «+» и «–» сверху перепрыгивают к следующему большему или меньшему представимому числу. 7 гарантированно точных значимых цифр подчёркнуты.
Каждый раз при нажатии «+» вы переходите кследующему наибольшему представимому значению. Обратите внимание на цифрупослеподчёркнутых — иногда значение перепрыгивает через число. Это и есть компромисс точности в действии.
При нажатии «+» на очень маленьком значении шаг небольшой. На очень большом значении шаг больше. Размер шага меняется в зависимости от положения в диапазоне —значения распределены неравномерно.
Чтобы лучше проиллюстрировать это, ниже приведена гистограмма. Каждый столбец показывает срез диапазона 32-битных чисел с плавающей точкой. Между -0,5 и 0,5 можно представить более 2 миллиардов уникальных значений.
Большинство представимых 32-битных чисел с плавающей точкой — это малые значения. Для LLM это отлично, потому что параметры тоже, как правило, малы. Малые параметры лучше обобщают задачи, с которыми модель не сталкивалась при обучении, поэтому в процессе тренировки модели «поощряются» за уменьшение параметров.
Ниже ещё одна гистограмма — она построена на основе 6 популярных моделей с открытыми весами. Почти все параметры очень близки к 0.
Итак, большинство параметров моделей попадают в диапазон значений с плавающей точкой, который можно представить наиболее точно. Впрочем, небольшое число выбросов всё же есть. Я вернусь к ним чуть позже.
Можно ли использовать числа с меньшей точностью?
Действительно ли языковым моделямнужны32-битные числа с плавающей точкой? Им не нужен широкий диапазон — это видно из гистограммы распределения параметров выше — идействительноли им нужны 7 значимых цифр?
Ответ: нет. LLM прекрасно работают с меньшими, менее точными форматами. Ниже пример 16-битного числа с плавающей точкой. Оно работает так же, как 32-битное, но имеет только 5 бит экспоненты и 10 бит мантиссы. Представляет 3 значимые цифры точности и охватывает диапазон ±65504. Занимает вдвое меньше RAM и дискового пространства, чем 32-битный вариант.
Можно комбинировать разное количество бит экспоненты и мантиссы для разных соотношений точности и диапазона. Например, команда Google Brain создала форматbfloat16с 8 битами экспоненты и только 7 битами мантиссы. Такой подход даёт очень широкий диапазон, но только 2 значимые цифры точности.
Google обнаружила, что 2 значимые цифры достаточно для создания LLM, а чрезвычайно широкий диапазон позволяет не беспокоиться о переполнении при вычислениях, которое может случаться в больших LLM с меньшими форматами чисел.
Есть и более экстремальные примеры, встречающиеся реже:float8иfloat4. Ниже — лишь примерные конфигурации этих форматов; на практике люди комбинируют количество бит экспоненты и мантиссы под свои нужды.
Ещё один способ визуализировать точность этих форматов — посмотреть, насколько хорошо они аппроксимируют синусоиду.
На графике сравниваются идеальная синусоида и квантизованные аппроксимации для float32, float16, bfloat16, float8 и float4. Форматы с меньшей точностью выглядят более ступенчато и больше отклоняются от гладкой кривой.
Поговорим о том, как использовать эти знания для уменьшения размера моделей.
Что такое квантизация?
Квантизация — это процесс взятия значений из широкого диапазона и упаковки их в более узкий. Это формасжатия с потерями.
При конвертации, например, изfloat16вfloat8, значения обычно округляются доближайшего представимого значения. Значения из диапазонаfloat16отображаются на ближайшее значениеfloat8. Такой подход называется «round-to-nearest» и является одним из многих видов квантизации.
При движении отображается ближайшее представимое значение для каждого размера числа с плавающей точкой.
Это простой способ взять значение из одного диапазона и представить его в меньшем. Однако для LLM так делать нельзя.
Посмотрите на небольшую модель ниже. Обратите внимание, как меняются параметры и выход при округлении отbfloat16доfloat8иfloat4.
Округление доfloat8вполне терпимо, но округление доfloat4полностью ломает модель. Часть параметров становится равной 0. Поскольку нет ни одного пути от входа к выходу без умножения на 0, выход всегда будет нулём.
Это происходит потому, что мы неэффективно используем 4 бита.float4охватывает диапазон от -3 до 3, тогда как наши параметры находятся в диапазоне от-0.89до0.16.
Кроме того,float4может представлятьInfinityиNaN. При квантизации это бесполезно.
Посмотрим, как можно эффективнее использовать 16 значений, которые даёт 4-битное число.
Симметричная квантизация
Что если вместо диапазона -3 до 3, как уfloat4, использовать более узкий диапазон, точнее соответствующий данным?
Один из способов —масштабированиеданных в новый диапазон. Например, если данные лежат в диапазоне от -14 до 14 и нужно уместить их в -7 до 7, достаточно разделить на 2.
Чтобы вернуться к исходному значению из масштабированного, просто умножьте на 2. Нечётные значения станут непредставимыми — они будут округляться до ближайшего целого. Например,5 / 2 = 2.5округляется до3и декквантизируется в3 * 2 = 6. Именно здесь и возникают потери при квантизации.
Этот процесс применим к любому набору значений — нужно лишь найти правильный масштабный коэффициент. Для этого берётся наибольшее абсолютное значение в наборе данных и делится на наибольшее значение в квантизованном диапазоне. Для наших параметров это0.89 / 7. Вот как это выглядит в JavaScript:
Код ниже применяет функциюquantizeк нашим значениям параметров из небольшой модели выше:
Малые числа с плавающей точкой отображены в квантизованный целочисленный диапазон. Вот как это выглядит визуально:
Теперь можно применитьdequantize, умножив значения наscale, чтобы вернуться в исходный диапазон чисел с плавающей точкой:
И визуально:
Сравниваем с оригинальными значениями:
Квантизованное
Средняя ошибка +18,0%
Модель стала в 4 раза меньше (с 16-битной до 4-битной), и в среднем декквантизированные значения отличаются примерно на 18%. Неплохо!
Посмотрим, как ведёт себя небольшая модель при симметричной квантизации.
Итоговый выходquantized 4-bitотличается примерно на 30%. Это огромный прогресс по сравнению с поведениемfloat4с округлением (выход всегда равен нулю), особенно с учётом того, что квантизованная модель требует в 4 раза меньше RAM, чем оригинал.
Но... можно сделать ещё лучше.
Асимметричная квантизация
Симметричная квантизация называется так потому, что 0 всегда находится посередине. Мы выбираем масштаб и сжимаем значения вокруг 0. Посмотрим внимательнее на наши симметрично квантизованные значения.
На положительной стороне много незадействованного пространства, потому что максимальное значение —0.16, тогда как минимальное —-0.89. Из-за симметрии положительный диапазон уходит до0.89, оставляя большой разрыв между0.16и0.89. Пространство используется неэффективно.
Идеяасимметричнойквантизации — исправить это, разрешив неравные диапазоны. Вместо сжатия вокруг 0 асимметричная квантизация сжимает данные вокруг их середины и вычисляет «нулевую точку» для компенсации при деквантизации.
Прогоним наши параметры через эту функцию:
Вот как выглядит это отображение визуально. Новая асимметричная функцияquantizeрешила, что нулевой точкой должна быть5.
Функцияdequantizeчуть сложнее симметричной версии — на этот раз требует вычитания помимо умножения:
Как это соотносится со средней ошибкой при симметричной квантизации?
Квантизованное
Средняя ошибка +8,5%
Намного лучше! На 10% меньше ошибки при том же количестве бит. Посмотрим, как это работает на нашей модели.
Итоговый выход всё ещё отличается примерно на 10%, но это заметное улучшение по сравнению с симметричной квантизацией.
Именно это и происходит с параметрами моделей при квантизации до размеров, подходящих для запуска на ноутбуке. Вместо чисел с плавающей точкой в память загружаются малые целые числа. Когда приходит время использовать квантизованные значения — например, для генерации ответа на вопрос — они декквантизируются на лету. Казалось бы, это должно быть медленнее, но позже мы увидим, что на практике это оказывается ещё ибыстрее, а не только компактнее.
Как квантизация применяется на практике?
Неужели кто-то берёт LLM со многими сотнями миллиардов параметров, находит среди них наибольшее и наименьшее значение и квантизирует всю модель за один раз?
Я намекал на причину раньше. Вернёмся к графику параметров 6 разных моделей с открытыми весами — на этот раз посмотрим на длинный хвост значений-выбросов.
У всех моделей есть небольшое количество параметров-выбросов — значений, которые намного больше или меньше большинства остальных. Выбросыочень плоховлияют на квантизацию. Посмотрите, что происходит при попытке квантизировать наши параметры с добавленным выбросом10:
Квантизованное
Средняя ошибка +116,8%
Всё сжимается в небольшое количество бакетов, и средняя ошибка резко возрастает. Если квантизировать всю модель за один раз — она будет уничтожена.На практике применяется квантизация блоками, обычно по 32–256 параметров за раз. Так воздействие выбросов оказывается локализованным.
Для декквантизации нужно сохранять значениеscale(для симметричной схемы) иscale+zero(для асимметричной). Они хранятся рядом с каждым блоком и составляют накладные расходы. Больший размер блока снижает эти расходы, но более широкие блоки в среднем имеют более широкий диапазон значений, что увеличивает ошибку. Это компромисс.
Странно, правда? Я сам был увлечён этими значениями какое-то время. Если хотите узнать больше, рекомендую:
- Эту статьюот Apple
- Этот постТима Деттмерса
Если коротко: никто не знает наверняка, но небольшая доля этих выбросовкритическиважна для качества модели. Удаление дажеодного«супервеса» (super weight, как их называет Apple) может привести к тому, что модель начнёт генерировать полную бессмыслицу.
Из-за их важности реальные схемы квантизации порой проделывают дополнительную работу для сохранения выбросов. Их могут либо не квантизировать вовсе, либо сохранять их расположение и значение в отдельной таблице, а затем убирать, чтобы их блок не был испорчен. При декквантизации эта таблица используется для восстановления выбросов.
Насколько квантизация влияет на точность модели?
В этом разделе я покажу несколько способов измерить потерю качества в LLM. У каждого из них есть плюсы и минусы. Если вы оцениваете квантизованные модели для критически важного сценария, ничто не заменит создания собственного бенчмарка для конкретной задачи.
Оговорки сделаны. Все следующие тесты выполнялись на моделиQwen3.5 9B. Подробности о командах — в приложении в конце статьи.
Перплексия (Perplexity)
LLM под капотом строят распределения вероятностей наиболее вероятного следующего «токена» для заданного промпта. Например, при промптеThe answer to 2 + 2 isQwen3.5 9B выдаёт такие вероятности для следующего токена:
Вероятность
И много других менее вероятных вариантов...
Токену4присвоена высокая вероятность — что логично, ведь это правильный ответ. Немного беспокоит, что в 3% случаев модель скажет5, но не будем отвлекаться.
Идея «перплексии» как метрики — свернуть эти распределения вероятностей в одно число, с которым удобно работать. Расчёт перплексии требует немного математики, но это не страшно. Для одного предсказания выше —The answer to 2 + 2 is— берём вероятностьправильноготокена4и делаем следующее:
Меньшее значение лучше. Читается так: «модель считает, что существует ~1,08 правдоподобных токенов, завершающих этот промпт». Чем ниже перплексия, тем выше вероятность, назначенная правильному токену.
При промптеAnd then Iвероятности у Qwen3.5 9B распределены шире:
И много других примерно равновероятных вариантов...
Предположив, что правильный следующий токен —was, расчёт перплексии для этого распределения выглядит так:
Значительно выше — но что бывыпредсказали послеAnd then I? Это куда более неоднозначный промпт, и вполне логично, что модель менее уверена в предсказании.
Для измерения перплексии Qwen 3.5 9B на разных уровнях квантизации я использовал инструментllama-perplexityиз проектаllama.cpp. Он принимает текст-эталон, скользит по нему окном токенов как промптом и использует следующий токен из эталона как правильный ответ.
Чтобы проиллюстрировать идею скользящего окна, ниже показаны токены промпта и правильный токен. Используйте кнопки «→» и «←» для перемещения окна.
На каждом шаге накапливается-Math.log(pCorrect), и в конце вычисляетсяMath.expот среднего. Если собрать вероятности правильных токенов для всего текста в массивprobs, итоговый расчёт выглядит так:
Проектllama.cppиспользует тестовый датасетwikitext-2в качестве эталонного текста — я сделал то же самое. Это просто содержимое страницы Википедии оРоберте Булутере. Понятия не имею, почему именно она. Интересно, знает ли он, что используется для бенчмаркинга квантизованных LLM...
Результаты:
Перплексия
8-bit симметричная
8,193 (+0,1%)
4-bit асимметричная
8,563 (+4,6%)
4-bit симметричная
8,71 (+6,4%)
2-bit асимметричная
66,1 (+707,5%)
При 8-битной симметричной — почти никаких изменений, при 4-битных вариантах — небольшая деградация, при 2-битной — почти полный коллапс. Квантизация заставила модель быть менее уверенной, в среднем рассматривая более широкий набор токенов.
Важно: перплексия учитывает только вероятностьправильноготокена. Вероятности всех остальных токенов не используются. Поэтому перплексия не даёт полной картины того, как квантизация повлияла на модель.
KL-дивергенция
KL-дивергенция (Kullback-Leibler divergence) — метрика, показывающая, насколько хорошо 2 вероятностных распределения совпадают.
KL-дивергенция равна 0 только тогда, когда два распределения идентичны. Чем больше они расходятся, тем выше KL-дивергенция.
Не только горизонтальное смещение повышает KL-дивергенцию — любое несовпадение оказывает этот эффект.
Эту метрику можно применить к распределениям вероятностей токенов, которые выдаёт LLM. На графике ниже показаны вероятности каждой цифры от 0 до 9 для продолжения промптаThe answer to 2 + 2 is.
Интуитивно понять значение KL-дивергенции нет простого способа — лишь «чем выше, тем хуже». У неё нет естественного максимума (нельзя сказать, что «KL-дивергенция всегда от 0 до 1»), она зависит от свойств модели. Поэтому сравнивать её имеет смысл только между разными квантизациями одной и той же модели.
Инструментllama-perplexityтакже измеряет KL-дивергенцию через флаг--kl-divergence, подробности в приложении. В качестве эталонного текста я снова использовалwikitext-2.
Средняя KL-дивергенция
8-bit симметричная
4-bit асимметричная
4-bit симметричная
2-bit асимметричная
Несмотря на сложность интерпретации и ограничение на сравнение только квантизаций одной модели, KL-дивергенция имеет преимущество перед перплексией: она учитывает всё распределение вероятностей каждого предсказания.
Перплексия заботитсятолькоо вероятности правильного токена. Вероятности всех остальных токенов могут измениться, но если правильный остался прежним, перплексия не изменится. При KL-дивергенции любое изменение всего распределения повысит оценку. KL-дивергенция даёт более полную картину того, как квантизация изменила поведение модели.
Я написалотдельную статьюпро бенчмаркинг LLM. Один из способов измерить влияние квантизации — сравнить оценку модели на бенчмарках до и после.
Для этой статьи я решил запустить бенчмаркGPQA Diamond. Яписал об этом бенчмаркеподробнее, но здесь достаточно знать: это набор из 198 очень сложных вопросов с несколькими вариантами ответа по биологии, химии и физике. У каждого вопроса 4 варианта, случайное угадывание даёт в среднем 25%. Подробности о запуске — в приложении.
Правильный ответ
Неправильный ответ
Нет ответа
8-bit симметричная
4-bit асимметричная
4-bit симметричная
2-bit асимметричная
Если вас смутили результаты — не волнуйтесь, меня тоже. 8-битная квантизация даётболее высокийбалл, чем оригинальная модель вbfloat16. Трудно сказать, почему именно так происходит — возможно, это просто удача. При вопросах с несколькими вариантами всегда есть 25% шанс угадать случайно.
Вывод из этих результатов: 8- и 4-битная квантизация работают хорошо, а 2-битная — совсем плохо. На 97% вопросов ответ не был найден, что могло означать зацикленность модели или непонимание задачи.
Просто поговорить с ней
Последний тест — самый простой и наименее строгий: просто поговорить с моделью. Я задал один и тот же вопрос всем уровням квантизации: «Какова столица Англии, Великобритания?»
Оригинал bfloat16
The capital city of England and the United Kingdom isLondon.
8-bit симметричная
The capital city of England and the United Kingdom isLondon.
4-bit асимметричная
The capital city of England isLondon. It is also the capital city of the entire United Kingdom.
4-bit симметричная
The capital city of England isLondon.
2-bit асимметричная
<нет ответа>
Все правильно, кроме 2-битной квантизации, которая почти каждый раз отказывалась отвечать. «Reasoning trace» при этом немного сошёл с ума:
После чего модель выдавала пустой ответ. Думаю, можно уверенно сказать: 2-битная квантизация — это слишком большая потеря информации для Qwen3.5 9B, и на таком уровне сжатия модель не годится для использования.
Очевидно, это не строгий научный тест, но он помогает поставить все остальные оценки в контекст.
Насколько квантизация влияет на скорость модели?
Последнее, о чём хочу поговорить, — скорость модели. Меньший размер квантизации, как правило, также делает модель быстрее. Это объясняется главным образом тем, что данных меньше и перемещать их внутри GPU быстрее.
Проектllama.cppпредоставляет инструментllama-bench, который я запускал на MacBook Pro M1 Max и на арендованном облачном H100 SXM GPU. Производительность измеряется в «токенах в секунду» — то есть насколько быстро модель генерирует ответы.
8-bit симметричная
4-bit асимметричная
4-bit симметричная
2-bit асимметричная
Единицы: токенов/сек
Между оригинальнымbfloat16и 8- и 4-битными квантизациями огромная разница в производительности. Почему 2-битная квантизация оказалась медленнее 4-битной — мне непонятно, я ожидал обратного. Если знаете почему,напишите мне!
Заключение
Главное, что я хочу донести этой статьёй:квантизованные модели, если честно, вполне хорошие.
Когда я только захотел написать эту статью, я ничего не знал о квантизации. Я предполагал, что качество модели деградирует линейно по мере сжатия. То есть 8-битная квантизацияbfloat16будет вдвое хуже, затем 4-битная вдвое хуже 8-битной, и так далее.
Это оказалось не так.
Похоже, переход с 16-битной до 8-битной квантизации несёт почти нулевые потери качества. Переход с 16-битной до 4-битной более заметен, но это точно не «в четыре раза хуже оригинала». Ближе к 90%, в зависимости от метрики.
Не бойтесь запускать локальные квантизованные модели. Обрыв качества существует, но теперь у вас есть инструменты, чтобы понять, где он находится. Пока вы не упали с этого обрыва, квантизованные модели работают хорошо, и не стоит избегать их только из-за того, что они сжаты.
Экспериментируя с квантизованными локальными моделями, попробуйтеAI gatewayот ngrok. С его помощью можномаршрутизировать LLM-запросы к этим локальным моделям, работающим как на вашем ноутбуке, так и на арендованном GPU в облаке.
Дополнительное чтение
Эта статья целиком посвящена «квантизации после обучения» (post-training quantization, PTQ). Некоторые модели сегодня проходят «квантизацию во время обучения» (quantization aware training, QAT), при которой квантизация вводится в процессе предобучения и помогает модели устанавливать параметры, удобные для квантизации.
Я также рассмотрел лишь пару методов квантизации — есть множество более сложных альтернатив с другими компромиссами. Рекомендую изучить AWQ и GPTQ.
Квантизация — лишь один из методов уменьшения размера LLM. Есть ещё прунинг параметров и дистилляция. СтатьяEfficient Large Language Models: A Surveyнемного устарела (май 2024), но даёт хороший обзор методов повышения эффективности LLM.
Русскоязычное сообщество про AI в разработке
Друзья! Перевод этой статьи подготовила команда ТГК «AI for Devs» — канала, где мы рассказываем про AI-агентов, плагины для IDE, делимся практическими кейсами и свежими новостями из мира ИИ.Подписывайтесь, чтобы быть в курсе и ничего не упустить!
Установка llama.cpp
Загрузка Qwen 3.5 9B
Эта команда загружает версию Qwen 3.5 9B вbfloat16и запускает OpenAI-совместимый сервер на порту 8000.
Запуск бенчмарка GPQA
Склонируйте официальный репозиторийGPQAи распакуйте набор вопросов:
Оригинальный репозиторий не позволяет запускать бенчмарк для произвольной локальной модели. Явнёс некоторые изменения, чтобы запускать:
Бенчмарк запускался наllama-serverс 4096 токенами для reasoning:
Квантизация модели
Разберём по частям:
- ~/Library/Caches/llama.cpp— каталог, гдеllama.cppхранит загруженные модели.
- unsloth_Qwen3.5-9B-GGUF_Qwen3.5-9B-BF16.gguf— имя файла модели, загруженной командойllama-server -hf unsloth/Qwen3.5-9B-GGUF:BF16ранее.
- unsloth_Qwen3.5-9B-GGUF_Qwen3.5-9B-Q8_0.gguf— имя файла для новой квантизованной модели.
- Q8_0— формат квантизации: «Q8» означает 8-битную квантизацию, «_0» — симметричную.
Команда выполнилась за минуту на ноутбуке, и результирующий файл занимает чуть больше половины размера оригинала.
Строки формата для каждого уровня квантизации, использованного в статье:
8-bit симметричная
4-bit асимметричная
4-bit симметричная
2-bit асимметричная
Вllama.cpp, насколько я могу судить, нет опций для 8-битной асимметричной или 2-битной симметричной квантизации.
Также замечу, что 2-битная квантизация в моих тестах отличается от остальных. Я посмотрел отличное видеоreverse-engineering GGUFот Джулии Турк, но пришлось выбирать между K-quant и I-quant — для 2-битной не оказалось доступного legacy quant. Пошёл на компромисс. Подозреваю, это как-то связано с тем, почему результатыllama-benchдля 2-битной квантизации оказались странными.
Измерение перплексии и KL-дивергенции
Для загрузки тестового датасета wikitext-2 я использовал скриптget-wikitext-2.shиз репозитория llama.cpp, затем запустил:
Это сохраняет базовые данные KL-дивергенции, необходимые при измерении квантизованных версий модели. Используйте их так:
Диалог с моделями локально
Измерение производительности