Skip to main content
Ce guide explique comment utiliser des bacs à sable sans serveur dans des workflows d’entraînement par apprentissage par renforcement (RL), où les modèles exécutent des appels d’outils dans des environnements isolés. Il s’adresse aux ingénieurs ML et aux chercheurs qui conçoivent des pipelines d’entraînement d’agents et ont besoin d’environnements éphémères et sécurisés pour évaluer les actions générées par les modèles et calculer les récompenses.

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éfinissez CWSANDBOX_API_KEY sur un jeton d’accès à l’API CoreWeave :
Installez le SDK Python :
Les exemples de cette page créent des bacs à sable à partir de 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.
La sandbox persiste d’un appel d’outil à l’autre au sein d’un épisode, si bien que les modifications de fichiers s’accumulent au fil du travail de l’agent.

É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 :
Métadonnées utiles à inclure dans les étiquettes : 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).
Utilisation des bacs à sable CoreWeave : L’exemple utilise cwsandbox.wait() pour traiter les résultats dès qu’ils sont disponibles :
Exécutez-le :
Aucune dépendance supplémentaire n’est requise. Aucun GPU n’est nécessaire. Sortie attendue : Les résultats s’affichent au fur et à mesure que les exécutions se terminent, si bien que les problèmes les plus rapides sont traités en premier :

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{}) :
Cette approche convient à l’entraînement de modèles chargés de générer du code correct en un seul tour de conversation.

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.
Utilisation des bacs à sable CoreWeave : La fonction de récompense extrait le code des balises <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 :
Les prompts utilisent un message système qui demande au modèle de formater le code avec des balises <answer> :
La Session suit les bacs à sable et les nettoie à sa fermeture. Exécutez-le :
Un GPU est recommandé pour obtenir des performances correctes. Sans GPU, l’entraînement fonctionne, mais il est lent. Sortie attendue :
Comprendre la sortie : Le nombre de bacs à sable varie d’une étape à l’autre, car le script ne crée des bacs à sable que lorsque 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.
Ce comportement est normal avec un petit modèle non entraîné. Au fil de l’entraînement, vous devriez constater moins de complétions ignorées et davantage de réussites.

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é :
Lors du calcul de la récompense, interceptez les exceptions et renvoyez une récompense par défaut plutôt que de les propager jusqu’à la boucle d’entraînement.

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 paquet wandb 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 :
Transmettez explicitement la clé à 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ètre report_to :

Métriques

Les métriques d’exécution sont suivies automatiquement à la fin de exec() : 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 :
Vous pouvez également accéder aux statistiques de chaque sandbox via la propriété 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.
Exemple d’utilisation dans un tableau de bord :
  • Tracez avg_execs_per_sandbox en 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_sandbox dé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.
Par défaut, log_metrics() réinitialise les compteurs après la journalisation. Définissez reset=False pour continuer à les cumuler :
Les métriques sont également journalisées automatiquement à la fermeture de la session : vous obtenez ainsi les métriques récapitulatives finales, même sans journalisation explicite.

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épertoire examples/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) ou TinkerBackend (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 :
  1. 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é.
  2. 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).
Fonctionnement :
  1. 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.
  2. Chaque trajectoire reçoit une récompense binaire : 1.0 si les tests réussissent, 0.0 sinon.
  3. Les trajectoires d’un même problème forment un groupe, au sein duquel GRPO les compare.
  4. Le modèle de base (Qwen3-8B) est entraîné à privilégier les trajectoires les mieux récompensées par rapport aux autres.
Après l’entraînement, vous déployez Qwen3-8B avec les mêmes définitions d’outils. En imitant les trajectoires réussies du modèle d’inférence, il a appris à effectuer des appels d’outils similaires.

Prérequis

Variables d’environnement :
Pour journaliser dans Weights & Biases (facultatif), définissez une clé API Forge :
ART 0.5.7 vérifie l’ancienne variable 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

Cette commande installe :
Pour LocalBackend avec prise en charge des GPU, installez également :

Exécuter l’exemple

Sortie attendue :

Options de configuration

Architecture

Principaux imports d’ART :
Le rollout renvoie art.Trajectory :
Modèle d’appel d’outils : Le rollout utilise l’appel d’outils compatible avec OpenAI, avec les deux outils suivants :
  • 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.
Les bacs à sable sont tagués à des fins de suivi :

Flux de données

Le pipeline d’entraînement comporte plusieurs composants :
  1. 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.
  2. 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.
  3. 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_code ou submit_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.
  4. 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 un art.TrajectoryGroup.
  5. 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. Avec TinkerBackend, 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.
Dernière modification le 15 octobre 2026