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

Индекс с GPU

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

Эта страница была устаревшей. Для получения информации о новейшей реализации см. раздел Обзор индексов 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 при выполнении обходного поиска.

ПереведеноDeepL

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

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

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

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