AISAQCompatible with Milvus 2.6.4+
AISAQ - это дисковый векторный индекс, который расширяет возможности DISKANN для работы с миллиардными массивами данных при минимальной занимаемой площади DRAM.
В отличие от DISKANN, которая хранит сжатые векторы в памяти, AISAQ спроектирована с "почти нулевой архитектурой DRAM", что означает хранение всех структур данных на SSD.
AISAQ позволяет работать с базами данных сверхвысокого масштаба на стандартных серверах, предлагая режимы работы, позволяющие сбалансировать производительность и стоимость хранения данных.
Принцип работы AISAQ
На диаграмме выше сравниваются схемы хранения данных DISKANN, AISAQ-Performance и AISAQ-Scale, показывающие, как данные (необработанные векторы, списки ребер и PQ-коды) распределяются между оперативной памятью и диском.
Aisaq Vs Diskann
Основание: Обзор DISKANN
В DISKANN необработанные векторы и списки граней хранятся на диске, а векторы, сжатые в PQ-коды, - в памяти (DRAM).
Когда DISKANN переходит к узлу (например, вектору 0):
Он загружает с диска необработанный вектор(raw_vector_0) и его список граней(edgelist_0).
Список ребер указывает, каких соседей следует посетить в следующий раз (узлы 2, 3 и 5 в данном примере).
Необработанный вектор используется для вычисления точного расстояния до вектора запроса для ранжирования.
Данные PQ в памяти используются для фильтрации приблизительного расстояния, чтобы направить следующий обход.
Поскольку данные PQ уже кэшированы в DRAM, каждое посещение узла требует только одного дискового ввода-вывода, что обеспечивает высокую скорость выполнения запроса при умеренном использовании памяти.
Подробное описание этих компонентов и параметров см. в разделе ДИСКАНН.
Режимы работы AISAQ
AISAQ предлагает два режима работы для решения двух различных задач:
Режим производительности: оптимизирован для приложений, которым требуется низкая задержка и высокая пропускная способность в масштабе, например для онлайнового семантического поиска.
Режим масштабирования: оптимизирован для приложений с более мягкими ограничениями по задержкам, таких как RAG и автономный семантический поиск, и позволяет экономически эффективно расширять наборы данных до сверхвысоких масштабов.
Режим AISAQ-performance
AISAQ-performance достигает "почти нулевого следа DRAM" за счет перемещения данных PQ из памяти на диск при сохранении низкого IOPS благодаря размещению данных и резервированию.
Необработанный вектор каждого узла, список ребер и PQ-данные его соседей хранятся вместе на диске.
Такая компоновка гарантирует, что посещение узла (например, вектора 0) потребует только одного дискового ввода-вывода.
Поскольку данные PQ хранятся в избытке вблизи нескольких узлов, размер индексного файла значительно увеличивается, занимая больше места на диске.
Режим AISAQ-scale
AISAQ-scale нацелен на снижение использования дискового пространства при соблюдении требований к производительности целевых приложений.
В этом режиме:
PQ-данные хранятся на диске отдельно, без избыточности.
Такая конструкция минимизирует размер индекса, но приводит к увеличению количества операций ввода-вывода при обходе графа.
Чтобы снизить нагрузку на IOPS, AISAQ использует две оптимизации:
Алгоритм перестановки, который сортирует векторы PQ по приоритету для улучшения локальности данных.
Кэш PQ в DRAM (pq_read_page_cache_size), который кэширует часто используемые данные PQ.
Пример конфигурации
# milvus.yaml
knowhere:
AISAQ:
build:
max_degree: 56 # Controls the maximum number of connections (edges) each data point can have in the Vamana graph
search_list_size: 100 # During index construction, this parameter defines the size of the candidate pool used when searching for the nearest neighbors for each node. For every node being added to the graph, the algorithm maintains a list of the search_list_size best candidates found so far. The search for neighbors stops when this list can no longer be improved. From this final candidate pool, the top max_degree nodes are selected to form the final edges
inline_pq: -1 # Number of PQ vectors stored inline per Index node (read when node is accessed, to reduce IO)
rearrange: true # Re-arrange the PQ vectors data structure to improve data locality and reduce disk accesses during search (ignored in performance mode)
num_entry_points: 100 # Number of candidate entry points to optimize search entry-point selection
pq_code_budget_gb_ratio: 0.125 # Controls the size of the PQ codes (compressed representations of data points) compared to the size of the uncompressed data
disk_pq_code_budget_gb_ratio: 0.25 # Controls the size of the PQ codes of the high precision vectors stored in the index (used for re-ranking), compared to the size of the uncompressed data
pq_cache_size: 0 # PQ vectors cache size in DRAM (bytes). The PQ vectors cache is loaded during Index load and used during search to reduce IOs (ignored in performance mode)
search_cache_budget_gb_ratio: 0 # Controls the amount of DRAM to be used for caching frequently accessed index nodes. This cache is loaded during index load and used during search to reduce IOs
search:
search_list: 16 # During a search operation, this parameter determines the size of the candidate pool that the algorithm maintains as it traverses the graph. A larger value increases the chances of finding the true nearest neighbors (higher recall) but also increases search latency
beamwidth: 8 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read the index nodes
vectors_beamwidth: 1 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read groups of neighboring PQ vectors (ignored in performance mode)
pq_read_page_cache_size: 5242880 (5MiB) # PQ read cache size in DRAM per search thread (bytes). It caches frequently accessed data pages containing PQ vectors (ignored in performance mode and applicable only when rearrange is true). The PQ read cache memory is reused across all AISAQ segments
Параметры AISAQ
AISAQ наследует некоторые параметры от DISKANN - max_degree, search_list_size, и pq_code_budget_gb_ratio.
Параметры построения индексов
Эти параметры влияют на то, как строится индекс AISAQ. Их настройка может повлиять на размер индекса, время построения и качество поиска.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|---|---|---|---|
|
Управляет максимальным количеством связей (ребер), которое может иметь каждая точка данных в графе Vamana. |
Тип: Целое число Диапазон: [1, 512] Значение по умолчанию: |
Более высокие значения создают более плотные графики, что потенциально повышает запоминаемость (поиск более релевантных результатов), но также увеличивает расход памяти и время построения. В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [10, 100]. |
|
При построении индекса этот параметр определяет размер пула кандидатов, используемого при поиске ближайших соседей для каждого узла. Для каждого узла, добавляемого в граф, алгоритм ведет список найденных на данный момент лучших кандидатов search_list_size. Поиск соседей прекращается, когда этот список больше не может быть улучшен. Из этого пула кандидатов выбираются узлы с максимальным числом градусов для формирования финальных ребер. |
Тип: Целое число Диапазон: [1, 512] Значение по умолчанию: |
Больший размер search_list_size увеличивает вероятность нахождения истинных ближайших соседей для каждого узла, что может привести к получению более качественного графа и повышению эффективности поиска (recall). Однако за это приходится платить значительно большим временем построения индекса. Это значение всегда должно быть больше или равно max_degree. |
|
Количество векторов PQ, хранящихся в строке для каждого узла индекса (считывается при обращении к узлу, чтобы сократить количество операций ввода-вывода) |
Тип: Integer Диапазон: [0, max_degree]. Значение по умолчанию: |
Большие значения Установите Установите Установите
|
|
Переупорядочить структуру данных векторов PQ для улучшения локальности данных и уменьшения обращений к диску во время поиска (игнорируется в режиме производительности). |
Тип: Булево Диапазон: [true, false]. Значение по умолчанию: |
Если значение true, уменьшает количество операций ввода-вывода во время поиска с незначительным увеличением объема памяти и времени построения индекса. |
|
Количество точек входа-кандидатов для оптимизации выбора точки входа в поиск. |
Тип: Integer Диапазон: [0, 1000] Значение по умолчанию: |
Большие значения могут сократить время поиска за счет начала поиска с более близкой точки входа. Задайте более высокие значения для больших сегментов (например, для векторов размером 10 М и выше используйте значение 1000). |
|
Управляет размером PQ-кодов (сжатых представлений точек данных) по сравнению с размером несжатых данных. |
Тип: Float Диапазон: (0.0, 0.25] Значение по умолчанию: |
Более высокий коэффициент приводит к более точным результатам поиска, эффективно сохраняя больше информации об исходных векторах, но увеличивает вычислительную сложность при поиске. В большинстве случаев рекомендуется задавать значение в этом диапазоне: (0.0417, 0.25]. |
|
Контролирует размер PQ-кодов высокоточных векторов, хранящихся в индексе (используется для повторного ранжирования), по сравнению с размером несжатых данных. |
Тип: Float Диапазон: [0, 0.25] Значение по умолчанию: |
При значении по умолчанию 0,25 векторы будут квантованы до 25 % от их исходного размера (сжатие 4×), что уменьшает занимаемую площадь на диске при относительно минимальном влиянии на точность. Установите значение 0, чтобы хранить векторы с полной точностью в дисковом индексе для повторного ранжирования. Большее значение обеспечивает более высокий коэффициент отзыва, но увеличивает использование диска. |
|
Размер кэша векторов PQ в DRAM (байты). Кэш векторов PQ загружается во время загрузки индекса и используется во время поиска для уменьшения количества операций ввода-вывода (игнорируется в режиме производительности). |
Тип: Целое число Диапазон: [0, 1073741824] Значение по умолчанию: |
Увеличение объема кэша повышает производительность запросов, но увеличивает расход DRAM. |
|
Контролирует объем DRAM, который будет использоваться для кэширования часто обращающихся узлов индекса. Этот кэш загружается во время загрузки индекса и используется во время поиска для уменьшения количества операций ввода-вывода. |
Тип: Float Диапазон: [0.0, 0.3) Значение по умолчанию: |
При большем значении выделяется больше памяти для кэширования, что уменьшает количество обращений к диску, но потребляет больше системной памяти. Меньшее значение использует меньше памяти для кэширования, потенциально увеличивая потребность в обращении к диску. |
Параметры индексного поиска
Эти параметры влияют на то, как AISAQ выполняет поиск. Их настройка может повлиять на скорость поиска, задержку и использование ресурсов.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|---|---|---|---|
|
Во время поиска этот параметр определяет размер пула кандидатов, который алгоритм сохраняет по мере прохождения графа. Большее значение увеличивает шансы найти истинных ближайших соседей (более высокий отзыв), но также увеличивает задержку поиска. |
Тип: Целое число Диапазон: [topk, int32_max]. Значение по умолчанию: |
Для достижения хорошего баланса между производительностью и точностью рекомендуется установить это значение равным или немного большим, чем количество результатов, которые вы хотите получить (top_k). |
|
Управляет степенью параллелизма при поиске, определяя максимальное количество параллельных запросов ввода-вывода на диск для чтения узлов индекса. |
Тип: Целое число Диапазон: [1, 16] Значение по умолчанию: |
Более высокие значения увеличивают параллелизм, что может ускорить поиск в системах с мощными процессорами и твердотельными накопителями. Однако слишком высокое значение может привести к чрезмерной нагрузке на ресурсы. В большинстве случаев мы рекомендуем устанавливать значение 2. |
|
Управляет степенью параллелизма при поиске, определяя максимальное количество параллельных запросов дискового ввода-вывода для чтения групп соседних векторов PQ (игнорируется в режиме производительности). |
Тип: Целое число Диапазон: [1, 4] должно быть <= beamwidth Значение по умолчанию: |
Большие значения увеличивают параллелизм, что может ускорить поиск на системах с мощными процессорами и SSD. Однако слишком высокое значение может привести к чрезмерному потреблению ресурсов, поскольку каждая соседняя группа векторов PQ может содержать до max_degree векторов. В большинстве случаев мы рекомендуем устанавливать значение 1. |
|
Размер кэша чтения PQ в DRAM на один поток поиска (байты). В нем кэшируются часто используемые страницы данных, содержащие векторы PQ (игнорируется в режиме производительности и применяется только в том случае, если значение rearrange равно true). Кэш-память для чтения PQ повторно используется во всех сегментах AISAQ. |
Тип: Целое число Диапазон: [0, 33554432] Значение по умолчанию: |
Увеличение объема кэша повышает производительность запросов, но увеличивает расход DRAM. Рекомендуемые значения: 2 Мбайт для малых сегментов (1 М векторов), 5 Мбайт для средних сегментов (50 М векторов) и 10 Мбайт для больших сегментов (250 М векторов). |