milvus-logo
LFAI
Home
  • Konzepte

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, wenn es darum geht, die Ähnlichkeitssuche nützlich zu machen, indem zeitaufwändige Abfragen auf großen Datenbeständen drastisch beschleunigt werden.

Um die Abfrageleistung zu verbessern, können Sie für jedes Vektorfeld einen Indextyp angeben.

Derzeit unterstützt ein Vektorfeld nur einen Index-Typ. Milvus löscht automatisch den alten Index, wenn der Indextyp gewechselt wird.

ANNS-Vektorindizes

Die meisten der von Milvus unterstützten Vektorindex-Typen verwenden Algorithmen zur approximativen Suche nach den nächsten Nachbarn (ANNS). Verglichen mit der genauen Suche, die in der Regel sehr zeitaufwändig 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 Speicherplatzbedarf 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.
  • Relativ kleiner Datensatz
  • Erfordert eine Wiedererkennungsrate von 100%.
IVF_FLAT Quantisierungsbasierter Index
  • Hochgeschwindigkeitsabfrage
  • Erfordert eine möglichst hohe Wiederfindungsrate
IVF_SQ8 Quantisierungsbasierter Index
  • Hochgeschwindigkeitsabfrage
  • Begrenzte Speicherressourcen
  • Akzeptiert geringfügige Kompromisse bei der Abrufrate
IVF_PQ Quantisierungsbasierter Index
  • Abfrage mit sehr hoher Geschwindigkeit
  • Begrenzte Speicherressourcen
  • Akzeptiert erhebliche Kompromisse bei der Abrufrate
HNSW Graph-basierter Index
  • Abfrage mit sehr hoher Geschwindigkeit
  • Erfordert eine möglichst hohe Abrufrate
  • Große Speicherressourcen
SCANN Quantisierungsbasierter Index
  • Abfrage mit sehr hoher Geschwindigkeit
  • Erfordert eine möglichst hohe Abrufrate
  • Große Speicherressourcen
Unterstützter Index Klassifizierung Szenario
BIN_FLAT Quantisierungsbasierter Index
  • Hängt von relativ kleinen Datensätzen ab.
  • Erfordert perfekte Genauigkeit.
  • Es findet keine Komprimierung statt.
  • Garantiert exakte Suchergebnisse.
BIN_IVF_FLAT Quantisierungsbasierter Index
  • Hochgeschwindigkeitsabfrage
  • Erfordert eine möglichst hohe Wiederfindungsrate
Unterstützter Index Klassifizierung Szenario
SPÄRLICHER_INVERTIERTER_INDEX Invertierter Index
  • Hängt von relativ kleinen Datensätzen ab.
  • Erfordert eine 100%ige Wiedererkennungsrate.
SPARSE_WAND Invertierter Index
  • Schwach-AND-Algorithmus beschleunigt
  • Kann eine erhebliche Geschwindigkeitsverbesserung bei nur geringen Einbußen bei der Wiederauffindbarkeit erzielen.

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

    ParameterBeschreibungBereich
    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. 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 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

    ParameterBeschreibungBereichStandardwert
    nlistAnzahl der Cluster-Einheiten[1, 65536]128
  • Suchparameter

    • Gemeinsame Suche

      ParameterBeschreibungBereichStandardwert
      nprobeAnzahl der abzufragenden Einheiten[1, nlist]8
    • Bereichssuche

      ParameterBeschreibungBereichStandardwert
      max_empty_result_bucketsMaximale 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_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

    ParameterBeschreibungBereich
    nlistAnzahl der Cluster-Einheiten[1, 65536]
  • Suchparameter

    • Gemeinsame Suche

      ParameterBeschreibungBereichStandardwert
      nprobeAnzahl der abzufragenden Einheiten[1, nlist]8
    • Bereichssuche

      ParameterBeschreibungBereichStandardwert
      max_empty_result_bucketsMaximale 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 noch kleiner als die von 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

    ParameterBeschreibungBereich
    nlistAnzahl der Cluster-Einheiten[1, 65536]
    mAnzahl der Faktoren der Produktquantisierungdim mod m == 0
    nbits[Optional] Anzahl der Bits, in denen jeder niedrigdimensionale Vektor gespeichert wird.[1, 64] (8 als Standard)
  • Suchparameter

    • Allgemeine Suche

      ParameterBeschreibungBereichStandardwert
      nprobeAnzahl der abzufragenden Einheiten[1, nlist]8
    • Bereichssuche

      ParameterBeschreibungBereichStandardwert
      max_empty_result_bucketsMaximale 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

    ParameterBeschreibungBereich
    nlistAnzahl der Cluster-Einheiten[1, 65536]
    with_raw_dataAngabe, ob die Rohdaten in den Index aufgenommen werden sollenTrue oder False. Der Standardwert ist True.

    Im Gegensatz zu IVF_PQ gelten die Standardwerte für m und nbits, um die Leistung zu optimieren.

  • Suchparameter

    • Allgemeine Suche

      ParameterBeschreibungBereichStandardwert
      nprobeAnzahl der abzufragenden Einheiten[1, nlist]
      reorder_kAnzahl der abzufragenden Einheiten[top_k, ∞]top_k
    • Bereichssuche

      ParameterBeschreibungBereichStandardwert
      max_empty_result_bucketsMaximale 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

    ParameterBeschreibungBereich
    MM 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]
    efConstructionef_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

    ParameterBeschreibungBereich
    efParameter, 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 er 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

    ParameterBeschreibungBereich
    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

    ParameterBeschreibungBereich
    nlistAnzahl der Cluster-Einheiten[1, 65536]
  • Suchparameter

    • Gemeinsame Suche

      ParameterBeschreibungBereichStandardwert
      nprobeAnzahl der abzufragenden Einheiten[1, nlist]8
    • Bereichssuche

      ParameterBeschreibungBereichStandardwert
      max_empty_result_bucketsMaximale 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

    ParameterBeschreibungBereich
    drop_ratio_buildDer 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

    ParameterBeschreibungBereich
    drop_ratio_searchDer Anteil der kleinen Vektorwerte, die während des Suchvorgangs ausgeschlossen werden. Diese Option ermöglicht eine 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

    ParameterBeschreibungBereich
    drop_ratio_buildDer 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

    ParameterBeschreibungBereich
    drop_ratio_searchDer Anteil der kleinen Vektorwerte, die während des Suchvorgangs ausgeschlossen werden. Diese Option ermöglicht eine 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?

Übersetzt vonDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?