Индекс GPU
Milvus поддерживает различные типы GPU-индексов для повышения производительности и эффективности поиска, особенно в сценариях с высокой пропускной способностью и большим количеством обращений. В этой теме представлен обзор типов GPU-индексов, поддерживаемых Milvus, их подходящих вариантов использования и характеристик производительности. Информацию о создании индексов с помощью GPU см. в разделе Индекс с GPU.
Важно отметить, что использование GPU-индекса не обязательно снизит задержку по сравнению с использованием CPU-индекса. Если вы хотите полностью увеличить пропускную способность, вам потребуется очень высокое давление запросов или большое количество векторов запросов.
производительность
Поддержка GPU в Milvus обеспечивается командой Nvidia RAPIDS. Ниже перечислены типы GPU-индексов, поддерживаемые Milvus в настоящее время.
GPU_CAGRA
GPU_CAGRA - это графовый индекс, оптимизированный для GPU. Использование GPU класса inference для запуска GPU-версии Milvus может быть более экономичным по сравнению с использованием дорогих GPU класса training.
Параметры построения индекса
Параметр Описание Значение по умолчанию intermediate_graph_degree
Влияет на запоминание и время построения, определяя степень графа перед обрезкой. Рекомендуемые значения: 32
или64
.128
graph_degree
Влияет на производительность поиска и запоминание, определяя степень графа после обрезки. Большая разница между этими двумя степенями приводит к увеличению времени построения. Его значение должно быть меньше значения intermediate_graph_degree. 64
build_algo
Выбирает алгоритм генерации графа перед обрезкой. Возможные значения: IVF_PQ
: : Обеспечивает более высокое качество, но меньшее время построения.NN_DESCENT
: Обеспечивает более быстрое построение с потенциально более низким отзывом.IVF_PQ
cache_dataset_on_device
Решает, кэшировать ли исходный набор данных в памяти GPU. Возможные значения: “true”
: Кэширует исходный набор данных, чтобы повысить запоминаемость за счет уточнения результатов поиска.“false”
: Не кэширует исходный набор данных для экономии памяти GPU.“false”
adapt_for_cpu
Определяет, использовать ли GPU для построения индексов и CPU для поиска.
Установка этого параметра в значениеtrue
требует наличия параметраef
в поисковых запросах.“false”
Параметры поиска
Параметр Описание Значение по умолчанию itopk_size
Определяет размер промежуточных результатов, сохраняемых во время поиска. Большее значение может улучшить запоминание за счет снижения производительности поиска. Оно должно быть, по крайней мере, равно конечному значению top-k (limit) и, как правило, равно 2 (например, 16, 32, 64, 128). Пустой search_width
Определяет количество точек входа в граф CAGRA во время поиска. Увеличение этого значения может улучшить запоминание, но может повлиять на производительность поиска (например, 1, 2, 4, 8, 16, 32). Empty min_iterations
/max_iterations
Управляет процессом итерации поиска. По умолчанию они установлены на 0
, и CAGRA автоматически определяет количество итераций на основеitopk_size
иsearch_width
. Настройка этих значений вручную может помочь сбалансировать производительность и точность.0
team_size
Указывает количество потоков CUDA, используемых для вычисления метрического расстояния на GPU. Обычные значения - от 2 до 32 (например, 2, 4, 8, 16, 32). Это значение незначительно влияет на производительность поиска. По умолчанию используется значение 0
, при котором Milvus автоматически выбираетteam_size
в зависимости от размерности вектора.0
ef
Определяет компромисс между временем запроса и точностью. Более высокое значение ef
приводит к более точному, но более медленному поиску.
Этот параметр обязателен, если при построении индекса вы установилиadapt_for_cpu
наtrue
.[top_k, int_max]
Ограничения на поиск
Параметр Диапазон limit
(top-K)<= 1024 limit
(top-K)<=max(( itopk_size
+ 31)// 32,search_width
) * 32
GPU_IVF_FLAT
Подобно IVF_FLAT, GPU_IVF_FLAT также делит векторные данные на кластеры nlist
, а затем сравнивает расстояния между целевым входным вектором и центром каждого кластера. В зависимости от количества кластеров, к которым система настроена на запрос (nprobe
), результаты поиска сходства возвращаются на основе сравнений между целевым входным вектором и векторами только в наиболее похожих кластерах, что значительно сокращает время запроса.
Настраивая nprobe
, можно найти идеальный баланс между точностью и скоростью для конкретного сценария. Результаты тестирования производительности IVF_FLAT показывают, что время выполнения запроса резко увеличивается как при увеличении количества векторов целевого входа (nq
), так и при увеличении количества кластеров для поиска (nprobe
).
GPU_IVF_FLAT - это самый базовый ЭКО-индекс, и закодированные данные, хранящиеся в каждом блоке, соответствуют исходным данным.
При проведении поиска следует учитывать, что для любого поиска по коллекции, проиндексированной GPU_IVF_FLAT, можно задать top-K до 256.
Параметры построения индекса
Параметр Описание Диапазон Значение по умолчанию nlist
Количество единиц кластера [1, 65536] 128
cache_dataset_on_device
Определяет, нужно ли кэшировать исходный набор данных в памяти GPU. Возможные значения: “true”
: Кэширует исходный набор данных для улучшения запоминания путем уточнения результатов поиска.“false”
: Не кэшировать исходный набор данных для экономии памяти графического процессора."true"
"flase"
"false"
Параметры поиска
Общий поиск
Параметр Описание Диапазон Значение по умолчанию nprobe
Количество единиц для запроса [1, nlist] 8
Ограничения на поиск
Параметр Диапазон limit
(top-K)<= 2048
GPU_IVF_PQ
PQ
(Product Quantization) равномерно разлагает исходное высокоразмерное векторное пространство на декартово произведение m
низкоразмерных векторных пространств, а затем квантует разложенные низкоразмерные векторные пространства. Вместо вычисления расстояний между целевым вектором и центром всех единиц, квантование по продуктам позволяет вычислять расстояния между целевым вектором и центром кластеризации каждого низкоразмерного пространства и значительно сокращает временную и пространственную сложность алгоритма.
IVF_PQ выполняет кластеризацию индекса ЭКО перед квантованием произведения векторов. Его индексный файл еще меньше, чем у IVF_SQ8, но это также приводит к потере точности при поиске векторов.
Параметры построения индекса и параметры поиска зависят от дистрибутива Milvus. Сначала выберите свой дистрибутив Milvus.
При поиске обратите внимание, что для любого поиска по коллекции, проиндексированной GPU_IVF_FLAT, можно установить top-K до 8192.
Параметры построения индекса
Параметр Описание Диапазон Значение по умолчанию nlist
Количество единиц кластера [1, 65536] 128
m
Количество коэффициентов квантования произведения, dim mod m or = 0
0
nbits
[Необязательно] Количество бит, в которых хранится каждый низкоразмерный вектор. [1, 16] 8
cache_dataset_on_device
Определяет, нужно ли кэшировать исходный набор данных в памяти GPU. Возможные значения: “true”
: Кэширует исходный набор данных для улучшения запоминания путем уточнения результатов поиска.“false”
: Не кэшировать исходный набор данных для экономии памяти графического процессора."true"
"false"
"false"
Параметры поиска
Общий поиск
Параметр Описание Диапазон Значение по умолчанию nprobe
Количество единиц для запроса [1, nlist] 8
Ограничения на поиск
Параметр Диапазон limit
(top-K)<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE предназначен для случаев, когда крайне важен высокий отзыв, гарантируя отзыв, равный 1, путем сравнения каждого запроса со всеми векторами в наборе данных. В качестве параметров построения индекса и поиска ему требуются только тип метрики (metric_type
) и top-k (limit
).
Для GPU_BRUTE_FORCE дополнительные параметры построения индекса и поиска не требуются.
Заключение
В настоящее время Milvus загружает все индексы в память GPU для эффективной работы поиска. Объем загружаемых данных зависит от размера памяти GPU:
- GPU_CAGRA: использование памяти примерно в 1,8 раза больше, чем исходные векторные данные.
- GPU_IVF_FLAT и GPU_BRUTE_FORCE: Требуется память, равная размеру исходных данных.
- GPU_IVF_PQ: Использует меньший объем памяти, который зависит от настроек параметров сжатия.