Index sur disque
Cet article présente DiskANN, un algorithme d'indexation sur disque pour les recherches vectorielles optimisées sur disque. Basé sur les graphes de Vamana, DiskANN permet d'effectuer des recherches vectorielles sur disque efficaces dans les 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.
Conditions préalables
Pour utiliser DiskANN dans Milvus, il faut que
- L'instance Milvus fonctionne sous Ubuntu 18.04.6 ou une version ultérieure.
- Le chemin de données Milvus doit être monté sur un disque SSD NVMe pour des performances optimales :
- Pour une instance Milvus autonome, le chemin de données doit être /var/lib/milvus/data dans le conteneur où l'instance s'exécute.
- Pour une instance Milvus Cluster, le chemin de données doit être /var/lib/milvus/data dans les conteneurs où s'exécutent les QueryNodes et les IndexNodes.
Limites
Pour utiliser DiskANN, veillez à
- N'utilisez que des vecteurs flottants ayant au moins une dimension dans vos données.
- d'utiliser uniquement la distance euclidienne (L2), le produit intérieur (IP) ou COSINE pour mesurer la distance entre les vecteurs.
Paramètres d'index et de recherche
Paramètres de construction d'index
Lors de la création d'un index DiskANN, utilisez
DISKANNcomme type d'index. Aucun paramètre d'index n'est nécessaire.Paramètres de recherche
Paramètre Description de la recherche Plage de valeurs Valeur par défaut search_listTaille de la liste des candidats. Une taille plus importante permet d'obtenir un taux de rappel plus élevé, mais avec des performances dégradées. [topk, int32_max] 16
Configurations Milvus liées à DiskANN
DiskANN est paramétrable. Vous pouvez modifier les paramètres liés à DiskANN dans ${MILVUS_ROOT_PATH}/configs/milvus.yaml afin d'améliorer ses performances.
...
DiskIndex:
MaxDegree: 56
SearchListSize: 100
PQCodeBudgetGBRatio: 0.125
SearchCacheBudgetGBRatio: 0.125
BeamWidthRatio: 4.0
...
| Paramètre | Description du paramètre | Plage de valeurs | Valeur par défaut |
|---|---|---|---|
MaxDegree | Degré maximal du graphe de Vamana. Une valeur plus élevée permet d'obtenir un taux de rappel plus important, mais augmente la taille de l'index et le temps nécessaire à sa construction. | [1, 512] | 56 |
SearchListSize | Taille de la liste des candidats. Une valeur plus élevée augmente le temps consacré à la construction de l'index mais offre un taux de rappel plus élevé. Fixez-la à une valeur inférieure à MaxDegree, sauf si vous avez besoin de réduire le temps de construction de l'index. | [1, int32_max] | 100 |
PQCodeBudgetGBRatio | Limite de taille du code PQ. Une valeur plus élevée offre un taux de rappel plus important mais augmente l'utilisation de la mémoire. | (0.0, 0.25] | 0.125 |
SearchCacheBudgetGBRatio | Rapport entre les numéros de nœuds mis en cache et les données brutes. Une valeur plus élevée améliore la performance de la construction de l'index mais augmente l'utilisation de la mémoire. | [0.0, 0.3) | 0.10 |
BeamWidthRatio | Rapport entre le nombre maximum de requêtes IO par itération de recherche et le nombre de CPU. | [1, max(128 / nombre de CPU, 16)] | 4.0 |
Résolution des problèmes
Comment traiter l'erreur
io_setup() failed; returned -11, errno=11:Resource temporarily unavailable?Le noyau Linux propose la fonction E/S asynchrone non bloquante (AIO) qui permet à un processus de lancer simultanément plusieurs opérations d'E/S sans avoir à attendre la fin de l'une d'entre elles. Cela permet d'améliorer les performances des applications qui peuvent chevaucher le traitement et les E/S.
Les performances peuvent être ajustées à l'aide du fichier virtuel
/proc/sys/fs/aio-max-nrdans le système de fichiers proc. Le paramètreaio-max-nrdétermine le nombre maximum de requêtes simultanées autorisées.La valeur par défaut de
aio-max-nrest65535, mais vous pouvez la régler sur10485760.