Compaction de la mise en grappe
Le compactage en grappes est conçu pour améliorer les performances de recherche et réduire les coûts dans les grandes collections. Ce guide vous aidera à comprendre le compactage en grappes et la manière dont cette fonctionnalité peut améliorer les performances de recherche.
Vue d'ensemble
Milvus stocke les entités entrantes dans des segments au sein d'une collection et scelle un segment lorsqu'il est plein. Dans ce cas, un nouveau segment est créé pour accueillir les entités supplémentaires. Par conséquent, les entités sont réparties arbitrairement entre les segments. Cette répartition oblige Milvus à rechercher plusieurs segments pour trouver les voisins les plus proches d'un vecteur de requête donné.
Sans regroupement Compaction
Si Milvus peut répartir les entités entre les segments en fonction des valeurs d'un champ spécifique, l'étendue de la recherche peut être limitée à un segment, ce qui améliore les performances de la recherche.
Lecompactage par regroupement est une fonctionnalité de Milvus qui redistribue les entités entre les segments d'une collection en fonction des valeurs d'un champ scalaire. Pour activer cette fonctionnalité, vous devez d'abord sélectionner un champ scalaire comme clé de clustering. Cela permet à Milvus de redistribuer les entités dans un segment lorsque leurs valeurs de clé de clustering se situent dans une plage spécifique. Lorsque vous déclenchez un compactage de clustering, Milvus génère/met à jour un index global appelé PartitionStats, qui enregistre la relation de mappage entre les segments et les valeurs de clé de clustering.
Avec le compactage de clustering
En utilisant PartitionStats comme référence, Milvus peut élaguer les données non pertinentes lors de la réception d'une requête de recherche qui comporte une valeur de clé de clustering et limiter la portée de la recherche aux segments correspondant à la valeur, ce qui améliore les performances de la recherche. Pour plus de détails sur l'amélioration des performances, reportez-vous à la section Tests de référence.
Utiliser le compactage de clustering
La fonction de compactage en grappes de Milvus est hautement configurable. Vous pouvez choisir de la déclencher manuellement ou de la configurer pour qu'elle soit déclenchée automatiquement à intervalles réguliers par Milvus. Pour activer le compactage de clustering, procédez comme suit :
Configuration globale
Vous devez modifier votre fichier de configuration Milvus comme indiqué ci-dessous.
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
Configuration Elément Description de l'élément Valeur par défaut enable
Spécifie s'il faut activer le compactage de clustering.
Définissez cette valeur surtrue
si vous devez activer cette fonction pour chaque collection ayant une clé de clustering.false
autoEnable
Spécifie s'il faut activer le compactage déclenché automatiquement.
La valeurtrue
indique que Milvus compacte les collections ayant une clé de clustering aux intervalles spécifiés.false
triggerInterval
Spécifie l'intervalle en millisecondes auquel Milvus démarre le compactage en grappe.
Ce paramètre n'est valide que lorsqueautoEnable
est défini surtrue
.- minInterval
Spécifie l'intervalle minimum en secondes.
Ce paramètre n'est valide que lorsqueautoEnable
est défini surtrue
.
La définition d'un nombre entier supérieur à triggerInterval permet d'éviter des compactages répétés sur une courte période.- maxInterval
Spécifie l'intervalle maximal en secondes.
Ce paramètre n'est valide que lorsqueautoEnable
est défini surtrue
.
Lorsque Milvus détecte qu'une collection n'a pas été compactée par clustering pendant une durée supérieure à cette valeur, il force un compactage par clustering.- newDataSizeThreshold
Spécifie le seuil supérieur de déclenchement du compactage en grappes.
Ce paramètre n'est valide que siautoEnable
est défini surtrue
.
Lorsque Milvus détecte que le volume de données d'une collection dépasse cette valeur, il lance un processus de compactage en grappes.- timeout
Spécifie le délai d'attente pour un compactage en grappe.
Un compactage en grappe échoue si sa durée d'exécution dépasse cette valeur.- queryNode
Élément de configuration Description de l'élément de configuration Valeur par défaut enableSegmentPrune
Indique si Milvus élague les données en se référant à PartitionStats lors de la réception de requêtes de recherche.
La valeurtrue
permet à Milvus d'élaguer les données non pertinentes des segments lors d'une demande de recherche/interrogation.false
dataNode.clusteringCompaction
Configuration Élément Description de l'élément Valeur par défaut memoryBufferRatio
Spécifie le ratio de mémoire tampon pour les tâches de compactage de clustering.
Milvus vide les données lorsque la taille des données dépasse la taille de la mémoire tampon allouée calculée à l'aide de ce ratio.- workPoolSize
Spécifie la taille du pool de travailleurs pour une tâche de compactage en grappe. - common
Élément de configuration Description de l'élément de configuration Valeur par défaut usePartitionKeyAsClusteringKey
Spécifie s'il faut utiliser la clé de partition dans les collections comme clé de regroupement.
La valeurtrue
indique que la clé de partition est utilisée comme clé de regroupement.
Vous pouvez toujours remplacer ce paramètre dans une collection en définissant explicitement une clé de regroupement.false
Pour appliquer les modifications ci-dessus à votre cluster Milvus, veuillez suivre les étapes des sections Configurer Milvus avec Helm et Configurer Milvus avec Milvus Operators.
Configuration de la collecte
Pour compacter le clustering dans une collection spécifique, vous devez sélectionner un champ scalaire de la collection comme clé de clustering.
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)
Vous pouvez utiliser les champs scalaires des types de données suivants comme clé de clustering : Int8
, Int16
, Int32
, Int64
, Float
, Double
, et VarChar
.
Déclencher le compactage de la mise en grappe
Si vous avez activé le compactage automatique du clustering, Milvus déclenche automatiquement le compactage à l'intervalle spécifié. Vous pouvez également déclencher manuellement le compactage comme suit :
coll1.compact(is_clustering=True)
coll1.get_compaction_state(is_clustering=True)
coll1.wait_for_compaction_completed(is_clustering=True)
Test de référence
Le volume de données et les modèles de requêtes combinés déterminent l'amélioration des performances que le compactage de clustering peut apporter. Un test de référence interne démontre que le compactage en grappe permet de multiplier par 25 le nombre de requêtes par seconde (QPS).
Le test de référence porte sur une collection d'entités provenant d'un ensemble de données LAION de 20 millions d'unités et de 768 dimensions, le champ clé étant désigné comme clé de clustering. Après le déclenchement du compactage de la collection, des recherches simultanées sont envoyées jusqu'à ce que l'utilisation de l'unité centrale atteigne un niveau élevé.
Filtre de recherche | Ratio d'élagage | Latence (ms) | QPS (reqs/s) | ||||
---|---|---|---|---|---|---|---|
Moyenne | Min | Max | Médiane | TP99 | |||
Aucun | 0% | 1685 | 672 | 2294 | 1710 | 2291 | 17.75 |
clé > 200 et clé < 800 | 40.2% | 1045 | 47 | 1828 | 1085 | 1617 | 28.38 |
clé > 200 et clé < 600 | 59.8% | 829 | 45 | 1483 | 882 | 1303 | 35.78 |
clé > 200 et clé < 400 | 79.5% | 550 | 100 | 985 | 584 | 898 | 54.00 |
clé == 1000 | 99% | 68 | 24 | 1273 | 70 | 246 | 431.41 |
Au fur et à mesure que la plage de recherche se réduit dans les filtres de recherche, le taux d'élagage augmente. Cela signifie que davantage d'entités sont ignorées au cours du processus de recherche. Si l'on compare les statistiques de la première et de la dernière ligne, on constate que les recherches sans compactage de grappes nécessitent l'analyse de l'ensemble de la collection. En revanche, les recherches avec compactage de grappes à l'aide d'une clé spécifique peuvent être multipliées par 25.
Meilleures pratiques
Voici quelques conseils pour vous aider à utiliser efficacement le compactage en grappes :
Activez cette option pour les collections contenant de gros volumes de données : les performances de recherche s'améliorent lorsque les volumes de données d'une collection sont plus importants. Il est conseillé d'activer cette fonctionnalité pour les collections comportant plus d'un million d'entités.
Choisissez une clé de clustering appropriée : vous pouvez utiliser des champs scalaires couramment employés comme conditions de filtrage en tant que clé de clustering. Pour une collection contenant des données provenant de plusieurs locataires, vous pouvez utiliser le champ qui distingue un locataire d'un autre comme clé de regroupement.
Utiliser la clé de partition comme clé de regroupement Vous pouvez définir
common.usePartitionKeyAsClusteringKey
sur true si vous souhaitez activer cette fonctionnalité pour toutes les collections de votre instance Milvus ou si vous rencontrez toujours des problèmes de performances dans une grande collection avec une clé de partition. Ainsi, vous disposerez d'une clé de regroupement et d'une clé de partition lorsque vous choisirez un champ scalaire dans une collection comme clé de partition.Notez que ce paramètre ne vous empêche pas de choisir un autre champ scalaire comme clé de clustering. La clé de regroupement explicitement désignée est toujours prioritaire.