🚀 Essayez Zilliz Cloud, la version entièrement gérée de Milvus, gratuitement—découvrez des performances 10x plus rapides ! Essayez maintenant>>

milvus-logo
LFAI

Nouvelles fonctionnalités

  • News
May 20, 2021
milvus

Milvus est un projet permanent de logiciel libre (OSS) visant à construire la base de données vectorielles la plus rapide et la plus fiable au monde. Les nouvelles fonctionnalités de Milvus v1.1.0 sont les premières de nombreuses mises à jour à venir, grâce au soutien à long terme de la communauté open-source et au parrainage de Zilliz. Cet article de blog couvre les nouvelles fonctionnalités, les améliorations et les corrections de bogues incluses dans Milvus v1.1.0.

Aller à :


Nouvelles fonctionnalités

Comme tout projet OSS, Milvus est un travail perpétuel en cours. Nous nous efforçons d'écouter nos utilisateurs et la communauté open-source afin de donner la priorité aux fonctionnalités les plus importantes. La dernière mise à jour, Milvus v1.1.0, offre les nouvelles fonctionnalités suivantes :

Spécification des partitions avec les appels de méthode get_entity_by_id()

Pour accélérer davantage la recherche de similarité vectorielle, Milvus 1.1.0 prend désormais en charge l'extraction de vecteurs à partir d'une partition spécifiée. En général, Milvus prend en charge l'interrogation de vecteurs par le biais d'ID de vecteur spécifiés. Dans Milvus 1.0, l'appel de la méthode get_entity_by_id() permet de rechercher l'ensemble de la collection, ce qui peut prendre du temps pour les grands ensembles de données. Comme le montre le code ci-dessous, GetVectorsByIdHelper utilise une structure FileHolder pour parcourir en boucle et trouver un vecteur spécifique.

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

Toutefois, cette structure n'est filtrée par aucune partition dans FilesByTypeEx(). Dans Milvus v1.1.0, il est possible pour le système de transmettre des noms de partition à la boucle GetVectorsIdHelper de sorte que FileHolder ne contienne que des segments provenant des partitions spécifiées. En d'autres termes, si vous savez exactement à quelle partition appartient le vecteur à rechercher, vous pouvez spécifier le nom de la partition dans un appel de méthode get_entity_by_id() pour accélérer le processus de recherche.

Nous avons non seulement apporté des modifications au code contrôlant les requêtes du système au niveau du serveur Milvus, mais nous avons également mis à jour tous nos SDK (Python, Go, C++, Java et RESTful) en ajoutant un paramètre permettant de spécifier les noms des partitions. Par exemple, dans pymilvus, la définition de get_entity_by_id def get_entity_by_id(self, collection_name, ids, timeout=None) est remplacée par def get_entity_by_id(self, collection_name, partition_tags=None, ids, timeout=None).


Spécifier les partitions avec les appels de méthode delete_entity_by_id()

Pour rendre la gestion des vecteurs plus efficace, Milvus v1.1.0 prend désormais en charge la spécification des noms de partition lors de la suppression d'un vecteur dans une collection. Dans Milvus 1.0, les vecteurs d'une collection ne peuvent être supprimés que par ID. Lors de l'appel de la méthode de suppression, Milvus examine tous les vecteurs de la collection. Cependant, il est beaucoup plus efficace de n'analyser que les partitions pertinentes lorsque l'on travaille avec des ensembles de données massifs d'un million, d'un milliard, voire d'un trillion de vecteurs. Comme pour la nouvelle fonctionnalité permettant de spécifier des partitions avec les appels de méthode get_entity_by_id(), des modifications ont été apportées au code Milvus selon la même logique.


Nouvelle méthode release_collection()

Pour libérer la mémoire utilisée par Milvus pour charger les collections au moment de l'exécution, une nouvelle méthode release_collection() a été ajoutée dans Milvus v1.1.0 pour décharger manuellement des collections spécifiques du cache.


Améliorations

Bien que les nouvelles fonctionnalités fassent généralement fureur, il est également important d'améliorer ce que nous avons déjà. Voici les mises à jour et autres améliorations générales par rapport à Milvus v1.0.


Amélioration des performances de l'appel à la méthode get_entity_by_id()

Le tableau ci-dessous est une comparaison des performances de recherche vectorielle entre Milvus v1.0 et Milvus v1.1.0 :

CPU : Intel® Core™ i7-8550U CPU @ 1.80GHz * 8
Taille du fichier de segment = 1024 Mo
Nombre de lignes = 1 000 000
Dim = 128

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


Hnswlib mis à niveau vers v0.5.0

Milvus adopte plusieurs bibliothèques d'index largement utilisées, notamment Faiss, NMSLIB, Hnswlib et Annoy, afin de simplifier le processus de sélection du type d'index approprié pour un scénario donné.

Hnswlib a été mis à niveau de la version 0.3.0 à la version 0.5.0 dans Milvus 1.1.0 en raison d'un bogue détecté dans la version précédente. De plus, la mise à niveau de Hnswlib améliore les performances de addPoint() dans la construction de l'index.

Un développeur de Zilliz a créé une pull request (PR) pour améliorer les performances de Hnswlib lors de la construction d'index dans Milvus. Voir PR #298 pour plus de détails.

Le tableau ci-dessous est une comparaison des performances de addPoint() entre Hnswlib 0.5.0 et la PR proposée :

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


Amélioration des performances de l'apprentissage de l'index IVF

La création d'un index comprend la formation, l'insertion et l'écriture des données sur le disque. Milvus 1.1.0 améliore la composante d'entraînement de la construction d'index. Le graphique ci-dessous est une comparaison des performances de formation d'index IVF entre Milvus 1.0 et Milvus 1.1.0 :

CPU : Intel® Core™ i7-8550U CPU @ 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


Correction de bogues

Nous avons également corrigé quelques bogues pour rendre Milvus plus stable et plus efficace lors de la gestion d'ensembles de données vectorielles. Voir les problèmes corrigés pour plus de détails.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Continuer à Lire