Nouvelles fonctionnalités
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 Num | v 1.0.0 | v1.1.0 |
---|---|---|
10 | 9 ms | 2 ms |
100 | 149 ms | 19 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.0 | PR-298 | |
---|---|---|
M = 16, ef_construction = 100 | 274406 ms | 265631 ms |
M = 16, ef_construction = 200 | 522411 ms | 499639 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) | 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 |
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.
- Améliorations
- Correction de bogues
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