Clustering-Verdichtung
Clustering Compaction wurde entwickelt, um die Suchleistung zu verbessern und die Kosten in großen Sammlungen zu reduzieren. In diesem Handbuch erfahren Sie, wie Sie die Clustering-Verdichtung nutzen können, um die Suchleistung zu verbessern.
Überblick
Milvus speichert eingehende Entitäten in Segmenten innerhalb einer Sammlung und versiegelt ein Segment, wenn es voll ist. Wenn dies geschieht, wird ein neues Segment erstellt, um zusätzliche Entitäten aufzunehmen. Infolgedessen sind die Entitäten willkürlich über die Segmente verteilt. Diese Verteilung erfordert, dass Milvus mehrere Segmente durchsucht, um die nächsten Nachbarn für einen bestimmten Abfragevektor zu finden.
Ohne Clustering Verdichtung
Wenn Milvus die Entitäten auf der Grundlage der Werte in einem bestimmten Feld auf die Segmente verteilen kann, lässt sich der Suchumfang innerhalb eines Segments einschränken, was die Suchleistung verbessert.
Clustering Compaction ist eine Funktion in Milvus, die Entitäten zwischen Segmenten in einer Sammlung basierend auf den Werten in einem skalaren Feld umverteilt. Um diese Funktion zu aktivieren, müssen Sie zunächst ein skalares Feld als Clustering-Schlüssel auswählen. Dies ermöglicht Milvus, Entitäten in ein Segment umzuverteilen, wenn ihre Clustering-Schlüsselwerte in einen bestimmten Bereich fallen. Wenn Sie eine Clustering Compaction auslösen, generiert/aktualisiert Milvus einen globalen Index namens PartitionStats, der die Zuordnungsbeziehung zwischen Segmenten und Clustering-Schlüsselwerten aufzeichnet.
Mit Clustering-Verdichtung
Unter Verwendung von PartitionStats als Referenz kann Milvus beim Empfang einer Such-/Abfrageanfrage, die einen Clustering-Schlüsselwert enthält, irrelevante Daten entfernen und den Suchbereich innerhalb der Segmente, die dem Wert zugeordnet sind, einschränken und so die Suchleistung verbessern. Einzelheiten zur Leistungsverbesserung finden Sie unter Benchmark-Tests.
Clustering-Verdichtung verwenden
Die Clustering Compaction Funktion in Milvus ist in hohem Maße konfigurierbar. Sie können sie manuell auslösen oder sie so einstellen, dass sie automatisch in bestimmten Abständen von Milvus ausgelöst wird. Um die Clustering Compaction zu aktivieren, gehen Sie wie folgt vor:
Globale Konfiguration
Sie müssen Ihre Milvus-Konfigurationsdatei wie unten gezeigt ändern.
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
Konfiguration Element Beschreibung Standardwert enable
Gibt an, ob die Clustering-Verdichtung aktiviert werden soll.
Setzen Sie dies auftrue
, wenn Sie diese Funktion für jede Sammlung mit einem Clustering-Schlüssel aktivieren müssen.false
autoEnable
Legt fest, ob die automatisch ausgelöste Verdichtung aktiviert werden soll.
Die Einstellungtrue
bedeutet, dass Milvus die Sammlungen mit einem Clustering-Schlüssel in den angegebenen Intervallen komprimiert.false
triggerInterval
Gibt das Intervall in Millisekunden an, in dem Milvus die Gruppierungsverdichtung startet.
Dieser Parameter ist nur gültig, wennautoEnable
auftrue
eingestellt ist.- minInterval
Legt das Mindestintervall in Sekunden fest.
Dieser Parameter ist nur gültig, wennautoEnable
auftrue
eingestellt ist.
Die Einstellung auf eine ganze Zahl größer als triggerInterval hilft, wiederholte Verdichtungen innerhalb eines kurzen Zeitraums zu vermeiden.- maxInterval
Gibt das maximale Intervall in Sekunden an.
Dieser Parameter ist nur gültig, wennautoEnable
auftrue
eingestellt ist.
Sobald Milvus feststellt, dass eine Sammlung länger als diese Zeitspanne nicht komprimiert wurde, erzwingt es eine Komprimierung durch Clustering.- newDataSizeThreshold
Legt den oberen Schwellenwert für die Auslösung einer Clustering-Verdichtung fest.
Dieser Parameter ist nur gültig, wennautoEnable
auftrue
eingestellt ist.
Sobald Milvus feststellt, dass das Datenvolumen in einer Sammlung diesen Wert übersteigt, wird ein Clustering-Compaction-Prozess eingeleitet.- timeout
Gibt die Timeout-Dauer für eine Clustering-Compaction an.
Eine Clustering-Compaction schlägt fehl, wenn ihre Ausführungszeit diesen Wert überschreitet.- queryNode
Konfiguration Element Beschreibung Standardwert enableSegmentPrune
Gibt an, ob Milvus beim Empfang von Such-/Abfrageanfragen Daten unter Bezugnahme auf PartitionStats bereinigt.
Die Einstellungtrue
ermöglicht es Milvus, irrelevante Daten aus Segmenten während einer Such-/Abfrageanfrage zu entfernen.false
dataNode.clusteringCompaction
Konfiguration Element Beschreibung Standardwert memoryBufferRatio
Legt das Speicherpufferverhältnis für Clustering-Kompaktierungsaufgaben fest.
Milvus löscht Daten, wenn die Datengröße die zugewiesene Puffergröße überschreitet, die mit diesem Verhältnis berechnet wurde.- workPoolSize
Legt die Größe des Worker-Pools für eine Clustering-Compaction-Task fest. - common
Konfiguration Element Beschreibung Standardwert usePartitionKeyAsClusteringKey
Gibt an, ob der Partitionsschlüssel in Sammlungen als Clustering-Schlüssel verwendet werden soll.
Die Einstellungtrue
bedeutet, dass der Partitionsschlüssel als Clustering-Schlüssel verwendet wird.
Sie können diese Einstellung in einer Sammlung jederzeit außer Kraft setzen, indem Sie explizit einen Clustering-Schlüssel festlegen.false
Um die oben genannten Änderungen auf Ihren Milvus-Cluster anzuwenden, folgen Sie bitte den Schritten in Konfigurieren Sie Milvus mit Helm und Konfigurieren Sie Milvus mit Milvus Operators.
Konfiguration der Sammlung
Für die Clusterverdichtung in einer bestimmten Sammlung sollten Sie ein skalares Feld aus der Sammlung als Clusterschlüssel auswählen.
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)
Sie können die skalaren Felder der folgenden Datentypen als Clustering-Schlüssel verwenden: Int8
, Int16
, Int32
, Int64
, Float
, Double
und VarChar
.
Clustering-Verdichtung auslösen
Wenn Sie die automatische Clustering-Verdichtung aktiviert haben, löst Milvus die Verdichtung automatisch in dem angegebenen Intervall aus. Alternativ dazu können Sie die Verdichtung wie folgt manuell auslösen:
coll1.compact(is_clustering=True)
coll1.get_compaction_state(is_clustering=True)
coll1.wait_for_compaction_completed(is_clustering=True)
Benchmark-Test
Das Datenvolumen und die Abfragemuster zusammen bestimmen die Leistungsverbesserung, die die Clustering-Verdichtung bringen kann. Ein interner Benchmark-Test zeigt, dass die Clustering-Verdichtung zu einer bis zu 25-fachen Verbesserung der Abfragen pro Sekunde (QPS) führt.
Der Benchmark-Test wird mit einer Sammlung durchgeführt, die Entitäten aus einem 20 Millionen, 768-dimensionalen LAION-Datensatz enthält, wobei das Schlüsselfeld als Clustering-Schlüssel bestimmt wurde. Nachdem die Clustering-Kompaktierung in der Sammlung ausgelöst wurde, werden gleichzeitige Suchanfragen gesendet, bis die CPU-Auslastung einen hohen Pegel erreicht.
Suchfilter | Prune-Verhältnis | Latenz (ms) | QPS (Abfragen/s) | ||||
---|---|---|---|---|---|---|---|
Avg | Min | Max | Median | TP99 | |||
Keine | 0% | 1685 | 672 | 2294 | 1710 | 2291 | 17.75 |
Schlüssel > 200 und Schlüssel < 800 | 40.2% | 1045 | 47 | 1828 | 1085 | 1617 | 28.38 |
Schlüssel > 200 und Schlüssel < 600 | 59.8% | 829 | 45 | 1483 | 882 | 1303 | 35.78 |
Schlüssel > 200 und Schlüssel < 400 | 79.5% | 550 | 100 | 985 | 584 | 898 | 54.00 |
Schlüssel == 1000 | 99% | 68 | 24 | 1273 | 70 | 246 | 431.41 |
Je enger der Suchbereich in den Suchfiltern ist, desto höher ist die Prune-Ratio. Das bedeutet, dass mehr Entitäten während des Suchvorgangs übersprungen werden. Ein Vergleich der Statistiken in der ersten und letzten Zeile zeigt, dass bei einer Suche ohne Clustering-Verdichtung die gesamte Sammlung durchsucht werden muss. Andererseits kann eine Suche mit Clustering-Verdichtung unter Verwendung eines bestimmten Schlüssels eine bis zu 25-fache Verbesserung erzielen.
Bewährte Verfahren
Im Folgenden finden Sie einige Tipps zur effizienten Nutzung der Clustering-Kompaktierung:
Aktivieren Sie diese Funktion für Sammlungen mit großen Datenmengen. Die Suchleistung verbessert sich mit größeren Datenmengen in einer Sammlung. Es ist eine gute Wahl, diese Funktion für Sammlungen mit mehr als 1 Million Entitäten zu aktivieren.
Wählen Sie einen geeigneten Clustering-Schlüssel: Sie können skalare Felder, die üblicherweise als Filterbedingungen verwendet werden, als Clustering-Schlüssel verwenden. Für eine Sammlung, die Daten von mehreren Tenants enthält, können Sie das Feld, das einen Tenant von einem anderen unterscheidet, als Clustering-Schlüssel verwenden.
Verwenden Sie den Partitionsschlüssel als Clustering-Schlüssel. Sie können
common.usePartitionKeyAsClusteringKey
auf true setzen, wenn Sie diese Funktion für alle Sammlungen in Ihrer Milvus-Instanz aktivieren möchten oder wenn Sie in einer großen Sammlung mit einem Partitionsschlüssel immer noch Leistungsprobleme haben. Auf diese Weise haben Sie einen Clustering-Schlüssel und einen Partitionsschlüssel, wenn Sie ein skalares Feld in einer Sammlung als Partitionsschlüssel wählen.Beachten Sie, dass diese Einstellung Sie nicht daran hindert, ein anderes skalares Feld als Clustering-Schlüssel zu wählen. Der explizit angegebene Clustering-Schlüssel hat immer Vorrang.