Index en mémoire
Cette rubrique répertorie les différents types d'index en mémoire pris en charge par Milvus, les scénarios les mieux adaptés à chacun d'entre eux et les paramètres que les utilisateurs peuvent configurer pour obtenir de meilleures performances de recherche. Pour les index sur disque, voir Index sur disque.
L'indexation est le processus d'organisation efficace des données et joue un rôle majeur dans l'utilité de la recherche par similarité en accélérant considérablement les requêtes fastidieuses sur de grands ensembles de données.
Pour améliorer les performances des requêtes, vous pouvez spécifier un type d'index pour chaque champ vectoriel.
Index vectoriels ANNS
La plupart des types d'index vectoriels pris en charge par Milvus utilisent des algorithmes de recherche approximative des plus proches voisins (ANNS). Par rapport à la recherche précise, qui prend généralement beaucoup de temps, l'idée centrale de l'ANNS n'est plus de renvoyer le résultat le plus précis, mais de rechercher uniquement les voisins de la cible. L'ANNS améliore l'efficacité de la recherche en sacrifiant la précision dans une fourchette acceptable.
Selon les méthodes de mise en œuvre, l'index vectoriel ANNS peut être classé en quatre catégories : basé sur les arbres, basé sur les graphes, basé sur le hachage et basé sur la quantification.
Index pris en charge par Milvus
Milvus prend en charge différents types d'index, classés en fonction du type d'intégration vectorielle qu'ils traitent : intégrations à virgule flottante (également appelées vecteurs à virgule flottante ou vecteurs denses), intégrations binaires (également appelées vecteurs binaires) et intégrations clairsemées (également appelées vecteurs clairsemés).
Indices pour les intégrations en virgule flottante
Pour les encastrements en virgule flottante à 128 dimensions (vecteurs), l'espace de stockage qu'ils occupent est de 128 * la taille de la virgule flottante = 512 octets. Les mesures de distance utilisées pour les enregistrements en virgule flottante sont la distance euclidienne (L2
) et le produit intérieur (IP
).
Ces types d'index comprennent FLAT
, IVF_FLAT
, IVF_PQ
, IVF_SQ8
, HNSW
, et SCANN
pour les recherches ANN basées sur l'unité centrale.
Index pour les encastrements binaires
Pour les encastrements binaires à 128 dimensions, l'espace de stockage qu'ils occupent est de 128 / 8 = 16 octets. Les mesures de distance utilisées pour les encastrements binaires sont JACCARD
et HAMMING
.
Ce type d'index comprend BIN_FLAT
et BIN_IVF_FLAT
.
Index pour les encastrements épars
La métrique de distance prise en charge pour les encastrements épars est uniquement IP
.
Les types d'index comprennent SPARSE_INVERTED_INDEX
et SPARSE_WAND
.
Index pris en charge | Classification | Scénario |
---|---|---|
FLAT | SANS OBJET |
|
IVF_FLAT | Index basé sur la quantification |
|
IVF_SQ8 | Index basé sur la quantification |
|
IVF_PQ | Index basé sur la quantification |
|
HNSW | Index basé sur les graphes |
|
SCANN | Index basé sur la quantification |
|
Index pris en charge | Classification | Scénario |
---|---|---|
BIN_FLAT | Index basé sur la quantification |
|
BIN_IVF_FLAT | Index basé sur la quantification |
|
Index pris en charge | Classification | Scénario |
---|---|---|
INDEX_INVERSÉ_PAUVRE | Index inversé |
|
SPARSE_WAND | Index inversé |
|
FLAT
Pour les applications de recherche de similarités vectorielles qui exigent une précision parfaite et dépendent d'ensembles de données relativement petits (à l'échelle du 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. Aucun paramètre n'est requis pour l'index FLAT dans Milvus et son utilisation ne nécessite pas de formation aux données.
Paramètres de recherche
Paramètre Description Distance metric_type
[Facultatif] La métrique de distance choisie. Voir Métriques prises en charge.
IVF_FLAT
IVF_FLAT divise les données vectorielles en nlist
unités de grappes, puis compare les distances entre le vecteur d'entrée cible et le centre de chaque grappe. En fonction du nombre de grappes que le système est configuré pour 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 d'interrogation.
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 du test de performance IVF_FLAT montrent que le temps d'interrogation augmente fortement à mesure que le nombre de vecteurs d'entrée cibles (nq
) et le nombre de grappes à rechercher (nprobe
) augmentent.
IVF_FLAT est l'index IVF le plus basique, et les données encodées stockées dans chaque unité sont cohérentes avec les données originales.
Paramètres de construction de l'index
Paramètre Description de l'indice Plage de valeurs Valeur par défaut nlist
Nombre d'unités de cluster [1, 65536] 128 Paramètres de recherche
Recherche commune
Paramètre Description de la recherche Plage de valeurs Valeur par défaut nprobe
Nombre d'unités à interroger [1, nlist] 8 Recherche par plage
Paramètre Description de la plage Plage Valeur par défaut max_empty_result_buckets
Nombre maximal de godets ne donnant aucun résultat de recherche.
Il s'agit d'un paramètre de recherche par plage et il met fin au processus de recherche lorsque le nombre de godets vides consécutifs atteint la valeur spécifiée.
L'augmentation de cette valeur peut améliorer le taux de rappel au prix d'un allongement du temps de recherche.[1, 65535] 2
IVF_SQ8
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 petits (~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 (SQ). 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.
Paramètres de construction de l'index
Paramètre Description de l'indice Fourchette nlist
Nombre d'unités de cluster [1, 65536] Paramètres de recherche
Recherche commune
Paramètre Description de la recherche Plage de valeurs Valeur par défaut nprobe
Nombre d'unités à interroger [1, nlist] 8 Recherche par plage
Paramètre Description de la plage Plage Valeur par défaut max_empty_result_buckets
Nombre maximal de godets ne donnant aucun résultat de recherche.
Il s'agit d'un paramètre de recherche par plage et il met fin au processus de recherche lorsque le nombre de godets vides consécutifs atteint la valeur spécifiée.
L'augmentation de cette valeur peut améliorer le taux de rappel au prix d'un allongement du temps de recherche.[1, 65535] 2
IVF_PQ
PQ
(Product Quantization) décompose uniformément l'espace vectoriel haute dimension original en produits cartésiens d'espaces vectoriels basse dimension m
, puis quantifie les espaces vectoriels basse dimension décomposés. Au lieu de calculer les distances entre le vecteur cible et le centre de toutes les unités, la quantification par produit permet de calculer les distances entre le vecteur cible et le centre de regroupement de chaque espace à faible dimension, ce qui réduit considérablement la complexité temporelle et spatiale de l'algorithme.
IVF_PQ effectue le regroupement de l'index IVF avant de quantifier le produit des vecteurs. Son fichier d'index est encore plus petit que IVF_SQ8, mais il entraîne également une perte de précision lors de la recherche de vecteurs.
Les paramètres de construction de l'index et les paramètres de recherche varient en fonction de la distribution Milvus. Sélectionnez d'abord votre distribution Milvus.
Paramètres de construction d'index
Paramètre Description Fourchette nlist
Nombre d'unités de cluster [1, 65536] m
Nombre de facteurs de quantification du produit dim mod m == 0
nbits
[Facultatif] Nombre de bits dans lesquels chaque vecteur de faible dimension est stocké. [1, 64] (8 par défaut) Paramètres de recherche
Recherche commune
Paramètre Description de la recherche Plage de valeurs Valeur par défaut nprobe
Nombre d'unités à interroger [1, nlist] 8 Recherche par plage
Paramètre Description de la plage Plage Valeur par défaut max_empty_result_buckets
Nombre maximal de godets ne donnant aucun résultat de recherche.
Il s'agit d'un paramètre de recherche par plage et il met fin au processus de recherche lorsque le nombre de godets vides consécutifs atteint la valeur spécifiée.
L'augmentation de cette valeur peut améliorer le taux de rappel au prix d'un allongement du temps de recherche.[1, 65535] 2
SCANN
ScaNN (Scalable Nearest Neighbors) est similaire à IVF_PQ en termes de regroupement de vecteurs et de quantification de produits. Ce qui les différencie, ce sont les détails de la mise en œuvre de la quantification du produit et l'utilisation de SIMD (Single-Instruction / Multi-data) pour un calcul efficace.
Paramètres de construction de l'index
Paramètre Description de l'indice Fourchette nlist
Nombre d'unités de cluster [1, 65536] with_raw_data
Inclure ou non les données brutes dans l'index True
ouFalse
. La valeur par défaut estTrue
.Contrairement à IVF_PQ, les valeurs par défaut s'appliquent à
m
etnbits
pour optimiser les performances.Paramètres de recherche
Recherche commune
Paramètre Description de la recherche Plage de valeurs Valeur par défaut nprobe
Nombre d'unités à interroger [1, nlist] reorder_k
Nombre d'unités candidates à interroger [ top_k
, ∞]top_k
Recherche par plage
Paramètre Description Plage Valeur par défaut max_empty_result_buckets
Nombre maximal de godets ne donnant aucun résultat de recherche.
Il s'agit d'un paramètre de recherche par plage et il met fin au processus de recherche lorsque le nombre de godets vides consécutifs atteint la valeur spécifiée.
L'augmentation de cette valeur peut améliorer le taux de rappel au prix d'un allongement du temps de recherche.[1, 65535] 2
HNSW
HNSW (Hierarchical Navigable Small World Graph) est un algorithme d'indexation basé sur les graphes. Il construit une structure de navigation multicouche pour une image selon certaines règles. Dans cette structure, les couches supérieures sont plus clairsemées et les distances entre les nœuds sont plus grandes ; les couches inférieures sont plus denses et les distances entre les nœuds sont plus étroites. La recherche commence par la couche la plus haute, trouve le nœud le plus proche de la cible dans cette couche, puis passe à la couche suivante pour commencer une nouvelle recherche. Après plusieurs itérations, elle peut rapidement s'approcher de la position de la cible.
Afin d'améliorer les performances, HNSW limite le degré maximal des nœuds de chaque couche du graphe à M
. En outre, vous pouvez utiliser efConstruction
(lors de la construction de l'index) ou ef
(lors de la recherche des cibles) pour spécifier une plage de recherche.
Paramètres de construction de l'index
Paramètre Description de l'index Plage de recherche M
M définit le nombre maximal de connexions sortantes dans le graphique. Plus M est élevé, plus la précision/le temps d'exécution est important(e) à ef/efConstruction fixe. [2, 2048] efConstruction
ef_construction contrôle le compromis vitesse de recherche/vitesse de construction de l'index. L'augmentation du paramètre efConstruction peut améliorer la qualité de l'index, mais elle tend également à allonger le temps d'indexation. [1, int_max] Paramètres de recherche
Paramètre Description de la recherche Portée ef
Paramètre contrôlant le compromis temps de recherche/précision. Une valeur plus élevée ( ef
) permet une recherche plus précise mais plus lente.[ top_k
, int_max]
BIN_FLAT
Cet indice est exactement le même que FLAT, sauf qu'il ne peut être utilisé que pour les intégrations binaires.
Pour les applications de recherche de similarité vectorielle qui exigent une précision parfaite et dépendent d'ensembles de données relativement petits (à l'échelle du million), l'index BIN_FLAT est un bon choix. BIN_FLAT ne compresse pas les vecteurs et est le seul index qui peut garantir des résultats de recherche exacts. Les résultats de BIN_FLAT peuvent également être utilisés comme point de comparaison pour les résultats produits par d'autres index dont le taux de rappel est inférieur à 100 %.
BIN_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 aux vecteurs d'un ensemble de données. Cela fait de BIN_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 BIN_FLAT dans Milvus, et son utilisation ne nécessite pas d'apprentissage des données ni de stockage supplémentaire.
Paramètres de recherche
Paramètre Description de la recherche Distance metric_type
[Facultatif] La métrique de distance choisie. Voir Métriques prises en charge.
BIN_IVF_FLAT
Cet index est exactement le même que IVF_FLAT, sauf qu'il ne peut être utilisé que pour les encastrements binaires.
BIN_IVF_FLAT divise les données vectorielles en nlist
unités de grappes, puis compare les distances entre le vecteur d'entrée cible et le centre de chaque grappe. Selon le nombre de grappes que le système est configuré pour 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 d'interrogation.
En ajustant nprobe
, un équilibre idéal entre la précision et la vitesse peut être trouvé pour un scénario donné. Le temps d'interrogation augmente fortement à mesure que le nombre de vecteurs d'entrée cibles (nq
) et le nombre de grappes à rechercher (nprobe
) augmentent.
BIN_IVF_FLAT est l'index BIN_IVF le plus basique, et les données encodées stockées dans chaque unité sont cohérentes avec les données originales.
Paramètres de construction de l'index
Paramètre Description de l'indice Plage de valeurs nlist
Nombre d'unités de cluster [1, 65536] Paramètres de recherche
Recherche commune
Paramètre Description de la recherche Plage de valeurs Valeur par défaut nprobe
Nombre d'unités à interroger [1, nlist] 8 Recherche par plage
Paramètre Description de la plage Plage Valeur par défaut max_empty_result_buckets
Nombre maximal de godets ne donnant aucun résultat de recherche.
Il s'agit d'un paramètre de recherche par plage et il met fin au processus de recherche lorsque le nombre de godets vides consécutifs atteint la valeur spécifiée.
L'augmentation de cette valeur peut améliorer le taux de rappel au prix d'un allongement du temps de recherche.[1, 65535] 2
INDEX_INVERSÉ_SPARSE
Chaque dimension conserve une liste de vecteurs dont la valeur n'est pas nulle à cette dimension. Pendant la recherche, Milvus parcourt chaque dimension du vecteur de la requête et calcule les scores des vecteurs qui ont des valeurs non nulles dans ces dimensions.
Paramètres de construction de l'index
Paramètre Description Fourchette drop_ratio_build
La proportion de petites valeurs vectorielles qui sont exclues au cours du processus d'indexation. Cette option permet d'affiner le processus d'indexation, en faisant un compromis entre l'efficacité et la précision en ignorant les petites valeurs lors de la construction de l'index. [0, 1] Paramètres de recherche
Paramètre Description de la recherche Plage de valeurs drop_ratio_search
Proportion des petites valeurs du vecteur qui sont exclues au cours du processus de recherche. Cette option permet d'affiner le processus de recherche en spécifiant le ratio des plus petites valeurs du vecteur de la requête à ignorer. Elle permet d'équilibrer la précision de la recherche et les performances. Plus la valeur définie pour drop_ratio_search
est petite, moins ces petites valeurs contribuent au résultat final. En ignorant certaines petites valeurs, il est possible d'améliorer les performances de la recherche avec un impact minimal sur la précision.[0, 1]
SPARSE_WAND
Cet indice présente des similitudes avec SPARSE_INVERTED_INDEX
, mais il utilise l'algorithme Weak-AND pour réduire davantage le nombre d'évaluations de la distance IP complète au cours du processus de recherche.
D'après nos tests, SPARSE_WAND
surpasse généralement les autres méthodes en termes de rapidité. Toutefois, ses performances peuvent se détériorer rapidement lorsque la densité des vecteurs augmente. Pour remédier à ce problème, l'introduction d'une adresse drop_ratio_search
non nulle peut améliorer considérablement les performances tout en n'entraînant qu'une perte de précision minime. Pour plus d'informations, reportez-vous à la section Vecteur clairsemé.
Paramètres de construction de l'index
Paramètre Description Plage de valeurs drop_ratio_build
La proportion de petites valeurs vectorielles qui sont exclues pendant le processus d'indexation. Cette option permet d'affiner le processus d'indexation, en faisant un compromis entre l'efficacité et la précision en ignorant les petites valeurs lors de la construction de l'index. [0, 1] Paramètres de recherche
Paramètre Description de la recherche Plage de valeurs drop_ratio_search
Proportion des petites valeurs du vecteur qui sont exclues au cours du processus de recherche. Cette option permet d'affiner le processus de recherche en spécifiant le ratio des plus petites valeurs du vecteur de la requête à ignorer. Elle permet d'équilibrer la précision de la recherche et les performances. Plus la valeur définie pour drop_ratio_search
est petite, moins ces petites valeurs contribuent au résultat final. En ignorant certaines petites valeurs, il est possible d'améliorer les performances de la recherche avec un impact minimal sur la précision.[0, 1]
FAQ
Quelle est la différence entre l'indice FLAT et l'indice IVF_FLAT ?
L'index IVF_FLAT divise un espace vectoriel en nlist
clusters. Si la valeur par défaut de nlist
est 16384, Milvus compare les distances entre le vecteur cible et les centres des 16384 clusters pour obtenir nprobe
clusters les plus proches. Milvus compare ensuite les distances entre le vecteur cible et les vecteurs des clusters sélectionnés pour obtenir les vecteurs les plus proches. Contrairement à IVF_FLAT, FLAT compare directement les distances entre le vecteur cible et chaque vecteur.
Par conséquent, lorsque le nombre total de vecteurs est approximativement égal à nlist
, IVF_FLAT et FLAT présentent peu de différences en termes de calcul et de performances de recherche. Mais lorsque le nombre de vecteurs devient deux fois, trois fois ou n fois supérieur à nlist
, l'index IVF_FLAT commence à présenter des avantages de plus en plus importants.
Voir Comment choisir un index dans Milvus pour plus d'informations.
Prochaines étapes
- En savoir plus sur les métriques de similarité prises en charge dans Milvus.