🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Руководство пользователя
    • Индексы
  • Home
  • Docs
  • Руководство пользователя

  • Индексы

  • Индексы с поддержкой GPU

Индекс с GPU

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

Настройка параметров Milvus для управления памятью GPU

Milvus использует глобальный пул графической памяти для выделения памяти GPU.

Он поддерживает два параметра initMemSize и maxMemSize в файле конфигурации Milvus. Изначально размер пула устанавливается на initMemSize, а после превышения этого лимита автоматически увеличивается до maxMemSize.

По умолчанию initMemSize составляет 1/2 доступной памяти GPU при запуске Milvus, а по умолчанию maxMemSize равен всей доступной памяти GPU.

До версии Milvus 2.4.1 (включая версию 2.4.1) Milvus использовал единый пул памяти GPU. Для версий до 2.4.1 (включая версию 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 определите index_type, metric_type и params:

  • index_type(string): Тип индекса, используемого для ускорения векторного поиска. Возможные варианты: GPU_CAGRA, GPU_IVF_FLAT, GPU_IVF_PQ и GPU_BRUTE_FORCE.

  • metric_type(строка): Тип метрики, используемой для измерения сходства векторов. Возможные варианты: IP и L2.

  • params(dict): Специфические для индекса параметры построения. Валидные опции для этого параметра зависят от типа индекса.

Ниже приведены примеры конфигураций для различных типов индексов:

  • ИндексGPU_CAGRA

    index_params = {
        "metric_type": "L2",
        "index_type": "GPU_CAGRA",
        "params": {
            'intermediate_graph_degree': 64,
            'graph_degree': 32
        }
    }
    

    Возможные опции для параметра params включают:

    • intermediate_graph_degree(int): Влияет на запоминание и время построения, определяя степень графа перед обрезкой. Рекомендуемые значения - 32 или 64.

    • graph_degree(int): Влияет на производительность поиска и запоминание, задавая степень графа после обрезки. Обычно она равна половине промежуточной_графовой_степени. Большая разница между этими двумя степенями приводит к увеличению времени построения. Его значение должно быть меньше значения intermediate_graph_degree.

    • build_algo(строка): Выбирает алгоритм построения графа перед обрезкой. Возможные варианты:

      • IVF_PQ: предлагает более высокое качество, но более медленное время построения.

      • NN_DESCENT: Обеспечивает более быстрое построение с потенциально более низким отзывом.

    • cache_dataset_on_device(string, "true" | "false"): Решает, нужно ли кэшировать исходный набор данных в памяти GPU. Значение "true" повышает запоминаемость за счет уточнения результатов поиска, а значение "false" экономит память GPU.

  • ИндексGPU_IVF_FLAT или GPU_IVF_PQ

    index_params = {
        "metric_type": "L2",
        "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ
        "params": {
            "nlist": 1024
        }
    }
    

    Параметры params идентичны тем, что используются в IVF_FLAT и IVF_PQ.

  • ИндексGPU_BRUTE_FORCE

    index_params = {
        'index_type': 'GPU_BRUTE_FORCE',
        'metric_type': 'L2',
        'params': {}
    }
    

    Никаких дополнительных конфигураций params не требуется.

Построение индекса

После настройки параметров индекса в index_params вызовите метод create_index() для построения индекса.

# Get an existing collection
collection = Collection("YOUR_COLLECTION_NAME")

collection.create_index(
    field_name="vector", # Name of the vector field on which an index is built
    index_params=index_params
)

После того как вы построили индекс GPU, следующим шагом будет подготовка параметров поиска перед выполнением поиска.

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

Ниже приведены примеры конфигураций для различных типов индексов:

  • ИндексGPU_BRUTE_FORCE

    search_params = {
        "metric_type": "L2",
        "params": {}
    }
    

    Никаких дополнительных конфигураций параметров не требуется.

  • ИндексGPU_CAGRA

    search_params = {
        "metric_type": "L2",
        "params": {
            "itopk_size": 128,
            "search_width": 4,
            "min_iterations": 0,
            "max_iterations": 0,
            "team_size": 0
        }
    }
    

    Ключевые параметры поиска включают:

    • itopk_size: Определяет размер промежуточных результатов, сохраняемых во время поиска. Большее значение может улучшить запоминание за счет снижения производительности поиска. Оно должно быть как минимум равно конечному значению top-k(limit) и обычно является показателем степени 2 (например, 16, 32, 64, 128).

    • search_width: задает количество точек входа в граф CAGRA во время поиска. Увеличение этого значения может улучшить запоминание, но может повлиять на производительность поиска.

    • min_iterations / max_iterations: Эти параметры управляют процессом итераций поиска. По умолчанию они установлены в 0, и CAGRA автоматически определяет количество итераций, основываясь на itopk_size и search_width. Настройка этих значений вручную может помочь сбалансировать производительность и точность.

    • team_size: Указывает количество потоков CUDA, используемых для вычисления метрического расстояния на GPU. Обычные значения - от 2 до 32 (например, 2, 4, 8, 16, 32). Это значение незначительно влияет на производительность поиска. Значение по умолчанию - 0, при котором Milvus автоматически выбирает размер team_size на основе размерности вектора.

  • ИндексGPU_IVF_FLAT или GPU_IVF_PQ

    search_params = {
        "metric_type": "L2", 
        "params": {"nprobe": 10}
    }
    

    Параметры поиска для этих двух типов индексов аналогичны тем, что используются в IVF_FLAT и IVF_PQ. Дополнительные сведения см. в разделе Проведение поиска векторного сходства.

Воспользуйтесь методом search() для выполнения поиска векторного сходства в индексе GPU.

# Load data into memory
collection.load()

collection.search(
    data=[[query_vector]], # Your query vector
    anns_field="vector", # Name of the vector field
    param=search_params,
    limit=100 # Number of the results to return
)

Ограничения

При использовании индексов GPU следует помнить о некоторых ограничениях:

  • Для GPU_IVF_FLAT максимальное значение limit равно 1024.

  • Для GPU_IVF_PQ и GPU_CAGRA максимальное значение limit равно 1024.

  • Хотя для GPU_BRUTE_FORCE нет установленного предела, рекомендуется не превышать 4096, чтобы избежать потенциальных проблем с производительностью.

  • В настоящее время индексы GPU не поддерживают расстояние COSINE. Если требуется расстояние COSINE, то сначала следует нормализовать данные, а затем использовать вместо него расстояние внутреннего произведения (IP).

  • Защита от OOM при загрузке для индексов GPU поддерживается не полностью, слишком большой объем данных может привести к сбою QueryNode.

  • GPU-индексы не поддерживают такие функции поиска, как поиск по диапазону и поиск по группировке.

FAQ

  • Когда целесообразно использовать GPU-индекс?

    GPU-индекс особенно полезен в ситуациях, когда требуется высокая пропускная способность или высокий уровень отзыва. Например, при работе с большими партиями данных производительность индексирования на GPU может превышать производительность индексирования на CPU в 100 раз. В сценариях с небольшими партиями индексы на GPU по-прежнему значительно превосходят индексы на CPU по производительности. Кроме того, если требуется быстрая вставка данных, использование GPU может существенно ускорить процесс создания индексов.

  • Для каких сценариев наиболее подходят индексы на GPU, такие как CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT и GPU_BRUTE_FORCE?

    Индексы CAGRA идеально подходят для сценариев, требующих повышенной производительности, хотя и за счет потребления большего объема памяти. В средах, где приоритетом является экономия памяти, индекс GPU_IVF_PQ может помочь минимизировать требования к хранению данных, хотя при этом теряется точность. Индекс GPU_IVF_FLAT служит сбалансированным вариантом, предлагая компромисс между производительностью и использованием памяти. И наконец, индекс GPU_BRUTE_FORCE предназначен для операций исчерпывающего поиска, гарантируя коэффициент отзыва равный 1 при выполнении обходного поиска.

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

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

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

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