In-Memory-Index
Dieses Thema listet verschiedene Arten von In-Memory-Indizes auf, die von Milvus unterstützt werden, die Szenarien, für die jeder von ihnen am besten geeignet ist, und die Parameter, die Benutzer konfigurieren können, um eine bessere Suchleistung zu erzielen. Für On-Disk-Indizes, siehe On-Disk-Index.
Indizierung ist der Prozess der effizienten Organisation von Daten und spielt eine wichtige Rolle bei der Nützlichkeit der Ähnlichkeitssuche, indem sie zeitaufwändige Abfragen auf großen Datenbeständen drastisch beschleunigt.
Um die Abfrageleistung zu verbessern, können Sie für jedes Vektorfeld einen Indextyp angeben.
ANNS-Vektorindizes
Die meisten der von Milvus unterstützten Vektorindex-Typen verwenden ANNS-Algorithmen (approximate nearest neighbors search). Verglichen mit der genauen Suche, die in der Regel sehr zeitaufwendig ist, beschränkt sich die Kernidee von ANNS nicht mehr darauf, das genaueste Ergebnis zu liefern, sondern sucht nur noch nach Nachbarn des Ziels. ANNS verbessert die Effizienz des Abrufs, indem es die Genauigkeit innerhalb eines akzeptablen Bereichs opfert.
Je nach Implementierungsmethode kann der ANNS-Vektorindex in vier Typen eingeteilt werden: Baum-basiert, Graph-basiert, Hash-basiert und Quantisierungs-basiert.
In Milvus unterstützte Indizes
Milvus unterstützt verschiedene Indextypen, die nach der Art der Vektoreinbettungen, die sie verarbeiten, kategorisiert werden: Fließkomma-Einbettungen (auch bekannt als Fließkomma-Vektoren oder dichte Vektoren), binäre Einbettungen (auch bekannt als binäre Vektoren) und spärliche Einbettungen (auch bekannt als spärliche Vektoren).
Indizes für Fließkomma-Einbettungen
Für 128-dimensionale Fließkomma-Einbettungen (Vektoren) beträgt der benötigte Speicherplatz 128 * die Größe von float = 512 Byte. Die für Fließkomma-Einbettungen verwendeten Abstandsmetriken sind der euklidische Abstand (L2
) und das innere Produkt (IP
).
Diese Arten von Indizes umfassen FLAT
, IVF_FLAT
, IVF_PQ
, IVF_SQ8
, HNSW
und SCANN
für CPU-basierte ANN-Suchen.
Indizes für binäre Einbettungen
Für 128-dimensionale binäre Einbettungen beträgt der Speicherplatzbedarf 128 / 8 = 16 Byte. Und die für binäre Einbettungen verwendeten Abstandsmetriken sind JACCARD
und HAMMING
.
Zu dieser Art von Indizes gehören BIN_FLAT
und BIN_IVF_FLAT
.
Indizes für spärliche Einbettungen
Die für spärliche Einbettungen unterstützte Abstandsmetrik ist nur IP
.
Die Arten von Indizes sind SPARSE_INVERTED_INDEX
und SPARSE_WAND
.
Unterstützter Index | Klassifizierung | Szenario |
---|---|---|
FLAT | K.A. |
|
IVF_FLAT | Quantisierungsbasierter Index |
|
IVF_SQ8 | Quantisierungsbasierter Index |
|
IVF_PQ | Quantisierungsbasierter Index |
|
HNSW | Graph-basierter Index |
|
SCANN | Quantisierungsbasierter Index |
|
Unterstützter Index | Klassifizierung | Szenario |
---|---|---|
BIN_FLAT | Quantisierungsbasierter Index |
|
BIN_IVF_FLAT | Quantisierungsbasierter Index |
|
Unterstützter Index | Klassifizierung | Szenario |
---|---|---|
SPÄRLICHER_INVERTIERTER_INDEX | Invertierter Index |
|
SPARSE_WAND | Invertierter Index |
|
FLAT
Für Anwendungen der Vektorähnlichkeitssuche, die eine perfekte Genauigkeit erfordern und von relativ kleinen Datensätzen (im Millionenbereich) abhängen, ist der FLAT-Index eine gute Wahl. FLAT komprimiert die Vektoren nicht und ist der einzige Index, der exakte Suchergebnisse garantieren kann. Die Ergebnisse von FLAT können auch als Vergleichspunkt für Ergebnisse anderer Indizes verwendet werden, die weniger als 100 % Recall haben.
FLAT ist genau, weil er einen erschöpfenden Suchansatz verfolgt, d. h. für jede Abfrage wird die Zieleingabe mit jedem Satz von Vektoren in einem Datensatz verglichen. Dadurch ist FLAT der langsamste Index auf unserer Liste und eignet sich schlecht für die Abfrage umfangreicher Vektordaten. Für den FLAT-Index in Milvus sind keine Parameter erforderlich, und seine Verwendung erfordert kein Datentraining.
Suchparameter
Parameter Beschreibung Bereich metric_type
[Optional] Die gewählte Distanzmetrik. Siehe Unterstützte Metriken.
IVF_FLAT
IVF_FLAT unterteilt Vektordaten in nlist
Cluster-Einheiten und vergleicht dann die Abstände zwischen dem Ziel-Eingangsvektor und dem Zentrum jedes Clusters. Je nach Anzahl der Cluster, die das System abfragen soll (nprobe
), werden die Ergebnisse der Ähnlichkeitssuche nur auf der Grundlage von Vergleichen zwischen der Zieleingabe und den Vektoren in den ähnlichsten Clustern zurückgegeben, was die Abfragezeit drastisch reduziert.
Durch die Anpassung von nprobe
kann ein ideales Gleichgewicht zwischen Genauigkeit und Geschwindigkeit für ein bestimmtes Szenario gefunden werden. Die Ergebnisse des IVF_FLAT-Leistungstests zeigen, dass die Abfragezeit stark ansteigt, wenn sowohl die Anzahl der Zieleingangsvektoren (nq
) als auch die Anzahl der zu durchsuchenden Cluster (nprobe
) zunimmt.
IVF_FLAT ist der einfachste IVF-Index, und die in jeder Einheit gespeicherten kodierten Daten stimmen mit den Originaldaten überein.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich Standardwert nlist
Anzahl der Cluster-Einheiten [1, 65536] 128 Suchparameter
Gemeinsame Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] 8 Bereichssuche
Parameter Beschreibung Bereich Standardwert max_empty_result_buckets
Maximale Anzahl von Bereichen, die keine Suchergebnisse liefern.
Dies ist ein Parameter für die Bereichssuche und beendet den Suchvorgang, wenn die Anzahl der aufeinanderfolgenden leeren Bereiche den angegebenen Wert erreicht.
Eine Erhöhung dieses Wertes kann die Abrufrate auf Kosten einer längeren Suchzeit verbessern.[1, 65535] 2
IVF_SQ8
IVF_FLAT führt keine Komprimierung durch, so dass die erzeugten Indexdateien ungefähr die gleiche Größe haben wie die ursprünglichen, nicht indizierten Vektordaten. Wenn z. B. der ursprüngliche 1B-SIFT-Datensatz 476 GB groß ist, sind die IVF_FLAT-Indexdateien etwas kleiner (~470 GB). Wenn alle Indexdateien in den Speicher geladen werden, werden 470 GB Speicherplatz verbraucht.
Wenn Festplatten-, CPU- oder GPU-Speicherressourcen begrenzt sind, ist IVF_SQ8 eine bessere Option als IVF_FLAT. Dieser Indextyp kann jedes FLOAT (4 Byte) in UINT8 (1 Byte) umwandeln, indem er eine Skalarquantisierung (SQ) durchführt. Dies reduziert den Festplatten-, CPU- und GPU-Speicherverbrauch um 70-75 %. Für den 1B-SIFT-Datensatz benötigen die IVF_SQ8-Indexdateien nur 140 GB Speicherplatz.
Parameter für die Indexerstellung
Parameter Beschreibung Bereich nlist
Anzahl der Cluster-Einheiten [1, 65536] Suchparameter
Gemeinsame Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] 8 Bereichssuche
Parameter Beschreibung Bereich Standardwert max_empty_result_buckets
Maximale Anzahl der Buckets, die keine Suchergebnisse liefern.
Dies ist ein Parameter für die Bereichssuche, der den Suchvorgang beendet, wenn die Anzahl der aufeinander folgenden leeren Buckets den angegebenen Wert erreicht.
Eine Erhöhung dieses Wertes kann die Abrufrate auf Kosten einer längeren Suchzeit verbessern.[1, 65535] 2
IVF_PQ
PQ
(Produktquantisierung) zerlegt den ursprünglichen hochdimensionalen Vektorraum gleichmäßig in kartesische Produkte von m
niedrigdimensionalen Vektorräumen und quantisiert dann die zerlegten niedrigdimensionalen Vektorräume. Anstatt die Abstände zwischen dem Zielvektor und dem Zentrum aller Einheiten zu berechnen, ermöglicht die Produktquantisierung die Berechnung der Abstände zwischen dem Zielvektor und dem Clustering-Zentrum jedes niedrigdimensionalen Raums und reduziert die Zeit- und Raumkomplexität des Algorithmus erheblich.
IVF_PQ führt das IVF-Index-Clustering durch, bevor das Produkt der Vektoren quantisiert wird. Seine Indexdatei ist sogar noch kleiner als IVF_SQ8, aber auch hier kommt es zu einem Verlust an Genauigkeit bei der Suche nach Vektoren.
Die Parameter für die Indexerstellung und die Suchparameter variieren je nach Milvus-Verteilung. Wählen Sie zunächst Ihre Milvus-Distribution aus.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich nlist
Anzahl der Cluster-Einheiten [1, 65536] m
Anzahl der Faktoren der Produktquantisierung dim mod m == 0
nbits
[Optional] Anzahl der Bits, in denen jeder niedrigdimensionale Vektor gespeichert wird. [1, 64] (8 als Standard) Suchparameter
Allgemeine Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] 8 Bereichssuche
Parameter Beschreibung Bereich Standardwert max_empty_result_buckets
Maximale Anzahl von Bereichen, die keine Suchergebnisse liefern.
Dies ist ein Parameter für die Bereichssuche und beendet den Suchvorgang, wenn die Anzahl der aufeinanderfolgenden leeren Bereiche den angegebenen Wert erreicht.
Eine Erhöhung dieses Wertes kann die Abrufrate auf Kosten einer längeren Suchzeit verbessern.[1, 65535] 2
SCANN
ScaNN (Scalable Nearest Neighbors) ähnelt IVF_PQ in Bezug auf Vektor-Clustering und Produktquantisierung. Der Unterschied liegt in den Implementierungsdetails der Produktquantisierung und der Verwendung von SIMD (Single-Instruction / Multi-data) für eine effiziente Berechnung.
Parameter für die Indexbildung
Parameter Beschreibung Bereich nlist
Anzahl der Cluster-Einheiten [1, 65536] with_raw_data
Angabe, ob die Rohdaten in den Index aufgenommen werden sollen True
oderFalse
. Der Standardwert istTrue
.Im Gegensatz zu IVF_PQ gelten die Standardwerte für
m
undnbits
, um die Leistung zu optimieren.Suchparameter
Allgemeine Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] reorder_k
Anzahl der abzufragenden Einheiten [ top_k
, ∞]top_k
Bereichssuche
Parameter Beschreibung Bereich Standardwert max_empty_result_buckets
Maximale Anzahl der Buckets, die keine Suchergebnisse liefern.
Dies ist ein Parameter für die Bereichssuche, der den Suchvorgang beendet, wenn die Anzahl der aufeinander folgenden leeren Buckets den angegebenen Wert erreicht.
Eine Erhöhung dieses Wertes kann die Abrufrate auf Kosten einer längeren Suchzeit verbessern.[1, 65535] 2
HNSW
HNSW (Hierarchical Navigable Small World Graph) ist ein graphbasierter Indizierungsalgorithmus. Er baut eine mehrschichtige Navigationsstruktur für ein Bild nach bestimmten Regeln auf. In dieser Struktur sind die oberen Schichten spärlicher und die Abstände zwischen den Knoten größer; die unteren Schichten sind dichter und die Abstände zwischen den Knoten sind kleiner. Die Suche beginnt in der obersten Schicht, findet den Knoten, der dem Ziel in dieser Schicht am nächsten liegt, und begibt sich dann in die nächste Schicht, um eine weitere Suche zu beginnen. Nach mehreren Iterationen kann sie sich schnell der Zielposition nähern.
Um die Leistung zu verbessern, begrenzt HNSW den maximalen Grad der Knoten auf jeder Ebene des Graphen auf M
. Darüber hinaus können Sie efConstruction
(beim Indexaufbau) oder ef
(bei der Suche nach Zielen) verwenden, um einen Suchbereich anzugeben.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich M
M definiert die maximale Anzahl der ausgehenden Verbindungen im Diagramm. Ein höheres M führt zu höherer Genauigkeit/Laufzeit bei fester ef/efConstruction. [2, 2048] efConstruction
ef_construction steuert den Kompromiss zwischen Indexsuchgeschwindigkeit und Erstellungsgeschwindigkeit. Eine Erhöhung des efConstruction-Parameters kann die Indexqualität verbessern, führt aber auch zu einer Verlängerung der Indexierungszeit. [1, int_max] Suchparameter
Parameter Beschreibung Bereich ef
Parameter, der den Kompromiss zwischen Abfragezeit und -genauigkeit steuert. Eine höhere ef
führt zu einer genaueren, aber langsameren Suche.[ top_k
, int_max]
BIN_FLAT
Dieser Index entspricht genau dem von FLAT, außer dass er nur für binäre Einbettungen verwendet werden kann.
Für Anwendungen der Vektorähnlichkeitssuche, die perfekte Genauigkeit erfordern und von relativ kleinen Datensätzen (im Millionenbereich) abhängen, ist der Index BIN_FLAT eine gute Wahl. BIN_FLAT komprimiert keine Vektoren und ist der einzige Index, der exakte Suchergebnisse garantieren kann. Die Ergebnisse von BIN_FLAT können auch als Vergleichspunkt für Ergebnisse anderer Indizes verwendet werden, die weniger als 100 % Recall haben.
BIN_FLAT ist genau, weil es einen erschöpfenden Suchansatz verfolgt, d. h. für jede Abfrage wird die Zieleingabe mit Vektoren in einem Datensatz verglichen. Dadurch ist BIN_FLAT der langsamste Index auf unserer Liste und eignet sich schlecht für die Abfrage umfangreicher Vektordaten. Es gibt keine Parameter für den BIN_FLAT-Index in Milvus, und seine Verwendung erfordert kein Datentraining oder zusätzlichen Speicherplatz.
Suchparameter
Parameter Beschreibung Bereich metric_type
[Optional] Die gewählte Abstandsmetrik. Siehe Unterstützte Metriken.
BIN_IVF_FLAT
Dieser Index ist genau derselbe wie IVF_FLAT, außer dass er nur für binäre Einbettungen verwendet werden kann.
BIN_IVF_FLAT unterteilt die Vektordaten in nlist
Cluster-Einheiten und vergleicht dann die Abstände zwischen dem Ziel-Eingangsvektor und dem Zentrum jedes Clusters. Abhängig von der Anzahl der Cluster, die das System abfragt (nprobe
), werden die Ergebnisse der Ähnlichkeitssuche nur auf der Grundlage von Vergleichen zwischen der Zieleingabe und den Vektoren in den ähnlichsten Clustern zurückgegeben, was die Abfragezeit drastisch reduziert.
Durch die Anpassung von nprobe
kann ein ideales Gleichgewicht zwischen Genauigkeit und Geschwindigkeit für ein bestimmtes Szenario gefunden werden. Die Abfragezeit steigt stark an, wenn sowohl die Anzahl der Zieleingangsvektoren (nq
) als auch die Anzahl der zu durchsuchenden Cluster (nprobe
) zunimmt.
BIN_IVF_FLAT ist der einfachste BIN_IVF-Index, und die in jeder Einheit gespeicherten kodierten Daten stimmen mit den Originaldaten überein.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich nlist
Anzahl der Cluster-Einheiten [1, 65536] Suchparameter
Gemeinsame Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] 8 Bereichssuche
Parameter Beschreibung Bereich Standardwert max_empty_result_buckets
Maximale Anzahl von Bereichen, die keine Suchergebnisse liefern.
Dies ist ein Parameter für die Bereichssuche und beendet den Suchvorgang, wenn die Anzahl der aufeinanderfolgenden leeren Bereiche den angegebenen Wert erreicht.
Eine Erhöhung dieses Wertes kann die Abrufrate auf Kosten einer längeren Suchzeit verbessern.[1, 65535] 2
SPARSE_INVERTED_INDEX
Für jede Dimension wird eine Liste von Vektoren geführt, die in dieser Dimension einen Wert ungleich Null haben. Während der Suche iteriert Milvus durch jede Dimension des Abfragevektors und berechnet die Punktzahlen für Vektoren, die in diesen Dimensionen Werte ungleich Null haben.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich drop_ratio_build
Der Anteil der kleinen Vektorwerte, die während des Indizierungsprozesses ausgeschlossen werden. Diese Option ermöglicht eine Feinabstimmung des Indizierungsprozesses, indem sie einen Kompromiss zwischen Effizienz und Genauigkeit herstellt, indem sie kleine Werte beim Aufbau des Index unberücksichtigt lässt. [0, 1] Suchparameter
Parameter Beschreibung Bereich drop_ratio_search
Der Anteil der kleinen Vektorwerte, die während des Suchprozesses ausgeschlossen werden. Diese Option ermöglicht die Feinabstimmung des Suchprozesses, indem sie das Verhältnis der kleinsten Werte im Abfragevektor angibt, die ignoriert werden sollen. Sie hilft, ein Gleichgewicht zwischen Suchgenauigkeit und Leistung herzustellen. Je kleiner der Wert für drop_ratio_search
eingestellt wird, desto weniger tragen diese kleinen Werte zur endgültigen Bewertung bei. Durch das Ignorieren einiger kleiner Werte kann die Suchleistung bei minimalen Auswirkungen auf die Genauigkeit verbessert werden.[0, 1]
SPARSE_WAND
Dieser Index weist Ähnlichkeiten mit SPARSE_INVERTED_INDEX
auf, verwendet jedoch den Weak-AND-Algorithmus, um die Anzahl der vollständigen IP-Abstandsbewertungen während des Suchprozesses weiter zu reduzieren.
Unsere Tests haben ergeben, dass SPARSE_WAND
im Allgemeinen schneller ist als die anderen Methoden. Allerdings kann sich die Leistung mit zunehmender Dichte der Vektoren schnell verschlechtern. Um dieses Problem zu beheben, kann die Einführung eines drop_ratio_search
, das nicht Null ist, die Leistung erheblich verbessern, während nur ein minimaler Genauigkeitsverlust entsteht. Weitere Informationen finden Sie unter Sparse Vector.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich drop_ratio_build
Der Anteil der kleinen Vektorwerte, die während des Indizierungsprozesses ausgeschlossen werden. Diese Option ermöglicht eine Feinabstimmung des Indizierungsprozesses, indem sie einen Kompromiss zwischen Effizienz und Genauigkeit herstellt, indem sie kleine Werte beim Aufbau des Index unberücksichtigt lässt. [0, 1] Suchparameter
Parameter Beschreibung Bereich drop_ratio_search
Der Anteil der kleinen Vektorwerte, die während des Suchvorgangs ausgeschlossen werden. Diese Option ermöglicht die Feinabstimmung des Suchprozesses, indem sie das Verhältnis der kleinsten Werte im Abfragevektor angibt, die ignoriert werden sollen. Sie hilft, ein Gleichgewicht zwischen Suchgenauigkeit und Leistung herzustellen. Je kleiner der Wert für drop_ratio_search
eingestellt wird, desto weniger tragen diese kleinen Werte zur endgültigen Bewertung bei. Durch das Ignorieren einiger kleiner Werte kann die Suchleistung bei minimalen Auswirkungen auf die Genauigkeit verbessert werden.[0, 1]
FAQ
Was ist der Unterschied zwischen dem FLAT-Index und dem IVF_FLAT-Index?
Der IVF_FLAT-Index unterteilt einen Vektorraum in nlist
-Cluster. Wenn Sie den Standardwert von nlist
mit 16384 beibehalten, vergleicht Milvus die Abstände zwischen dem Zielvektor und den Zentren aller 16384 Cluster, um nprobe
nächstgelegene Cluster zu erhalten. Anschließend vergleicht Milvus die Abstände zwischen dem Zielvektor und den Vektoren in den ausgewählten Clustern, um die nächstgelegenen Vektoren zu ermitteln. Im Gegensatz zu IVF_FLAT vergleicht FLAT direkt die Abstände zwischen dem Zielvektor und jedem einzelnen Vektor.
Wenn die Gesamtzahl der Vektoren ungefähr nlist
beträgt, unterscheiden sich IVF_FLAT und FLAT daher kaum in der Art der erforderlichen Berechnungen und der Suchleistung. Aber wenn die Anzahl der Vektoren auf das Zwei-, Drei- oder n-fache von nlist
ansteigt, beginnt der IVF_FLAT-Index immer größere Vorteile zu zeigen.
Weitere Informationen finden Sie unter Wie man einen Index in Milvus auswählt.
Was kommt als Nächstes?
- Erfahren Sie mehr über die in Milvus unterstützten Ähnlichkeitsmetriken.