Wir stellen Cardinal vor: Die leistungsfähigste Engine für Vektorsuchen
Dieser Beitrag wurde von Alexandr Guzhva und Li Liu verfasst.
In Datenbanken ist „Performance“ eine kritische Kennzahl, insbesondere in Vektordatenbanken. Sie ist entscheidend, um ein hohes Volumen an Benutzeranfragen innerhalb begrenzter Ressourcen effizient zu verarbeiten. Während Zugriffslatenz in manchen Situationen kein Problem darstellen mag, bleibt Performance für eine Vektordatenbank aus verschiedenen Gründen wesentlich.
Vektorsuche, die auf Approximate Nearest Neighbor Search (ANNS) beruht, kann einen geringen Grad an Genauigkeit zugunsten einer verbesserten Performance eintauschen. Eine verbesserte Performance wiederum ermöglicht eine höhere Präzision.
Hervorragende Performance, die bei gleichbleibender Abfragelatenz aufrechterhalten wird, ermöglicht einen höheren Durchsatz mit denselben Ressourcen und unterstützt eine größere Nutzerbasis.
Darüber hinaus führt eine verbesserte Performance dazu, dass weniger Rechenressourcen erforderlich sind, um identische Nutzungsszenarien zu unterstützen.
Vektordatenbanken sind von Natur aus rechenintensiv, wobei ein erheblicher Teil der Ressourcennutzung—oft mehr als 80%—auf Vektordistanzberechnungen entfällt. Daher wird die Vektorsuchmaschine, die für die Verarbeitung von Vektorsuchaufgaben verantwortlich ist, zu einem kritischen Faktor bei der Bestimmung der Gesamtperformance einer Vektordatenbank.
Zilliz priorisiert konsequent die Verbesserung der Performance von Vektordatenbanken. Das Open-Source-Milvus und die vollständig verwaltete Zilliz Cloud zeigen im Vergleich zu ähnlichen Produkten eine überlegene Performance. Die Milvus-Vektorsuchmaschine Knowhere spielt eine bedeutende Rolle bei diesem Erfolg, indem sie die Grundlage für eine neue Suchmaschine legt.
Im Mittelpunkt der neuesten Veröffentlichung von Zilliz Cloud steht Cardinal, eine neue Vektorsuchmaschine, die wir entwickelt haben. Diese Suchmaschine hat bereits eine dreifache Leistungssteigerung im Vergleich zur vorherigen Version demonstriert und bietet eine Suchperformance (QPS), die das Zehnfache der von Milvus erreicht.
Wir haben die Performance der neuesten Zilliz Cloud mit dem Open-Source-Benchmark-Tool für Vektordatenbanken bewertet und ihre Performance mit Milvus und Zilliz Cloud mit einer alten Engine verglichen. Die Bewertungsergebnisse sind in den folgenden Diagrammen dargestellt.
Was ist Cardinal?
Cardinal ist eine proprietäre, moderne, multithreaded C++-Template-basierte Vektorsuchmaschine, die die praktischsten und am weitesten verbreiteten ANNS-Methoden implementiert. Cardinal wurde von Grund auf entworfen und geschrieben, um verfügbare Rechenressourcen effizient zu nutzen.
Cardinal ist in der Lage:
Brute-Force-Suche durchzuführen,
ANNS-Indizes zu erstellen und zu ändern,
Index-Top-K- und Index-Range-Suchen durchzuführen,
mit verschiedenen Eingabedatenformaten zu arbeiten, darunter FP32, FP16 und BF16,
mit In-Memory-Daten oder mit memory-mapped Daten zu arbeiten,
die Ergebnisse während der Suche auf Grundlage benutzerbereitgestellter Kriterien zu filtern.
Cardinal umfasst:
Eine Implementierung von ANN-Methoden, die eine einfache Konfiguration verschiedener interner Parameter ermöglichen. Der standardmäßige Betriebspunkt ist jedoch konsequent darauf abgestimmt, die Suchgeschwindigkeit (QPS, queries per second) zu maximieren und gleichzeitig eine angemessene Genauigkeit (Recall-Rate) beizubehalten.
Effiziente Implementierung verschiedener Algorithmen, die ANNS-Methoden unterstützen. Zum Beispiel solche, die Funktionen zur Stichprobenfilterung bereitstellen.
Low-Level-spezialisierte, optimierte Kernels für die rechenintensivsten Operationen, die während der Suche oder Konstruktion verwendet werden. Mehrere Hardwareplattformen werden unterstützt. Neben Kernels, die Distanzen für verschiedene Metriken berechnen, enthält Cardinal auch fused Kernels und Kernels für die Datenvorverarbeitung.
Unterstützende Einrichtungen wie asynchrone Operationen, Memory-Mapped-I/O-Fähigkeiten, Caching, Speicherallokatoren, Logging usw.
Knowhere vs. Cardinal
Die Bibliothek Knowhere ist ein interner Kern von Open-Source-Milvus und für die Vektorsuche verantwortlich. Knowhere basiert auf gepatchten Versionen branchenüblicher Open-Source-Bibliotheken wie Faiss, DiskANN und hnswlib.
Lassen Sie uns einen Vergleich zwischen Knowhere und Cardinal bereitstellen:
| Feature | Knowhere | Cardinal |
|---|---|---|
| Produktionsreife | Ja | Ja |
| Skalierbarkeitsfähigkeiten | Ja | Ja |
| Designphilosophie | Experimentieren und Flexibilität | Enger gefasst, mit Priorität auf der Verbesserung bestehender Funktionen für Performance |
| Host-Kompatibilität | Alle Host-Typen | Optimiert für die Zilliz Cloud Host-Umgebung |
| Abhängigkeit | Stützt sich auf bekannte OSS-Bibliotheken und -Implementierungen | Enthält nicht-triviale Modifikationen und Optimierungen |
Beide sind produktionsreif und bieten alle Skalierbarkeitsfähigkeiten, die Milvus und Zilliz Cloud benötigen.
Knowhere wurde mit Blick auf Experimentieren und Flexibilität entwickelt. Cardinal ist enger gefasst und priorisiert die Verbesserung bestehender Funktionen für höhere Geschwindigkeit und Performance, anstatt umfangreiche neue Funktionalität einzuführen.
Da Knowhere Open Source ist und in vielen verschiedenen Umgebungen bereitgestellt werden kann, läuft es auf allen Host-Typen. Cardinal ist für die Zilliz Cloud Host-Umgebung optimiert.
Knowhere stützt sich auf bekannte OSS-Bibliotheken und -Implementierungen(wie Faiss, DiskANN und hnswlib). Cardinal enthält nicht-triviale Modifikationen und Optimierungen.
Was Cardinal so schnell macht
Cardinal implementiert verschiedene algorithmusbezogene, technische und Low-Level-Optimierungen. Cardinal führt den AUTOINDEX-Mechanismus ein, der automatisch die beste Suchstrategie und den besten Index für den Datensatz auswählt. Dadurch entfällt die Notwendigkeit manueller Feinabstimmung, was Entwicklerinnen und Entwicklern Zeit und Aufwand spart.
Lassen Sie uns in die Details eintauchen.
Algorithmusoptimierungen
Diese Form der Optimierung verbessert die Genauigkeit und Effektivität des Suchprozesses erheblich, einer vielschichtigen Pipeline, in der verschiedene Algorithmen zusammenwirken. Zahlreiche Algorithmen innerhalb dieser Pipeline können verfeinert werden, um die Gesamtleistung zu steigern. Bemerkenswerte Kandidaten für Algorithmusoptimierungen innerhalb von Cardinal sind:
Suchalgorithmen, die sowohl IVF-basierte als auch graphbasierte Ansätze umfassen,
Algorithmen, die darauf ausgelegt sind, der Suche zu helfen, die erforderliche Recall-Rate unabhängig vom Prozentsatz gefilterter Stichproben aufrechtzuerhalten,
Fortgeschrittene Iterationen von Best-First-Search-Algorithmen,
Angepasste Algorithmen für eine Priority-Queue-Datenstruktur.
Parametrisierbare Algorithmen bieten die Flexibilität für Kompromisse, etwa beim Abwägen von Performance gegenüber RAM-Nutzung. Daher umfassen Algorithmusoptimierungen für Cardinal auch die Auswahl optimaler Betriebspunkte innerhalb des Parameterraums.
Technische Optimierungen
Während Algorithmen ursprünglich mit abstrakten Turing-Maschinen im Hinterkopf entworfen werden, steht die reale Implementierung vor Herausforderungen wie Netzwerklatenzen, Einschränkungen von Cloud-Anbietern bei IOPS und Begrenzungen des Maschinen-RAM, einer wertvollen, aber endlichen Ressource.
Technische Optimierungen stellen sicher, dass Cardinals Vektorsuch-Pipeline praktisch bleibt und mit Rechenleistung, RAM und anderen Ressourcenbeschränkungen im Einklang steht. In der Entwicklung von Cardinal kombinieren wir Standardpraktiken und innovative Techniken. Dieser Ansatz ermöglicht es dem C++-Compiler, rechnerisch optimalen kompilierten Code zu erzeugen, während sauberer, benchmarkfähiger und leicht erweiterbarer Quellcode erhalten bleibt, der das schnelle Hinzufügen neuer Funktionen erleichtert.
Hier sind einige Beispiele für in Cardinal implementierte Engineering-Praktiken, die spezifische Optimierungen zeigen:
Spezialisierte Speicher-Allokatoren und Speicherpools,
Ordnungsgemäß implementierter Multithread-Code,
Eine hierarchische Struktur von Komponenten, die die Kombination von Elementen zu verschiedenen Such-Pipelines erleichtert,
Code-Anpassung für spezifische, kritische Anwendungsfälle.
Low-Level-Optimierungen
Der Großteil der Suchzeit wird in relativ kleinen Codeabschnitten verbracht, die als Kernels bekannt sind. Das einfachste Beispiel ist ein Kernel, der die L2-Distanz zwischen zwei Vektoren berechnet.
Cardinal enthält zahlreiche Compute-Kernels für verschiedene Zwecke, die jeweils speziell für eine bestimmte Hardwareplattform und einen bestimmten Anwendungsfall geschrieben und optimiert wurden.
Cardinal unterstützt x86- und ARM-Hardwareplattformen, aber andere Plattformen können problemlos hinzugefügt werden.
Für die x86-Plattform verwenden Cardinal-Kernels die Erweiterungen F, CD, VL, BW, DQ, VPOPCNTDQ, VBMI, VBMI2, VNNI, BF16 und FP16 von AVX-512. Außerdem untersuchen wir die Nutzung eines neuen AMX-Befehlssatzes.
Für die ARM-Plattform sind Cardinal-Kernels sowohl für die NEON- als auch für die SVE-Befehlssätze verfügbar.
Wir stellen sicher, dass Cardinal den optimalsten Code für die Compute-Kernels erhält. Wir verlassen uns nicht einfach darauf, dass ein moderner C++-Compiler die Arbeit erledigt:
Wir verwenden dedizierte Tools wie Linux perf, um Hotspots und CPU-Metriken zu analysieren
Wir verwenden Werkzeuge zur Maschinencodeanalyse wie GodBolt Compiler Explorer und uiCA, um die optimale Nutzung von Hardware-„Ressourcen“ sicherzustellen, wie etwa die Anzahl der RAM-/Cache-Zugriffe, verwendete CPU-Instruktionen, Register und Compute-Ports.
Wir verwenden einen iterativen Ansatz, der die Phasen des Designs, des Benchmarkings, des Profilings und der Analyse des Assemblercodes miteinander verzahnt.
Ein ordnungsgemäß optimierter Compute-Kernel kann im Vergleich zu einem naiven, aber unoptimierten Kernel eine 2- bis 3-fache Beschleunigung bieten. Dies kann sich weiter in einen 2-fach höheren QPS-Wert oder 20 % geringere Speicheranforderungen auf einer Cloud-Host-Maschine übersetzen.
AutoIndex: Auswahl der Suchstrategie
Vektorsuche ist ein komplexer Prozess, der viele unabhängige Komponenten umfasst, darunter Quantisierung, Indexerstellung, Suchalgorithmen, Datenstrukturen und mehr. Jede Komponente verfügt über eine Vielzahl anpassbarer Parameter. Zusammen bilden sie eine äußerst vielfältige Palette von Vektorsuchstrategien, und unterschiedliche Datensätze und Szenarien erfordern unterschiedliche Suchstrategien.
Um das Potenzial für Leistungsverbesserungen besser auszuschöpfen, hat Cardinal zusätzlich zur Unterstützung mehrerer Strategien in jeder Komponente eine Reihe KI-basierter dynamischer Mechanismen zur Strategieauswahl implementiert, die als AUTOINDEX bekannt sind. Es wählt adaptiv die am besten geeignete Strategie basierend auf der Verteilung des gegebenen Datensatzes, der bereitgestellten Abfrage und der Hardwarekonfiguration aus. Dies hilft uns, optimale Leistung zu erzielen und gleichzeitig die Anforderungen der Nutzer an die Suchqualität zu erfüllen.
Cardinal-Benchmark
Wir haben die ANN-benchmarks übernommen, um Cardinal in unserer Testumgebung zu unterstützen. ANN benchmarks ist ein standardmäßiges Benchmarking-Tool zur Bewertung von ANNS-Implementierungen und wird auf mehreren Standarddatensätzen ausgeführt, die unterschiedliche Distanzmetriken verwenden. Jede Leistungsbewertung wird innerhalb eines Docker-Containers durchgeführt, der auf die Nutzung eines einzelnen Threads beschränkt ist. Die Metriken basieren auf mehreren Evaluierungsiterationen, die zahlreiche einzelne Query-Anfragen nutzen. Die Ergebnisse jedes evaluierten Frameworks werden zu einer Recall-vs-QPS-Pareto-Front aggregiert.
Alle Tests wurden auf derselben Art von Maschine durchgeführt wie die Basis-ann-benchmarks (Stand Jan. 2024), nämlich einer Amazon EC2 r6i.16xlarge-Maschine mit der folgenden Konfiguration:
CPU: Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
Anzahl der CPU-Kerne: 32
Hyperthreading ist deaktiviert
RAM: 512 GB
OS: Ubuntu 22.04.3 LTS mit Linux-Kernel 6.2.0-1017-aws
Huge-Page-Unterstützung war nicht aktiviert.
Die Tests wurden mit der Option `--parallelism=31` ausgeführt.
Cardinal wurde mit dem Compiler clang 17.0.6 kompiliert.
Die unten dargestellten Benchmark-Ergebnisse gelten nur für die Cardinal-Engine und enthalten keine zusätzlichen Nicht-Index-Optimierungen, die von Zilliz Cloud bereitgestellt werden.
Hinweis: Ergebnisse, die Zilliz-Cloud-spezifische Optimierungen enthalten, werden oben am Anfang des Artikels bereitgestellt.
Die folgenden Diagramme wurden erstellt, indem die Bilder der Diagramme mit den auf der ANN-benchmark GitHub page präsentierten Ergebnissen genommen und präzise eine zusätzliche Cardinal-Kurve darübergelegt wurde.
Bei allen bereitgestellten Benchmarks zeigt Cardinal sehr wettbewerbsfähige Ergebnisse. Und es gibt Raum für weitere Verbesserungen.
Was kommt als Nächstes?
Die Zukunft wird uns zweifellos neue Herausforderungen bringen. Unterschiedliche Anforderungen, unterschiedliche Engpässe, größere Datensätze. Wir arbeiten weiter daran, Cardinal noch besser zu machen.
Der Weg ist erleuchtet. Der Pfad ist klar. Wir brauchen nur die Kraft, ihm zu folgen :)
Weiterlesen

Zilliz Cloud Now Available in AWS Asia Pacific (Seoul)
Zilliz Cloud is now available in AWS Seoul — low-latency vector search, in-country data residency, and one-step migration for Korean AI teams. 31 regions across 5 clouds.

Zilliz Named "Highest Performer" and "Easiest to Use" in G2's Summer 2025 Grid® Report for Vector Databases
Zilliz shines in G2's Summer 2025 Grid® Report as both "Highest Performer" and "Easiest to Use," solving the performance-usability dilemma.

Vector Databases vs. Hierarchical Databases
Use a vector database for AI-powered similarity search; use a hierarchical database for organizing data in parent-child relationships with efficient top-down access patterns.



