IVF_RABITQCompatible with Milvus 2.6.x
Индекс IVF_RABITQ - это алгоритм индексации на основе двоичного квантования, который квантует векторы FP32 в двоичное представление. Этот индекс обеспечивает исключительную эффективность хранения с коэффициентом сжатия 1 к 32, сохраняя при этом относительно хорошие показатели запоминания. Он поддерживает опциональное уточнение для достижения более высокого уровня запоминания ценой дополнительной памяти, что делает его универсальной заменой IVF_SQ8 и IVF_FLAT в сценариях с ограниченным объемом памяти.
Обзор
IVF_RABITQ означает Inverted File with RaBitQ quantization, объединяющий две мощные техники для эффективного поиска и хранения векторов.
IVF
Inverted File (IVF) организует пространство векторов в управляемые регионы с помощью кластеризации k-means. Каждый кластер представлен центроидом, который служит точкой отсчета для векторов внутри этого кластера. Такой подход к кластеризации сокращает пространство поиска, позволяя алгоритму сосредоточиться только на наиболее релевантных кластерах при обработке запроса.
Чтобы узнать больше о технических деталях IVF, обратитесь к разделу IVF_FLAT.
RaBitQ
RaBitQ - это современный метод бинарного квантования с теоретическими гарантиями, представленный в научной статье "RaBitQ: квантование высокоразмерных векторов с теоретическим ограничением ошибки для приближенного поиска ближайших соседей" Цзяньяна Гао и Ченга Лонга.
RaBitQ представляет несколько инновационных концепций:
Кодирование угловой информации: В отличие от традиционного пространственного кодирования, RaBitQ кодирует угловую информацию через нормализацию вектора. В IVF_RABITQ векторы данных нормализуются относительно ближайшего центроида IVF, что повышает точность процесса квантования.
Теоретическая основа: Основная формула аппроксимации расстояния имеет вид:
Где:
- o - вектор данных из набора данных.
- q - вектор запроса
- c - ближайший центроидный вектор ЭКО для o
- C, ) и C , ) являются предварительно вычисленными константами
- o q представляет собой операцию точечного произведения.
Эффективность вычислений: Бинарная природа AVX-512 VPOPCNTDQ на процессорах Intel Ice Lake+ или AMD Zen 4+.
Алгоритмические усовершенствования: RaBitQ эффективно интегрируется с такими известными методами, как подходFastScan и случайные вращения, что повышает производительность.
ЭКО + RaBitQ
Индекс IVF_RABITQ сочетает в себе эффективную кластеризацию IVF и передовое двоичное квантование RaBitQ:
Грубая фильтрация: IVF разбивает векторное пространство на кластеры, значительно сокращая область поиска за счет фокусировки на наиболее релевантных областях кластеров.
Бинарное квантование: Внутри каждого кластера RaBitQ сжимает векторы в двоичное представление, сохраняя при этом существенные отношения расстояний с помощью теоретических гарантий.
Дополнительное уточнение: Если эта функция включена, индекс хранит дополнительные уточненные данные, используя форматы более высокой точности (SQ6, SQ8, FP16, BF16 или FP32), чтобы улучшить показатели запоминания за счет увеличения объема памяти.
Milvus реализует IVF_RABITQ с использованием следующих фабричных строк FAISS:
- С уточнением:
"RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})" - Без уточнения:
"RR({dim}),IVF{nlist},RaBitQ"
Построить индекс
Чтобы построить индекс IVF_RABITQ для векторного поля в Milvus, используйте метод add_index(), указав index_type, metric_type и дополнительные параметры для индекса.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_RABITQ", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 1024, # Number of clusters for the index
"refine": True, # Enable refinement for higher recall
"refine_type": "SQ8" # Refinement data format
} # Index building params
)
В данной конфигурации:
index_type: Тип индекса, который будет построен. В этом примере задайте значениеIVF_RABITQ.metric_type: Метод, используемый для вычисления расстояния между векторами. Поддерживаются следующие значения:COSINE,L2иIP. Подробнее см. в разделе Типы метрик.params: Дополнительные параметры конфигурации для построения индекса. Подробнее см. в разделе Параметры построения индекса.
После настройки параметров индекса вы можете создать индекс, используя метод create_index() напрямую или передавая параметры индекса в метод create_collection. Подробнее см. в разделе Создание коллекции.
Поиск по индексу
После того как индекс создан и сущности вставлены, можно выполнять поиск по сходству в индексе.
search_params = {
"params": {
"nprobe": 128, # Number of clusters to search
"rbq_query_bits": 0, # Query vector quantization bits
"refine_k": 1 # Refinement magnification factor
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
В этой конфигурации:
params: Дополнительные параметры конфигурации для поиска по индексу. Подробнее см. в разделе Параметры поиска по индексу.
Индекс IVF_RABITQ в значительной степени полагается на аппаратную инструкцию popcount для обеспечения оптимальной производительности. Современные архитектуры процессоров, такие как Intel IceLake+ или AMD Zen 4+ с набором инструкций AVX512VPOPCNTDQ, обеспечивают значительный прирост производительности при выполнении операций RaBitQ.
Параметры индекса
В этом разделе представлен обзор параметров, используемых для построения индекса и выполнения поиска по нему.
Параметры построения индекса
В следующей таблице перечислены параметры, которые могут быть настроены в params при построении индекса.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
ЭКО |
|
Количество кластеров, создаваемых с помощью алгоритма k-means при построении индекса. Каждый кластер, представленный центроидом, хранит список векторов. Увеличение этого параметра уменьшает количество векторов в каждом кластере, создавая меньшие, более целенаправленные разделы. |
Тип: Целое число |
Большие значения |
RaBitQ |
|
Включает процесс уточнения и сохраняет уточненные данные. |
Тип: Булево |
Установите значение |
|
Определяет представление данных, используемое для уточнения, когда включено |
Тип: Строка |
Перечисленные значения представлены в порядке возрастания частоты запоминания, уменьшения QPS и увеличения размера хранилища. |
Параметры поиска, специфичные для индекса
В следующей таблице перечислены параметры, которые могут быть настроены в search_params.params при поиске по индексу.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
ЭКО |
|
Количество кластеров для поиска кандидатов. Большие значения позволяют искать в большем количестве кластеров, что улучшает запоминание благодаря расширению области поиска, но ценой увеличения задержки запроса. |
Тип: Целое число |
Увеличение этого значения улучшает запоминание, но может замедлить поиск. Установите значение |
RaBitQ |
|
Устанавливает, будет ли применяться дополнительное скалярное квантование вектора запроса. Если установлено значение |
Тип: Целое число |
Значение по умолчанию |
|
Процесс уточнения использует более качественное квантование, чтобы выбрать необходимое количество ближайших соседей из |
Тип: Плавающая величина |
Более высокие значения |