Développer avec l’IA

Réduire les temps de bascule des LLM locaux de dix secondes à moins de deux

Un nouvel outil d'encapsulation appelé llama-sleep réduit la latence de changement de modèle sur les configurations mono-GPU en stockant l'état CUDA dans la RAM hôte plutôt qu'en rechargeant les poids.

Illustration d'un modèle de réseau neuronal étant basculé entre le stockage GPU et la RAM
Illustration générée pour cet article

Traduit automatiquement depuis l'original anglais.

L'exécution de plusieurs grands modèles de langage (LLM) sur un seul GPU nécessite souvent leur chargement et déchargement successifs en mémoire, un processus qui engendre traditionnellement une latence significative. Un nouvel outil open source nommé llama-sleep, combiné à des configurations spécifiques du noyau Linux, a permis de réduire ce temps de bascule de plus de dix secondes à moins de deux secondes tout en préservant les prompts mis en cache.

Ce qui s'est passé

Les développeurs qui hébergent eux-mêmes des modèles d'IA locaux font fréquemment face à un goulot d'étranglement lorsque leur matériel ne peut pas contenir simultanément tous les modèles requis dans la mémoire GPU. Dans une configuration typique utilisant un proxy comme llama-swap, passer d'un modèle occupant tout le GPU à un autre implique d'arrêter le processus actuel, de libérer sa mémoire et de charger le nouveau modèle depuis zéro. Lors de tests de référence effectués sur une NVIDIA RTX 3060, cette bascule à froid prenait environ 10,3 secondes. Ce délai non seulement affecte la réactivité, mais détruit également le cache clé-valeur (KV), forçant le système à recalculer les longs prompts système à chaque changement.

Pour remédier à cette inefficacité, Robert Zaage a développé llama-sleep, une encapsulation légère pour le serveur de llama.cpp. Au lieu de terminer le processus du modèle pendant les périodes d'inactivité, llama-sleep utilise les fonctionnalités de checkpointing CUDA de NVIDIA pour suspendre l'état du modèle. Il copie le contenu de la mémoire GPU dans la RAM hôte, « parquant » ainsi le modèle. Lorsque le modèle est de nouveau nécessaire, son état est restauré directement depuis la RAM vers le GPU. Cette approche élimine le besoin de recharger les poids du modèle depuis le disque et conserve le cache KV, permettant au système de reprendre l'inférence presque immédiatement.

La première implémentation de ce mécanisme de parking a réduit les temps de bascule à 2,1 secondes. Cependant, une optimisation supplémentaire a révélé que la vitesse de transfert des données était limitée par la gestion des pages mémoire par le système d'exploitation. En activant les pages géantes transparentes multi-tailles (mTHP) dans le noyau Linux, le développeur a encore réduit le temps de bascule à 1,7 seconde. Cela représente une amélioration six fois supérieure par rapport à la référence initiale, rendant le changement rapide de modèles viable pour des applications en temps réel telles que les assistants vocaux et les workflows automatisés.

Comment cela fonctionne

La technologie centrale derrière llama-sleep repose sur la capacité cuda-checkpoint introduite dans la version 550 du pilote NVIDIA. Cette fonctionnalité permet à un processus CUDA en cours d'exécution de prendre un instantané de sa mémoire périphérique et de la déplacer vers la mémoire hôte sans terminer le processus. llama-sleep agit comme un proxy inverse et un gestionnaire de processus. Il exécute llama-server comme un démon détaché, le protégeant des requêtes externes directes. Lorsque le modèle devient inactif pendant une période configurée, par exemple cinq secondes, llama-sleep déclenche la fonction de checkpoint. Cela suspend le contexte CUDA, copie les données VRAM dans la RAM système et libère les ressources GPU pour d'autres tâches.

Un défi majeur dans cette conception est la gestion des requêtes entrantes pendant qu'un modèle est parqué ou en cours de restauration. Si une requête arrive pendant que la mémoire GPU est recopiée, le processus pourrait planter ou renvoyer des erreurs. llama-sleep résout ce problème en mettant toutes les requêtes entrantes, y compris les vérifications de santé du proxy, en file d'attente. Il ne libère ces requêtes que lorsque le modèle est entièrement réveillé et réactif. Cela garantit que le proxy ne voit jamais un statut « prêt » pour un modèle encore en transit, prévenant ainsi les fautes de segmentation et assurant un fonctionnement fluide.

Le gain de performance final provient de l'optimisation de la copie mémoire elle-même. Le transfert de gigaoctets de données entre le GPU et la RAM hôte est fortement influencé par les fautes de page. Les pages mémoire standard de 4 Ko obligent le système d'exploitation à gérer des millions d'entrées de page individuelles lors de la copie, créant une surcharge importante. En activant les pages géantes transparentes multi-tailles dans les noyaux Linux version 6.8 et ultérieures, le système peut utiliser des blocs mémoire plus grands allant de 16 Ko à 1 Mo. Cela réduit considérablement le nombre de fautes de page, permettant au transfert de données de s'approcher des limites théoriques de bande passante du bus PCIe plutôt que d'être limité par la gestion mémoire du CPU.

Détails clés

  • Amélioration des performances : Le temps de bascule entre deux modèles de 26 milliards de paramètres est passé de 10,3 secondes à 1,7 seconde.
  • Préservation du cache : Le cache KV reste intact lors des bascules, éliminant le besoin de recalculer des prompts de milliers de tokens.
  • Exigences matérielles : Nécessite un GPU NVIDIA avec un pilote version 570 ou ultérieure et un système hôte Linux.
  • Dépendances logicielles : Utilise llama-swap v263, llama.cpp b11552 et le binaire autonome llama-sleep écrit en Go.
  • Configuration du noyau : Une performance optimale nécessite l'activation des pages géantes transparentes multi-tailles (mTHP) pour la mémoire anonyme dans le noyau Linux.
  • Compromis mémoire : Les modèles parqués consomment une quantité de RAM hôte équivalente à leur utilisation mémoire GPU, nécessitant une mémoire système suffisante.

Pourquoi c'est important

Pour les ingénieurs construisant des infrastructures IA locales, ce développement transforme la faisabilité des architectures multi-modèles sur du matériel grand public. Auparavant, la forte latence liée au changement de modèles rendait impraticable l'utilisation de modèles spécialisés pour différentes tâches, comme un petit modèle pour les commandes vocales et un plus grand pour le raisonnement complexe. Les utilisateurs devaient choisir entre garder un seul grand modèle chargé, gaspiller des ressources pour des tâches simples ou accepter de longs délais lors du changement de contexte. Avec des temps de bascule inférieurs à deux secondes, les systèmes peuvent allouer dynamiquement les ressources selon la demande sans latence perceptible.

La préservation du cache KV est tout aussi significative pour l'expérience utilisateur et l'efficacité computationnelle. Le recalcul de longs prompts système ou d'historiques de conversation consomme du temps et de l'énergie. En conservant cet état dans la RAM hôte, llama-sleep garantit que la génération du premier token après une bascule est quasi instantanée. Ceci est particulièrement précieux pour des applications comme la domotique ou les agents interactifs où la continuité du contexte est essentielle. La capacité de parquer les modèles en arrière-plan signifie que le système est toujours prêt à répondre, comblant le fossé entre la flexibilité des API cloud et la confidentialité de l'inférence locale.

Ce que vous pouvez faire

  • Mettez à jour vos pilotes : Assurez-vous que les pilotes de votre GPU NVIDIA sont mis à jour vers la version 570 ou ultérieure pour prendre en charge les fonctionnalités de checkpointing CUDA.
  • Installez llama-sleep : Téléchargez le binaire Go autonome pour llama-sleep et intégrez-le à votre configuration llama-swap existante.
  • Configurez les timeouts d'inactivité : Définissez le paramètre --idle dans llama-sleep pour correspondre à vos schémas d'utilisation, garantissant que les modèles ne sont parqués que lorsqu'ils ne sont pas utilisés activement.
  • Activez les pages géantes : Si vous utilisez un noyau Linux 6.8 ou plus récent, activez les pages géantes transparentes multi-tailles en écrivant "always" dans les entrées sysfs concernées pour les tailles comprises entre 16 Ko et 1 Mo.
  • Surveillez l'utilisation mémoire : Vérifiez que votre système hôte dispose de suffisamment de RAM libre pour contenir les modèles parqués en plus des autres processus en cours d'exécution.
  • Testez la latence de bascule : Mesurez le temps entre la requête et le premier token après une bascule pour valider les gains de performance dans votre environnement matériel spécifique.
  • #llama.cpp
  • #local-llm
  • #nvidia-cuda
  • #linux-kernel
  • #performance-optimization

Outils de la Boutique Bytechap

$89

DocBento

Gestion documentaire auto-hébergée qui analyse chaque scan et répond avec des citations de pages.

Démo en ligne

Continuer la lecture

Tous les articles