Кластерное уплотнение
Функция уплотнения кластеров предназначена для повышения производительности поиска и снижения затрат в больших коллекциях. Это руководство поможет вам понять, что такое уплотнение кластеров и как эта функция может повысить производительность поиска.
Обзор
Milvus хранит входящие сущности в сегментах коллекции и уплотняет сегмент, когда он переполнен. Если это происходит, создается новый сегмент для размещения дополнительных сущностей. В результате сущности произвольно распределяются по сегментам. Такое распределение требует от Milvus поиска в нескольких сегментах ближайших соседей для заданного вектора запроса.
Уплотнение без кластеризации
Если Milvus может распределить сущности между сегментами на основе значений в определенном поле, область поиска может быть ограничена в пределах одного сегмента, что повышает производительность поиска.
Clustering Compaction - это функция в Milvus, которая перераспределяет сущности между сегментами в коллекции на основе значений в скалярном поле. Чтобы включить эту функцию, сначала нужно выбрать скалярное поле в качестве ключа кластеризации. Это позволит Milvus перераспределять сущности в сегмент, если значения их ключа кластеризации попадают в определенный диапазон. Когда вы запускаете уплотнение кластеризации, Milvus генерирует/обновляет глобальный индекс PartitionStats, который записывает отношения сопоставления между сегментами и значениями ключей кластеризации.
При кластерном уплотнении
Используя 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 или если вы все еще сталкиваетесь с проблемами производительности в большой коллекции с ключом раздела. При этом у вас будет ключ кластеризации и ключ раздела, когда вы выбираете скалярное поле в коллекции в качестве ключа раздела.Обратите внимание, что эта настройка не мешает выбрать другое скалярное поле в качестве ключа кластеризации. Явно указанный ключ кластеризации всегда имеет приоритет.