Skip to main content
Acheminez les pods de sandbox exclusivement CPU via le SUNK Pod Scheduler afin que Slurm gère leur placement aux côtés des tâches Slurm exécutées dans votre cluster. Les bacs à sable deviennent des tâches Slurm ordinaires et peuvent s’exécuter sur n’importe quel nœud du cluster disposant de ressources libres, y compris en partageant des ressources CPU avec d’autres tâches Slurm ou bacs à sable déjà en cours d’exécution sur ce même nœud. La politique d’un exécuteur définit l’ordonnanceur SUNK pour chaque sandbox placée sur cet exécuteur. Les clients sélectionnent l’exécuteur au moyen du placement CoreWeave Kubernetes Service (CKS). Ce guide s’adresse aux opérateurs de cluster chargés de configurer la politique ainsi qu’aux auteurs de charges de travail qui lancent des bacs à sable.
Prise en charge limitée au CPULes bacs à sable GPU sont en préversion privée et ne sont pas encore pris en charge par l’intégration au SUNK Pod Scheduler. Consultez Bacs à sable GPU pour connaître les options de placement prises en charge et savoir comment demander l’accès.Les bacs à sable exclusivement CPU peuvent être placés sur des nœuds CPU inactifs, partager des nœuds CPU avec d’autres bacs à sable ou tâches Slurm, et partager des ressources CPU sur des nœuds GPU où s’exécutent d’autres charges de travail. Consultez Limitations connues pour plus de détails.

Prérequis

  • Un cluster CKS sur lequel SUNK est déployé et le SUNK Pod Scheduler activé.
  • Un exécuteur de sandbox CoreWeave déployé sur le même cluster.
  • La CoreWeave Intelligent CLI (cwic) v1.44.0 ou version ultérieure, installée et authentifiée. Pour plus de détails sur la configuration, voir Déployer et gérer un runner.
  • Le rôle sandbox_admin, pour consulter et mettre à jour la politique de l’exécuteur, ainsi que l’autorisation de mettre à jour le déploiement Slurm.
  • cwsandbox >= 1.0.0, installé et authentifié, pour l’API de sandbox v1.
  • kubectl et yq pour l’inspection du cluster. Les exemples HTTP utilisent également curl, jq et un jeton API CoreWeave stocké dans $TOKEN.
Sur l’ensemble de cette page, remplacez [RUNNER-ID] par l’ID de l’exécuteur de votre cluster SUNK.

Étape 1 : Vérifier le SUNK Pod Scheduler

Vérifiez que votre déploiement SUNK est configuré pour fonctionner avec les bacs à sable CoreWeave.
  1. Vérifiez que l’ordonnanceur est en cours d’exécution :
    Si aucun pod n’est renvoyé, activez l’ordonnanceur dans vos valeurs Helm Slurm en définissant scheduler.enabled: true. Pour plus de détails, voir Activer l’ordonnanceur.
  2. Récupérez le nom de l’ordonnanceur. Vous le définirez dans la politique de l’exécuteur à l’étape 2. À partir de SUNK 8.0, l’ordonnanceur lit son nom dans une ConfigMap :
    Sur SUNK 7.x, le nom est plutôt fourni par l’argument --scheduler-name du Pod de l’ordonnanceur. Pour comprendre le fonctionnement sous-jacent, voir Rechercher la configuration de l’ordonnanceur.
  3. Récupérez la valeur de KillWait. Elle vous servira à vérifier l’arrêt des Pods :
    Repérez --slurm-kill-wait dans la sortie :
  4. Configurez la fenêtre d’arrêt de Slurm pour les Pods des bacs à sable. SUNK exige que terminationGracePeriodSeconds soit strictement inférieur à --slurm-kill-wait moins 5 secondes. La politique n’accepte pas base.spec.terminationGracePeriodSeconds. Pour un Pod utilisant le délai de grâce par défaut de Kubernetes (30 secondes), définissez KillWait sur une valeur supérieure à 35 secondes. Par exemple, intégrez ce bloc à vos valeurs Helm Slurm et appliquez la mise à jour via votre processus de déploiement SUNK habituel :
    Cette modification s’applique à la fenêtre d’arrêt de Slurm pour toutes les tâches du cluster. À l’aide de la commande précédente, vérifiez que l’ordonnanceur indique désormais --slurm-kill-wait=60s. Voir Paramètres de configuration de Slurm et Définir le délai de grâce d’arrêt.
    Les bacs à sable dotés d’un stockage compatible avec les instantanés peuvent avoir un délai de grâce de Pod de 300 secondes. Une valeur KillWait de 60 secondes ne suffit pas pour ces Pods. Examinez la valeur terminationGracePeriodSeconds du Pod généré et définissez KillWait sur une valeur supérieure à celle-ci plus 5 secondes. Pour 300 secondes, utilisez par exemple 330. Veillez à ce que le paramètre kill-wait de l’ordonnanceur reste aligné sur celui de Slurm.
  5. Vérifiez que la portée de l’ordonnanceur couvre les namespace des bacs à sable. La sélection des namespace est gérée par l’exécuteur ; il ne s’agit pas d’un champ de la politique. Définissez scheduler.scope.type: cluster pour surveiller tous les namespace des bacs à sable, y compris ceux créés pour de nouveaux utilisateurs. Si vous utilisez scheduler.scope.type: namespace, incluez chaque namespace de bac à sable dans scheduler.scope.namespaces et mettez la liste à jour à mesure que de nouveaux namespace sont créés. Appliquez les modifications de portée via Helm afin que l’ordonnanceur reçoive également les autorisations RBAC requises dans ces namespace. Voir Activer l’ordonnanceur.
  6. Réduisez les demandes de ressources de slurmd sur les NodeSets que vous souhaitez partager avec les bacs à sable. Cette modification s’effectue côté Slurm, dans vos valeurs Helm Slurm, et non dans une configuration de bac à sable. Par défaut, les demandes de ressources des NodeSets consomment la majeure partie de la capacité allouable du nœud dans Kubernetes, ce qui ne laisse aucune place aux pods des bacs à sable. Sans cette modification, les pods des bacs à sable sont rejetés avec des erreurs OutOfMemory ou OutOfcpu. Pour plus de détails sur la configuration, voir Gérer les ressources avec le SUNK Pod Scheduler.

Étape 2 : configurer la politique de l’exécuteur

Chaque exécuteur possède une seule politique. Définissez base.spec.schedulerName dans cette politique pour acheminer ses Pods de sandbox via SUNK. Vous n’avez pas à créer ni à lier de ressource de politique distincte.
Toute mise à jour de la politique remplace l’intégralité du document de politique. Lisez la politique actuelle, conservez ses éléments base joints et ses constraints existants, et ne modifiez que les paramètres nécessaires pour SUNK. Cette modification s’applique aux nouveaux bacs à sable de l’exécuteur. Elle ne déplace pas les bacs à sable en cours d’exécution.
Fusionnez le fragment suivant dans la politique existante de l’exécuteur. Remplacez slurm-scheduler par le nom de l’ordonnanceur obtenu à l’étape 1 :
Lisez la politique actuelle, puis ouvrez-la dans $EDITOR :
Ajoutez schedulerName sous base.spec sans modifier le reste du document. Enregistrez et fermez l’éditeur pour appliquer la politique.Si vous gérez la politique complète dans un fichier, validez puis appliquez ce fichier :
Évitez base.spec.nodeSelector et les restrictions de type d’instance de sandbox qui entrent en conflit avec le placement Slurm. C’est Slurm qui choisit le nœud : un sélecteur Kubernetes contradictoire peut provoquer des échecs NodeAffinity. Pour cibler des nœuds, utilisez des partitions ou des contraintes Slurm au moyen des annotations de l’étape 4.
L’accès réseau est régi par le champ constraints.network et par le trafic sortant déclaré par la sandbox. Conservez les contraintes réseau existantes de l’exécuteur lorsque vous ajoutez l’ordonnancement SUNK. Voir Configurer une politique de sandbox. Les modifications de politique peuvent mettre un certain temps à s’appliquer à la création des sandboxes. Avant de vous fier à un nouvel ordonnanceur ou à une annotation épinglée, créez une sandbox et vérifiez les champs de son Pod comme décrit dans Les pods restent en attente. La lecture de la politique peut afficher la nouvelle valeur avant que les nouvelles sandboxes ne l’utilisent. Pour le schéma complet, voir Référence de la politique. Pour la configuration de l’exécuteur, voir Déployer et gérer un runner.

Étape 3 : créer des bacs à sable

Définissez placement_mode="cks" et runner_ids pour sélectionner l’exécuteur dont vous avez configuré la politique. La politique de l’exécuteur fournit automatiquement l’ordonnanceur.
Pour vérifier que la sandbox s’exécute en tant que tâche Slurm, recherchez sa tâche de substitution dans Slurm à l’aide de l’ID de la sandbox affiché dans l’exemple précédent :
Slurm choisit le nœud. Vous ne contrôlez pas le nœud sur lequel la sandbox est placée, sauf si vous ajoutez des annotations Slurm pour orienter l’ordonnanceur de Slurm. Pour utiliser le même exécuteur configuré pour SUNK pour toutes les sandboxes d’une session, définissez les champs de placement dans SandboxDefaults :

Demandes de ressources et comptabilité Slurm

SUNK lit les demandes de ressources (et non les limites) du pod et les convertit en paramètres de tâche Slurm : Slurm utilise ces valeurs pour les décisions d’ordonnancement et pour la comptabilité sacct. SUNK n’exige aucune classe de Qualité de service particulière : les classes Guaranteed (demandes égales aux limites) et Burstable (demandes inférieures aux limites) fonctionnent toutes les deux. Si vous définissez avec ResourceOptions des demandes inférieures aux limites, le pod peut monter jusqu’à ses limites lorsque de la capacité se libère, mais Slurm ne voit que les demandes. Par exemple, une sandbox configurée avec :
apparaît dans sacct comme une tâche de 500m de CPU et 512Mi de mémoire, même si le sandbox peut utiliser jusqu’à 2 CPU et 2Gi lorsque le nœud a de la capacité libre. Pour la référence complète de ResourceOptions, voir Ressources. Dimensionnez les demandes de ressources en fonction des besoins des charges de travail de vos sandbox, tout en laissant suffisamment de place sur les nœuds cibles pour les demandes de ressources de slurmd que vous avez réduites à l’étape 1. Pour connaître les règles sous-jacentes, voir Définir les demandes de ressources et Gérer les ressources avec le SUNK Pod Scheduler.

Étape 4 : contrôler le placement avec des annotations Slurm

Pour contrôler le placement de la sandbox, définissez des annotations SUNK sur la sandbox lors de son lancement. L’exemple suivant force l’exécution de la sandbox sur la partition hpc-prod :

Annotations courantes

Toutes les annotations partagent le préfixe sunk.coreweave.com/. Les annotations couramment utilisées pour contrôler le placement des sandboxes sont les suivantes : Si vous transmettez un nom d’utilisateur au lieu d’un UID numérique à l’annotation user-id, une erreur bloquante empêche Slurm d’ordonnancer la sandbox. Pour trouver l’UID numérique depuis un nœud de connexion Slurm, remplacez [USERNAME] par le nom d’utilisateur Linux à rechercher :
Pour la liste complète, consultez Référence des annotations.

Appliquer les annotations dans la politique

Pour définir un paramètre de tâche Slurm pour chaque sandbox de l’exécuteur, ajoutez l’annotation correspondante à base.metadata.annotations. Par exemple, pour utiliser la partition sandboxes, fusionnez ce fragment dans la politique existante :
Les annotations de la politique prévalent sur les valeurs fournies par le client pour une même clé. Pour permettre aux clients de choisir une valeur, retirez cette clé de base.metadata.annotations et vérifiez que constraints.metadata.denied_annotation_prefixes l’autorise. Par exemple, ne fixez pas sunk.coreweave.com/user-id lorsque les clients doivent faire correspondre la valeur à l’utilisateur d’une tâche d’entraînement.

Faire correspondre l’utilisateur Slurm d’une tâche d’entraînement

Les tâches d’entraînement s’exécutent souvent avec --exclusive=user afin de réserver des nœuds entiers à un seul utilisateur. Les tâches des autres utilisateurs ne peuvent ainsi pas entrer en concurrence pour les ressources de ces nœuds, tandis que le même utilisateur peut toujours y exécuter d’autres tâches, par exemple des bacs à sable qui exploitent le CPU inutilisé en parallèle de l’entraînement sur GPU. Par défaut, les tâches de substitution SUNK s’exécutent en tant que root (UID 0). Comme root n’est pas l’utilisateur qui a soumis la tâche d’entraînement, Slurm ne place pas la tâche de substitution de la sandbox sur le nœud exclusif. Lorsque le code d’entraînement utilise le client Python cwsandbox pour créer des bacs à sable depuis une tâche Slurm en cours d’exécution, il peut lire l’ID utilisateur Slurm de la tâche dans l’environnement et le transmettre sous forme d’annotation. Les tâches de substitution de la sandbox sont alors soumises sous le même utilisateur Slurm que la tâche d’entraînement, ce qui permet à Slurm de les placer sur les mêmes nœuds exclusifs :
L’annotation user-id doit être un UID Linux numérique, et non un nom d’utilisateur. Lorsqu’elle est définie, SUNK attribue également par défaut cette même valeur à group-id. Si l’ID de groupe est différent, définissez sunk.coreweave.com/group-id séparément.

Dépannage

Les sections suivantes vous aident à diagnostiquer les problèmes courants lors de l’exécution de bacs à sable via le SUNK Pod Scheduler.

Les pods restent en attente

Inspectez le Pod de la sandbox pour vérifier que l’exécuteur a bien appliqué le nom de l’ordonnanceur, et pour contrôler son délai de grâce avant arrêt :
Exécutez cette commande pendant que la sandbox est active. Vérifiez que SCHEDULER correspond à l’ordonnanceur SUNK, que sa portée inclut NAMESPACE et que GRACE est strictement inférieur au délai d’attente avant arrêt forcé (kill wait) de l’ordonnanceur, moins 5 secondes. Un délai de grâce de 30 secondes échoue avec le délai d’attente avant arrêt forcé par défaut, qui est de 30 secondes. Si la politique impose une partition, vérifiez que PARTITION y correspond. Si le nom de l’ordonnanceur ou les annotations imposées sont manquants ou incorrects, relisez la politique de l’exécuteur et vérifiez que le client a sélectionné l’exécuteur prévu. Si les Pods nouvellement créés utilisent encore les anciennes valeurs, laissez à la politique le temps de se propager, puis faites une nouvelle tentative avec une autre sandbox.

Tâches de substitution temporairement à l’état « completing »

Lorsqu’une sandbox s’arrête, sa tâche de substitution Slurm reste 30 à 60 secondes à l’état CG (completing), le temps que les scripts de nettoyage s’exécutent et que le nœud soit restitué au pool. Il s’agit du comportement normal de Slurm, qui n’affecte pas les autres tâches exécutées sur le même nœud. Consultez Slurm job states pour la référence complète des états.

Les bacs à sable ne sont pas placés à l’endroit prévu

Slurm détermine le placement des sandbox en fonction des annotations définies par la politique ou transmises par le client. Si les bacs à sable ne sont pas placés sur les nœuds prévus, vérifiez les paramètres de la tâche Slurm. Pour chaque pod de sandbox, SUNK crée une tâche Slurm de substitution nommée <namespace>/<pod-name>. Le nom du pod contient l’ID de la sandbox, disponible côté client via sb.sandbox_id. Pour trouver la tâche de substitution et inspecter ses paramètres, lancez une recherche sur l’ID de la sandbox :
Remplacez [SANDBOX-ID] par la valeur de sb.sandbox_id fournie par le client Python.

Voir aussi

Dernière modification le 15 octobre 2026