GPU-beschleunigte Vektorsuche in Elasticsearch mit NVIDIA: Kapitel 1

Die Zusammenarbeit basiert auf NVIDIA cuVS und soll Entwicklern GPU-Beschleunigung für die Vektorsuche in Elasticsearch bieten.

Von der Vektorsuche bis hin zu leistungsstarken REST-APIs bietet Elasticsearch Entwicklern das umfangreichste Such-Toolkit. Sehen Sie sich die Beispiel-Notebooks auf GitHub an, um etwas Neues testen. Sie können auch noch heute Ihre kostenlose Testversion starten oder Elasticsearch lokal ausführen.

Wir in der Elastic Engineering-Organisation sind seit einiger Zeit damit beschäftigt, die Leistung von Vektordatenbanken zu optimieren. Unsere Mission: Lucene und Elasticsearch zur besten Vektordatenbank machen. Durch hardwarebeschleunigte CPU-SIMD-Anweisungen, die Einführung neuer Innovationen bei der Vektordatenkomprimierung (bessere binäre Quantisierung, auch bekannt als BBQ), und das anschließende Übertreffen der Erwartungen durch die Aktualisierung des algorithmischen Ansatzes für BBQ, um noch mehr Vorteile zu erzielen und auch gefiltertes HNSW schneller zu machen. Sie verstehen, was ich meine – wir bauen eine schnellere, bessere, effizientere (äh?) Vektordatenbank für die Entwickler beim Lösen dieser RAG-gedy-Probleme!

Im Rahmen unserer Mission, keine Effizienz zu vernachlässigen, erkunden wir Beschleunigungsmöglichkeiten mit diesen merkwürdigen Computerchips, von denen Sie vielleicht schon gehört haben – NVIDIA-GPUs! (Im Ernst, nicht wahr?)

Wenn wir uns so sehr auf die Leistung konzentrieren, müssen wir mehrere Problembereiche untersuchen: Wie lassen sich exponentiell mehr Daten indizieren, wie lassen sich daraus Erkenntnisse gewinnen und wie geht das, wenn Ihre ML-Modelle beteiligt sind? Wenn Sie über GPUs verfügen, sollten Sie in der Lage sein, jeden noch so kleinen Vorteil auszuschöpfen.

In diesem Beitrag tauchen wir in unsere Zusammenarbeit mit dem NVIDIA-Vektorsuchteam ein, während wir die GPU-beschleunigte Vektorsuche in Elasticsearch erkunden. Diese Arbeit ebnet den Weg für Anwendungsfälle, in denen Entwickler eine Mischung aus GPUs und CPUs für reale, auf Elasticsearch basierende Apps verwenden können. Spannende Zeiten!

Elasticsearch-GPUs

Wir freuen uns, mitteilen zu können, dass das Elasticsearch-Entwicklungsteam dabei hilft, die Open-Source-CuVS-Java-API-Erfahrung für Entwickler aufzubauen, die Bindungen für Vektorsuchalgorithmen bereitstellt. Diese Arbeit nutzt unsere bisherigen Erfahrungen mit Panama FFI. Elasticsearch und Apache Lucene verwenden die NVIDIA cuVS-API, um den Graphen während der Indizierung zu erstellen. Okay, wir springen vor; spulen wir ein bisschen zurück.

NVIDIA cuVS, eine Open-Source-C++-Bibliothek, ist das Herzstück dieser Zusammenarbeit. Ziel ist es, die Vektorsuche durch GPU-Beschleunigung zu verbessern, indem ein höherer Durchsatz, geringere Latenz und schnellere Indexerstellungszeiten erreicht werden. Aber Elasticsearch und Apache Lucene sind in Java geschrieben. Wie soll das funktionieren?

Geben Sie lucene-cuvs und die Zusammenarbeit zwischen Elastic, NVIDIA und SearchScale ein, um es in das Lucene-Ökosystem zu integrieren und die GPU-beschleunigte Vektorsuche in Elasticsearch zu erkunden. In der aktuellen Version von NVIDIA cuVS 25.02 haben wir eine Java-API für cuVS hinzugefügt. Die neue API ist experimentell und wird weiterentwickelt, ist aber derzeit zur Verwendung verfügbar. Es stellt sich möglicherweise die Frage: Sind Funktionsaufrufe von Java zu nativen Funktionen nicht langsam? Nicht mehr! Wir verwenden für die Bindungen das neue Panama FFI (Foreign Function Interface), das für Java-zu-native-Downcalls nur einen minimalen Overhead verursacht.

Wir verwenden Panama FFI bereits seit einiger Zeit in Elasticsearch und Lucene . Es ist fantastisch! Aber ... es gibt immer ein „Aber“, nicht wahr? FFI hat Verfügbarkeitsprobleme bei allen Java-Versionen. Wir haben dies überwunden, indem wir die cuVS-API für Java 21 kompiliert und die Implementierung in einem Multi-Release-JAR für Java 22 gekapselt haben. Dies ermöglicht die Verwendung von cuVS Java direkt in Lucene und Elasticsearch.

Ok, jetzt, da wir die cuVS Java-API haben, was brauchen wir noch?

Eine Geschichte von zwei Algorithmen für die CPU

Elasticsearch unterstützt den HNSW-Algorithmus für die skalierbare ungefähre KNN-Suche. Um jedoch das Beste aus der GPU herauszuholen, verwenden wir einen anderen Algorithmus, CAGRA [CUDA ANN GRAph], der speziell für die hohen Parallelitätsgrade der GPU entwickelt wurde.

Bevor wir uns damit befassen, wie wir Unterstützung für CAGRA hinzufügen möchten, schauen wir uns an, wie Elasticsearch und Lucene über ein „Codec-Format“ auf Indexdaten zugreifen. Dieses besteht aus

  1. die Darstellung auf der Festplatte,
  2. die Schnittstellen zum Lesen und Schreiben von Daten,
  3. und die Mechanismen zum Umgang mit der segmentbasierten Architektur von Lucene.

Wir implementieren ein neues KNN -Vektorformat (k-nearest neighbors), das intern die cuVS Java-API zum Indizieren und Suchen auf der GPU verwendet. Von hier aus „verknüpfen“ wir diesen Codec-Typ über die Zuordnungen von Elasticsearch mit einem Feldtyp im Index. Daher funktionieren Ihre vorhandenen KNN-Abfragen weiterhin, unabhängig davon, ob der zugrunde liegende Index ein CAGRA- oder HNSW-Diagramm verwendet. Natürlich werden dabei viele Details außer Acht gelassen, die wir in einem zukünftigen Blog behandeln möchten. Im Folgenden finden Sie die High-Level-Architektur für eine GPU-beschleunigte Elasticsearch.

Dieses neue Codec-Format ist standardmäßig auf CAGRA eingestellt. Es unterstützt jedoch auch die Konvertierung eines CAGRA-Diagramms in ein HNSW-Diagramm für die Suche auf der CPU.

Indizierung und Suche auf der GPU: Treffen einiger „Kernentscheidungen“

Mit der zustandslosen Architektur für Elasticsearch Serverless, die Indizierung und Suche trennt, gibt es nun eine klare Abgrenzung der Verantwortlichkeiten. Wir wählen das beste Hardwareprofil aus, um jede dieser unabhängigen Aufgaben zu erfüllen.

Wir gehen davon aus, dass Benutzer zwei Hauptbereitstellungsstrategien in Betracht ziehen:

  1. Indizierung und Suche auf der GPU: Erstellen Sie während der Indizierung ein CAGRA-Diagramm und verwenden Sie es während der Suche – ideal, wenn eine Suche mit extrem geringer Latenz erforderlich ist.
  2. Index auf GPU und Suche auf CPU: Erstellen Sie während der Indizierung ein CAGRA-Diagramm und konvertieren Sie es in ein HNSW-Diagramm. Im Index wird der HNSW-Graph gespeichert, der später auf der CPU zur Suche verwendet werden kann.

Diese Flexibilität ermöglicht verschiedene Bereitstellungsmodelle und bietet einen Kompromiss zwischen Kosten und Leistung. Beispielsweise könnte ein Indexierungsdienst mithilfe der GPU Diagramme effizient und zeitnah erstellen und zusammenführen, während für die Suche eine CPU mit geringerer Leistung verwendet wird.

Hier ist also der Plan für die GPU-beschleunigte Vektorsuche in Elasticsearch

Wir freuen uns darauf, den Benutzern Leistungssteigerungen und Flexibilität bei Bereitstellungsstrategien zu bieten und verschiedene Regler zum Ausgleich von Kosten und Leistung bereitzustellen. Hier ist die NVIDIA GTC 2025-Sitzung, in der diese Arbeit ausführlich vorgestellt wurde.

Wir möchten den Entwicklungsteams von NVIDIA und SearchScale für ihre fantastische Zusammenarbeit danken. In einem kommenden Blog werden wir die Implementierungsdetails und die Leistungsanalyse genauer untersuchen. Halten Sie Ihre Neugierhüte fest 🎩!

Zugehörige Inhalte

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus