GPU-Index
Milvus unterstützt verschiedene GPU-Indextypen, um die Suchleistung und -effizienz zu beschleunigen, insbesondere in Szenarien mit hohem Durchsatz und hohem Wiederaufruf. Dieses Thema bietet einen Überblick über die von Milvus unterstützten GPU-Indextypen, ihre geeigneten Anwendungsfälle und Leistungsmerkmale. Informationen zur Erstellung von Indizes mit GPU finden Sie unter Index mit GPU.
Es ist wichtig zu beachten, dass die Verwendung eines GPU-Index nicht unbedingt die Latenzzeit im Vergleich zu einem CPU-Index reduziert. Wenn Sie den Durchsatz vollständig maximieren möchten, benötigen Sie einen extrem hohen Anfragedruck oder eine große Anzahl von Abfragevektoren.
Leistung
Die GPU-Unterstützung von Milvus wird vom Nvidia RAPIDS-Team beigesteuert. Im Folgenden sind die GPU-Indextypen aufgeführt, die derzeit von Milvus unterstützt werden.
GPU_CAGRA
GPU_CAGRA ist ein graphbasierter Index, der für GPUs optimiert ist. Die Verwendung von GPUs mit Inferenzqualität zur Ausführung der GPU-Version von Milvus kann im Vergleich zur Verwendung teurer GPUs mit Trainingsqualität kostengünstiger sein.
Parameter für die Indexerstellung
Parameter Beschreibung Standardwert intermediate_graph_degree
Beeinflusst Recall und Erstellungszeit, indem der Grad des Graphen vor dem Pruning bestimmt wird. Empfohlene Werte sind 32
oder64
.128
graph_degree
Beeinflusst die Suchleistung und den Abruf, indem der Grad des Graphen nach dem Pruning festgelegt wird. Eine größere Differenz zwischen diesen beiden Graden führt zu einer längeren Erstellungszeit. Sein Wert muss kleiner sein als der Wert von intermediate_graph_degree. 64
build_algo
Wählt den Graphenerzeugungsalgorithmus vor dem Pruning. Mögliche Werte: IVF_PQ
: Bietet eine höhere Qualität, aber eine langsamere Erstellungszeit.NN_DESCENT
Bietet einen schnelleren Aufbau mit potenziell geringerer Wiedererkennung.IVF_PQ
cache_dataset_on_device
Legt fest, ob der Originaldatensatz im GPU-Speicher zwischengespeichert werden soll. Mögliche Werte: “true”
: Zwischenspeichern des Originaldatensatzes zur Verbesserung der Wiederauffindung durch Verfeinerung der Suchergebnisse.“false”
Cache: Der Originaldatensatz wird nicht zwischengespeichert, um GPU-Speicher zu sparen.“false”
Suchparameter
Parameter Beschreibung Standardwert itopk_size
Bestimmt die Größe der Zwischenergebnisse, die während der Suche gespeichert werden. Ein größerer Wert kann die Wiederauffindbarkeit auf Kosten der Suchleistung verbessern. Er sollte mindestens dem endgültigen Top-k-Wert (Grenzwert) entsprechen und ist normalerweise eine Potenz von 2 (z. B. 16, 32, 64, 128). Leer search_width
Gibt die Anzahl der Einstiegspunkte in den CAGRA-Graphen während der Suche an. Eine Erhöhung dieses Wertes kann die Wiederauffindbarkeit verbessern, kann sich aber auf die Suchleistung auswirken(z.B. 1, 2, 4, 8, 16, 32). Leer min_iterations
/max_iterations
Steuert den Iterationsprozess der Suche. Standardmäßig sind sie auf 0
eingestellt, und CAGRA bestimmt automatisch die Anzahl der Iterationen auf der Grundlage vonitopk_size
undsearch_width
. Eine manuelle Anpassung dieser Werte kann helfen, Leistung und Genauigkeit auszugleichen.0
team_size
Gibt die Anzahl der CUDA-Threads an, die für die Berechnung des metrischen Abstands auf dem Grafikprozessor verwendet werden. Übliche Werte sind eine Potenz von 2 bis zu 32 (z. B. 2, 4, 8, 16, 32). Er hat einen geringen Einfluss auf die Suchleistung. Der Standardwert ist 0
, wobei Milvus dieteam_size
automatisch auf der Grundlage der Vektordimension auswählt.0
Grenzen für die Suche
Parameter Bereich limit
(Top-K)<= 1024 limit
(Top-K)<=max(( itopk_size
+ 31)// 32,search_width
) * 32
GPU_IVF_FLAT
Ähnlich wie IVF_FLAT unterteilt auch GPU_IVF_FLAT die Vektordaten in nlist
Cluster-Einheiten und vergleicht dann die Abstände zwischen dem Zieleingabevektor 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.
GPU_IVF_FLAT ist der einfachste IVF-Index, und die in jeder Einheit gespeicherten kodierten Daten stimmen mit den Originaldaten überein.
Bei der Durchführung von Suchvorgängen ist zu beachten, dass Sie bei jeder Suche in einer mit GPU_IVF_FLAT indizierten Sammlung den Top-K-Wert auf bis zu 256 setzen können.
Parameter für die Indexerstellung
Parameter Beschreibung Bereich Standardwert nlist
Anzahl der Cluster-Einheiten [1, 65536] 128
cache_dataset_on_device
Legt fest, ob der Originaldatensatz im GPU-Speicher zwischengespeichert werden soll. Mögliche Werte: “true”
: Zwischenspeichern des Originaldatensatzes zur Verbesserung der Wiedererkennung durch Verfeinerung der Suchergebnisse.“false”
Cache: Der Originaldatensatz wird nicht zwischengespeichert, um GPU-Speicher zu sparen."true"
"flase"
"false"
Suchparameter
Allgemeine Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] 8
Grenzen für die Suche
Parameter Bereich limit
(Top-K)<= 2048
GPU_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.
Beachten Sie bei der Durchführung von Suchvorgängen, dass Sie den Top-K-Wert für jede Suche gegen eine GPU_IVF_FLAT-indizierte Sammlung auf bis zu 8192 einstellen können.
Parameter für den Indexaufbau
Parameter Beschreibung Bereich Standardwert nlist
Anzahl der Cluster-Einheiten [1, 65536] 128
m
Anzahl der Faktoren der Produktquantisierung, dim mod m or = 0
0
nbits
[Optional] Anzahl der Bits, in denen jeder niedrigdimensionale Vektor gespeichert wird. [1, 16] 8
cache_dataset_on_device
Legt fest, ob der Originaldatensatz im GPU-Speicher zwischengespeichert werden soll. Mögliche Werte: “true”
: Zwischenspeichern des Originaldatensatzes zur Verbesserung der Wiedererkennung durch Verfeinerung der Suchergebnisse.“false”
Cache: Der Originaldatensatz wird nicht zwischengespeichert, um GPU-Speicher zu sparen."true"
"false"
"false"
Suchparameter
Allgemeine Suche
Parameter Beschreibung Bereich Standardwert nprobe
Anzahl der abzufragenden Einheiten [1, nlist] 8
Grenzen für die Suche
Parameter Bereich limit
(Top-K)<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE ist auf Fälle zugeschnitten, in denen eine extrem hohe Trefferquote entscheidend ist. Sie garantiert eine Trefferquote von 1, indem sie jede Abfrage mit allen Vektoren des Datensatzes vergleicht. Es benötigt nur den metrischen Typ (metric_type
) und Top-k (limit
) als Indexaufbau- und Suchparameter.
Für GPU_BRUTE_FORCE sind keine zusätzlichen Indexerstellungs- oder Suchparameter erforderlich.
Schlussfolgerung
Derzeit lädt Milvus alle Indizes in den GPU-Speicher, um effiziente Suchvorgänge zu ermöglichen. Die Menge der Daten, die geladen werden können, hängt von der Größe des GPU-Speichers ab:
- GPU_CAGRA: Der Speicherbedarf beträgt etwa das 1,8-fache der ursprünglichen Vektordaten.
- GPU_IVF_FLAT und GPU_BRUTE_FORCE: Benötigt Speicher, der der Größe der Originaldaten entspricht.
- GPU_IVF_PQ: Verwendet einen kleineren Speicherplatz, der von den Einstellungen der Komprimierungsparameter abhängt.