Квантование широко используется для решения проблем масштабирования в ИИ. Название может показаться сложным, но это всего лишь округление чисел, чтобы они занимали меньше места. Это означает, что векторы эмбеддингов (Embeddings) становятся меньше, занимают меньше памяти и места для хранения, а также ускоряется поиск информации, поскольку требуется меньше времени для сравнения векторов. Квантование — это чисто числовой метод, которому все равно, какие данные обрабатывает ваша модель или какие у вас варианты использования, поэтому он может принести улучшения, не требуя больших затрат на знания предметной области.
Можно было бы ожидать, что квантование включает в себя старые добрые компромиссы и ничто не дается даром — где мы должны пожертвовать некоторой точностью. В этой статье мы покажем вам способ сделать его без потерь с помощью квантования с учетом обучения (quantization-aware training, QAT). Этот метод используется в jina-embeddings-v4 для предоставления меньших по размеру эмбеддингов, которые требуются в приложениях, критичных к пространству.
tagОбзор методов квантования
Квантование модели обычно означает одно из четырех:
- Пост-тренировочное квантование (Post-training quantization, PTQ)
- Обучение для квантованных выходов эмбеддингов (Output QAT)
- Обучение для полностью квантованных моделей (Full QAT)
- Дистилляция новой квантованной модели из существующей неквантованной
Пост-тренировочное квантование (PTQ) принимает обученную модель эмбеддингов как есть и никак ее не изменяет. Это просто вопрос отбрасывания наименее значащих цифр значений с плавающей запятой, производимых моделью. Мы просто округляем числа, а иногда масштабируем их до диапазона.
Output QAT означает тонкую настройку модели эмбеддингов для получения оптимальных векторов с уменьшенной точностью. Это означает изменение модели, но не меняет точность весов модели, и, следовательно, не уменьшает ее размер. Уменьшается только размер выходного вектора.
Full QAT начинается с полностью обученной модели с полной точностью и снижает точность весов модели, а затем тонко настраивает производительность этой измененной модели. Это приводит к созданию значительно меньшей модели, а также меньших по размеру эмбеддингов, ценой некоторой тонкой настройки.
Дистилляция — это процесс обучения новой модели для соответствия производительности существующей. Это означает создание новой модели, которая разработана с нуля как квантованная, а затем использование существующей модели для генерации столько обучающих данных, сколько необходимо для обучения, пока она не будет работать как можно ближе к существующей модели.
Преимущества этих четырех подходов суммированы в таблице ниже:
Подход | Более компактные эмбеддинги? | Требуется обучение? | Сжатие модели? | Более быстрый вывод? |
---|---|---|---|---|
PTQ | ✓ | ❌ | ❌ | ❌ |
Output QAT | ✓ | ✓ | ❌ | ❌ |
Full QAT | ✓ | ✓ | ✓ | ✓ |
Дистилляция | ||||
(к меньшей модели) | ✓ | ✓ | ✓ | ✓ |
Все четыре подхода создают более компактные эмбеддинги, но, кроме PTQ, все требуют некоторого дополнительного обучения, в то время как только Full QAT и дистилляция создают новые, более быстрые модели. Full QAT и дистилляция намного дороже в реализации, поскольку требуют гораздо больше обучения, чем Output QAT.
В этой статье мы рассмотрим только PTQ и Output QAT, которые не меняют размер или скорость модели эмбеддингов.
tagЭкспериментальная установка
Для этих экспериментов нашей базовой моделью является jina-embeddings-v4 с адаптером извлечения, который производит векторы с плавающей запятой 32-битной точности (FP32) в 2048 измерениях. Каждый эмбеддинг, следовательно, имеет размер 8196 байт или 8 кБ.
Мы изучили несколько экспериментальных условий, используя эталонные задачи извлечения запросов-документов из набора NanoBEIR benchmark. Процесс извлечения использует косинусное сходство между векторами для поиска и ранжирования документов, которые лучше всего соответствуют запросам.
- Базовая линия — Производительность векторов эмбеддингов jina-embeddings-v4 без какого-либо квантования. Во всех этих экспериментах использовалась бета-версия модели, и производительность выпуска несколько лучше.
- PTQ — Мы квантовали выходные векторы в бинарные векторы, не меняя модель.
- Output QAT — Мы квантовали выходные векторы и применили тонкую настройку к адаптеру извлечения, чтобы улучшить его производительность в квантованных условиях.
tagУровни квантования

Мы экспериментировали с четырьмя различными уровнями квантования.
- 8-битные целые числа — Значения FP32 сводятся к целым числам в диапазоне от -128 до 127, уменьшая эмбеддинги в 4 раза до 2048 байт.
- 4-битные целые числа — То же, что и для 4-битных целых чисел, но мы отображаем в диапазон от -8 до 7, уменьшая размеры векторов в 8 раз, до 1024 байт.
- Троичное квантование — Все значения отображаются в одно из трех значений: -1, 0, 1. Оптимально хранятся, это уменьшает каждое измерение до 1,6 бита, уменьшая размер векторов эмбеддингов примерно в 40 раз до примерно 230 байт.
- Бинарное квантование — Мы преобразуем скалярные значения FP32 в один бит, используя тип данных
torch.sign
, который предоставляет только два значения, занимающие один бит для хранения. Это уменьшает 2048-мерные векторы эмбеддингов с 8192 байт до 128 байт, что в 64 раза меньше.
tagМасштабирование
Для бинарного квантования квантование очень простое: Если значение вектора выше 0 или положительное, оно отображается в 1. В противном случае оно отображается в -1.

Для других сценариев квантования мы нормализовали значения до диапазона, а затем округлили до ближайшего значения, разрешенного уровнем квантования. Векторы эмбеддингов состоят из масштабируемых чисел между -∞ и +∞ (или, на практике, действительно больших положительных и отрицательных чисел). Мы используем два числа, и , для масштабирования значений для квантования.
Для троичного квантования мы берем каждый компонент вектора и преобразуем его следующим образом:
- если ≥ , становится 1.
- если ≤ , становится -1.
- если < < , становится 0.

Для 4-битных целых чисел:
- если ≥ , становится 7.
- если ≤ , становится -8.
- если < < , становится , затем округляется до ближайшего целого числа. Это масштабирует значение до диапазона .

Для 8-битных целых чисел:
- если ≥ , становится 127.
- если ≤ , становится -128.
- если < < , становится , округленным до ближайшего целого числа. Это масштабирует значение до диапазона .

Для вычисления и мы использовали два подхода:
- Min/Max — Мы обрабатывали наши данные пакетами, и для каждого пакета мы определяли самый высокий и самый низкий компонент вектора, устанавливая на самый высокий, а на самый низкий.
- Скользящее усреднение по пакетам — Для каждого пакета мы вычисляли среднее и стандартное отклонение компонентов вектора. Мы поддерживали скользящее среднее как среднего, так и стандартного отклонения по мере обработки всех пакетов. Если является текущим скользящим средним значений среднего пакета, а является текущим скользящим средним стандартных отклонений, то для каждого пакета:
tagТонкая настройка QAT
Для экспериментов PTQ мы использовали модель как есть и квантовали эмбеддинги, которые она производила, используя методы, описанные выше.
Для Output QAT мы тонко настроили модель, используя прямую оценку. Это означает, что мы обращаем процесс квантования, восстанавливая полную точность значений, прежде чем вычислять потери (т. е. ошибку), а затем используем эту метрику потерь для тонкой настройки модели.
В каждом случае мы выполняли дообучение в течение 10 000 шагов, сохраняя контрольную точку каждые 500 шагов. Затем мы сохранили контрольную точку с наивысшей оценкой в бенчмарке NanoBEIR.
tagАсимметричная квантизация
Посттреничная квантизация (PTQ) и Квантизация с учетом обучения (Output QAT) уменьшают размер векторов 向量模型 (Embeddings), но не уменьшают размер модели или скорость вывода; вся экономия заключается в размере хранимых 向量模型 (Embeddings) документов и скорости поиска.
В результате мы протестировали как квантование векторов запросов, так и оставление их неквантованными во время поиска, поскольку это не меняет размер хранимых векторов 向量模型 (Embeddings) в любом случае.
tagРезультаты
Всего мы протестировали девять условий, которые суммированы в таблицах ниже:
Название условия | Дообучение | Уровень квантования | Стратегия масштабирования | Квантованные запросы |
---|---|---|---|---|
Базовый уровень | ❌ | н/д | н/д | н/д |
PTQ для обоих | ❌ | Двоичный | н/д | ✓ |
PTQ только для документов | ❌ | Двоичный | н/д | ❌ |
QAT Двоичный | ✓ | Двоичный | н/д | ✓ |
QAT Двоичный только для документов | ✓ | Двоичный | н/д | ❌ |
QAT Троичный | ✓ | Троичный | Скользящее среднее | ✓ |
QAT 4-бита | ✓ | 4-бита | Скользящее среднее | ✓ |
QAT 8-бит | ✓ | 8-бит | Скользящее среднее | ✓ |
QAT 8-бит Мин/Макс | ✓ | 8-бит | Мин/Макс | ✓ |
Таблица 2: Экспериментальные условия
Название условия | Средняя оценка | Отличие от базового уровня |
---|---|---|
Базовый уровень | 60.10 | н/д |
PTQ Двоичный | 58.33 | -1.78 |
PTQ Двоичный только для документов | 59.08 | -1.02 |
QAT Двоичный | 59.22 | -0.89 |
QAT Двоичный только для документов | 60.81 | +0.70 |
QAT Троичный | 59.49 | -0.62 |
QAT 4-бита | 61.73 | +1.62 |
QAT 8-бит | 61.67 | +1.56 |
QAT 8-бит Мин/Макс | 61.29 | +1.19 |
Таблица 3: Средняя оценка (в % правильных ответов) для каждого условия по двенадцати бенчмаркам NanoBEIR.
Из приведенной выше таблицы видно, что дообучение для квантования улучшает результаты. Единственное различие между условиями PTQ Двоичный и QAT Двоичный заключается в дообучении, и разница в оценке значительна. Аналогично, мы видим почти 2% улучшение в оценках между условиями PTQ Двоичный только для документов и QAT Двоичный только для документов, которые отличаются только тем же дообучением.
Неудивительно, что мы также видим, что оценки, как правило, улучшаются, чем меньше мы квантуем, при этом 4-битное квантование показывает результаты лучше, чем троичное, а троичное лучше, чем двоичное. Однако дальнейший переход к 8-битам, похоже, ничего не улучшил.
Мы протестировали оставление запросов неквантованными только в двоичных случаях, но, похоже, это улучшает производительность.
Наконец, наши тесты показывают, что метод масштабирования скользящего среднего превосходит упрощенный подход мин/макс.
tagВывод
Квантование имеет некоторые важные операционные преимущества для моделей 向量模型 (Embeddings), значительно уменьшая размер векторов 向量模型 (Embeddings) и ускоряя поиск информации. В то время как простая посттреничная квантизация (PTQ) обеспечивает немедленные преимущества с точки зрения памяти и хранения, наши эксперименты показывают, что квантизация с учетом обучения (QAT) значительно снижает неизбежные потери точности. Дообучение неизменно давало лучшие результаты.
Степень квантования напрямую влияет на производительность, чего и следовало ожидать от метода, основанного на снижении точности значений. Менее агрессивное квантование (например, 4-битное) обычно превосходит более агрессивные методы (например, двоичное), но, что удивительно, не было существенной разницы в производительности между 8-битным и 4-битным квантованием. Казалось бы, пока вы не достигнете определенного порога неточности, разница между большим и меньшим квантованием невелика.
Стратегии масштабирования также важны, при этом метод скользящего среднего показывает превосходные результаты по сравнению с фиксированным подходом мин/макс. Использование значений масштабирования, которые относятся к данным, по-видимому, работает значительно лучше и заслуживает дальнейшего изучения.
Квантование может помочь вам получить больше от ваших моделей 向量模型 (Embeddings) за меньшие деньги. Хотя в этой статье не рассматриваются все варианты квантования, в ней рассматриваются два, которые легко доступны, и они имеют реальные преимущества. Мы работаем над уточнением и улучшением стратегий квантования, чтобы мы могли еще больше снизить затраты пользователей, и ожидаем выпустить двоичную поддержку для jina-embeddings-v4 в ближайшем будущем.