blog-post

Представляем векторную квантизацию в Manticore Search

Manticore Search 13.2.3 вводит векторную квантизацию (VQ) в свой движок ближайших соседей K (K-nearest-neighbour) ( KNN ). Новая функция уменьшает использование ОЗУ на порядок, ускоряет индексацию и при этом соответствует (или даже превосходит) пропускную способность поиска полнопроекционных векторов.

Ниже вы найдете краткое введение в VQ, практические примеры и результаты тестов, которые мы провели с manticore-load - официальным инструментом нагрузочного тестирования для Manticore Search.

Что такое векторная квантизация

Векторы обычно хранятся в виде 32-битных чисел с плавающей точкой.
С помощью VQ каждый компонент сжимается до 8 бит или 1 бита. Это сокращает размер индекса (а следовательно, и ОЗУ) в 4–32 раза, в то время как SIMD-инструкции обеспечивают молниеносные расчеты расстояний. Компромисс заключается в небольших ошибках аппроксимации, которые можно устранить с помощью избыточной выборки и повторной оценки (см. ниже).

Включение VQ

Чтобы включить векторную квантизацию (VQ) в Manticore Search, вам нужно добавить атрибут quantization в свой оператор создания таблицы. Этот атрибут задает уровень квантизации, который вы хотите применить к вашим векторам. В следующем примере демонстрируется, как создать таблицу с включенной VQ:

create table products (
  title text,
  vec float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='l2' quantization='1bit'
);

В этом примере атрибут quantization='1bit' сжимает каждый компонент вектора до 1 бита, значительно уменьшая размер индекса и использование ОЗУ. Векторы квантизируются автоматически во время индексации, не требуя дополнительных файлов, обучения или фоновых задач.

Опции конфигурации

Вот доступные параметры при создании таблицы:

SettingPurpose
quantization='8bit'Векторы в 4 раза меньше, с почти нулевой потерей точности
quantization='1bit'Векторы в 32 раза меньше, асимметричная квантизация (см. ниже) для лучшей точности
quantization='1bitsimple'Векторы в 32 раза меньше, самый быстрый, но немного менее точный

Объяснение асимметричной квантизации:

Асимметричная квантизация означает, что векторы запросов и хранящиеся векторы используют разные уровни квантизации. В частности, векторы запросов квантизируются до 4 бит, в то время как векторы, хранящиеся в индексе HNSW, квантизируются до 1 бита. Во время поиска расстояния рассчитываются между 4-битовыми векторами запросов и 1-битовыми хранящимися векторами. Этот подход предлагает большую точность, чем более простые методы, хотя и сопряжен с некоторыми компромиссами по производительности.

Опции запроса

Вы также можете настроить избыточную выборку и повторную оценку при выполнении запроса:

SettingPurpose
oversampling=<float>Получить k × factor кандидатов, используя квантизированные векторы
rescore=1Повторно вычислить расстояния, используя полнопроекционные векторы и переоценить их

Почему важны избыточная выборка + повторная оценка

Квантизация ускоряет поиск, приближая расстояния векторов. Это может привести к небольшим ошибкам, особенно с 1-битным сжатием, что может немного повлиять на полноту. Чтобы это исправить, вы можете:

  • Использовать избыточную выборку, чтобы получить больше кандидатов из квантизированного индекса
  • Использовать повторную оценку для повторной проверки расстояний с помощью оригинальных полнопроекционных векторов и переоценки их

Вместе они обеспечивают полнопроекционную точность с преимуществами скорости и памяти квантизированных векторов.

Вот как это работает в запросе:

select *  
from products  
where knn(vec, 20, (<your 512-dim vector>), {oversampling = 3.0, rescore = 1});

💡 Примечание: избыточная выборка и повторная оценка в основном полезны с квантизированными векторами. Без квантизации они, вероятно, не улучшат качество, но замедлят процесс.

Бенчмарки

Тестовая среда:

  • Сервер с 16 физическими ядрами ЦП (32 виртуальных ядра)
  • 1 М документов
  • 512-мерные L2 векторы
  • размер пакета = 10 000
  • параллелизм = 5 для индексации
  • переменное количество потоков для поиска.

1. Скорость индексации

Векторная квантизация значительно ускоряет процесс индексации, уменьшая вычислительные затраты на расчеты расстояний во время построения графа HNSW. Наши результаты тестирования показывают значительные улучшения как в пропускной способности, так и в задержке.

MetricQuantizedFull-precisionImprovement
Docs/s3,8901,7762.2×
Avg latency13.5s29.6s2.2×
root@perf3 ~ # manticore-load --drop --wait --batch-size=10000 --threads=5 --total=1000000 --init="create table vq1 ( title text, vec float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='l2' quantization='1bit' )" --load="insert into vq1 values ( <increment>, '<text/1/2>', (<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>) )"

...

Total time:       04:17
Total queries:    100
Threads:          5
Batch size:       10000
Total docs:       1000000
Docs per sec avg: 3890
QPS avg:          5
QPS 1p:           0
QPS 5p:           0
QPS 95p:          7
QPS 99p:          7
Latency avg:      13460.8 ms
Latency 50p:      915.0 ms
Latency 95p:      99500.0 ms
Latency 99p:      99500.0 ms



root@perf3 ~ # manticore-load --drop --wait --batch-size=10000 --threads=5 --total=1000000 --init="create table v ( title text, vec float_vector knn_type='hnsw' knn_dims='512' hnsw_similarity='l2' )" --load="insert into v values ( <increment>, '<text/1/2>', (<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>,<float/0/1>) )"

...

Total time:       09:22
Total queries:    100
Threads:          5
Batch size:       10000
Total docs:       1000000
Docs per sec avg: 1776
QPS avg:          5
QPS 1p:           0
QPS 5p:           0
QPS 95p:          8
QPS 99p:          8
Latency avg:      29572.0 ms
Latency 50p:      885.0 ms
Latency 95p:      99500.0 ms
Latency 99p:      99500.0 ms

Ключевые выводы:

  • Улучшение пропускной способности: Квантизированная индексация обрабатывает 3,890 документов в секунду по сравнению с 1,776 для полнопроекционных, что представляет собой ускорение в 2.2×
  • Снижение задержки: Среднее время индексации падает с 29.6 секунд до 13.5 секунд (в 2.2 раза быстрее)
  • Стабильное масштабирование: Обе метрики показывают идентичные коэффициенты улучшения, что указывает на стабильные приросты производительности при различных характеристиках нагрузки

2. Объем ОЗУ

Одно из наиболее значительных преимуществ квантизации - это резкое снижение использования памяти. При работе с крупномасштабными приложениями поиска векторов потребление ОЗУ может стать критическим узким местом, особенно в облачных средах, где затраты на память увеличиваются линейно с использованием.

Размер индекса

На графике выше показана замечательная эффективность использования памяти, достигнутая благодаря 1-битной квантизации. Квантизированный индекс требует всего 216 МБ ОЗУ по сравнению с 2,097 МБ для неквантизированной версии. Это представляет собой 90% сокращение использования памяти, что позволяет обрабатывать гораздо большие наборы данных на том же оборудовании или значительно сократить затраты на инфраструктуру.

root@perf3 ~ # ls -lah /var/lib/manticore/v/*.spknn /var/lib/manticore/vq1/*.spknn
-rw------- 1 manticore manticore  11M Jul 11 16:52 /var/lib/manticore/vq1/vq1.0.spknn
-rw------- 1 manticore manticore 6.5M Jul 11 16:51 /var/lib/manticore/vq1/vq1.1.spknn
-rw------- 1 manticore manticore  69M Jul 11 16:55 /var/lib/manticore/vq1/vq1.2.spknn
-rw------- 1 manticore manticore  11M Jul 11 16:52 /var/lib/manticore/vq1/vq1.3.spknn
-rw------- 1 manticore manticore  69M Jul 11 16:59 /var/lib/manticore/vq1/vq1.4.spknn
-rw------- 1 manticore manticore  11M Jul 11 16:56 /var/lib/manticore/vq1/vq1.5.spknn
-rw------- 1 manticore manticore  39M Jul 11 17:01 /var/lib/manticore/vq1/vq1.6.spknn

=11+6.5+69+11+69+11+39=216.5

-rw------- 1 manticore manticore 105M Jul 11 17:15 /var/lib/manticore/v/v.0.spknn
-rw------- 1 manticore manticore  21M Jul 11 17:14 /var/lib/manticore/v/v.1.spknn
-rw------- 1 manticore manticore 671M Jul 11 17:23 /var/lib/manticore/v/v.2.spknn
-rw------- 1 manticore manticore 105M Jul 11 17:15 /var/lib/manticore/v/v.3.spknn
-rw------- 1 manticore manticore 671M Jul 11 17:31 /var/lib/manticore/v/v.4.spknn
-rw------- 1 manticore manticore 105M Jul 11 17:24 /var/lib/manticore/v/v.5.spknn
-rw------- 1 manticore manticore 419M Jul 11 17:36 /var/lib/manticore/v/v.6.spknn

3. Пропускная способность поиска (без избыточной выборки/повторной оценки)

Установить Manticore Search

Установить Manticore Search