milvus-logo
LFAI
Home
  • Concepts

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.

Actuellement, un champ vectoriel ne prend en charge qu'un seul type d'index. Milvus supprime automatiquement l'ancien index lors du changement de type d'index.

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
  • Ensemble de données relativement restreint
  • Nécessite un taux de rappel de 100%.
IVF_FLAT Index basé sur la quantification
  • Requête à grande vitesse
  • Requiert un taux de rappel aussi élevé que possible
IVF_SQ8 Index basé sur la quantification
  • Requête à grande vitesse
  • Ressources mémoire limitées
  • Accepte un compromis mineur sur le taux de rappel
IVF_PQ Index basé sur la quantification
  • Requête à très haut débit
  • Ressources mémoire limitées
  • Accepte un compromis substantiel sur le taux de rappel
HNSW Index basé sur les graphes
  • Requête à très haut débit
  • Exige un taux de rappel aussi élevé que possible
  • Grandes ressources de mémoire
SCANN Index basé sur la quantification
  • Requête à très haut débit
  • Requiert un taux de rappel aussi élevé que possible
  • Ressources mémoire importantes
Index pris en charge Classification Scénario
BIN_FLAT Index basé sur la quantification
  • Dépend d'ensembles de données relativement petits.
  • Exige une précision parfaite.
  • Aucune compression n'est appliquée.
  • Garantit des résultats de recherche exacts.
BIN_IVF_FLAT Index basé sur la quantification
  • Requête à grande vitesse
  • Exige un taux de rappel aussi élevé que possible
Index pris en charge Classification Scénario
INDEX_INVERSÉ_PAUVRE Index inversé
  • Dépend d'ensembles de données relativement petits.
  • Nécessite un taux de rappel de 100 %.
SPARSE_WAND Index inversé
  • Algorithmefaible-AND accéléré
  • Permet d'obtenir une amélioration significative de la vitesse tout en ne sacrifiant qu'un faible taux de rappel.

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ètreDescriptionDistance
    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ètreDescription de l'indicePlage de valeursValeur par défaut
    nlistNombre d'unités de cluster[1, 65536]128
  • Paramètres de recherche

    • Recherche commune

      ParamètreDescription de la recherchePlage de valeursValeur par défaut
      nprobeNombre d'unités à interroger[1, nlist]8
    • Recherche par plage

      ParamètreDescription de la plagePlageValeur par défaut
      max_empty_result_bucketsNombre 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ètreDescription de l'indiceFourchette
    nlistNombre d'unités de cluster[1, 65536]
  • Paramètres de recherche

    • Recherche commune

      ParamètreDescription de la recherchePlage de valeursValeur par défaut
      nprobeNombre d'unités à interroger[1, nlist]8
    • Recherche par plage

      ParamètreDescription de la plagePlageValeur par défaut
      max_empty_result_bucketsNombre 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ètreDescriptionFourchette
    nlistNombre d'unités de cluster[1, 65536]
    mNombre de facteurs de quantification du produitdim 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ètreDescription de la recherchePlage de valeursValeur par défaut
      nprobeNombre d'unités à interroger[1, nlist]8
    • Recherche par plage

      ParamètreDescription de la plagePlageValeur par défaut
      max_empty_result_bucketsNombre 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ètreDescription de l'indiceFourchette
    nlistNombre d'unités de cluster[1, 65536]
    with_raw_dataInclure ou non les données brutes dans l'indexTrue ou False. La valeur par défaut est True.

    Contrairement à IVF_PQ, les valeurs par défaut s'appliquent à m et nbits pour optimiser les performances.

  • Paramètres de recherche

    • Recherche commune

      ParamètreDescription de la recherchePlage de valeursValeur par défaut
      nprobeNombre d'unités à interroger[1, nlist]
      reorder_kNombre d'unités candidates à interroger[top_k, ∞]top_k
    • Recherche par plage

      ParamètreDescriptionPlageValeur par défaut
      max_empty_result_bucketsNombre 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ètreDescription de l'indexPlage de recherche
    MM 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]
    efConstructionef_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ètreDescription de la recherchePortée
    efParamè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ètreDescription de la rechercheDistance
    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ètreDescription de l'indicePlage de valeurs
    nlistNombre d'unités de cluster[1, 65536]
  • Paramètres de recherche

    • Recherche commune

      ParamètreDescription de la recherchePlage de valeursValeur par défaut
      nprobeNombre d'unités à interroger[1, nlist]8
    • Recherche par plage

      ParamètreDescription de la plagePlageValeur par défaut
      max_empty_result_bucketsNombre 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ètreDescriptionFourchette
    drop_ratio_buildLa 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ètreDescription de la recherchePlage de valeurs
    drop_ratio_searchProportion 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ètreDescriptionPlage de valeurs
    drop_ratio_buildLa 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ètreDescription de la recherchePlage de valeurs
    drop_ratio_searchProportion 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

Traduit parDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?