Nuove funzionalità
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 Num | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2 ms |
100 | 149 ms | 19 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.0 | PR-298 | |
---|---|---|
M = 16, ef_construction = 100 | 274406 ms | 265631 ms |
M = 16, ef_costruzione = 200 | 522411 ms | 499639 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) | 90079 | 81544 |
ivf_pq (nlist = 2048, m=16) | 103535 | 97115 |
ivf_pq (nlist = 2048, m=32) | 108638 | 104558 |
ivf_flat (nlist = 4096) | 340643 | 310685 |
ivf_pq (nlist = 4096, m=16) | 351982 | 323758 |
ivf_pq (nlist = 4096, m=32) | 357359 | 330887 |
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.
- Miglioramenti
- Correzioni di bug
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word