🚀 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

1. index_file_size

  • Engineering
February 26, 2020
milvus

Les meilleures pratiques pour la configuration de Milvus ont été présentées dans l'article Meilleures pratiques pour la configuration de Milvus 0.6.0. Dans cet article, nous présenterons également quelques bonnes pratiques pour définir des paramètres clés dans les clients Milvus pour des opérations telles que la création d'une table, la création d'index et la recherche. Ces paramètres peuvent affecter les performances de recherche.

1. index_file_size

Lors de la création d'une table, le paramètre index_file_size est utilisé pour spécifier la taille, en Mo, d'un fichier unique pour le stockage des données. La valeur par défaut est 1024. Lors de l'importation de données vectorielles, Milvus combine progressivement les données dans des fichiers. Lorsque la taille du fichier atteint index_file_size, ce fichier n'accepte pas de nouvelles données et Milvus enregistre les nouvelles données dans un autre fichier. Il s'agit de fichiers de données brutes. Lorsqu'un index est créé, Milvus génère un fichier d'index pour chaque fichier de données brutes. Pour le type d'index IVFLAT, la taille du fichier d'index est approximativement égale à la taille du fichier de données brutes correspondant. Pour l'index SQ8, la taille d'un fichier d'index est d'environ 30 % du fichier de données brutes correspondant.

Au cours d'une recherche, Milvus examine chaque fichier d'index un par un. D'après notre expérience, lorsque la taille du fichier d'index passe de 1024 à 2048, les performances de recherche s'améliorent de 30 à 50 %. Toutefois, si la valeur est trop élevée, les fichiers volumineux risquent de ne pas être chargés dans la mémoire GPU (ou même dans la mémoire CPU). Par exemple, si la mémoire du GPU est de 2 Go et que index_file_size est de 3 Go, le fichier d'index ne pourra pas être chargé dans la mémoire du GPU. En général, nous fixons la taille du fichier d'index à 1024 Mo ou 2048 Mo.

Le tableau suivant montre un test utilisant sift50m pour index_file_size. Le type d'index est SQ8.

1-sift50m-test-results-milvus.png 1-sift50m-test-results-milvus.png

Nous pouvons voir qu'en mode CPU et en mode GPU, lorsque index_file_size est de 2048 Mo au lieu de 1024 Mo, les performances de recherche s'améliorent de manière significative.

2. nlist et nprobe

Le paramètre nlist est utilisé pour la création de l'index et le paramètre nprobe est utilisé pour la recherche. IVFLAT et SQ8 utilisent tous deux des algorithmes de regroupement pour diviser un grand nombre de vecteurs en grappes, ou buckets. nlist est le nombre de buckets pendant le regroupement.

Lors d'une recherche à l'aide d'index, la première étape consiste à trouver un certain nombre d'ensembles les plus proches du vecteur cible et la deuxième étape consiste à trouver les k vecteurs les plus similaires à partir des ensembles en fonction de la distance vectorielle. nprobe est le nombre d'ensembles lors de la première étape.

En règle générale, l'augmentation de nlist entraîne une augmentation du nombre de godets et une diminution du nombre de vecteurs dans un godet lors du regroupement. Par conséquent, la charge de calcul diminue et les performances de recherche s'améliorent. Cependant, avec moins de vecteurs pour la comparaison des similitudes, le résultat correct peut être manqué.

L'augmentation de nprobe entraîne une augmentation du nombre de godets à rechercher. Par conséquent, la charge de calcul augmente et les performances de recherche se détériorent, mais la précision de la recherche s'améliore. La situation peut varier selon les ensembles de données dont la distribution est différente. Vous devez également tenir compte de la taille de l'ensemble de données lorsque vous définissez nlist et nprobe. En règle générale, il est recommandé que nlist soit 4 * sqrt(n), où n est le nombre total de vecteurs. Comme pour nprobe, vous devez faire un compromis entre la précision et l'efficacité et la meilleure façon est de déterminer la valeur par essais et erreurs.

Le tableau suivant montre un test utilisant sift50m pour nlist et nprobe. Le type d'index est SQ8.

sq8-index-test-sift50m.png sq8-index-test-sift50m.png

Le tableau compare les performances de recherche et la précision en utilisant différentes valeurs de nlist/nprobe. Seuls les résultats GPU sont affichés car les tests CPU et GPU donnent des résultats similaires. Dans ce test, lorsque les valeurs de nlist/nprobe augmentent du même pourcentage, la précision de la recherche augmente également. Lorsque nlist = 4096 et nprobe est 128, Milvus a les meilleures performances de recherche. En conclusion, lorsque vous déterminez les valeurs de nlist et nprobe, vous devez faire un compromis entre les performances et la précision en tenant compte des différents ensembles de données et des exigences.

Résumé

index_file_size: Lorsque la taille des données est supérieure à index_file_size, plus la valeur de index_file_size est élevée, meilleures sont les performances de recherche.nlist et nprobe:Vous devez faire un compromis entre les performances et la précision.

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