Pourquoi utiliser des bacs à sable pour l’exécution d’outils des agents
L’entraînement d’agents de code par RL nécessite d’exécuter des appels d’outils (commandes bash, opérations sur les fichiers) dans des environnements isolés. Le code généré par le modèle n’étant pas fiable, il peut modifier le système de fichiers de l’hôte, accéder au réseau ou produire des résultats non déterministes. Les bacs à sable fournissent des environnements isolés et éphémères dans lesquels les appels d’outils s’exécutent sans affecter l’hôte ni les autres rollouts. Dans une boucle d’entraînement, le modèle génère des actions (appels d’outils), la sandbox les exécute, puis les observations sont renvoyées au modèle. La sandbox est conservée d’un appel d’outil à l’autre au sein d’un épisode : les modifications de fichiers et les paquets installés persistent ainsi d’une étape à l’autre. La récompense est calculée à partir de l’état final de la sandbox (par exemple, la réussite des tests) ou de la qualité de la trajectoire. Grâce aux API d’étiquetage et de listage, il devient simple de nettoyer et de surveiller des runs d’entraînement comportant des milliers de bacs à sable.Prérequis
Avant de commencer, effectuez les étapes de configuration suivantes. DéfinissezCWSANDBOX_API_KEY sur un
jeton d’accès à l’API CoreWeave :
SandboxDefaults et utilisent par défaut l’authentification CoreWeave. Pour utiliser une clé API Forge, configurez explicitement l’authentification en suivant les instructions de la page Premiers pas, puis transmettez la valeur auth obtenue à chaque SandboxDefaults(...).
Principe de base
La configuration de base repose sur une boucle d’agent qui s’exécute sur votre infrastructure d’entraînement, tandis que les appels d’outils s’exécutent dans une sandbox.Étape d’entraînement avec épisodes en parallèle
Traitez un lot de tâches en utilisant une sandbox par épisode :Étiquetage des métadonnées de tâche
Les étiquettes vous permettent de filtrer et de retrouver les bacs à sable créés par vos tâches d’entraînement, ce qui devient indispensable lorsqu’un run unique peut lancer des milliers de bacs à sable. Ajoutez des métadonnées qui facilitent l’identification des bacs à sable lors du débogage ou du nettoyage :
Les étiquettes de sandbox deviennent des libellés de pod Kubernetes, que la plateforme d’observabilité CoreWeave exploite pour le filtrage et les tableaux de bord.
Essayer l’exemple de fonction de récompense
Une intégration minimale qui calcule des récompenses d’exécution de code en exécutant le code en parallèle dans des sandbox. Fonctionnement :- Exécute un ensemble de complétions de code simples (arithmétique, opérations sur les chaînes de caractères, erreurs de syntaxe, erreurs d’exécution).
- Crée une sandbox par complétion afin de garantir l’isolation.
- Calcule des récompenses binaires : 1.0 en cas d’exécution réussie, 0.0 en cas d’échec.
- Affiche la progression au fur et à mesure de l’arrivée des résultats (les exécutions les plus rapides se terminent en premier).
cwsandbox.wait() pour traiter les résultats dès qu’ils sont disponibles :
Intégration de TRL GRPOTrainer
TRL utilise une interface de fonction de récompense dans laquelle chaque complétion est directement associée à une récompense. L’agent génère une complétion, puis la fonction de récompense l’exécute dans une sandbox. L’approche standard utilise des balises XML<answer> pour extraire le code (comme dans les exemples mathématiques GRPO, qui utilisent \boxed{}) :
Essayer l’exemple d’intégration TRL GRPO
Cet exemple utilise des bacs à sable CoreWeave avec le GRPOTrainer de TRL pour attribuer des récompenses fondées sur l’exécution du code. Ce que fait cet exemple :- Il charge un petit modèle (
Qwen/Qwen2.5-0.5B-Instruct). - Il crée un dataset jouet de problèmes de programmation simples.
- Il entraîne le modèle avec GRPO en calculant les récompenses dans des bacs à sable.
- Il exécute 10 étapes d’entraînement pour illustrer l’intégration.
<answer> (le schéma GRPO standard), crée des bacs à sable en parallèle via une Session, exécute chaque complétion et renvoie des récompenses binaires :
<answer> :
extract_xml_answer() trouve du code extractible dans la complétion du modèle. Lorsque le modèle génère du texte sans les balises <answer>...</answer> attendues, cette complétion est ignorée et reçoit une récompense de 0,0.
2 sandboxes, 0/2 passed: le modèle a généré 2 blocs de code, dont l’exécution a échoué dans les deux cas.1 sandboxes, 0/1 passed, 1 skipped (no code): le modèle a généré 1 bloc de code (en échec) et 1 complétion contenant uniquement du texte.0 sandboxes, 0/0 passed, 2 skipped (no code): le modèle n’a généré de code extractible dans aucune des deux complétions.
Gestion des erreurs dans les épisodes d’agent
Les opérations de sandbox peuvent échouer (délais d’expiration, fichiers manquants, arrêt de la sandbox), et la façon dont vous remontez ces échecs détermine ce que l’agent apprend. Renvoyez des observations qui décrivent le problème rencontré :Intégration des métriques Weights & Biases
Lorsque vous utilisez Weights & Biases pour l’entraînement, les Sessions cwsandbox journalisent automatiquement les métriques d’utilisation des sandboxes dans votre run wandb actif. Vous pouvez ainsi corréler l’état de santé des sandboxes (temps de démarrage, échecs d’exécution, appels d’outils par enregistrement de session) avec vos métriques d’entraînement, dans un même tableau de bord. Les sections suivantes décrivent le fonctionnement de la détection automatique, la manière de contrôler explicitement la remontée des métriques, ainsi que les métriques suivies.Détection automatique
Si le paquetwandb est installé et qu’un run Weights & Biases est actif (wandb.run existe), la journalisation des métriques est activée automatiquement. Pour le suivi des expériences, installez le paquet facultatif et définissez une clé API Forge :
wandb.login(). Cet exemple lit FORGE_API_KEY, mais le SDK ne la détecte pas automatiquement. L’authentification de la sandbox utilise toujours CWSANDBOX_API_KEY :
Contrôle explicite
Contrôlez l’envoi des métriques à l’aide du paramètrereport_to :
Métriques
Les métriques d’exécution sont suivies automatiquement à la fin deexec() :
Le suivi est automatique. Appelez
exec() sur n’importe quelle sandbox associée à une session. Appelez session.log_metrics(step=N) pour journaliser les métriques à des étapes d’entraînement précises :
exec_stats :
Métriques exec par sandbox
Les sessions dotées de l’intégration Weights & Biases suivent également des métriques par sandbox :
Ce que ces métriques révèlent sur le comportement de l’agent :
- Une valeur élevée de avg_execs_per_sandbox peut signaler des agents verbeux qui effectuent de nombreux appels d’outils par épisode.
- Un écart important (max-min) peut signaler un comportement de rollout irrégulier d’un épisode à l’autre.
- Les tendances au fil des étapes d’entraînement montrent comment le comportement de l’agent évolue à mesure que la politique s’améliore.
- Tracez
avg_execs_per_sandboxen fonction de l’étape d’entraînement pour suivre l’évolution de l’utilisation des outils au cours de l’entraînement. - Déclenchez une alerte si
max_execs_per_sandboxdépasse un seuil (agent incontrôlé effectuant un nombre excessif d’appels d’outils). - Comparez l’écart min/max pour distinguer les épisodes où les agents restent bloqués dans des boucles de ceux qui se terminent rapidement.
log_metrics() réinitialise les compteurs après la journalisation. Définissez reset=False pour continuer à les cumuler :
Surveillance et débogage
Les approches suivantes vous permettent d’observer en temps réel ce que fait votre run d’entraînement et de capturer des informations qui facilitent le diagnostic des échecs.Compter les bacs à sable actifs
Surveillez l’utilisation des bacs à sable pendant l’entraînement :Journalisation des détails d’exécution
Capturez les détails d’exécution pour déboguer le calcul des récompenses :Rollouts multi-étapes avec ART
L’exemple TRL précédent utilise des bacs à sable pour une exécution en une seule passe : un sandbox par complétion, une seule exécution, puis le renvoi d’une récompense. Cette approche convient pour entraîner des modèles à générer du code correct du premier coup. Les rollouts multi-étapes avec état fonctionnent différemment : l’agent effectue plusieurs actions au sein d’un même sandbox, qui conserve son état d’une action à l’autre. L’agent peut écrire un fichier, l’exécuter, observer l’erreur, modifier le fichier et réessayer, le tout dans le même sandbox. Le répertoireexamples/rl_training/art/ illustre ce schéma sur le benchmark MBPP. Lorsqu’une solution échoue, l’agent reçoit un retour sur l’erreur et peut affiner son approche par itérations successives.
Aperçu
La suite de cette section présente ART, l’approche d’entraînement adoptée par l’exemple, les prérequis, l’installation, la procédure d’exécution de l’exemple et la manière dont les composants s’articulent. ART (Agent Reinforcement Trainer) est un framework de RL open source développé par OpenPipe pour entraîner des agents multi-étapes avec GRPO. Cet exemple intègre les bacs à sable CoreWeave à ART :- Utilise le paquet
art(openpipe-art) pour la collecte de trajectoires et l’entraînement. - Prend en charge deux backends :
LocalBackend(GPU requis) ouTinkerBackend(sans GPU). - Exécute du code par appel d’outils dans une sandbox CoreWeave.
- Calcule des récompenses binaires basées sur les résultats des cas de test MBPP.
Approche d’entraînement avec GRPO et distillation
Cet exemple combine la distillation et l’apprentissage par renforcement : un modèle plus performant génère des démonstrations, et un modèle plus petit apprend à reproduire celles qui aboutissent. Deux modèles interviennent :-
Modèle d’inférence (
--model, par défaut :gpt-5.1-codex-mini) : génère des trajectoires pendant les rollouts. Ce modèle effectue des appels d’outils, consulte les résultats de la sandbox, corrige ses erreurs par itérations successives et soumet des solutions. Il n’est pas entraîné. -
Modèle de base (
--base-model, par défaut :Qwen/Qwen3-8B) : le modèle entraîné. Il reçoit les trajectoires générées par le modèle d’inférence et en tire des enseignements grâce à GRPO (Group Relative Policy Optimization).
- Le modèle d’inférence génère plusieurs trajectoires par problème, chacune comportant des appels d’outils exécutés dans une sandbox CoreWeave.
- Chaque trajectoire reçoit une récompense binaire : 1.0 si les tests réussissent, 0.0 sinon.
- Les trajectoires d’un même problème forment un groupe, au sein duquel GRPO les compare.
- Le modèle de base (Qwen3-8B) est entraîné à privilégier les trajectoires les mieux récompensées par rapport aux autres.
Prérequis
Variables d’environnement :
WANDB_API_KEY avant d’activer son intégration de journalisation. Ajoutez ce mappage de compatibilité dans train.py, avant la création du backend. La clé correspond à une clé API Forge :
Installation
Exécuter l’exemple
Options de configuration
Architecture
art.Trajectory :
execute_code: teste le code dans la sandbox et renvoie stdout/stderr.submit_solution: soumet la solution finale et exécute tous les cas de test.
Flux de données
Le pipeline d’entraînement comporte plusieurs composants :-
Machine locale : le script d’entraînement (
train.py) s’exécute sur votre machine ou votre serveur d’entraînement. Il charge les problèmes du dataset MBPP et orchestre la boucle d’entraînement. - API OpenAI (inférence) : pendant la collecte des trajectoires, le code du rollout appelle l’API OpenAI (ou un point de terminaison compatible) pour générer les réponses du modèle. Le modèle reçoit les définitions d’outils et renvoie des appels d’outils que le rollout exécute.
-
Sandbox CoreWeave (exécution du code) : chaque rollout utilise une seule sandbox CoreWeave, conservée pendant tous les appels d’outils. Lorsque le modèle appelle
execute_codeousubmit_solution, le code s’exécute dans cette sandbox. Les modifications de fichiers et l’état s’accumulent donc au fil des itérations de l’agent : il peut écrire un fichier, l’exécuter, constater une erreur et la corriger. La sandbox assure l’isolation, de sorte que le code non fiable généré par le modèle ne peut pas affecter l’hôte. Les résultats (stdout, stderr, code de sortie) sont renvoyés au rollout. -
Collecte des trajectoires : le rollout accumule l’historique de la conversation (messages et résultats d’outils), ainsi que la récompense finale, dans un objet
art.Trajectory. Plusieurs trajectoires portant sur un même problème forment unart.TrajectoryGroup. -
Backend d’entraînement : les groupes de trajectoires collectés sont envoyés au backend d’entraînement. Avec
LocalBackend, l’entraînement s’effectue sur votre GPU local. AvecTinkerBackend, les trajectoires sont téléversées vers le service Tinker de Thinking Machines, qui se charge de l’entraînement à distance. Aucun GPU local n’est alors nécessaire.