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

milvus-logo
LFAI
Главная
  • Руководство по администрированию
    • Оптимизация хранения
  • Home
  • Docs
  • Руководство по администрированию

  • Оптимизация хранения

  • Уплотнение кластеров

Кластерное уплотнение

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

Обзор

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

Without clustering Compaction Уплотнение без кластеризации

Если Milvus может распределить сущности между сегментами на основе значений в определенном поле, область поиска может быть ограничена в пределах одного сегмента, что повышает производительность поиска.

Clustering Compaction - это функция в Milvus, которая перераспределяет сущности между сегментами в коллекции на основе значений в скалярном поле. Чтобы включить эту функцию, сначала нужно выбрать скалярное поле в качестве ключа кластеризации. Это позволит Milvus перераспределять сущности в сегмент, если значения их ключа кластеризации попадают в определенный диапазон. Когда вы запускаете уплотнение кластеризации, Milvus генерирует/обновляет глобальный индекс PartitionStats, который записывает отношения сопоставления между сегментами и значениями ключей кластеризации.

With Clustering Compaction При кластерном уплотнении

Используя PartitionStats в качестве ссылки, Milvus может отсеивать нерелевантные данные при получении запроса на поиск/запрос, содержащего значение ключа кластеризации, и ограничивать область поиска сегментами, сопоставленными с этим значением, тем самым повышая производительность поиска. Подробнее об улучшении производительности см. в разделе "Бенчмарк-тесты".

Использование уплотнения кластеров

Функция Clustering Compaction в Milvus является очень настраиваемой. Вы можете запустить ее вручную или настроить автоматическое включение через определенные промежутки времени с помощью Milvus. Чтобы включить уплотнение кластеров, выполните следующие действия:

Глобальная конфигурация

Вам необходимо изменить конфигурационный файл Milvus, как показано ниже.

dataCoord:
  compaction:
    clustering:
      enable: true 
      autoEnable: false 
      triggerInterval: 600 
      minInterval: 3600 
      maxInterval: 259200 
      newDataSizeThreshold: 512m 
      timeout: 7200
     
queryNode:
  enableSegmentPrune: true 

datanode:
  clusteringCompaction:
    memoryBufferRatio: 0.1 
    workPoolSize: 8  
common:
  usePartitionKeyAsClusteringKey: true 
  • dataCoord.compaction.clustering

    Элемент конфигурацииОписаниеЗначение по умолчанию
    enableУказывает, нужно ли включать уплотнение кластеризации.
    Установите значение true, если вам нужно включить эту функцию для каждой коллекции, имеющей ключ кластеризации.
    false
    autoEnableУказывает, следует ли включать автоматически запускаемое уплотнение.
    Значение true означает, что Milvus уплотняет коллекции, имеющие ключ кластеризации, через указанные интервалы времени.
    false
    triggerIntervalУказывает интервал в миллисекундах, через который Milvus начинает уплотнение кластеров.
    Этот параметр действителен только в том случае, если для autoEnable установлено значение true.
    -
    minIntervalУказывает минимальный интервал в секундах.
    Этот параметр действителен только в том случае, если для autoEnable установлено значение true.
    Установка целого числа, большего, чем triggerInterval, помогает избежать повторных уплотнений в течение короткого периода.
    -
    maxIntervalУказывает максимальный интервал в секундах.
    Этот параметр действителен только в том случае, если для autoEnable установлено значение true.
    Если Milvus обнаруживает, что коллекция не была уплотнена кластеризацией в течение периода, превышающего это значение, он принудительно выполняет уплотнение кластеризации.
    -
    newDataSizeThresholdУказывает верхний порог для запуска кластерного уплотнения.
    Этот параметр действителен только в том случае, если для параметра autoEnable установлено значение true.
    Как только Milvus обнаружит, что объем данных в коллекции превышает это значение, он инициирует процесс кластерного уплотнения.
    -
    timeoutУказывает длительность таймаута для кластерного уплотнения.
    Если время выполнения кластерного уплотнения превышает это значение, кластерное уплотнение завершается неудачно.
    -
  • queryNode

    Элемент конфигурацииОписаниеЗначение по умолчанию
    enableSegmentPruneУказывает, обрезает ли Milvus данные, обращаясь к PartitionStats при получении запросов поиска/запроса.
    Установка этого значения в true позволяет Milvus отсеивать нерелевантные данные из сегментов во время запроса поиска/запроса.
    false
  • dataNode.clusteringCompaction

    Элемент конфигурацииОписаниеЗначение по умолчанию
    memoryBufferRatioОпределяет соотношение буферов памяти для задач уплотнения кластеризации.
    Milvus удаляет данные, когда размер данных превышает размер выделенного буфера, рассчитанный с помощью этого соотношения.
    -
    workPoolSizeУказание размера рабочего пула для задачи кластерного уплотнения.-
  • common

    Элемент конфигурацииОписаниеЗначение по умолчанию
    usePartitionKeyAsClusteringKeyУказывает, использовать ли ключ раздела в коллекциях в качестве ключа кластеризации.
    Значение true означает, что ключ раздела будет использоваться в качестве ключа кластеризации.
    Вы всегда можете отменить эту настройку в коллекции, явно задав ключ кластеризации.
    false

Чтобы применить вышеуказанные изменения к кластеру Milvus, выполните действия, описанные в разделах Настройка Milvus с Helm и Настройка Milvus с Milvus Operators.

Конфигурация коллекции

Для уплотнения кластера в определенной коллекции необходимо выбрать скалярное поле из коллекции в качестве ключа кластеризации.

default_fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
    FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
]

default_schema = CollectionSchema(
    fields=default_fields, 
    description="test clustering-key collection"
)

coll1 = Collection(name="clustering_test", schema=default_schema)

В качестве ключа кластеризации можно использовать скалярные поля следующих типов данных: Int8, Int16, Int32, Int64, Float, Double и VarChar.

Запуск уплотнения кластеризации

Если вы включили автоматическое уплотнение кластеризации, Milvus автоматически запускает уплотнение через указанный интервал времени. В качестве альтернативы вы можете вручную запустить уплотнение следующим образом:

coll1.compact(is_clustering=True)
coll1.get_compaction_state(is_clustering=True)
coll1.wait_for_compaction_completed(is_clustering=True)

Тест бенчмарка

Объем данных и шаблоны запросов в совокупности определяют повышение производительности уплотнения кластеризации. Внутренний эталонный тест демонстрирует, что уплотнение кластеризации дает 25-кратное улучшение количества запросов в секунду (QPS).

Эталонный тест проводился на коллекции, содержащей сущности из 20-миллионного 768-мерного набора данных LAION с ключевым полем, назначенным в качестве ключа кластеризации. После запуска уплотнения кластеризации в коллекции параллельные поиски выполняются до тех пор, пока загрузка процессора не достигнет высокого уровня.

Фильтр поиска Коэффициент отсева Задержка (мс) QPS (запросов/с)
Avg Min Max Медиана TP99
Нет 0% 1685 672 2294 1710 2291 17.75
ключ > 200 и ключ < 800 40.2% 1045 47 1828 1085 1617 28.38
ключ > 200 и ключ < 600 59.8% 829 45 1483 882 1303 35.78
ключ > 200 и ключ < 400 79.5% 550 100 985 584 898 54.00
ключ == 1000 99% 68 24 1273 70 246 431.41

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

Лучшие практики

Вот несколько советов по эффективному использованию кластерного уплотнения:

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

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

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

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

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

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

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

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