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
- Lisez la balise de l'image depuis
jenkins/current_image_tags.propertiesdans le dépôt TRT-LLM. - Exécutez
enroot-importpour 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:xxxenurm.nvidia.com#sw-tensorrt-docker/tensorrt-llm:xxxpour éviter les problèmes d'authentification. - Attendez que la tâche d'import se termine (
squeue -j <job_id>). - Le fichier
.sqshobtenu est l'container_imageutilisé à 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 :
- Lisez la balise de l'image Docker depuis
<repo_dir>/jenkins/current_image_tags.properties. - Utilisez
enroot-importpour la pré-dumper :cd <directory_for_sqsh_files> <scripts_dir>/enroot-import --partition cpu_datamover --debug <image_url> - Surveillez la tâche d'import avec
squeue -j <job_id>. - Une fois terminée, le chemin du fichier
.sqshdevient le paramètrecontainer_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_dirmount_dirpartitionetaccount
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 :
- Interrogez
squeue -j <job_id>pour vérifier l'état - Si
PD(en attente) — signalez la raison, continuez à interroger toutes les 30-60s - 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 - Si la tâche disparaît de
squeue, elle s'est terminée — passez à l'étape 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 compilationLinking CXX...— phase de liaisonFAILED:,error:,fatal error:— échec de la compilationSuccessfully 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 :
- Demander le chemin de l'image de conteneur, le chemin du dépôt, le répertoire de montage (si non connus)
- Confirmer la partition/le compte pour le cluster OCI
- Copier les scripts vers un emplacement accessible sous mount_dir
- Soumettre avec
sbatch - Signaler l'ID de la tâche
- Surveiller avec
squeuejusqu'à la fin - Vérifier les journaux et signaler le succès/l'échec