Aperçu de l'index GPU
La création d'un index avec prise en charge du GPU dans Milvus peut améliorer de manière significative les performances de recherche dans les scénarios à haut débit et à fort rappel.
La figure suivante compare le débit des requêtes (requêtes par seconde) en fonction des configurations d'index, des configurations matérielles, des ensembles de données vectorielles (Cohere et OpenAI) et de la taille des lots de recherche, montrant que GPU_CAGRA est toujours plus performant que les autres méthodes.
Performances de l'index Gpu
Configuration du pool de mémoire GPU pour Milvus
Milvus prend en charge un pool de mémoire GPU global et fournit deux paramètres de configuration, initMemSize et maxMemSize, dans le fichier de configuration de Milvus.
gpu:
initMemSize: 0 # set the initial memory pool size.
maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.
La valeur par défaut initMemSize correspond généralement à la moitié de la mémoire du GPU au démarrage de Milvus, et la valeur par défaut maxMemSize correspond à la totalité de la mémoire du GPU. La taille du pool de mémoire GPU est initialement fixée à initMemSize et s'étend automatiquement à maxMemSize si nécessaire.
Lorsqu'un index compatible avec le GPU est spécifié, Milvus charge les données de la collection cible dans la mémoire du GPU avant les recherches, de sorte que maxMemSize doit être au moins égal à la taille des données.
Limites
Pour
GPU_IVF_FLAT, la valeur maximale pourlimitest de 1 024.Pour
GPU_IVF_PQetGPU_CAGRA, la valeur maximale pourlimitest de 1 024.GPU_BRUTE_FORCEBien qu'il n'y ait pas de valeur définie pourlimit, il est recommandé de ne pas dépasser 4 096 pour éviter les problèmes de performance.Actuellement, les index GPU ne prennent pas en charge la distance
COSINE. Si la distanceCOSINEest requise, les données doivent d'abord être normalisées, puis la distance du produit intérieur (IP) peut être utilisée comme substitut.La protection OOM du chargement pour les index GPU n'est pas entièrement prise en charge, une trop grande quantité de données peut entraîner le blocage du QueryNode.
Les index GPU ne prennent pas en charge les fonctions de recherche telles que la recherche par plage et la recherche par groupement.
Types d'index GPU pris en charge
Le tableau suivant répertorie les types d'index GPU pris en charge par Milvus.
Type d'index |
Description de l'index |
Utilisation de la mémoire |
|---|---|---|
GPU_CAGRA est un index basé sur les graphes optimisé pour les GPU. L'utilisation de GPU de niveau inférence pour exécuter la version GPU de Milvus peut être plus rentable que l'utilisation de GPU de niveau formation coûteux. |
L'utilisation de la mémoire est environ 1,8 fois supérieure à celle des données vectorielles d'origine. |
|
GPU_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. Lorsque vous effectuez des recherches, notez que vous pouvez définir le top-k ( |
Nécessite une mémoire égale à la taille des données d'origine. |
|
GPU_IVF_PQ effectue un regroupement d'index IVF avant de quantifier le produit des vecteurs. Lorsque vous effectuez des recherches, notez que vous pouvez définir le top-k ( |
Utilise une empreinte mémoire plus petite, qui dépend des paramètres de compression. |
|
GPU_BRUTE_FORCE est conçu pour les cas où un rappel extrêmement élevé est crucial, garantissant un rappel de 1 en comparant chaque requête avec tous les vecteurs de l'ensemble de données. Il ne nécessite que le type de métrique ( |
Il nécessite une mémoire égale à la taille des données originales. |
Configurer les paramètres Milvus pour le contrôle de la mémoire GPU
Milvus utilise un pool de mémoire graphique global pour allouer la mémoire du GPU. Il prend en charge deux paramètres initMemSize et maxMemSize dans le fichier de configuration de Milvus. La taille du pool est initialement fixée à initMemSize et sera automatiquement étendue à maxMemSize si cette limite est dépassée.
La valeur par défaut de initMemSize est égale à la moitié de la mémoire GPU disponible au démarrage de Milvus, et la valeur par défaut de maxMemSize est égale à la totalité de la mémoire GPU disponible.
Jusqu'à la version 2.4.1, Milvus utilise un pool de mémoire GPU unifié. Pour les versions antérieures à 2.4.1, il était recommandé de définir les deux valeurs à 0.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
A partir de Milvus 2.4.1, le pool de mémoire GPU n'est utilisé que pour les données GPU temporaires pendant les recherches. Par conséquent, il est recommandé de le définir à 2048 et 4096.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Pour savoir comment construire un index GPU, reportez-vous au guide spécifique à chaque type d'index.
FAQ
Quand est-il approprié d'utiliser un index GPU ?
Un index GPU est particulièrement utile dans les situations qui exigent un débit élevé ou un rappel important. Par exemple, lorsqu'il s'agit de lots importants, le débit de l'indexation GPU peut être jusqu'à 100 fois supérieur à celui de l'indexation CPU. Dans les scénarios avec des lots plus petits, les index GPU surpassent toujours de manière significative les index CPU en termes de performance. En outre, s'il est nécessaire d'insérer rapidement des données, l'intégration d'un GPU peut accélérer considérablement le processus de construction des index.
Dans quels scénarios les index GPU tels que GPU_CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT et GPU_BRUTE_FORCE sont-ils les plus adaptés ?
GPU_CAGRALes index GPU_CAGRA sont idéaux pour les scénarios qui exigent des performances accrues, mais au prix d'une plus grande consommation de mémoire. Pour les environnements où la conservation de la mémoire est une priorité, l'indexGPU_IVF_PQpeut aider à minimiser les besoins en stockage, bien que cela s'accompagne d'une perte de précision plus importante. L'indexGPU_IVF_FLATconstitue une option équilibrée, offrant un compromis entre les performances et l'utilisation de la mémoire. Enfin, l'indexGPU_BRUTE_FORCEest conçu pour des opérations de recherche exhaustive, garantissant un taux de rappel de 1 en effectuant des recherches transversales.