Un service d’IA local peut-il basculer sur le processeur lorsque la mémoire du GPU est pleine ?

Eva Wong est la rédactrice technique et bricoleuse résidente chez ZimaSpace. Geek depuis toujours, passionnée par les homelabs et les logiciels open source, elle se spécialise dans la traduction de concepts techniques complexes en guides accessibles et pratiques. Eva croit que l’auto-hébergement doit être amusant, pas intimidant. À travers ses tutoriels, elle donne à la communauté les moyens de démystifier les configurations matérielles, depuis la construction de leur premier NAS jusqu’à la maîtrise des conteneurs Docker.

Oui, mais un basculement fiable vers le processeur doit être conçu avant que la mémoire du GPU ne soit saturée ; la plupart des processus d’inférence ne récupèrent pas automatiquement d’un dépassement de mémoire inattendu.

Un serveur IA domestique peut répondre rapidement sur son GPU jusqu’à ce qu’un prompt plus long, un lot plus volumineux, une requête d’image ou un second modèle consomme la VRAM restante. L’allocation suivante peut alors échouer, même si la mémoire vive et le processeur sont inactifs. La survie de la requête dépend de l’environnement d’exécution : certains peuvent placer les poids sur le processeur dès le départ, tandis que d’autres nécessitent un processus distinct sur le processeur et un routeur capable de réessayer sans risque.

Le déchargement vers le processeur et le basculement vers le processeur répondent à des problèmes différents

Le déchargement vers le processeur est une stratégie de placement du modèle. Certaines couches, certains tenseurs ou composants du pipeline résident dans la mémoire vive et sont transférés vers l’accélérateur lorsque nécessaire, ce qui réduit la VRAM requise pour une requête normale. Le basculement vers le processeur est un comportement du service : lorsque le chemin GPU est indisponible ou rejette une requête, un autre processus l’accepte et exécute un modèle compatible avec le processeur sans perdre la tâche.

Hugging Face Accelerate propose des méthodes de déchargement vers le processeur qui déplacent délibérément l’état du modèle entre la mémoire du processeur et un périphérique d’exécution. Il s’agit d’une exécution hétérogène planifiée, et non d’une intervention d’urgence après l’échec d’un état CUDA arbitraire. Le modèle, la répartition des périphériques, les hooks et le budget mémoire sont préparés avant le début de l’inférence.

Un modèle partiellement déchargé peut déjà utiliser le processeur tout en dépendant du GPU pour chaque token. Si le GPU tombe en panne, ce processus ne peut pas nécessairement poursuivre l’exécution sur le processeur à partir du token interrompu. Un véritable basculement redémarre généralement la requête sur un processus prêt à fonctionner sur le processeur. Cette distinction explique pourquoi une application peut annoncer la prise en charge du processeur tout en renvoyant une erreur de dépassement de mémoire au lieu de terminer la requête en cours.

La VRAM peut se remplir après le chargement réussi d’un modèle

Les poids du modèle ne représentent qu’une partie du budget mémoire. Le cache clé-valeur augmente avec la longueur de séquence active et la concurrence, les noyaux temporaires ont besoin d’espace de travail, les encodeurs d’image ou audio ajoutent des tenseurs, et un allocateur mémoire peut réserver des blocs pour les réutiliser. Un modèle qui tient au démarrage peut donc échouer avec un contexte long ou plusieurs utilisateurs simultanés.

PyTorch utilise un allocateur mémoire avec mise en cache ; la mémoire indiquée comme réservée ne correspond donc pas exactement à la mémoire occupée par les tenseurs actifs. La fragmentation et les allocations effectuées en dehors du framework peuvent réduire davantage la marge disponible. Un déclencheur de basculement doit surveiller les allocations rejetées et l’état des processus, plutôt que de déduire la sécurité d’un seul indicateur de tableau de bord ou du simple fait que le chargement du modèle a réussi.

C’est également pourquoi une règle statique du type « taille du modèle inférieure à la VRAM » est incomplète. Un service peut limiter la longueur du contexte, plafonner le nombre de séquences simultanées ou laisser un pourcentage de VRAM inutilisé afin de protéger les allocations d’exécution. Ces contrôles évitent davantage de défaillances qu’un basculement réactif vers le processeur, car ils maintiennent le processus GPU dans un état connu et préservent une latence prévisible pour les requêtes acceptées.

La nouvelle tentative automatique n’est sûre que si la requête peut être rejouée

Après un dépassement de mémoire, le routeur peut considérer le processus GPU comme défaillant, le libérer ou le redémarrer, puis rejouer la requête d’origine sur un processus fonctionnant sur le processeur. Cela fonctionne pour une génération de texte ordinaire lorsqu’aucun effet externe ne s’est produit. La tâche est plus complexe avec les réponses en continu, les pipelines d’images utilisant des graines aléatoires ou les agents qui ont peut-être déjà appelé un outil.

Les frameworks peuvent également répartir les grands modèles entre plusieurs périphériques dès le départ. L’inférence de grands modèles d’Accelerate prend en charge les répartitions de périphériques ainsi que le placement sur le processeur ou le disque lorsqu’un modèle dépasse les capacités d’un seul périphérique. Cette approche peut maintenir une requête active au sein d’un graphe d’exécution planifié, mais elle échange de la vitesse contre de la capacité et ne doit pas être confondue avec le routage d’une requête échouée vers un service distinct.

Le basculement cesse d’être applicable lorsque le processeur ne dispose pas de suffisamment de mémoire vive, que l’environnement d’exécution ne possède pas de noyaux compatibles avec le processeur, que la requête a déjà produit une action irréversible ou que la latence attendue sur le processeur dépasse le délai d’attente du client. Dans ces cas, renvoyez une erreur de capacité contrôlée ou placez la requête en file d’attente. Une nouvelle tentative silencieuse peut dupliquer des effets externes ou faire patienter les utilisateurs bien plus longtemps que ce que l’interface promet.

-15% OFF

Validez le basculement avec un test mémoire délibéré

Exécutez un processus GPU et un processus processeur derrière un routeur, puis envoyez une requête qui dépasse le profil GPU sans dépasser la mémoire vive du système. Enregistrez la première défaillance, la décision de nouvelle tentative, l’heure de démarrage sur le processeur, la sortie finale et la survie de la connexion client. Répétez d’abord avec la diffusion en continu désactivée, puis testez l’annulation, le trafic concurrent et une requête d’agent avec un outil simulé.

L’exécution partielle sur GPU constitue une base de comparaison utile, car des environnements tels que l’inférence llama.cpp peuvent placer une portion configurable du traitement du modèle sur des accélérateurs tout en conservant une exécution sur le processeur. Comparez les profils avec modèle entièrement sur le GPU, répartition processeur/GPU planifiée et solution de secours indépendante sur le processeur. Un modèle de charge de travail IA hybride aide à distinguer le basculement pour manque de capacité du routage cloud habituel.

Ne considérez la conception comme fiable que si la nouvelle tentative aboutit une seule fois, conserve l’identité de la requête, évite les actions d’outil en double et restaure le processus GPU sans interrompre les tâches indépendantes. Si l’exécution sur le processeur est trop lente, utilisez-la comme voie de sécurité préservant la file d’attente plutôt que comme équivalent interactif. L’objectif opérationnel est une dégradation progressive, et non de prétendre que les niveaux de service du processeur et du GPU sont interchangeables.

Comportement Préparé avant le dépassement de mémoire ? Peut sauvegarder la requête en cours ?
Déchargement processeur/GPU Oui Généralement, dans le graphe planifié
Réduction de la concurrence GPU Oui Empêche l’admission d’un travail risqué
Nouvelle tentative sur le processeur par le routeur Oui Oui, si la requête peut être rejouée
Basculement non planifié au sein du processus Non Généralement non

FAQ

Vider le cache du GPU déclenche-t-il un basculement ?

Non. La libération du cache peut rendre disponibles des blocs réservés inutilisés, mais elle ne crée pas d’exécution sur le processeur, ne répare pas l’état corrompu d’une requête et ne garantit pas une quantité suffisante de mémoire contiguë pour l’allocation suivante.

Le basculement vers le processeur produira-t-il la même réponse ?

C’est possible si les mêmes poids, la même précision, le même prompt, le même tokenizer et le même état d’échantillonnage sont utilisés. Des noyaux différents, la quantification, les graines ou l’état redémarré d’une diffusion en continu peuvent toutefois modifier la sortie exacte.

Un modèle plus petit est-il préférable au basculement vers le processeur ?

Souvent, pour un service interactif. Un modèle GPU plus petit peut offrir une latence prévisible, tandis que le basculement vers le processeur protège la disponibilité pour les requêtes exceptionnelles. Ces deux mécanismes répondent à des objectifs de service différents et peuvent être combinés.

Centre Tech & IA

Plus à lire

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.