Contexte
ans cet article, nous verrons comment Milvus planifie les tĂąches d'interrogation. Nous aborderons Ă©galement les problĂšmes, les solutions et les orientations futures pour la mise en Ćuvre de l'ordonnancement de Milvus.
Contexte
La gestion des donnĂ©es dans un moteur de recherche vectorielle Ă grande Ă©chelle nous a appris que la recherche de similaritĂ© vectorielle est mise en Ćuvre par la distance entre deux vecteurs dans un espace Ă haute dimension. L'objectif de la recherche vectorielle est de trouver les K vecteurs les plus proches du vecteur cible.
Il existe de nombreuses façons de mesurer la distance vectorielle, comme la distance euclidienne :
1-distance-euclidienne.png
oĂč x et y sont deux vecteurs. n est la dimension des vecteurs.
Afin de trouver les K vecteurs les plus proches dans un ensemble de donnĂ©es, la distance euclidienne doit ĂȘtre calculĂ©e entre le vecteur cible et tous les vecteurs de l'ensemble de donnĂ©es Ă rechercher. Ensuite, les vecteurs sont triĂ©s en fonction de la distance pour obtenir les K vecteurs les plus proches. Le travail de calcul est directement proportionnel Ă la taille de l'ensemble de donnĂ©es. Plus l'ensemble de donnĂ©es est important, plus la requĂȘte nĂ©cessite de travail de calcul. Un GPU, spĂ©cialisĂ© dans le traitement des graphes, dispose d'un grand nombre de cĆurs pour fournir la puissance de calcul nĂ©cessaire. La prise en charge multi-GPU est donc Ă©galement prise en compte lors de la mise en Ćuvre de Milvus.
Concepts de base
Bloc de donnĂ©esïŒTableFileïŒ
Pour améliorer la prise en charge de la recherche de données à grande échelle, nous avons optimisé le stockage des données de Milvus. Milvus divise les données d'une table par taille en plusieurs blocs de données. Pendant la recherche vectorielle, Milvus recherche des vecteurs dans chaque bloc de données et fusionne les résultats. Une opération de recherche vectorielle se compose de N opérations indépendantes de recherche vectorielle (N est le nombre de blocs de données) et de N-1 opérations de fusion des résultats.
File d'attente des tĂąchesïŒTaskTableïŒ
Chaque ressource possĂšde un tableau de tĂąches, qui enregistre les tĂąches appartenant Ă la ressource. Chaque tĂąche a diffĂ©rents Ă©tats : dĂ©marrage, chargement, chargement, exĂ©cution et exĂ©cution. Le chargeur et l'exĂ©cuteur d'un dispositif informatique partagent la mĂȘme file d'attente de tĂąches.
Ordonnancement des requĂȘtes
2-query-scheduling.png
- Lorsque le serveur Milvus démarre, Milvus lance la GpuResource correspondante via les paramÚtres
gpu_resource_config
dans le fichier de configurationserver_config.yaml
. DiskResource et CpuResource ne peuvent toujours pas ĂȘtre modifiĂ©s dansserver_config.yaml
. GpuResource est la combinaison desearch_resources
etbuild_index_resources
et est appelé{gpu0, gpu1}
dans l'exemple suivant :
3-sample-code.png
3-example.png
- Milvus reçoit une demande. Les métadonnées de la table sont stockées dans une base de données externe, qui est SQLite ou MySQl pour l'hÎte unique et MySQL pour la base de données distribuée. AprÚs avoir reçu une demande de recherche, Milvus vérifie que la table existe et que la dimension est cohérente. Ensuite, Milvus lit la liste TableFile de la table.
4-milvus-reads-tablefile-list.png
- Milvus crée une SearchTask. Le calcul de chaque TableFile étant effectué indépendamment, Milvus crée une SearchTask pour chaque TableFile. En tant qu'unité de base de l'ordonnancement des tùches, une SearchTask contient les vecteurs cibles, les paramÚtres de recherche et les noms de fichiers des TableFile.
5-table-file-list-task-creator.png
- Milvus choisit un dispositif informatique. Le dispositif sur lequel une SearchTask effectue les calculs dépend du temps d'exécution estimé pour chaque dispositif. Le temps de réalisation estimé spécifie l'intervalle estimé entre l'heure actuelle et l'heure estimée de la fin du calcul.
Par exemple, lorsqu'un bloc de données d'une SearchTask est chargé dans la mémoire du CPU, la SearchTask suivante est en attente dans la file d'attente des tùches de calcul du CPU et la file d'attente des tùches de calcul du GPU est inactive. Le temps d'exécution estimé pour l'unité centrale est égal à la somme des temps d'exécution estimés de la tùche de recherche précédente et de la tùche de recherche actuelle. Le temps de réalisation estimé pour un GPU est égal à la somme du temps de chargement des blocs de données sur le GPU et du coût temporel estimé de la tùche de recherche en cours. Le temps de réalisation estimé pour une tùche de recherche dans une ressource est égal au temps d'exécution moyen de toutes les tùches de recherche dans la ressource. Milvus choisit alors un dispositif dont le temps d'exécution estimé est le plus court et affecte la tùche de recherche à ce dispositif.
Ici, nous supposons que le temps d'exécution estimé pour le GPU1 est plus court.
6-GPU1-shorter-estimated-completion-time.png
Milvus ajoute SearchTask Ă la file d'attente de DiskResource.
Milvus déplace SearchTask dans la file d'attente de CpuResource. Le thread de chargement de CpuResource charge chaque tùche de la file d'attente de maniÚre séquentielle. CpuResource lit les blocs de données correspondants dans la mémoire du processeur.
Milvus déplace SearchTask vers GpuResource. Le thread de chargement de GpuResource copie les données de la mémoire du CPU vers la mémoire du GPU. GpuResource lit les blocs de données correspondants dans la mémoire du GPU.
Milvus exécute SearchTask dans GpuResource. Le résultat d'une SearchTask étant relativement petit, il est directement renvoyé dans la mémoire de l'unité centrale.
7-scheduler.png
- Milvus fusionne le résultat de la SearchTask avec l'ensemble des résultats de la recherche.
8-milvus-merges-searchtast-result.png
Lorsque toutes les tùches de recherche sont terminées, Milvus renvoie le résultat complet de la recherche au client.
Création d'index
La construction d'un index est essentiellement la mĂȘme chose que le processus de recherche sans le processus de fusion. Nous n'en parlerons pas en dĂ©tail.
Optimisation des performances
Cache
Comme indiquĂ© prĂ©cĂ©demment, les blocs de donnĂ©es doivent ĂȘtre chargĂ©s dans les dispositifs de stockage correspondants, tels que la mĂ©moire de l'unitĂ© centrale ou la mĂ©moire du processeur graphique, avant le calcul. Pour Ă©viter le chargement rĂ©pĂ©titif des donnĂ©es, Milvus introduit le cache LRU (Least Recently Used). Lorsque le cache est plein, les nouveaux blocs de donnĂ©es repoussent les anciens. Vous pouvez personnaliser la taille du cache Ă l'aide du fichier de configuration en fonction de la taille de la mĂ©moire actuelle. Il est recommandĂ© d'utiliser un cache de grande taille pour stocker les donnĂ©es de recherche afin d'Ă©conomiser le temps de chargement des donnĂ©es et d'amĂ©liorer les performances de la recherche.
Chevauchement du chargement des données et du calcul
Le cache ne peut pas rĂ©pondre Ă nos besoins en matiĂšre de performances de recherche. Les donnĂ©es doivent ĂȘtre rechargĂ©es lorsque la mĂ©moire est insuffisante ou que la taille de l'ensemble de donnĂ©es est trop importante. Nous devons rĂ©duire l'effet du chargement des donnĂ©es sur les performances de recherche. Le chargement des donnĂ©es, que ce soit du disque vers la mĂ©moire de l'unitĂ© centrale ou de la mĂ©moire de l'unitĂ© centrale vers la mĂ©moire du processeur graphique, fait partie des opĂ©rations d'E/S et ne nĂ©cessite pratiquement aucun travail de calcul de la part des processeurs. Nous envisageons donc d'effectuer le chargement des donnĂ©es et le calcul en parallĂšle pour une meilleure utilisation des ressources.
Nous divisons le calcul d'un bloc de données en trois étapes (chargement du disque vers la mémoire du CPU, calcul du CPU, fusion des résultats) ou en quatre étapes (chargement du disque vers la mémoire du CPU, chargement de la mémoire du CPU vers la mémoire du GPU, calcul du GPU et récupération des résultats, et fusion des résultats). Si l'on prend l'exemple d'un calcul en 3 étapes, on peut lancer 3 threads responsables des 3 étapes pour faire fonctionner le pipelining d'instructions. Comme les ensembles de résultats sont généralement petits, la fusion des résultats ne prend pas beaucoup de temps. Dans certains cas, le chevauchement du chargement des données et du calcul peut réduire le temps de recherche de moitié.
9-sequential-overlapping-load-milvus.png
ProblĂšmes et solutions
Différentes vitesses de transmission
Auparavant, Milvus utilisait la stratégie Round Robin pour la planification des tùches multi-GPU. Cette stratégie a parfaitement fonctionné sur notre serveur à 4 GPU et les performances de recherche ont été multipliées par 4. Cependant, pour nos hÎtes à 2 GPU, les performances n'ont pas été multipliées par 2. Nous avons fait quelques expériences et découvert que la vitesse de copie des données pour un GPU était de 11 GB/s. Cependant, pour un autre GPU, elle était de 3 GB/s. AprÚs avoir consulté la documentation de la carte mÚre, nous avons confirmé que la carte mÚre était connectée à un GPU via PCIe x16 et à un autre GPU via PCIe x4. En d'autres termes, ces GPU ont des vitesses de copie différentes. Par la suite, nous avons ajouté le temps de copie pour mesurer le dispositif optimal pour chaque SearchTask.
Travaux futurs
Environnement matériel plus complexe
Dans des conditions rĂ©elles, l'environnement matĂ©riel peut ĂȘtre plus complexe. Dans les environnements matĂ©riels comportant plusieurs CPU, une mĂ©moire avec architecture NUMA, NVLink et NVSwitch, la communication entre les CPU/GPU offre de nombreuses possibilitĂ©s d'optimisation.
Optimisation des requĂȘtes
Au cours de l'expĂ©rimentation, nous avons dĂ©couvert quelques possibilitĂ©s d'amĂ©lioration des performances. Par exemple, lorsque le serveur reçoit plusieurs requĂȘtes pour la mĂȘme table, les requĂȘtes peuvent ĂȘtre fusionnĂ©es sous certaines conditions. En utilisant la localitĂ© des donnĂ©es, nous pouvons amĂ©liorer les performances. Ces optimisations seront mises en Ćuvre dans nos dĂ©veloppements futurs. Nous savons dĂ©jĂ comment les requĂȘtes sont planifiĂ©es et exĂ©cutĂ©es pour le scĂ©nario mono-hĂŽte et multi-GPU. Nous continuerons Ă prĂ©senter d'autres mĂ©canismes internes pour Milvus dans les prochains articles.
- Concepts de base
- Création d'index
- Optimisation des performances
- ProblĂšmes et solutions
- Travaux futurs
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word