Обзор индексов на GPU
Создание индекса с поддержкой GPU в Milvus может значительно повысить производительность поиска в сценариях с высокой пропускной способностью и большим количеством обращений.
На следующем рисунке сравнивается производительность запросов (запросы в секунду) в различных конфигурациях индекса, аппаратных установках, векторных наборах данных (Cohere и OpenAI) и размерах поисковых партий, и показано, что GPU_CAGRA неизменно превосходит другие методы.
Производительность индексов на GPU
Настройка пула памяти GPU для Milvus
Milvus поддерживает глобальный пул памяти GPU и предоставляет два параметра конфигурации, initMemSize и maxMemSize, в файле конфигурации Milvus.
gpu:
initMemSize: 0 # set the initial memory pool size.
maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.
По умолчанию initMemSize обычно занимает половину памяти GPU при запуске Milvus, а maxMemSize по умолчанию занимает всю память GPU. Размер пула памяти GPU изначально установлен на initMemSize и будет автоматически расширяться до maxMemSize по мере необходимости.
Если указан индекс с поддержкой GPU, Milvus загружает данные целевой коллекции в память GPU перед поиском, поэтому maxMemSize должен быть не меньше размера данных.
Ограничения
Для
GPU_IVF_FLATмаксимальное значение дляlimitсоставляет 1 024.Для
GPU_IVF_PQиGPU_CAGRAмаксимальное значение дляlimitравно 1 024.Хотя для
GPU_BRUTE_FORCEнет установленного значенияlimit, рекомендуется не превышать 4 096, чтобы избежать потенциальных проблем с производительностью.В настоящее время индексы GPU не поддерживают расстояние
COSINE. Если требуется расстояниеCOSINE, данные следует сначала нормализовать, а затем можно использовать расстояние внутреннего произведения (IP) в качестве замены.Защита от OOM при загрузке для GPU-индексов поддерживается не полностью, слишком большой объем данных может привести к сбою QueryNode.
GPU-индексы не поддерживают такие функции поиска, как поиск по диапазону и поиск по группировке.
Поддерживаемые типы индексов GPU
В следующей таблице перечислены типы индексов GPU, поддерживаемые Milvus.
Тип индекса |
Описание |
Использование памяти |
|---|---|---|
GPU_CAGRA - это графовый индекс, оптимизированный для GPU. Использование GPU класса inference для запуска GPU-версии Milvus может быть более экономичным по сравнению с использованием дорогих GPU класса training. |
Объем памяти примерно в 1,8 раза больше, чем у исходных векторных данных. |
|
GPU_IVF_FLAT - это самый базовый ЭКО-индекс, и закодированные данные, хранящиеся в каждом блоке, соответствуют исходным данным. При выполнении поиска следует учитывать, что для любого поиска по коллекции, проиндексированной GPU_IVF_FLAT, можно задать top-k ( |
Требуется память, равная размеру исходных данных. |
|
GPU_IVF_PQ выполняет кластеризацию индексов ЭКО перед квантованием произведения векторов. При выполнении поиска следует учитывать, что для любого поиска по коллекции, проиндексированной GPU_IVF_FLAT, можно установить top-k ( |
Использует меньший объем памяти, который зависит от настроек параметров сжатия. |
|
GPU_BRUTE_FORCE предназначен для случаев, когда крайне важен высокий отзыв, гарантируя отзыв, равный 1, путем сравнения каждого запроса со всеми векторами в наборе данных. В качестве параметров построения индекса и поиска ему требуются только тип метрики ( |
Требуется память, равная размеру исходных данных. |
Настройка параметров Milvus для управления памятью GPU
Milvus использует глобальный пул графической памяти для выделения памяти GPU. Он поддерживает два параметра initMemSize и maxMemSize в конфигурационном файле Milvus. Изначально размер пула устанавливается на initMemSize, а после превышения этого лимита автоматически увеличивается до maxMemSize.
По умолчанию initMemSize составляет 1/2 доступной памяти GPU при запуске Milvus, а по умолчанию maxMemSize равен всей доступной памяти GPU.
До версии Milvus 2.4.1 Milvus использует единый пул памяти GPU. В версиях до 2.4.1 рекомендуется устанавливать оба значения в 0.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Начиная с Milvus 2.4.1, пул памяти GPU используется только для временных данных GPU во время поиска. Поэтому рекомендуется устанавливать значения 2048 и 4096.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Чтобы узнать, как построить GPU-индекс, обратитесь к специальному руководству для каждого типа индекса.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Когда целесообразно использовать GPU-индекс?
GPU-индекс особенно полезен в ситуациях, требующих высокой пропускной способности или большого количества обращений. Например, при работе с большими партиями данных производительность индексирования на GPU может превышать производительность индексирования на CPU в 100 раз. В сценариях с небольшими партиями индексы на GPU по-прежнему значительно превосходят индексы на CPU по производительности. Кроме того, если требуется быстрая вставка данных, использование GPU может существенно ускорить процесс создания индексов.
В каких сценариях GPU-индексы, такие как GPU_CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT и GPU_BRUTE_FORCE, являются наиболее подходящими?
GPU_CAGRAЭти индексы идеально подходят для сценариев, в которых требуется повышенная производительность, хотя и ценой потребления большего объема памяти. В средах, где экономия памяти является приоритетом, индексGPU_IVF_PQможет помочь минимизировать требования к хранению, хотя это сопровождается большими потерями в точности. ИндексGPU_IVF_FLATявляется сбалансированным вариантом, предлагающим компромисс между производительностью и потреблением памяти. Наконец, индексGPU_BRUTE_FORCEпредназначен для исчерпывающих поисковых операций, гарантируя коэффициент отзыва, равный 1, при выполнении сквозного поиска.