🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI

Nuove funzionalità

  • News
May 20, 2021
milvus

Milvus è un progetto software open-source (OSS) in corso, incentrato sulla creazione del database vettoriale più veloce e affidabile al mondo. Le novità di Milvus v1.1.0 sono le prime di molti aggiornamenti futuri, grazie al sostegno a lungo termine della comunità open-source e alla sponsorizzazione di Zilliz. Questo articolo del blog illustra le nuove funzionalità, i miglioramenti e le correzioni di bug inclusi in Milvus v1.1.0.

Vai a:


Nuove funzionalità

Come ogni progetto OSS, Milvus è un continuo lavoro in corso. Ci sforziamo di ascoltare i nostri utenti e la comunità open-source per dare priorità alle funzionalità più importanti. L'ultimo aggiornamento, Milvus v1.1.0, offre le seguenti nuove funzionalità:

Specificare le partizioni con le chiamate al metodo get_entity_by_id()

Per accelerare ulteriormente la ricerca di similarità vettoriale, Milvus 1.1.0 supporta ora il recupero di vettori da una partizione specificata. In generale, Milvus supporta l'interrogazione di vettori attraverso ID vettoriali specificati. In Milvus 1.0, chiamando il metodo get_entity_by_id() si cerca nell'intera collezione, il che può richiedere molto tempo per grandi insiemi di dati. Come si può vedere dal codice sottostante, GetVectorsByIdHelper utilizza una struttura FileHolder per eseguire un ciclo e trovare un vettore specifico.

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) { 

Tuttavia, questa struttura non è filtrata da alcuna partizione in FilesByTypeEx(). In Milvus v1.1.0, è possibile per il sistema passare i nomi delle partizioni al ciclo GetVectorsIdHelper in modo che FileHolder contenga solo i segmenti delle partizioni specificate. In altre parole, se si sa esattamente a quale partizione appartiene il vettore da ricercare, è possibile specificare il nome della partizione in una chiamata al metodo get_entity_by_id() per accelerare il processo di ricerca.

Non solo abbiamo apportato modifiche al codice che controlla le query di sistema a livello di server Milvus, ma abbiamo anche aggiornato tutti i nostri SDK (Python, Go, C++, Java e RESTful) aggiungendo un parametro per specificare i nomi delle partizioni. Ad esempio, in pymilvus, la definizione di get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) è cambiata in def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None).


Specificare le partizioni con le chiamate al metodo delete_entity_by_id()

Per rendere più efficiente la gestione dei vettori, Milvus v1.1.0 supporta ora la specificazione dei nomi delle partizioni quando si cancella un vettore in una collezione. In Milvus 1.0, i vettori di una collezione possono essere cancellati solo per ID. Quando si chiama il metodo di cancellazione, Milvus esegue una scansione di tutti i vettori della collezione. Tuttavia, è molto più efficiente scansionare solo le partizioni rilevanti quando si lavora con enormi insiemi di milioni, miliardi o addirittura trilioni di vettori. Analogamente alla nuova funzione per specificare le partizioni con le chiamate al metodo get_entity_by_id(), sono state apportate modifiche al codice di Milvus utilizzando la stessa logica.


Nuovo metodo release_collection()

Per liberare la memoria utilizzata da Milvus per caricare le collezioni in fase di esecuzione, in Milvus v1.1.0 è stato aggiunto un nuovo metodo release_collection() per scaricare manualmente dalla cache collezioni specifiche.


Miglioramenti

Sebbene le nuove funzionalità siano di solito di gran moda, è anche importante migliorare quelle che già abbiamo. Di seguito sono riportati gli aggiornamenti e altri miglioramenti generali rispetto a Milvus v1.0.


Miglioramento delle prestazioni delle chiamate al metodo get_entity_by_id()

Il grafico seguente è un confronto delle prestazioni della ricerca vettoriale tra Milvus v1.0 e Milvus v1.1.0:

CPU: CPU Intel® Core™ i7-8550U @ 1,80GHz * 8
Dimensione del file di segmento = 1024 MB
Numero di righe = 1.000.000
Dim = 128

ID query Numv 1.0.0v1.1.0
109 ms2 ms
100149 ms19 ms


Hnswlib aggiornato alla v0.5.0

Milvus adotta diverse librerie di indici ampiamente utilizzate, tra cui Faiss, NMSLIB, Hnswlib e Annoy, per semplificare il processo di scelta del tipo di indice giusto per un determinato scenario.

Hnswlib è stato aggiornato dalla v0.3.0 alla v0.5.0 in Milvus 1.1.0 a causa di un bug rilevato nella versione precedente. Inoltre, l'aggiornamento di Hnswlib migliora le prestazioni di addPoint() nella costruzione degli indici.

Uno sviluppatore di Zilliz ha creato una richiesta di pull (PR) per migliorare le prestazioni di Hnswlib durante la costruzione degli indici in Milvus. Si veda la PR #298 per i dettagli.

Il grafico seguente è un confronto delle prestazioni di addPoint() tra Hnswlib 0.5.0 e la PR proposta:

CPU: CPU Intel® Core™ i7-8550U @ 1.80GHz * 8
Dataset: sift_1M (numero di righe = 1000000, dim = 128, spazio = L2)

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


Migliori prestazioni di formazione dell'indice FIV

La creazione di un indice comprende l'addestramento, l'inserimento e la scrittura dei dati su disco. Milvus 1.1.0 migliora la componente di addestramento della costruzione dell'indice. Il grafico seguente confronta le prestazioni di addestramento degli indici FIV tra Milvus 1.0 e Milvus 1.1.0:

CPU: CPU Intel® Core™ i7-8550U @ 1.80GHz * 8
Dataset: 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 (nlist = 2048, m=16)10353597115
ivf_pq (nlist = 2048, m=32)108638104558
ivf_flat (nlist = 4096)340643310685
ivf_pq (nlist = 4096, m=16)351982323758
ivf_pq (nlist = 4096, m=32)357359330887


Correzioni di bug

Abbiamo anche risolto alcuni bug per rendere Milvus più stabile ed efficiente nella gestione di insiemi di dati vettoriali. Vedere Problemi risolti per maggiori dettagli.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Continua a Leggere