Compactación en clústeres
La compactación en clústeres está diseñada para mejorar el rendimiento de la búsqueda y reducir los costes en grandes colecciones. Esta guía le ayudará a comprender la compactación en clústeres y cómo esta función puede mejorar el rendimiento de la búsqueda.
Visión general
Milvus almacena las entidades entrantes en segmentos dentro de una colección y sella un segmento cuando está lleno. Si esto ocurre, se crea un nuevo segmento para acomodar entidades adicionales. Como resultado, las entidades se distribuyen arbitrariamente entre los segmentos. Esta distribución requiere que Milvus busque en múltiples segmentos para encontrar los vecinos más cercanos a un vector de consulta dado.
Compactación sin agrupación
Si Milvus puede distribuir entidades entre segmentos basándose en los valores de un campo específico, el alcance de la búsqueda puede restringirse dentro de un segmento, mejorando así el rendimiento de la búsqueda.
Lacompactación por agrupamiento es una función de Milvus que redistribuye las entidades entre los segmentos de una colección basándose en los valores de un campo escalar. Para activar esta función, primero debe seleccionar un campo escalar como clave de agrupación. Esto permite a Milvus redistribuir entidades en un segmento cuando sus valores de clave de agrupación caen dentro de un rango específico. Cuando usted activa una compactación de clustering, Milvus genera/actualiza un índice global llamado PartitionStats, que registra la relación de mapeo entre segmentos y valores de clave de clustering.
Con la compactación de clustering
Utilizando PartitionStats como referencia, Milvus puede eliminar datos irrelevantes al recibir una solicitud de búsqueda/consulta que contenga un valor de clave de agrupación y restringir el ámbito de búsqueda dentro de los segmentos que corresponden al valor, mejorando así el rendimiento de la búsqueda. Para obtener más información sobre la mejora del rendimiento, consulte Pruebas comparativas.
Utilizar la compactación de clústeres
La función de compactación de agrupaciones en Milvus es altamente configurable. Puede elegir activarla manualmente o configurarla para que Milvus la active automáticamente a intervalos. Para activar la compactación en cluster, haga lo siguiente:
Configuración global
Debe modificar su archivo de configuración de Milvus como se muestra a continuación.
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
Elemento de configuración Descripción Valor por defecto enable
Especifica si se habilita la compactación en clúster.
Configure esta opción entrue
si necesita habilitar esta función para cada colección que tenga una clave de agrupación.false
autoEnable
Especifica si se activa la compactación automática.
Si se establece entrue
, Milvus compactará las colecciones que tengan una clave de agrupación en los intervalos especificados.false
triggerInterval
Especifica el intervalo en milisegundos en el que Milvus inicia la compactación de agrupaciones.
Este parámetro sólo es válido cuandoautoEnable
se establece entrue
.- minInterval
Especifica el intervalo mínimo en segundos.
Este parámetro sólo es válido cuandoautoEnable
está configurado comotrue
.
Establecerlo en un número entero mayor que triggerInterval ayuda a evitar compactaciones repetidas en un período corto.- maxInterval
Especifica el intervalo máximo en segundos.
Este parámetro sólo es válido cuandoautoEnable
está configurado comotrue
.
Una vez que Milvus detecta que una colección no ha sido compactada en clúster durante un periodo superior a este valor, fuerza una compactación en clúster.- newDataSizeThreshold
Especifica el umbral superior para activar una compactación en clúster.
Este parámetro sólo es válido cuandoautoEnable
está configurado comotrue
.
Una vez que Milvus detecta que el volumen de datos de una colección supera este valor, inicia un proceso de compactación en clúster.- timeout
Especifica la duración del tiempo de espera para una compactación en clúster.
Una compactación en clúster falla si su tiempo de ejecución supera este valor.- queryNode
Configuración Elemento Descripción Valor predeterminado enableSegmentPrune
Especifica si Milvus poda los datos consultando PartitionStats al recibir peticiones de búsqueda/consulta.
Si se establece entrue
, Milvus puede eliminar los datos irrelevantes de los segmentos durante una solicitud de búsqueda/consulta.false
dataNode.clusteringCompaction
Configuración Elemento Descripción Valor por defecto memoryBufferRatio
Especifica la proporción de memoria intermedia para las tareas de compactación en clúster.
Milvus vacía los datos cuando el tamaño de los datos excede el tamaño del búfer asignado calculado utilizando este ratio.- workPoolSize
Especifica el tamaño del grupo de trabajadores para una tarea de compactación en clúster. - common
Configuración Elemento Descripción Valor predeterminado usePartitionKeyAsClusteringKey
Especifica si se utiliza la clave de partición en las colecciones como clave de agrupación.
El valortrue
indica que la clave de partición se utiliza como clave de agrupación.
Siempre puede anular esta configuración en una colección configurando explícitamente una clave de agrupación.false
Para aplicar los cambios anteriores a su cluster Milvus, por favor siga los pasos en Configurar Milvus con Helm y Configurar Milvus con Milvus Operators.
Configuración de la colección
Para la compactación en cluster en una colección específica, debe seleccionar un campo escalar de la colección como clave de cluster.
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)
Puede utilizar los campos escalares de los siguientes tipos de datos como clave de agrupación: Int8
, Int16
, Int32
, Int64
, Float
, Double
y VarChar
.
Activar la compactación en clúster
Si ha activado la compactación automática de clustering, Milvus activa automáticamente la compactación en el intervalo especificado. Alternativamente, puede activar manualmente la compactación como se indica a continuación:
coll1.compact(is_clustering=True)
coll1.get_compaction_state(is_clustering=True)
coll1.wait_for_compaction_completed(is_clustering=True)
Prueba comparativa
El volumen de datos y los patrones de consulta combinados determinan la mejora del rendimiento que puede aportar la compactación en clúster. Una prueba comparativa interna demuestra que la compactación en clústeres mejora hasta 25 veces las consultas por segundo (QPS).
La prueba de referencia se realiza en una colección que contiene entidades de un conjunto de datos LAION de 20 millones y 768 dimensiones, con el campo clave designado como clave de agrupación. Una vez activada la compactación por clustering en la colección, se envían búsquedas concurrentes hasta que el uso de la CPU alcanza un nivel alto de agua.
Filtro de búsqueda | Ratio de poda | Latencia (ms) | QPS (reqs/s) | ||||
---|---|---|---|---|---|---|---|
Avg | Mín | Max | Mediana | TP99 | |||
Ninguno | 0% | 1685 | 672 | 2294 | 1710 | 2291 | 17.75 |
clave > 200 y clave < 800 | 40.2% | 1045 | 47 | 1828 | 1085 | 1617 | 28.38 |
clave > 200 y clave < 600 | 59.8% | 829 | 45 | 1483 | 882 | 1303 | 35.78 |
clave > 200 y clave < 400 | 79.5% | 550 | 100 | 985 | 584 | 898 | 54.00 |
clave == 1000 | 99% | 68 | 24 | 1273 | 70 | 246 | 431.41 |
A medida que se reduce el ámbito de búsqueda en los filtros de búsqueda, aumenta el porcentaje de exclusión. Esto significa que se omiten más entidades durante el proceso de búsqueda. Si se comparan las estadísticas de la primera y la última fila, se observa que las búsquedas sin compactación por agrupación requieren escanear toda la colección. Por otro lado, las búsquedas con compactación de agrupación mediante una clave específica pueden lograr una mejora de hasta 25 veces.
Buenas prácticas
A continuación le ofrecemos algunos consejos para que utilice la compactación en clústeres de forma eficiente:
Habilítela para colecciones con grandes volúmenes de datos. El rendimiento de la búsqueda mejora con mayores volúmenes de datos en una colección. Es una buena opción activar esta función para colecciones con más de 1 millón de entidades.
Elija una clave de agrupación adecuada: puede utilizar campos escalares empleados habitualmente como condiciones de filtrado como clave de agrupación. Para una colección que contiene datos de varios inquilinos, puede utilizar el campo que distingue a un inquilino de otro como clave de agrupación.
Utilice la clave de partición como clave de agrupación. Puede establecer
common.usePartitionKeyAsClusteringKey
en true si desea habilitar esta función para todas las colecciones de su instancia de Milvus o si todavía tiene problemas de rendimiento en una colección grande con una clave de partición. Al hacerlo, tendrá una clave de agrupación y una clave de partición cuando elija un campo escalar en una colección como clave de partición.Tenga en cuenta que esta configuración no le impide elegir otro campo escalar como clave de agrupación. La clave de agrupación designada explícitamente siempre tiene prioridad.