Milvus: Milliardstel-Skala Ähnlichkeitssuche in Millisekunden

Milvus ist die weltweit fortschrittlichste Open-Source-Vektordatenbank und Ähnlichkeitssuchmaschine, die von mehr als 1.000 der „Who’s-who“-Organisationen auf der ganzen Welt genutzt wird, darunter Lucidworks! Entwickelt als Cloud-native, skalierbare Architektur, die die Speicherung und Suche von Milliarden von Vektoren unterstützt, basiert der Kern auf den modernsten ANN-Algorithmus-Bibliotheken wie FAISS, HNSW und Annoy. In der Sitzung wird die Leistungsfähigkeit von Milvus vorgestellt und die Verfügbarkeit des SDK für Python, JAVA, GO und Restful hervorgehoben.
Zielpublikum
Entwickler, IT-Management, Softwareentwickler
Teilnehmer nehmen mit
Die Teilnehmer erhalten ein umfassendes Verständnis dafür, wie Vektordatenbanken die Ähnlichkeitssuche um das 10-fache beschleunigen und von Unternehmen in verschiedenen Branchen genutzt werden können, um milliardenschwere Datensätze in Millisekunden abzufragen.
Die Teilnehmer werden die wichtigsten Anwendungsfälle kennenlernen, in denen Milvus in der Produktion eingesetzt wird, und erfahren, wie sie die Vorteile der Software für ihre Anwendungen nutzen können.
Sprecher
Ryan Chan, Zilliz
[Ryan Chan]
Hallo, guten Morgen zusammen. Danke, dass Sie zu Activate gekommen sind.
Heute werden wir ein wenig über die Vektorsuche und Vektordatenbanken sprechen und einen Überblick darüber geben, wie wir unser verteiltes Vektordatenbanksystem implementieren und wie Sie diese Technologie nutzen können, um die nächste Generation Ihrer Suche in einem wirklich großen Maßstab zu betreiben.
Stellen Sie sich zunächst kurz vor. Mein Name ist Ryan Chan, ich bin Data Engineer im User Success Team von Zilliz. Mein Schwerpunkt liegt auf der Systembereitstellung, insbesondere in öffentlichen Cloud-Systemen.
Also Zilliz, wer sind wir? Nun, wir sind ein Open-Source-Softwareunternehmen mit Sitz in Shanghai. Wir haben es uns zur Aufgabe gemacht, die Datenwissenschaft neu zu erfinden, indem wir eine Reihe von Open-Source-Projekten veröffentlichen und zu ihnen beitragen.
Die heute relevante ist Milvus, unsere Open-Source-Vektordatenbank, auf die wir etwas später in der Präsentation eingehen werden. Bevor wir uns mit Milvus beschäftigen, eine kurze Einführung in die Vektorsuche. Herkömmliche Suchmodelle funktionieren am besten mit Zahlen und Texten, also mit Dingen, die wir als strukturierte Daten bezeichnen können. Strukturierte Daten sind Daten mit einer inhärenten Struktur, die sich leicht analysieren lassen und sich in ihrer Form nicht stark unterscheiden.
Wir haben Anwendungen, die für diese Anwendungsfälle recht gut funktionieren. Ich bin sicher, dass viele von uns schon einmal mit Lucene-basierten Systemen oder etwas wie Solr gearbeitet haben. Für ihre Anwendungsfälle, nämlich die Text- und Dokumentensuche, sind sie ganz gut geeignet. Was aber, wenn wir darüber hinausgehen wollen? Heutzutage besteht ein großer Teil der von Unternehmen erfassten Daten aus so genannten unstrukturierten Daten wie Bildern, Videos, biometrischen Daten und so ziemlich allem, was nicht nur aus Text oder Zahlen besteht.
Unsere herkömmlichen technischen Suchstrategien sind hier nicht ganz so nützlich. Stattdessen können wir Modelle des maschinellen Lernens verwenden, um sogenannte Einbettungsvektoren zu generieren, d.h. vektorielle Darstellungen der einzelnen Daten, und mit diesen eine Ähnlichkeitssuche durchführen.
Wie führen wir also diese Vektorsuchen durch? Nun, es gibt eine Reihe von Open-Source-Frameworks für die Vektorsuche, die wir ausprobiert haben, aber letztendlich haben wir festgestellt, dass wir für fast jede einzelne Anwendung mehr als nur eine algorithmische Bibliothek benötigen. Sobald Sie Ihre Vektoren haben, müssen Sie sie speichern und bearbeiten. Und wenn Sie mit wirklich großen Datenmengen arbeiten möchten, müssen Sie ein ganzes System um die Skalierbarkeit herum aufbauen.
Angesichts dieser gemeinsamen Anforderungen haben wir Milvus entwickelt, das wir gerne als Vektordatenbank bezeichnen. Wir haben die Vektorsuche mit der Einbettung von Speicher- und Abrufdaten kombiniert, und das alles auf verteilte Weise, um Skalierbarkeit und Robustheit zu gewährleisten.
Hier haben wir also ein Diagramm, das einen Beispielablauf einer sehr allgemeinen Pipeline für maschinelles Lernen zeigt. Im Großen und Ganzen handelt es sich um eine sehr lehrbuchmäßige Vorgehensweise. Zunächst erstellen und trainieren Sie Ihr maschinelles Lernmodell, um Ihre Einbettungsfaktoren zu generieren. Als nächstes erstellen Sie die Vektoren, um sie in Ihrer Vektordatenbank zu speichern, damit Sie sie abfragen können. Es gibt verschiedene Möglichkeiten, dies zu tun, aber die einfachste ist, Ihr Modell auf den gesamten Datenbestand anzuwenden, den Sie durchsuchbar machen möchten. Wenn Sie dann Ihre Eingabedaten in der Produktion erhalten, z.B. die Suchanfrage eines Benutzers, können Sie sie durch dasselbe Modell laufen lassen und dann Ihre Vektordatenbank verwenden, um effizient eine ungefähre Suche nach dem nächsten Nachbarn durchzuführen und Ihre Ergebnisse zu erhalten. Führen Sie einfach eine Nachbearbeitung durch. Dann sind Sie fertig.
Jetzt habe ich über die allgemeinen Fälle von Vektordatenbanken gesprochen, aber unser eigenes Vektordatenbankprojekt Milvus hat einige zusätzliche Funktionen, die unserer Meinung nach ein wenig über das normale Maß hinausgehen. Was die Hardware betrifft, so sind wir stolz auf unsere Unterstützung für heterogenes Computing, einschließlich der Unterstützung für viele verschiedene Arten von Hardware und Befehlssätzen.
Was die Datenverwaltung betrifft, so verwaltet Milvus riesige Datenmengen durch Partitionierung und Data Sharding, was eine beeindruckende Leistung selbst bei den größten Datensätzen ermöglicht. Wir übernehmen und verbessern Algorithmen wie Faiss, Annoy und HNSW, um eine effiziente Suche zu ermöglichen.
Nun zur Cloud und zur Skalierbarkeit bei der Suche. Ich habe das Konzept der Skalierbarkeit bisher ein wenig gestreift, aber warum ist es so wichtig? Nun, es gibt ein paar offensichtliche Antworten. Wenn Sie ein verteiltes System aufbauen, erhalten Sie eine bessere Elastizität und Ausfallsicherheit. Sie können die verschiedenen Teile Ihres Systems nach Belieben disaggregieren und verwalten. Wenn Sie Ihr System auf Cloud-Plattformen einsetzen, können Sie bei geringer Auslastung Betriebskosten einsparen und es gleichzeitig automatisch skalieren, wenn die Auslastung zunimmt.
Darüber hinaus, und das ist vielleicht noch wichtiger, ist die Fähigkeit zur Skalierung für neues Wachstum. Mit dem neuen Zustrom großer Datenmengen und dem Aufkommen so vieler neuer maschineller Lerntechniken sagen wir voraus, dass die Suchlasten beim Übergang zu dieser neuen Generation vektorbasierter Suchen extrem ansteigen werden. Die Entwicklung von Systemen, die diese enormen Datenmengen effizient verarbeiten können, ist von entscheidender Bedeutung.
Wie genau sieht also die Skalierbarkeit in Milvus aus? Die Bereitstellung in Kubernetes und Helm bietet Konfigurationsoptionen für die Skalierung für jede Clustergröße. Auf der Speicherseite haben wir das System von Grund auf für S3-Speicher entwickelt. Für Bereitstellungen, die nicht mit S3-Buckets verbunden sind, bündeln wir eine Speicherlösung namens MinIO. Dabei handelt es sich um einen Objektspeicher-Server, den Sie ausführen können und der dieselbe API-Grenze wie S3 nutzt. Er kann quasi als Ersatz betrachtet werden, wenn Sie Ihren eigenen Speicher hosten möchten, anstatt S3 zu verwenden.
Außerdem bieten wir Unterstützung für die Speicherung mit Azure Blob Storage und Google Cloud Storage, falls Sie daran interessiert sind, Dinge in einer anderen öffentlichen Cloud auszuführen. Wir trennen unsere Speicher- und Berechnungsfunktionen und ermöglichen getrennte Lese-, Schreib- und Hintergrunddienste. Dies erreichen wir durch unser verteiltes Systemdesign.
Lassen Sie uns also ein wenig darüber sprechen, wie wir die Dinge in Milvus erreichen, insbesondere unsere verteilte Architektur. Ich werde hier nicht zu sehr in die technischen Details einsteigen, aber als Überblick auf mittlerer Ebene ist die Hauptidee, dass wir so viele Komponenten unseres Systems wie möglich in individuell skalierbare Dienste aufteilen. Zum Beispiel werden die Dateneingabe, die Indizierung und die Suchabfrage in verschiedenen skalierbaren Komponenten durchgeführt.
Sie können einige von ihnen in der Grafik auf dem Bildschirm sehen. Wir haben insgesamt acht verschiedene Arten von Diensten oder Knoten. Wir haben Proxy-Knoten, Root-Koordinator-Knoten, Abfrage-Koordinator-Knoten, Daten-Koordinator-Knoten, Index-Koordinator-Knoten, Abfrage-Arbeits-Knoten, Daten-Arbeits-Knoten und schließlich Index-Arbeits-Knoten.
Auf diese Weise können Sie Milvus auf einem einzelnen Rechner oder auf einem ganzen Cluster in der Cloud mit genau demselben System betreiben. Das Rückgrat des Systems, das all die verschiedenen Teile unseres Systems zusammenhält, ist also unsere Protokollsequenz. Wir verwenden ein verteiltes Protokoll auf einem Pub-Sub-System, um die Datenbewegung und die Knotenkommunikation so zu handhaben, dass die einzelnen Knoten so zustandslos wie möglich bleiben. Indem wir alle unsere Daten in einem Protokoll speichern, können wir die Dauerhaftigkeit der Daten garantieren, eine schnelle Fehlerbehebung ermöglichen und das System leicht erweiterbar machen.
Nun gut, lassen Sie uns ein paar Details zu den verschiedenen Arten von Knotenpunkten erläutern. Da wäre zunächst die Zugriffsebene, die Sie vielleicht schon erahnen können. Benutzer interagieren mit dem System über Proxy-Knoten, die Nachrichten, Ingestion und Routing verwalten. Schemaänderungen und andere Aktualisierungen von Datenbankmetadaten werden an die Koordinator-Knoten gesendet, alle Datenverwaltungsnachrichten werden in das Protokoll aufgenommen und von den Arbeitsknoten verarbeitet. Wie Sie in dem roten Kasten auf dem Bildschirm sehen können, wenn Sie daran interessiert sind.
Der nächste Schritt sind die Koordinatorendienste. Zunächst haben wir den Root-Koordinator, der die oben erwähnten Anfragen nach Datenbank-Metadaten bearbeitet. Die übrigen Koordinatorenknoten verwalten alle Arbeitsknoten, die die Arbeitslast für ihre jeweiligen Aufgaben bewältigen. Wir haben Datenkoordinator-Knoten, die Datenoperationen im Hintergrund verfolgen und auslösen, z.B. das Flushing und die Datenverdichtung nach dem Einfügen. Sie verwalten auch die Metadaten für die tatsächlich eingefügten Vektordaten. Wir haben Abfragekoordinator-Knoten, die den Lastausgleich für Abfrageknoten verwalten. Und schließlich haben wir Index-Koordinatorenknoten, die Indexerstellungsaufgaben verwalten und zuweisen und gleichzeitig Index-Metadaten verwalten.
Für jeden Datenabfrage- und Indexkoordinator gibt es also eine respektable Sammlung von Arbeitsknoten. Diese Arbeitsknoten sind alle zustandslos und führen die Aufgaben aus, die von den Koordinatoren vorgegeben werden. Datenknoten rufen inkrementelle Protokolldaten aus dem Protokoll ab, packen und speichern diese Daten und verarbeiten Mutationsanfragen. Index-Knoten erstellen Indizes für eingefügte Daten, was ziemlich einfach ist. Abfrageknoten laden Indizes und Daten aus dem Objektspeicher und führen daraufhin Suchvorgänge und Abfragen durch.
Und schließlich haben wir noch die Speicherschicht von Milvus. Milvus verwendet eine Reihe von Open-Source-Technologien für die Datenbewegung und -speicherung. Unser Log-Broker verwendet Pulsar, das dem System die Persistenz von Streaming-Daten, Ereignisbenachrichtigungen und zuverlässige asynchrone Abfragen ermöglicht. Die Speicherung von Metadaten und die Erkennung von Suchergebnissen erfolgt über ETCD, einen robusten, verteilten Schlüsselwertspeicher.
Der Objektspeicher schließlich wird mit miniO oder S3 verwaltet, wo wir Snapshot-Dateien von Protokollen, Indexdateien und Zwischenergebnissen von Abfragen speichern. Wenn Sie die Bereitstellung über Helm vornehmen, werden diese Komponenten automatisch eingerichtet und bereitgestellt. Wenn Sie jedoch bereits über einen Pulsar-Cluster verfügen, den Sie nutzen möchten, kann Milvus auch über diesen Cluster geleitet werden. Werfen wir nun einen Blick auf einige Anwendungsbeispiele für die Technologie der Vektorsuche.
Das erste Beispiel ist das System für die intelligente Wohnungssuche und -empfehlung. Wir sind auf eine Reihe von Unternehmen gestoßen, die Milvus bereits für diese Anwendung nutzen. Wir werden also über das Beispiel von Leju sprechen, dem chinesischen Pendant zu Zillow. Sie nutzen Milvus, um ihre Software für die Wohnungssuche zu beschleunigen und zu erweitern. Dazu werden zunächst mit Hilfe von Modellen des maschinellen Lernens vier Sammlungen von Merkmalsvektoren aus den Eingabedaten extrahiert. Bei diesen Eingabedaten kann es sich um Dinge wie Grundrisse, Fläche, Umrisse, Ausrichtung des Hauses und andere Hausdetails handeln, die als Teil eines Angebots aufgenommen werden.
Anschließend führt Milvus anhand dieser vier Sammlungen eine Ähnlichkeitssuche durch, um die nächstgelegenen Ergebnisse pro Sammlung für die eingegebenen Hausparameter zu finden. Schließlich werden die Ergebnisse der Ähnlichkeitssuche zusammengeführt und die nächstgelegenen Häuser werden als empfohlene Objekte zurückgegeben. Eine der häufigeren Anwendungen der Vektorsuchtechnologie ist die umgekehrte Bildsuche, d.h. die Suche nach ähnlichen Bildern anhand eines Eingabebereichs. Dies ist die lehrbuchmäßige Anwendung der Vektorsuche. Wenn Sie jemals ein Beispiel für die Vektorsuche sehen, dann ist dies wahrscheinlich ein Beispiel, das Sie sehen werden. Wir haben festgestellt, dass das Produkt Reverse Image bei weitem nicht nur ein Testsystem ist, sondern von vielen verschiedenen Unternehmen verwendet wird, die oft Milvus dafür einsetzen.
In diesem Fall hat der Benutzer also zwei neuronale Netze verwendet, um eine Einbettung zu erstellen. Das erste neuronale Netz war ein abgestimmtes Yolo-Netz zur Objekterkennung. Und das nächste war ein ResNet für die Bildeinbettung. Mit diesen Bildeinbettungen in Milvus kann eine Ähnlichkeitssuche für alte Bilder durchgeführt werden, um die besten Übereinstimmungen zu finden.
Ein weiterer interessanter Anwendungsfall für Milvus sind also Musikempfehlungen. Der erste Schritt bei der Kodierung eines Songs besteht darin, die Hintergrundmusik und den Gesang zu trennen. Dies geschieht mit Techniken wie der Audioinversion. Der nächste Schritt besteht darin, Einbettungen zu erhalten, die aus der Hintergrundmusik aufgebaut sind. Die Hintergrundmusik wird verwendet, um mehr Informationen über den Song zu haben und um eine falsche Clusterbildung zu vermeiden, z.B. weil Cover-Variationen unterschiedliche Gesangsstimmen für Songs haben. Mit diesen in Milvus gespeicherten Einbettungen können wir das aktuelle Lied, das der Benutzer gerade hört, durchsuchen, um ähnliche Lieder zu finden. Um zu vermeiden, dass die Lieder zu bekannt sind, können Sie die Ergebnisse rückwärts sortieren oder anderweitig nachbearbeiten, um ein ähnliches, aber nicht gleiches Lied zu erhalten. Dies kann sowohl als Empfehlungssystem als auch als Suchsystem verwendet werden. Wie Sie vielleicht aus den bisherigen Beispielen ersehen haben, gibt es zwischen den beiden eine ganze Menge Überschneidungen.
Und schließlich haben wir noch einen letzten Anwendungsfall, mit dem einige von Ihnen vielleicht schon Erfahrung haben, nämlich die Produktsuche im Einzelhandel. Anstelle einer herkömmlichen direkten Textsuche werden wir jedoch darüber sprechen, wie Sie mit einer Vektorsuche bessere Ergebnisse erzielen können.
In diesem Beispiel haben wir Tokopedia, einen der größten E-Commerce-Dienste in Indonesien. Das Unternehmen brauchte eine aktualisierte Suchmaschine. Sie verwendeten Elasticsearch, um rohe Schlüsselwörter in Produktnamen und -beschreibungen zu finden. Das funktionierte zwar, um Dokumente zu finden, in denen dieselben Wörter wiederholt vorkamen, aber es bedeutete nicht immer, dass sie auch tatsächlich ähnlich waren. Die neue Methode besteht also darin, aus den Produktnamen und -beschreibungen Worteinbettungsvektoren zu erzeugen. Worteinbettungen ersetzen Wörter durch Vektoren, die Ähnlichkeitsbereiche zwischen Wörtern abbilden. Diese Worteinbettungen können dann in Mulvis eingegeben und eine Ähnlichkeitssuche durchgeführt werden, um Produkte zu finden, die sich ähneln.
So, das war’s auch schon mit unserer Präsentation. Treten Sie unserem Slack bei, besuchen Sie uns auf Github, schauen Sie sich unsere anderen sozialen Medien an, wenn Sie Fragen haben oder mehr erfahren möchten. Wir sind Open Source, Sie können uns auf Github finden. Externe Mitwirkende sind uns immer willkommen. Wenn Sie sich an der Diskussion beteiligen möchten, wenn Sie mehr über die technische Entwicklung erfahren möchten, wenn Sie Probleme einreichen möchten – wir mögen Probleme. So seltsam das auch klingen mag, machen Sie einfach ein Issue, schließen Sie sich uns auf Slack an, egal was.
Wie auch immer, ich danke Ihnen allen fürs Einschalten und wünsche Ihnen einen schönen Tag und viel Spaß mit den restlichen Präsentationen.