🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI

Neue Funktionen

  • News
May 20, 2021
milvus

Milvus ist ein fortlaufendes Open-Source-Software (OSS)-Projekt mit dem Ziel, die schnellste und zuverlässigste Vektordatenbank der Welt zu entwickeln. Die neuen Funktionen in Milvus v1.1.0 sind das erste von vielen Updates, die dank der langjährigen Unterstützung der Open-Source-Community und des Sponsorings von Zilliz kommen werden. Dieser Blog-Artikel behandelt die neuen Funktionen, Verbesserungen und Fehlerbehebungen in Milvus v1.1.0.

Springe zu:


Neue Funktionen

Wie jedes OSS-Projekt ist auch Milvus ein ständiges Projekt. Wir bemühen uns, auf unsere Benutzer und die Open-Source-Gemeinschaft zu hören, um die wichtigsten Funktionen zu priorisieren. Das neueste Update, Milvus v1.1.0, bietet die folgenden neuen Funktionen:

Partitionen mit get_entity_by_id() Methodenaufrufen spezifizieren

Um die Suche nach Vektorähnlichkeit weiter zu beschleunigen, unterstützt Milvus 1.1.0 nun die Abfrage von Vektoren aus einer bestimmten Partition. Im Allgemeinen unterstützt Milvus die Abfrage von Vektoren durch angegebene Vektor-IDs. In Milvus 1.0 wird durch den Aufruf der Methode get_entity_by_id() die gesamte Sammlung durchsucht, was bei großen Datensätzen zeitaufwändig sein kann. Wie aus dem nachstehenden Code hervorgeht, verwendet GetVectorsByIdHelper eine FileHolder Struktur, um eine Schleife zu durchlaufen und einen bestimmten Vektor zu finden.

std::vector<meta::CollectionSchema> collection_array; 
 auto status = meta_ptr_->ShowPartitions(collection.collection_id_, collection_array); 
  
 collection_array.push_back(collection); 
 status = meta_ptr_->FilesByTypeEx(collection_array, file_types, files_holder); 
 if (!status.ok()) { 
     std::string err_msg = "Failed to get files for GetVectorByID: " + status.message(); 
     LOG_ENGINE_ERROR_ << err_msg; 
     return status; 
 } 
  
 if (files_holder.HoldFiles().empty()) { 
     LOG_ENGINE_DEBUG_ << "No files to get vector by id from"; 
     return Status(DB_NOT_FOUND, "Collection is empty"); 
 } 
  
 cache::CpuCacheMgr::GetInstance()->PrintInfo(); 
 status = GetVectorsByIdHelper(id_array, vectors, files_holder); 
DBImpl::GetVectorsByIdHelper(const IDNumbers& id_array, std::vector<engine::VectorsData>& vectors, 
                              meta::FilesHolder& files_holder) { 
     // attention: this is a copy, not a reference, since the files_holder.UnMarkFile will change the array internal 
     milvus::engine::meta::SegmentsSchema files = files_holder.HoldFiles(); 
     LOG_ENGINE_DEBUG_ << "Getting vector by id in " << files.size() << " files, id count = " << id_array.size(); 
  
     // sometimes not all of id_array can be found, we need to return empty vector for id not found 
     // for example: 
     // id_array = [1, -1, 2, -1, 3] 
     // vectors should return [valid_vector, empty_vector, valid_vector, empty_vector, valid_vector] 
     // the ID2RAW is to ensure returned vector sequence is consist with id_array 
     using ID2VECTOR = std::map<int64_t, VectorsData>; 
     ID2VECTOR map_id2vector; 
  
     vectors.clear(); 
  
     IDNumbers temp_ids = id_array; 
     for (auto& file : files) { 

Diese Struktur wird jedoch nicht nach Partitionen in FilesByTypeEx() gefiltert. In Milvus v1.1.0 ist es möglich, dass das System Partitionsnamen an die GetVectorsIdHelper -Schleife weitergibt, so dass FileHolder nur Segmente aus bestimmten Partitionen enthält. Anders ausgedrückt: Wenn Sie genau wissen, zu welcher Partition der zu suchende Vektor gehört, können Sie den Partitionsnamen in einem get_entity_by_id() Methodenaufruf angeben, um den Suchprozess zu beschleunigen.

Wir haben nicht nur Änderungen am Code zur Steuerung von Systemabfragen auf der Milvus-Servereinheit vorgenommen, sondern auch alle unsere SDKs (Python, Go, C++, Java und RESTful) aktualisiert, indem wir einen Parameter zur Angabe von Partitionsnamen hinzugefügt haben. Zum Beispiel wird in pymilvus die Definition von get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) in def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None) geändert.


Partitionen mit delete_entity_by_id() Methodenaufrufen spezifizieren

Um die Vektorverwaltung effizienter zu gestalten, unterstützt Milvus v1.1.0 nun die Angabe von Partitionsnamen beim Löschen eines Vektors in einer Sammlung. In Milvus 1.0 können Vektoren in einer Sammlung nur nach ID gelöscht werden. Beim Aufruf der Löschmethode durchsucht Milvus alle Vektoren in der Sammlung. Es ist jedoch weitaus effizienter, nur die relevanten Partitionen zu scannen, wenn man mit massiven Millionen-, Milliarden- oder sogar Billionen-Vektordatensätzen arbeitet. Ähnlich wie bei der neuen Funktion zur Angabe von Partitionen mit den Methodenaufrufen von get_entity_by_id() wurden am Milvus-Code Änderungen vorgenommen, die auf derselben Logik beruhen.


Neue Methode release_collection()

Um Speicher freizugeben, den Milvus zum Laden von Sammlungen zur Laufzeit verwendet, wurde in Milvus v1.1.0 eine neue Methode release_collection() hinzugefügt, um bestimmte Sammlungen manuell aus dem Cache zu entladen.


Verbesserungen

Obwohl neue Funktionen normalerweise der letzte Schrei sind, ist es auch wichtig, das zu verbessern, was wir bereits haben. Im Folgenden finden Sie Upgrades und andere allgemeine Verbesserungen gegenüber Milvus v1.0.


Verbesserte Leistung von get_entity_by_id() Methodenaufrufen

Das folgende Diagramm ist ein Vergleich der Vektorsuchleistung zwischen Milvus v1.0 und Milvus v1.1.0:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Segmentdateigröße = 1024 MB
Zeilenanzahl = 1.000.000
Dim = 128

Abfrage-ID Nr.v 1.0.0v1.1.0
109 ms2 ms
100149 ms19 ms


Hnswlib wurde auf v0.5.0 aktualisiert

Milvus übernimmt mehrere weit verbreitete Indexbibliotheken, darunter Faiss, NMSLIB, Hnswlib und Annoy, um den Prozess der Auswahl des richtigen Indextyps für ein bestimmtes Szenario zu vereinfachen.

Hnswlib wurde von v0.3.0 auf v0.5.0 in Milvus 1.1.0 aktualisiert, da in der früheren Version ein Fehler entdeckt wurde. Außerdem verbessert das Upgrade der Hnswlib die Leistung von addPoint() bei der Indexerstellung.

Ein Zilliz-Entwickler hat einen Pull Request (PR) erstellt, um die Leistung der Hnswlib beim Aufbau von Indizes in Milvus zu verbessern. Siehe PR #298 für Details.

Das folgende Diagramm ist ein Vergleich der addPoint() Leistung zwischen Hnswlib 0.5.0 und dem vorgeschlagenen PR:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Dataset: sift_1M (row count = 1000000, dim = 128, space = L2)

0.5.0PR-298
M = 16, ef_construction = 100274406 ms265631 ms
M = 16, ef_construction = 200522411 ms499639 ms


Verbesserte IVF-Indextrainingsleistung

Das Erstellen eines Indexes umfasst das Trainieren, Einfügen und Schreiben von Daten auf die Festplatte. Milvus 1.1.0 verbessert die Trainingskomponente der Indexerstellung. Das folgende Diagramm ist ein Vergleich der IVF-Indextrainingsleistung zwischen Milvus 1.0 und Milvus 1.1.0:

CPU: Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Datensatz: sift_1m (row_count = 1000000, dim = 128, metric_type = L2)

v1.0.0 (ms)v1.1.0 (ms)
ivf_flat (nlist = 2048)9007981544
ivf_pq (nListe = 2048, m=16)10353597115
ivf_pq (nListe = 2048, m=32)108638104558
ivf_flach (nListe = 4096)340643310685
ivf_pq (nListe = 4096, m=16)351982323758
ivf_pq (nListe = 4096, m=32)357359330887


Fehlerbehebungen

Wir haben auch einige Fehler behoben, um Milvus stabiler und effizienter bei der Verwaltung von Vektordatensätzen zu machen. Siehe Behobene Probleme für weitere Details.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Weiterlesen