Passer au contenu principal
Le pool de mémoire unifiée de 128 Go de DGX Spark constitue à la fois son principal atout et le plus grand défi en matière de réglage. Contrairement aux GPU classiques où la VRAM reste fixe et distincte de la mémoire système, le processeur Grace et le GPU Blackwell partagent un même espace mémoire. Lorsque celui-ci se vide, le système devient totalement bloqué au lieu d’afficher une erreur claire d’épuisement de la mémoire. Cette page décrit l’utilisation de la mémoire, la manière de dimensionner le cache KV et les paramètres vLLM à ajuster selon vos besoins.

Fonctionnement de la mémoire unifiée sur GB10

DGX Spark intègre la puce GB10 de NVIDIA, qui regroupe un processeur ARM Grace et un GPU Blackwell dans un même boîtier. Ces composants partagent 128 Go de mémoire LPDDR5X via un interconnect atteignant 273 Go/s. Il n’existe pas de VRAM séparée. Lorsque vLLM alloue de la « mémoire GPU », il s’agit en réalité d’une portion du même pool de 128 Go utilisé par le système d’exploitation DGX, le runtime CUDA et vos applications. Cela implique :
  • gpu_memory_utilization détermine la part du pool total, et non un budget mémoire dédié au GPU.
  • Les processus système se disputent les mêmes octets. Le système d’exploitation DGX, les services en arrière-plan et les surcharges liées au contexte CUDA réduisent ainsi la quantité disponible pour le modèle.
  • Il n’existe aucun mécanisme de sécurité tel qu’un OOM killer. Une fois le pool épuisé, DGX Spark se fige au lieu de mettre fin au processus responsable.
Un budget mémoire réaliste se présente comme suit :

Surcharge du cache KV sur 128 Go

Le cache KV stocke les tenseurs clé-valeur de chaque jeton de chaque séquence active. Sa taille augmente avec 3 facteurs : la longueur du contexte, le nombre de séquences simultanées et l’architecture du modèle (nombre de couches et de têtes KV).

La formule

Pour une seule séquence à une longueur de contexte donnée :
Le facteur 2 prend en compte à la fois les clés et les valeurs.

Exemple : modèle dense 70B fonctionnant à différentes longueurs de contexte

En supposant un modèle 70B typique doté de 80 couches, de 8 têtes KV et d’une dimension de tête égale à 128 :
Utilisez le cache KV FP8 afin de réduire la consommation mémoire de moitié. Définissez la valeur --kv-cache-dtype fp8 dans la commande de lancement de vLLM. L’impact sur la qualité est inférieur à 2% sur la plupart des tests, et cette méthode permet d’augmenter de manière significative le nombre de séquences simultanées ou la longueur de contexte prise en charge.

Exemple : 35B modèle MoE

Pour un nombre total de couches identique, les modèles MoE utilisent les mêmes calculs de cache KV que les modèles denses. Un modèle MoE 35B comportant environ 64 couches et doté de la même configuration de têtes KV : Avec un MoE à 35B utilisant les poids NVFP4 (environ 18 Go), il est possible de gérer 128K d’éléments de contexte grâce à un cache KV en FP8, tout en conservant environ 65 Go de marge de manœuvre.

Compromis entre longueur du contexte et taille du lot

Chaque jeton de contexte présent dans chaque séquence active consomme de la mémoire du cache KV. Le budget total alloué au cache KV est le suivant :
En pratique, le compromis à obtenir sur DGX Spark se présente ainsi : Pour un modèle dense 70B en format NVFP4 (environ 35 Go pour les poids, et ~75 Go restants pour le cache KV) :

Comparaison entre les tests pratiques et les affirmations de NVIDIA

Le chiffre publié par NVIDIA, soit 82,739 jetons/s, pour le DGX Spark correspond à un débit de mise au point global, et non à l’inférence pour un seul utilisateur. Les valeurs réelles pour le service interactif sont les suivantes :
Le chiffre de 82,739 jetons/seconde indique le débit global lors de multiples flux de réglage fin parallèles. L’inférence interactive pour un seul utilisateur constitue une charge de travail différente ; on observe alors entre 15 et 120 jetons/seconde selon la taille du modèle et du moteur, ce qui reste suffisant pour des chats en temps réel et des agents de programmation.

Protection mémoire : évite les blocages du système

Le paramètre de réglage le plus crucial sur DGX Spark est --gpu-memory-utilization. Une valeur trop élevée entraîne des blocages irrécupérables ; une valeur trop basse réduit l’espace disponible dans le cache KV.

Valeurs de départ recommandées

Il ne faut jamais fixer gpu_memory_utilization à une valeur supérieure à 0.90 sur DGX Spark. Contrairement aux GPU discrets, l’épuisement de la mémoire unifiée rend l’ensemble du système incapable de répondre. Il faudra alors effectuer un redémarrage forcé pour le rétablir. Commencez avec des valeurs modestes et augmentez-les uniquement après avoir vérifié la stabilité avec votre charge de travail réelle.

Surveillez l’utilisation de la mémoire en temps réel

Ouvrez un second terminal et observez l’utilisation de la mémoire pendant le déploiement :
Si la valeur de memory.free descend en dessous de la plage allant de 2 à 3 Go, votre système risque de se figer. Il convient alors de réduire les paramètres max_model_len, max_num_seqs ou gpu_memory_utilization.

Référence des paramètres de réglage

Voici les options vLLM les plus importantes sur DGX Spark, classées selon leur impact :

Tableau décisionnel : configurations courantes

Recettes de réglage

Maximiser le débit pour un seul utilisateur

Maximiser le nombre d’utilisateurs simultanés pour 70B

Configuration la plus sûre pour les modèles de grande taille

Prochaines étapes

vLLM sur DGX Spark

Commandes d’installation et de lancement pour chaque taille de modèle.

Compatibilité des modèles

Quels modèles peuvent être utilisés avec 128 Go d’espace mémoire et quelles options de quantification sont disponibles.

Un ou deux Sparks

Les cas où l’ajustement de la mémoire ne suffit pas et où il devient nécessaire d’ajouter un second Spark.

Notions relatives au cache KV

Explication approfondie du fonctionnement du cache KV selon les différentes architectures de modèles.