GPU-Index-Übersicht
Der Aufbau eines Index mit GPU-Unterstützung in Milvus kann die Suchleistung in Szenarien mit hohem Durchsatz und hohem Rückruf deutlich verbessern.
Die folgende Abbildung vergleicht den Abfragedurchsatz (Abfragen pro Sekunde) über verschiedene Indexkonfigurationen, Hardwarekonfigurationen, Vektordatensätze (Cohere und OpenAI) und Suchstapelgrößen hinweg. Dabei zeigt sich, dass GPU_CAGRA durchweg besser abschneidet als andere Methoden.
GPU-Indexleistung
Konfigurieren Sie den GPU-Speicherpool für Milvus
Milvus unterstützt einen globalen GPU-Speicherpool und bietet zwei Konfigurationsparameter, initMemSize und maxMemSize, in der Milvus-Konfigurationsdatei.
gpu:
initMemSize: 0 # set the initial memory pool size.
maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.
Der Standardwert initMemSize ist normalerweise die Hälfte des GPU-Speichers, wenn Milvus startet, und maxMemSize ist der Standardwert für den gesamten GPU-Speicher. Die Größe des GPU-Speicherpools ist anfänglich auf initMemSize eingestellt und wird bei Bedarf automatisch auf maxMemSize erweitert.
Wenn ein GPU-aktivierter Index angegeben wird, lädt Milvus die Zielsammlungsdaten vor der Suche in den GPU-Speicher, so dass maxMemSize mindestens die Datengröße sein muss.
Begrenzungen
Für
GPU_IVF_FLATbeträgt der Höchstwert fürlimit1.024.Für
GPU_IVF_PQundGPU_CAGRAist der Höchstwert fürlimit1.024.Während es für
GPU_BRUTE_FORCEkeinen festgelegtenlimitgibt, wird empfohlen, 4.096 nicht zu überschreiten, um mögliche Leistungsprobleme zu vermeiden.Derzeit unterstützen GPU-Indizes nicht den
COSINEAbstand. Wenn derCOSINEAbstand benötigt wird, sollten die Daten zuerst normalisiert werden, und dann kann der innere Produktabstand (IP) als Ersatz verwendet werden.Das Laden von OOM-Schutz für GPU-Indizes wird nicht vollständig unterstützt, zu viele Daten können zum Absturz von QueryNode führen.
GPU-Indizes unterstützen keine Suchfunktionen wie Bereichssuche und Gruppierungssuche.
Unterstützte GPU-Indextypen
In der folgenden Tabelle sind die von Milvus unterstützten GPU-Indextypen aufgeführt.
Index-Typ |
Beschreibung |
Speicherverwendung |
|---|---|---|
GPU_CAGRA ist ein graphenbasierter 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. |
Der Speicherbedarf ist etwa 1,8 Mal so hoch wie der der ursprünglichen Vektordaten. |
|
GPU_IVF_FLAT ist der einfachste IVF-Index, und die in jeder Einheit gespeicherten kodierten Daten stimmen mit den Originaldaten überein. Beachten Sie bei der Durchführung von Suchvorgängen, dass Sie für jede Suche in einer GPU_IVF_FLAT-indizierten Sammlung den Top-k-Wert ( |
Benötigt Speicher, der der Größe der Originaldaten entspricht. |
|
GPU_IVF_PQ führt ein IVF-Indexclustering durch, bevor das Produkt der Vektoren quantisiert wird. Beachten Sie bei der Durchführung von Suchvorgängen, dass Sie den Top-k-Wert ( |
Verwendet einen kleineren Speicherbedarf, der von den Einstellungen der Kompressionsparameter abhängt. |
|
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 ( |
Benötigt einen Speicherplatz, der der Größe der Originaldaten entspricht. |
Konfigurieren Sie die Milvus-Einstellungen für die GPU-Speichersteuerung
Milvus verwendet einen globalen Grafikspeicher-Pool für die Zuweisung von GPU-Speicher. Er unterstützt zwei Parameter initMemSize und maxMemSize in der Milvus-Konfigurationsdatei. Die Poolgröße ist anfänglich auf initMemSize eingestellt und wird automatisch auf maxMemSize erweitert, wenn diese Grenze überschritten wird.
Der Standardwert initMemSize ist 1/2 des verfügbaren GPU-Speichers, wenn Milvus startet, und der Standardwert maxMemSize ist gleich dem gesamten verfügbaren GPU-Speicher.
Bis zu Milvus 2.4.1 verwendet Milvus einen einheitlichen GPU-Speicherpool. Für Versionen vor 2.4.1 wurde empfohlen, beide Werte auf 0 zu setzen.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Ab Milvus 2.4.1 wird der GPU-Speicherpool nur noch für temporäre GPU-Daten während der Suche verwendet. Es wird daher empfohlen, ihn auf 2048 und 4096 zu setzen.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Um zu erfahren, wie man einen GPU-Index erstellt, lesen Sie die spezifische Anleitung für jeden Indextyp.
FAQ
Wann ist es sinnvoll, einen GPU-Index zu verwenden?
Ein GPU-Index ist besonders vorteilhaft in Situationen, die einen hohen Durchsatz oder eine hohe Abrufrate erfordern. Bei großen Batches kann der Durchsatz der GPU-Indizierung beispielsweise den der CPU-Indizierung um das 100-fache übertreffen. In Szenarien mit kleineren Stapeln übertrifft die GPU-Indizierung die CPU-Indizierung in Bezug auf die Leistung immer noch deutlich. Darüber hinaus kann die Einbindung einer GPU den Prozess der Indexerstellung erheblich beschleunigen, wenn Daten schnell eingefügt werden müssen.
Für welche Szenarien sind GPU-Indizes wie GPU_CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT und GPU_BRUTE_FORCE am besten geeignet?
GPU_CAGRAGPU_IVF_PQ und GPU_BRUTE_FORCE-Indizes sind ideal für Szenarien, die eine höhere Leistung erfordern, allerdings um den Preis, dass mehr Speicher verbraucht wird. In Umgebungen, in denen Speicherplatzeinsparung eine Priorität ist, kann der IndexGPU_IVF_PQdazu beitragen, die Speicheranforderungen zu minimieren, auch wenn dies mit einem höheren Präzisionsverlust einhergeht. Der IndexGPU_IVF_FLATstellt eine ausgewogene Option dar, die einen Kompromiss zwischen Leistung und Speicherbedarf bietet. Der IndexGPU_BRUTE_FORCEschließlich ist für erschöpfende Suchvorgänge konzipiert und garantiert durch die Durchführung von Traversalsuchen eine Abrufrate von 1.