Accélérer la recherche de similitudes sur des données très volumineuses grâce à l'indexation vectorielle
De la vision artificielle à la découverte de nouveaux médicaments, les moteurs de recherche de similarités vectorielles alimentent de nombreuses applications d'intelligence artificielle (IA). L'indexation, un processus d'organisation des données qui accélère considérablement la recherche dans les big data, est un élément essentiel qui permet d'interroger efficacement les ensembles de données de millions, de milliards, voire de trillions de vecteurs sur lesquels s'appuient les moteurs de recherche par similarité. Cet article traite du rôle de l'indexation dans l'efficacité de la recherche de similarités vectorielles, des différents types d'index de fichiers vectoriels inversés (FVI) et des conseils sur le choix de l'index à utiliser dans différents scénarios.
Aller à :
- Accélérer la recherche de similarités sur des données très volumineuses grâce à l'indexation vectorielle
- Comment l'indexation vectorielle accélère-t-elle la recherche de similarités et l'apprentissage automatique ?
- Quels sont les différents types d'index IVF et quels sont les scénarios pour lesquels ils sont les mieux adaptés ?
- FLAT : Bon pour la recherche d'ensembles de données relativement petits (à l'échelle d'un million) lorsqu'un rappel de 100 % est requis.
- IVF_FLAT : Améliore la vitesse au détriment de la précision (et vice versa).
- IVF_SQ8 : plus rapide et moins gourmand en ressources que IVF_FLAT, mais aussi moins précis.
- IVF_SQ8H : Nouvelle approche hybride GPU/CPU encore plus rapide que IVF_SQ8.
- En savoir plus sur Milvus, une plateforme de gestion de données vectorielles à grande échelle.
- Méthodologie
Comment l'indexation vectorielle accélère-t-elle la recherche de similarités et l'apprentissage automatique ?
Les moteurs de recherche de similarité fonctionnent en comparant une entrée à une base de données pour trouver les objets qui sont les plus similaires à l'entrée. L'indexation est le processus d'organisation efficace des données et joue un rôle majeur dans l'utilité de la recherche de similarité en accélérant considérablement les requêtes fastidieuses sur les grands ensembles de données. Après l'indexation d'un vaste ensemble de données vectorielles, les requêtes peuvent être acheminées vers les grappes, ou sous-ensembles de données, qui sont les plus susceptibles de contenir des vecteurs similaires à une requête d'entrée. Dans la pratique, cela signifie qu'un certain degré de précision est sacrifié pour accélérer les requêtes sur des données vectorielles très volumineuses.
On peut faire une analogie avec un dictionnaire, où les mots sont classés par ordre alphabétique. Lors de la recherche d'un mot, il est possible de naviguer rapidement vers une section qui ne contient que des mots ayant la même initiale, ce qui accélère considérablement la recherche de la définition du mot saisi.
Quels sont les différents types d'index de FIV et quels sont les scénarios pour lesquels ils sont le mieux adaptés ?
Il existe de nombreux index conçus pour la recherche de similarités vectorielles en haute dimension, et chacun d'entre eux présente des compromis en termes de performances, de précision et d'exigences de stockage. Cet article présente plusieurs types d'index FVI courants, leurs forces et leurs faiblesses, ainsi que les résultats des tests de performance pour chaque type d'index. Les tests de performance quantifient le temps d'interrogation et les taux de rappel pour chaque type d'index dans Milvus, une plateforme de gestion de données vectorielles open-source. Pour plus d'informations sur l'environnement de test, voir la section méthodologie au bas de cet article.
FLAT : Bon pour la recherche d'ensembles de données relativement petits (à l'échelle d'un million) lorsqu'un taux de rappel de 100 % est requis.
Pour les applications de recherche de similarités vectorielles qui exigent une précision parfaite et qui dépendent d'ensembles de données relativement petits (à l'échelle d'un million), l'index FLAT est un bon choix. FLAT ne compresse pas les vecteurs et est le seul index qui peut garantir des résultats de recherche exacts. Les résultats de FLAT peuvent également servir de point de comparaison pour les résultats produits par d'autres index dont le taux de rappel est inférieur à 100 %.
FLAT est précis parce qu'il adopte une approche exhaustive de la recherche, ce qui signifie que pour chaque requête, l'entrée cible est comparée à tous les vecteurs d'un ensemble de données. Cela fait de FLAT l'index le plus lent de notre liste, et il est mal adapté à l'interrogation de données vectorielles massives. Il n'y a pas de paramètres pour l'index FLAT dans Milvus, et son utilisation ne nécessite pas d'apprentissage des données ni de stockage supplémentaire.
Résultats des tests de performance FLAT :
Les tests de performance de l'index FLAT ont été effectués dans Milvus à l'aide d'un ensemble de données composé de 2 millions de vecteurs à 128 dimensions.
Blog_Accelerating Similarity Search on Really Big Data with Vector Indexing_2.png (en anglais)
Principaux enseignements :
- Plus nq (le nombre de vecteurs cibles pour une requête) augmente, plus le temps d'interrogation augmente.
- En utilisant l'index FLAT dans Milvus, nous pouvons voir que le temps de requête augmente fortement dès que nq dépasse 200.
- En général, l'index FLAT est plus rapide et plus cohérent lorsque Milvus est exécuté sur le GPU par rapport au CPU. Cependant, les requêtes FLAT sur le CPU sont plus rapides lorsque nq est inférieur à 20.
IVF_FLAT : Améliore la vitesse au détriment de la précision (et vice versa).
Un moyen courant d'accélérer le processus de recherche de similarités au détriment de la précision consiste à effectuer une recherche approximative du plus proche voisin (ANN). Les algorithmes ANN réduisent les besoins de stockage et la charge de calcul en regroupant les vecteurs similaires, ce qui accélère la recherche de vecteurs. IVF_FLAT est le type d'index de fichiers inversés le plus basique et repose sur une forme de recherche ANN.
IVF_FLAT divise les données vectorielles en un certain nombre d'unités de regroupement (nlist), puis compare les distances entre le vecteur d'entrée cible et le centre de chaque regroupement. En fonction du nombre de grappes que le système doit interroger (nprobe), les résultats de la recherche de similarité sont renvoyés sur la base des comparaisons entre l'entrée cible et les vecteurs dans la ou les grappes les plus similaires uniquement - ce qui réduit considérablement le temps de recherche.
En ajustant nprobe, un équilibre idéal entre la précision et la vitesse peut être trouvé pour un scénario donné. Les résultats de notre test de performance IVF_FLAT montrent que le temps d'interrogation augmente fortement lorsque le nombre de vecteurs d'entrée cibles (nq) et le nombre de grappes à rechercher (nprobe) augmentent. IVF_FLAT ne compresse pas les données vectorielles, mais les fichiers d'index comprennent des métadonnées qui augmentent marginalement les besoins de stockage par rapport à l'ensemble de données vectorielles brutes non indexées.
Résultats des tests de performance d'IVF_FLAT :
Les tests de performance d'IVF_FLAT ont été effectués dans Milvus à l'aide de l'ensemble de données publiques 1B SIFT, qui contient 1 milliard de vecteurs à 128 dimensions.
Blog_Accélérer la recherche de similarité sur des données vraiment volumineuses avec l'indexation vectorielle_3.png
Principaux enseignements :
- Lors de l'exécution sur l'unité centrale, le temps d'interrogation de l'index IVF_FLAT dans Milvus augmente avec nprobe et nq. Cela signifie que plus une requête contient de vecteurs d'entrée, ou plus une requête recherche de clusters, plus le temps d'interrogation sera long.
- Sur le GPU, l'index présente une variance de temps moindre par rapport aux changements de nq et nprobe. Cela s'explique par le fait que les données de l'index sont volumineuses et que la copie des données de la mémoire du CPU vers la mémoire du GPU représente la majeure partie du temps total de la requête.
- Dans tous les scénarios, sauf lorsque nq = 1 000 et nprobe = 32, l'index IVF_FLAT est plus efficace lorsqu'il est exécuté sur l'unité centrale.
Les tests de rappel IVF_FLAT ont été effectués dans Milvus en utilisant à la fois l'ensemble de données public 1M SIFT, qui contient 1 million de vecteurs à 128 dimensions, et l'ensemble de données glove-200-angular, qui contient plus d'un million de vecteurs à 200 dimensions, pour la construction de l'index (nlist = 16 384).
Blog_Accélérer la recherche de similarité sur des données vraiment volumineuses avec l'indexation vectorielle_4.png
Principaux enseignements :
- L'index IVF_FLAT peut être optimisé pour la précision, atteignant un taux de rappel supérieur à 0,99 sur l'ensemble de données SIFT 1M lorsque nprobe = 256.
IVF_SQ8 : plus rapide et moins gourmand en ressources qu'IVF_FLAT, mais aussi moins précis.
IVF_FLAT n'effectue aucune compression, de sorte que les fichiers d'index qu'il produit sont à peu près de la même taille que les données vectorielles brutes non indexées d'origine. Par exemple, si l'ensemble de données SIFT 1B d'origine pèse 476 Go, les fichiers d'index IVF_FLAT seront légèrement plus volumineux (~470 Go). Le chargement de tous les fichiers d'index en mémoire consommera 470 Go d'espace de stockage.
Lorsque les ressources disque, CPU ou mémoire GPU sont limitées, IVF_SQ8 est une meilleure option qu'IVF_FLAT. Ce type d'index peut convertir chaque FLOAT (4 octets) en UINT8 (1 octet) en effectuant une quantification scalaire. Cela permet de réduire la consommation de mémoire du disque, du CPU et du GPU de 70 à 75 %. Pour l'ensemble de données 1B SIFT, les fichiers d'index IVF_SQ8 ne nécessitent que 140 Go de stockage.
Résultats des tests de performance de l'IVF_SQ8 :
Les tests de temps de requête IVF_SQ8 ont été effectués dans Milvus en utilisant l'ensemble de données public 1B SIFT, qui contient 1 milliard de vecteurs à 128 dimensions, pour la construction de l'index.
Blog_Accelerating Similarity Search on Really Big Data with Vector Indexing_5.png (en anglais)
Principaux enseignements :
- En réduisant la taille du fichier d'index, IVF_SQ8 offre de nettes améliorations des performances par rapport à IVF_FLAT. IVF_SQ8 suit une courbe de performance similaire à IVF_FLAT, le temps de requête augmentant avec nq et nprobe.
- Comme IVF_FLAT, IVF_SQ8 est plus performant lorsqu'il est exécuté sur l'unité centrale et lorsque nq et nprobe sont plus petits.
Les tests de rappel IVF_SQ8 ont été effectués dans Milvus en utilisant à la fois l'ensemble de données public 1M SIFT, qui contient 1 million de vecteurs à 128 dimensions, et l'ensemble de données glove-200-angular, qui contient plus d'un million de vecteurs à 200 dimensions, pour la construction de l'index (nlist = 16 384).
Blog_Accélérer la recherche de similarité sur des données vraiment volumineuses avec l'indexation vectorielle_6.png
Principaux enseignements :
- Malgré la compression des données d'origine, IVF_SQ8 ne constate pas de baisse significative de la précision des requêtes. Avec les différents paramètres de nprobe, IVF_SQ8 a un taux de rappel inférieur d'au plus 1 % à celui d'IVF_FLAT.
IVF_SQ8H : Nouvelle approche hybride GPU/CPU encore plus rapide que IVF_SQ8.
IVF_SQ8H est un nouveau type d'index qui améliore les performances des requêtes par rapport à IVF_SQ8. Lorsqu'un index IVF_SQ8 fonctionnant sur l'unité centrale est interrogé, la majeure partie du temps total d'interrogation est consacrée à la recherche des clusters nprobe les plus proches du vecteur d'entrée cible. Pour réduire le temps d'interrogation, IVF_SQ8 copie les données pour les opérations de quantification grossière, qui sont plus petites que les fichiers d'index, dans la mémoire du GPU, ce qui accélère considérablement les opérations de quantification grossière. Le seuil de recherche gpu_ détermine ensuite le dispositif qui exécute la requête. Lorsque nq >= gpu_search_threshold, le GPU exécute la requête ; dans le cas contraire, le CPU exécute la requête.
IVF_SQ8H est un type d'index hybride qui nécessite la collaboration du CPU et du GPU. Il ne peut être utilisé qu'avec Milvus équipé d'un GPU.
Résultats du test de performance IVF_SQ8H :
Les tests de performance du temps de requête IVF_SQ8H ont été effectués dans Milvus en utilisant l'ensemble de données public 1B SIFT, qui contient 1 milliard de vecteurs à 128 dimensions, pour la construction de l'index.
Blog_Accélérer la recherche de similarité sur des données vraiment volumineuses avec l'indexation vectorielle_7.png
Principaux enseignements :
- Lorsque nq est inférieur ou égal à 1 000, IVF_SQ8H obtient des temps de requête presque deux fois plus rapides que IVFSQ8.
- Lorsque nq = 2000, les temps de requête pour IVFSQ8H et IVF_SQ8 sont identiques. Cependant, si le paramètre gpu_search_threshold est inférieur à 2000, IVF_SQ8H sera plus performant que IVF_SQ8.
- Le taux de rappel des requêtes d'IVF_SQ8H est identique à celui d'IVF_SQ8, ce qui signifie que le temps d'interrogation est réduit sans perte de précision de la recherche.
En savoir plus sur Milvus, une plateforme de gestion de données vectorielles à grande échelle.
Milvus est une plateforme de gestion de données vectorielles qui peut alimenter des applications de recherche par similarité dans des domaines couvrant l'intelligence artificielle, l'apprentissage profond, les calculs vectoriels traditionnels, etc. Pour plus d'informations sur Milvus, consultez les ressources suivantes :
- Milvus est disponible sous une licence open-source sur GitHub.
- Des types d'index supplémentaires, notamment des index basés sur des graphes et des arbres, sont pris en charge dans Milvus. Pour une liste complète des types d'index pris en charge, voir la documentation sur les index vectoriels dans Milvus.
- Pour en savoir plus sur la société qui a lancé Milvus, visitez Zilliz.com.
- Discutez avec la communauté Milvus ou obtenez de l'aide en cas de problème sur Slack.
Méthodologie
Environnement des tests de performance
La configuration de serveur utilisée pour les tests de performance mentionnés dans cet article est la suivante :
- Intel ® Xeon ® Platinum 8163 @ 2.50GHz, 24 cœurs
- GeForce GTX 2080Ti x 4
- 768 Go de mémoire
Concepts techniques pertinents
Bien que cela ne soit pas nécessaire à la compréhension de cet article, voici quelques concepts techniques utiles à l'interprétation des résultats de nos tests de performance de l'index :
Blog_Accélérer la recherche de similarité sur des données vraiment volumineuses avec l'indexation vectorielle_8.png
Ressources
Les sources suivantes ont été utilisées pour cet article :
- "Encyclopédie des systèmes de bases de données", Ling Liu et M. Tamer Özsu.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word