Ce qui se passe
Sur le blog de PyTorch, l'équipe de NVIDIA Dynamo — la couche qui route les requêtes vers des moteurs vLLM ou SGLang — explique comment elle sert les agents de code. Tout repose sur un identifiant de session, commun à toutes les requêtes d'une même trajectoire d'agent, avec un identifiant parent pour les sous-agents.
Pourquoi ça compte
Un agent n'envoie pas des requêtes isolées. Sa session s'ouvre sur des dizaines
de milliers de jetons (prompt système, outils, consignes), renvoie tout son
contexte à chaque tour, et passe l'essentiel de son temps à attendre un outil —
pendant que son cache KV reste en mémoire GPU. Un routeur qui raisonne requête
par requête, y compris le KvRouter de Dynamo, ignore que N agents au tour k
occupent N fois leur contexte. Quand ce volume dépasse la HBM, puis la DRAM, le
moteur évince des sessions vivantes, et chaque tour suivant repaie un
préremplissage complet.
Le mécanisme
L'identifiant. Dynamo lit les en-têtes que les agents envoient déjà :
| Agent | Session | Parent |
|---|---|---|
| Claude Code | x-claude-code-session-id, x-claude-code-agent-id |
x-claude-code-parent-agent-id |
| Codex | thread-id |
x-codex-parent-thread-id |
| OpenCode | x-opencode-session-id |
x-opencode-parent-session-id |
Un agent maison ajoute x-dynamo-session-id, et x-dynamo-parent-session-id
pour un sous-agent, à ses appels compatibles OpenAI :
curl http://localhost:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-H 'x-dynamo-session-id: revue-pr-1234' \
-d '{"model":"mon-modele","messages":[{"role":"user","content":"..."}]}'Des greffons couvrent Pi, Hermes et OpenClaw (ai-dynamo/agent-plugins).
Le planificateur. Écrit en Rust à partir de l'article ThunderAgent, il suit chaque session sur deux axes : elle génère ou elle attend un outil, elle est active ou suspendue. Sa mesure est U, la part du cache KV d'un GPU occupée par les sessions qui lui sont affectées.
- À 0,95, les sessions en attente d'outil sont suspendues, les plus petites d'abord, jusqu'à revenir à 0,80. Aucun tour en cours n'est interrompu ; s'il n'y a plus rien à suspendre, la plus petite session active le sera à son prochain appel d'outil.
- Entre 0,80 et 0,95, une pénalité de priorité de −2,0 sert de contre-pression précoce.
- La reprise attend 0,85 (hystérésis de 0,10), réadmet les sessions par taille croissante, leur donne une seconde de priorité, et force toute reprise au bout de 30 minutes.
Les résultats
Sur SWE-bench, avec deux répliques MiniMax-M2 en TP4 sur un nœud 8×H100 : +12 à 16 % de débit face au seul routage KV. Sur des déploiements d'apprentissage par renforcement (Qwen3-Coder-30B-A3B, 8×H20), +11 à 14,6 % à concurrence moyenne face à l'équilibreur par défaut de VERL, avec plus de 94,5 % de réussite du cache de préfixe. Ce sont les chiffres de l'éditeur.
Restent expérimentaux un index du cache déplacé vers Mooncake et une interface de « KvHints » (Share, Prefetch, Demote, Pin, Retain) proposée à vLLM et SGLang ; seul Share fonctionne déjà.
Comment s'y prendre
Lancer le déploiement avec DYN_REQUEST_TRACE=1. Dynamo écrit alors une trace
par requête — session, jetons, métriques de cache, noms d'outils — sans le
contenu des prompts par défaut. Elle se rejoue hors GPU avec AISimulate, ou sur
vos GPU avec AIPerf, pour comparer routage, nombre de workers et capacité de
cache sur votre propre trafic.
Source : Session-Aware Agentic Inference with NVIDIA Dynamo, PyTorch, 8 octobre 2026.