exec-slurm-compile

Par nvidia · skills

Compilez TensorRT-LLM sur un cluster SLURM. Couvre la soumission d'un job batch avec une image de conteneur, le suivi du job et la vérification du build. À utiliser lorsque l'utilisateur souhaite compiler TRT-LLM à distance via SLURM plutôt que sur un nœud de calcul local.

npx skills add https://github.com/nvidia/skills --skill exec-slurm-compile

Compiler TensorRT-LLM sur un cluster SLURM

Soumettez, surveillez et vérifiez une tâche de compilation TensorRT-LLM sur un cluster SLURM à l'aide de conteneurs enroot.

Quand l'utiliser

Scénario Utiliser cette skill ?
L'utilisateur veut compiler TRT-LLM sur un cluster SLURM Oui
L'utilisateur est déjà sur un nœud de calcul et veut compiler Non — utilisez plutôt la skill exec-local-compile

Trouver l'image Docker

La balise officielle de l'image Docker pour une version donnée de TensorRT-LLM est enregistrée dans le dépôt lui-même :

<repo_dir>/jenkins/current_image_tags.properties

Lisez ce fichier pour trouver l'URL de l'image actuelle (par exemple, urm.nvidia.com/sw-tensorrt-docker/tensorrt-llm:pytorch-25.12-py3-aarch64-ubuntu24.04-trt10.14.1.48-skip-tritondevel-202602011118-10901).

Pré-dumper l'image du conteneur (enroot import)

Les clusters SLURM utilisant enroot/pyxis nécessitent une image de conteneur .sqsh. Pour éviter la surcharge de téléchargement au moment de la compilation, pré-dumpez l'image à l'avance en utilisant le script compagnon enroot-import :

# Utilisation basique — soumet une tâche SLURM sur une partition CPU pour importer l'image
enroot-import --partition cpu_datamover --debug <docker_image_url>

Le script soumet une tâche sbatch qui exécute enroot import docker://<image_url> et produit un fichier .sqsh dans le répertoire courant. La sortie sur stdout est l'ID de la tâche SLURM.

Flags enroot-import

Flag Description
-p, --partition Partition SLURM pour la tâche d'import (utilisez une partition CPU comme cpu_datamover)
-d, --debug Activer la sortie de débogage et préserver le journal SLURM (recommandé)
-o, --output Chemin de sortie personnalisé pour le fichier .sqsh
-A, --account Compte SLURM (par défaut, le premier compte de l'utilisateur)
-t, --time Limite de temps pour la tâche d'import (par défaut : 1 heure)
-n, --just-print Afficher la commande sbatch sans l'exécuter
-J, --job-name Nom de tâche personnalisé

Flux de travail enroot-import

  1. Lisez la balise de l'image depuis jenkins/current_image_tags.properties dans le dépôt TRT-LLM.
  2. Exécutez enroot-import pour soumettre la tâche d'import :
    cd <directory_where_sqsh_should_be_stored>
    <path_to>/enroot-import --partition cpu_datamover --debug <image_url>

    IMPORTANT : Convertissez urm.nvidia.com/sw-tensorrt-docker/tensorrt-llm:xxx en urm.nvidia.com#sw-tensorrt-docker/tensorrt-llm:xxx pour éviter les problèmes d'authentification.

  3. Attendez que la tâche d'import se termine (squeue -j <job_id>).
  4. Le fichier .sqsh obtenu est l'container_image utilisé à l'étape de compilation.

Prérequis

L'utilisateur doit fournir (ou vous devez demander) ces valeurs :

Paramètre Description Exemple
container_image Chemin vers l'image de conteneur .sqsh (voir enroot import ci-dessus) /path/to/pytorch.sqsh
repo_dir Chemin vers le dépôt TensorRT-LLM /path/to/TensorRT-LLM
mount_dir Répertoire de haut niveau à bind-monter dans le conteneur /shared/users
partition Partition SLURM batch
account Compte SLURM my_account

Paramètres optionnels :

Paramètre Description Par défaut
jobname Nom de la tâche SLURM trtllm-compile.<username>
gpu_count Nombre de GPUs à demander 4
time_limit Limite de temps de la tâche 02:00:00
arch Architecture(s) GPU pour le flag -a 100-real
extra_build_args Flags supplémentaires pour build_wheel.py (aucun)

Scripts compagnons

Cette skill inclut trois scripts compagnons dans scripts/ :

Script Objectif
enroot-import Pré-dumper une image Docker en .sqsh via une tâche batch SLURM
submit_compile.sh Modèle pour soumettre la tâche SLURM — copiez et personnalisez
compile.slurm Script batch SLURM — lance le conteneur et appelle compile.sh
compile.sh S'exécute à l'intérieur du conteneur — exécute build_wheel.py

Répertoire des scripts : skills/exec-slurm-compile/scripts/

Instructions

Suivez ces étapes dans l'ordre :

Étape 0 : Résoudre l'image du conteneur (si nécessaire)

Si l'utilisateur n'a pas déjà une image de conteneur .sqsh :

  1. Lisez la balise de l'image Docker depuis <repo_dir>/jenkins/current_image_tags.properties.
  2. Utilisez enroot-import pour la pré-dumper :
    cd <directory_for_sqsh_files>
    <scripts_dir>/enroot-import --partition cpu_datamover --debug <image_url>
  3. Surveillez la tâche d'import avec squeue -j <job_id>.
  4. Une fois terminée, le chemin du fichier .sqsh devient le paramètre container_image.

Si l'utilisateur a déjà un fichier .sqsh, ignorez cette étape.

Étape 1 : Recueillir les informations

Demandez à l'utilisateur les valeurs de prérequis manquantes listées ci-dessus. Au minimum, vous devez avoir :

  • container_image (ou l'URL de l'image Docker — exécutez alors l'étape 0 en premier)
  • repo_dir
  • mount_dir
  • partition et account

Si l'utilisateur a utilisé ce flux de travail avant, vérifiez si les valeurs précédentes sont stockées dans des fichiers de mémoire.

Étape 2 : Préparer le répertoire des scripts

Les scripts de compilation doivent être accessibles de l'intérieur du conteneur (c'est-à-dire sous mount_dir). Soit :

Option A — Copiez les scripts compagnons vers un emplacement sous mount_dir :

scripts_dir=<mount_dir>/<username>/workspace/tensorrt_llm_scripts
mkdir -p ${scripts_dir}/log
cp skills/exec-slurm-compile/scripts/compile.sh ${scripts_dir}/
cp skills/exec-slurm-compile/scripts/compile.slurm ${scripts_dir}/
chmod +x ${scripts_dir}/compile.sh ${scripts_dir}/compile.slurm

Option B — Si l'utilisateur a déjà des scripts à un emplacement connu, utilisez-les directement.

Étape 3 : Soumettre la tâche

Exécutez sbatch depuis le nœud de connexion (ou un nœud avec accès au client SLURM) :

sbatch \
    --nodes=1 --ntasks=1 --ntasks-per-node=1 \
    --gres=gpu:<gpu_count> \
    --partition=<partition> \
    --account=<account> \
    --job-name=<jobname> \
    --time=<time_limit> \
    <scripts_dir>/compile.slurm \
    <container_image> <mount_dir> <scripts_dir> <repo_dir>

Capturez et signalez l'ID de la tâche à partir de la sortie sbatch.

Étape 4 : Surveiller la tâche (Proactif — NE PAS attendre l'utilisateur)

Vous DEVEZ interroger activement la tâche jusqu'à ce qu'elle se termine. Ne soumettez pas et ne vous en allez pas.

# Vérifiez l'état de la tâche (répétez toutes les 30-60 secondes)
squeue -j <job_id> -o "%.18i %.9P %.30j %.8u %.2t %.10M %.6D %R"

# Une fois en cours d'exécution, affichez périodiquement la fin du journal (n'utilisez PAS tail -f, utilisez tail -30 à la place)
tail -30 <scripts_dir>/log/compile_<job_id>.srun.log

Boucle de surveillance :

  1. Interrogez squeue -j <job_id> pour vérifier l'état
  2. Si PD (en attente) — signalez la raison, continuez à interroger toutes les 30-60s
  3. Si R (en cours d'exécution) — affichez la fin du journal de compilation toutes les 30-60s ; cherchez [XX%] Building, les erreurs ou la fin
  4. Si la tâche disparaît de squeue, elle s'est terminée — passez à l'étape 5
  5. Si F (échouée) — lisez immédiatement le journal complet et signalez l'erreur

Indicateurs de progression à chercher dans le journal :

  • [XX%] Building CXX object... — progression de la compilation
  • Linking CXX... — phase de liaison
  • FAILED:, error:, fatal error: — échec de la compilation
  • Successfully built — succès

Étape 5 : Vérifier la compilation

Une fois la tâche terminée, vérifiez le succès :

# Vérifiez le code de sortie SLURM
sacct -j <job_id> --format=JobID,State,ExitCode,Elapsed

# Vérifiez le journal de compilation pour les erreurs
tail -50 <scripts_dir>/log/compile_<job_id>.srun.log

Une compilation réussie se termine par un message comme Successfully built tensorrt_llm ou se termine sans erreur.

Référence des flags de compilation courants

Flag Description
--trt_root /usr/local/tensorrt Chemin d'installation de TensorRT (standard dans les conteneurs NVIDIA)
--benchmarks Compiler les benchmarks C++
-a "100-real" Architecture cible — 100 pour Blackwell, 90 pour Hopper, etc.
--nvtx Activer les marqueurs NVTX pour le profilage
--no-venv Ignorer la création d'environnement virtuel
-ccache Utiliser ccache pour accélérer la recompilation
--skip_building_wheel Compiler sur place sans créer de fichier wheel
-f Compilation rapide — ignorer certains kernels pour une compilation développeur plus rapide
-c Compilation propre — effacer le répertoire de compilation avant de compiler

Valeurs d'architecture courantes :

  • "100-real" — Blackwell (B200, GB200)
  • "90-real" — Hopper (H100, H200)
  • "89-real" — Ada Lovelace (L40S)
  • "80-real" — Ampere (A100)
  • "90;100-real" — Plusieurs architectures

Dépannage

Problème Solution
sbatch: error: invalid partition Vérifiez le nom de la partition avec sinfo -s
sbatch: error: invalid account Vérifiez les comptes disponibles avec sacctmgr show assoc user=$USER
Image de conteneur introuvable Vérifiez que le chemin .sqsh existe et est lisible
Compilation échoue avec TensorRT manquant Assurez-vous que --trt_root pointe vers le bon chemin à l'intérieur du conteneur
Compilation OOM (mémoire insuffisante) Réduisez le parallélisme avec le flag -j <N> vers build_wheel.py
srun: error: Unable to create step Le nœud peut manquer d'enroot/pyxis — vérifiez auprès de l'administrateur du cluster
Tâche bloquée dans l'état PD Vérifiez squeue -j <id> -o %R pour la raison (par exemple, limites de ressources, priorité)
enroot import échoue avec erreur d'authentification Vérifiez que ~/.config/enroot/.credentials contient les bonnes identifiants de registre
enroot import produit un .sqsh vide ou corrompu Réexécutez avec --debug et vérifiez le journal SLURM ; assurez-vous que l'URL de l'image n'a pas de préfixe https://
Problèmes de compilation étranges Réessayez avec une compilation propre (flag -c)
QOSGrpNodeLimit affiché dans NODELIST(REASON) Pas un problème, attendez simplement que la tâche soit programmée

Exemple d'interaction

Utilisateur : « Compiler TRT-LLM sur le cluster OCI »

Actions de l'agent :

  1. Demander le chemin de l'image de conteneur, le chemin du dépôt, le répertoire de montage (si non connus)
  2. Confirmer la partition/le compte pour le cluster OCI
  3. Copier les scripts vers un emplacement accessible sous mount_dir
  4. Soumettre avec sbatch
  5. Signaler l'ID de la tâche
  6. Surveiller avec squeue jusqu'à la fin
  7. Vérifier les journaux et signaler le succès/l'échec

Skills similaires