• О Милвусе
  • Начать
  • Концепции
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебники
  • Вопросы и ответы
  • API Reference

AISAQCompatible with Milvus 2.6.4+

AISAQ - это дисковый векторный индекс, который расширяет возможности DISKANN для работы с миллиардными массивами данных при минимальной занимаемой площади DRAM.

В отличие от DISKANN, которая хранит сжатые векторы в памяти, AISAQ спроектирована с "почти нулевой архитектурой DRAM", что означает хранение всех структур данных на SSD.

AISAQ позволяет работать с базами данных сверхвысокого масштаба на стандартных серверах, предлагая режимы работы, позволяющие сбалансировать производительность и стоимость хранения данных.

Принцип работы AISAQ

На диаграмме выше сравниваются схемы хранения данных DISKANN, AISAQ-Performance и AISAQ-Scale, показывающие, как данные (необработанные векторы, списки ребер и PQ-коды) распределяются между оперативной памятью и диском.

Aisaq Vs Diskann 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. Их настройка может повлиять на размер индекса, время построения и качество поиска.

Параметр

Описание

Диапазон значений

Предложение по настройке

max_degree

Управляет максимальным количеством связей (ребер), которое может иметь каждая точка данных в графе Vamana.

Тип: Целое число

Диапазон: [1, 512]

Значение по умолчанию: 56

Более высокие значения создают более плотные графики, что потенциально повышает запоминаемость (поиск более релевантных результатов), но также увеличивает расход памяти и время построения. В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [10, 100].

search_list_size

При построении индекса этот параметр определяет размер пула кандидатов, используемого при поиске ближайших соседей для каждого узла. Для каждого узла, добавляемого в граф, алгоритм ведет список найденных на данный момент лучших кандидатов search_list_size. Поиск соседей прекращается, когда этот список больше не может быть улучшен. Из этого пула кандидатов выбираются узлы с максимальным числом градусов для формирования финальных ребер.

Тип: Целое число

Диапазон: [1, 512]

Значение по умолчанию: 100

Больший размер search_list_size увеличивает вероятность нахождения истинных ближайших соседей для каждого узла, что может привести к получению более качественного графа и повышению эффективности поиска (recall). Однако за это приходится платить значительно большим временем построения индекса. Это значение всегда должно быть больше или равно max_degree.

inline_pq

Количество векторов PQ, хранящихся в строке для каждого узла индекса (считывается при обращении к узлу, чтобы сократить количество операций ввода-вывода)

Тип: Integer

Диапазон: [0, max_degree].

Значение по умолчанию: -1

Большие значения inline_pq повышают производительность, но увеличивают дисковое пространство.

Установите inline_pq=0 для работы AISAQ в режиме масштабирования.

Установите inline_pq=-1, чтобы автоматически заполнить все неиспользуемое пространство в индексе векторами PQ для дальнейшей оптимизации AISAQ в режиме масштабирования.

Установите inline_pq=max_degree для AISAQ в режиме производительности.

inline_pq Настройки в диапазоне от 0 до max_degree позволяют регулировать баланс между производительностью и потреблением дискового пространства.

rearrange

Переупорядочить структуру данных векторов PQ для улучшения локальности данных и уменьшения обращений к диску во время поиска (игнорируется в режиме производительности).

Тип: Булево

Диапазон: [true, false].

Значение по умолчанию: true

Если значение true, уменьшает количество операций ввода-вывода во время поиска с незначительным увеличением объема памяти и времени построения индекса.

num_entry_points

Количество точек входа-кандидатов для оптимизации выбора точки входа в поиск.

Тип: Integer

Диапазон: [0, 1000]

Значение по умолчанию: 100

Большие значения могут сократить время поиска за счет начала поиска с более близкой точки входа.

Задайте более высокие значения для больших сегментов (например, для векторов размером 10 М и выше используйте значение 1000).

pq_code_budget_gb_ratio

Управляет размером PQ-кодов (сжатых представлений точек данных) по сравнению с размером несжатых данных.

Тип: Float

Диапазон: (0.0, 0.25]

Значение по умолчанию: 0.125

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

В большинстве случаев рекомендуется задавать значение в этом диапазоне: (0.0417, 0.25].

disk_pq_code_budget_gb_ratio

Контролирует размер PQ-кодов высокоточных векторов, хранящихся в индексе (используется для повторного ранжирования), по сравнению с размером несжатых данных.

Тип: Float

Диапазон: [0, 0.25]

Значение по умолчанию: 0.25

При значении по умолчанию 0,25 векторы будут квантованы до 25 % от их исходного размера (сжатие 4×), что уменьшает занимаемую площадь на диске при относительно минимальном влиянии на точность.

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

pq_cache_size

Размер кэша векторов PQ в DRAM (байты). Кэш векторов PQ загружается во время загрузки индекса и используется во время поиска для уменьшения количества операций ввода-вывода (игнорируется в режиме производительности).

Тип: Целое число

Диапазон: [0, 1073741824]

Значение по умолчанию: 0

Увеличение объема кэша повышает производительность запросов, но увеличивает расход DRAM.

search_cache_budget_gb_ratio

Контролирует объем DRAM, который будет использоваться для кэширования часто обращающихся узлов индекса.

Этот кэш загружается во время загрузки индекса и используется во время поиска для уменьшения количества операций ввода-вывода.

Тип: Float

Диапазон: [0.0, 0.3)

Значение по умолчанию: 0

При большем значении выделяется больше памяти для кэширования, что уменьшает количество обращений к диску, но потребляет больше системной памяти. Меньшее значение использует меньше памяти для кэширования, потенциально увеличивая потребность в обращении к диску.

Параметры индексного поиска

Эти параметры влияют на то, как AISAQ выполняет поиск. Их настройка может повлиять на скорость поиска, задержку и использование ресурсов.

Параметр

Описание

Диапазон значений

Предложение по настройке

search_list

Во время поиска этот параметр определяет размер пула кандидатов, который алгоритм сохраняет по мере прохождения графа. Большее значение увеличивает шансы найти истинных ближайших соседей (более высокий отзыв), но также увеличивает задержку поиска.

Тип: Целое число

Диапазон: [topk, int32_max].

Значение по умолчанию: 16

Для достижения хорошего баланса между производительностью и точностью рекомендуется установить это значение равным или немного большим, чем количество результатов, которые вы хотите получить (top_k).

beamwidth

Управляет степенью параллелизма при поиске, определяя максимальное количество параллельных запросов ввода-вывода на диск для чтения узлов индекса.

Тип: Целое число

Диапазон: [1, 16]

Значение по умолчанию: 8

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

В большинстве случаев мы рекомендуем устанавливать значение 2.

vectors_beamwidth

Управляет степенью параллелизма при поиске, определяя максимальное количество параллельных запросов дискового ввода-вывода для чтения групп соседних векторов PQ (игнорируется в режиме производительности).

Тип: Целое число

Диапазон: [1, 4] должно быть <= beamwidth

Значение по умолчанию: 1

Большие значения увеличивают параллелизм, что может ускорить поиск на системах с мощными процессорами и SSD. Однако слишком высокое значение может привести к чрезмерному потреблению ресурсов, поскольку каждая соседняя группа векторов PQ может содержать до max_degree векторов.

В большинстве случаев мы рекомендуем устанавливать значение 1.

pq_read_page_cache_size

Размер кэша чтения PQ в DRAM на один поток поиска (байты). В нем кэшируются часто используемые страницы данных, содержащие векторы PQ (игнорируется в режиме производительности и применяется только в том случае, если значение rearrange равно true).

Кэш-память для чтения PQ повторно используется во всех сегментах AISAQ.

Тип: Целое число

Диапазон: [0, 33554432]

Значение по умолчанию: 5242880 (5MiB)

Увеличение объема кэша повышает производительность запросов, но увеличивает расход DRAM.

Рекомендуемые значения: 2 Мбайт для малых сегментов (1 М векторов), 5 Мбайт для средних сегментов (50 М векторов) и 10 Мбайт для больших сегментов (250 М векторов).

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?