Les clusters d'entraînement Vertex AI utilisent Simple Linux Utility for Resource Management (Slurm) comme orchestrateur pour gérer et planifier les jobs sur votre cluster.
Slurm est un système de gestion de clusters et de planification de tâches Open Source très utilisé, connu pour son évolutivité et sa tolérance aux pannes.
Fonctionnalités clés de Slurm
- Slurm alloue un ensemble de nœuds de calcul à l'usage exclusif d'un job spécifique pendant une période définie. Cela garantit qu'un job dispose d'un accès dédié aux ressources dont il a besoin pour s'exécuter sans interférence.
- Slurm fournit un framework permettant de gérer l'intégralité du cycle de vie d'un job, de l'envoi à l'exécution, en passant par la surveillance et l'achèvement. Ce système est spécifiquement conçu pour gérer les jobs parallèles qui s'exécutent sur un ensemble de nœuds alloués.
- Slurm gère une file d'attente des jobs en attente à l'aide d'un moteur de priorisation sophistiqué pour arbitrer l'accès aux ressources de calcul. En tenant compte de facteurs tels que la taille du job, la priorité de l'utilisateur et le temps d'attente, ce système garantit une utilisation équitable et efficace des ressources dans l'ensemble du cluster.
Configuration de base du cluster
Avant de pouvoir exécuter des jobs, vous devez définir la structure fondamentale de votre cluster Slurm. Cette section décrit en détail les paramètres de configuration essentiels, y compris comment organiser les nœuds de calcul en partitions, spécifier un pool de nœuds de connexion dédié et configurer un répertoire personnel partagé pour vos utilisateurs.
Partitions
Les partitions regroupent les nœuds en ensembles logiques, ce qui peut être utile pour gérer différents types de machines ou niveaux d'accès. Elles sont définies sous forme de liste dans le champ "partitions" de slurm_spec.
Chaque objet de partition comporte les champs obligatoires suivants :
id: identifiant unique de la partition.node_pool_ids: liste contenant les ID d'un ou de plusieurs pools de nœuds appartenant à cette partition.
Exemple :
"partitions": [
{
"id": "a4",
"node_pool_ids": [ "a4" ]
}
]
Nœuds de connexion
Le pool de nœuds de connexion fournit des nœuds dédiés qui servent de point d'entrée principal pour les utilisateurs qui souhaitent interagir avec le cluster. Le champ login_node_pool_id spécifie l'identifiant unique de ce pool.
Exemple :
"login_node_pool_id": "login"
Stockage du répertoire d'accueil
Le champ home_directory_storage spécifie l'instance Filestore à monter en tant que répertoire /home sur tous les nœuds du cluster. Cela fournit un répertoire personnel partagé et persistant pour tous les utilisateurs.
Pour cette valeur, vous devez indiquer le nom complet de la ressource de l'instance Filestore.
Exemple :
"home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_NAME"
Configuration avancée de Slurm
Les clusters d'entraînement Vertex AI vous permettent de personnaliser un ensemble de paramètres slurm.conf. Toutefois, sachez que ces paramètres ne peuvent être configurés que lors de la création initiale du cluster et ne peuvent pas être modifiés par la suite.
Comptabilité
Les clusters d'entraînement Vertex AI vous permettent d'utiliser des fonctionnalités de comptabilité intégrées pour suivre l'utilisation des ressources dans votre cluster. Pour obtenir un guide complet sur la surveillance des métriques telles que le temps CPU et l'utilisation de la mémoire spécifiques à un job, consultez la documentation officielle sur la comptabilité Slurm.
| Paramètre | Valeur | Exemple |
|---|---|---|
| AccountingStorageEnforce | Chaînes séparées par une virgule | associations,limits,qos |
Préemption et priorité
Pour gérer la planification et la priorité des jobs, les clusters d'entraînement Vertex AI vous permettent de configurer la préemption des jobs Slurm. La préemption fonctionne avec le plug-in de priorité multifactorielle pour déterminer si les jobs en cours d'exécution doivent être mis en pause pour laisser la place à des tâches de priorité plus élevée.
Pour obtenir une présentation conceptuelle complète, consultez la documentation officielle de Slurm sur le plug-in de priorité multifactorielle et la préemption.
Paramètres de préemption
| Paramètre | Valeur | Exemple |
|---|---|---|
| PREEMPT_TYPE | Chaîne | preempt/partition_prio |
| PREEMPT_MODE | Chaînes séparées par une virgule | SUSPEND,GANG |
| PREEMPT_EXEMPT_TIME | Chaîne | 00:00:00 |
Paramètres de priorité
| Paramètre | Valeur | Exemple |
|---|---|---|
| PRIORITY_TYPE | Chaîne | priority/multifactor |
| PRIORITY_WEIGHT_AGE | Integer | 0 |
| PRIORITY_WEIGHT_ASSOC | Integer | 0 |
| PRIORITY_WEIGHT_FAIRSHARE | Integer | 0 |
| PRIORITY_WEIGHT_JOB_SIZE | Integer | 0 |
| PRIORITY_WEIGHT_PARTITION | Integer | 0 |
| PRIORITY_WEIGHT_QOS | Integer | 0 |
| PRIORITY_WEIGHT_TRES | Chaînes séparées par une virgule | cpu=100,mem=150 |
Scripts de prologue et d'épilogue
Vous pouvez configurer des scripts Bash personnalisés pour qu'ils s'exécutent automatiquement au début (prologue) et à la fin (épilogue) de chaque job à l'aide des champs suivants :
prolog_bash_scripts: liste de chaînes, où chaque chaîne contient l'intégralité du contenu d'un script Bash à exécuter avant le début du job.epilog_bash_scripts: liste de chaînes, où chaque chaîne contient l'intégralité du contenu d'un script Bash à exécuter une fois le job terminé.
Cela s'avère utile pour configurer un environnement de job unique ou effectuer des tâches de nettoyage automatisées.
Exemple de spécification de cluster
L'exemple suivant montre une configuration JSON complète pour créer un cluster d'entraînement. Vous pouvez adapter cette spécification à vos besoins.
{ // ... other cluster configurations ... "orchestratorSpec": { "slurmSpec": { "partitions": [ { "id": "a4", "node_pool_ids": ["a4"] } ], "login_node_pool_id": "login", "home_directory_storage": "projects/PROJECT_ID/locations/REGION-ZONE/instances/FILESTORE_INSTANCE_ID", "accounting": { "accounting_storage_enforce": "ACCOUNTING_STORAGE_ENFORCE" }, "scheduling": { "priority_type": "PRIORITY_TYPE", "priority_weight_age": PRIORITY_WEIGHT_AGE, "priority_weight_assoc": PRIORITY_WEIGHT_ASSOC, "priority_weight_fairshare": PRIORITY_WEIGHT_FAIRSHARE, "priority_weight_job_size": PRIORITY_WEIGHT_JOB_SIZE, "priority_weight_partition": PRIORITY_WEIGHT_PARTITION, "priority_weight_qos": PRIORITY_WEIGHT_QOS, "priority_weight_tres": "PRIORITY_WEIGHT_TRES", "preempt_type": "PREEMPT_TYPE", "preempt_mode": "PREEMPT_MODE", "preempt_exempt_time": "PREEMPT_EXEMPT_TIME" }, "prolog_bash_scripts": [ "#!/bin/bash\necho 'First prolog script running'", "#!/bin/bash\necho 'Second prolog script running'" ], "epilog_bash_scripts": [ "#!/bin/bash\necho 'Epilog script running'" ] // ... other Slurm settings ... } } }
Gestion et opérations des clusters
Gérer un cluster en cours d'exécution
Une fois votre cluster créé avec les paramètres de comptabilité et de préemption choisis, vous pouvez utiliser les outils de ligne de commande de Slurm pour gérer les comptes utilisateur et surveiller la planification des tâches.
Gérer votre compte avec sacctmgr
La commande sacctmgr est l'outil principal pour gérer les informations sur les utilisateurs et les comptes dans la base de données Slurm. Par exemple, pour ajouter un utilisateur à un compte et lui accorder l'accès à une partition, exécutez la commande suivante :
sudo sacctmgr add User Accounts=<account> Partition=<partition> <user>
Pour obtenir la liste complète de toutes les options sacctmgr, consultez la documentation officielle sur la comptabilité Slurm.
Vérifier la priorité d'un job
Pour vérifier les composants prioritaires de chaque job dans la file d'attente, utilisez l'utilitaire sprio. Cela permet de comprendre pourquoi certaines tâches sont planifiées avant d'autres.
Pour en savoir plus sur l'utilisation, consultez la documentation de l'utilitaire sprio.
Exemples de préemption
La documentation officielle de Slurm fournit plusieurs exemples concrets de différentes stratégies de préemption. Vous les trouverez sur la page Préemption Slurm.
Étapes suivantes
La suite se concentre sur les dernières étapes du cycle de vie du machine learning : la gestion, le déploiement et la surveillance de vos modèles entraînés.
- Déployez votre modèle pour l'inférence : déployez votre modèle entraîné sur un point de terminaison Vertex AI pour répondre aux demandes d'inférence en ligne à grande échelle.
- Gérez le cycle de vie de votre modèle : utilisez Vertex AI Model Registry pour versionner, comparer et gérer vos modèles. Un pipeline peut être configuré pour enregistrer automatiquement un nouveau modèle une fois l'entraînement réussi.
- Surveillez les exécutions de votre pipeline et les performances de votre modèle :
- Surveillance des pipelines : suivez le graphique d'exécution, les artefacts et les performances de vos exécutions de pipeline pour déboguer les problèmes et optimiser votre orchestration.
- Model Monitoring : après le déploiement, configurez la surveillance pour détecter les dérives et les anomalies dans les performances de prédiction de votre modèle. Cela vous aidera à maintenir la précision du modèle au fil du temps.
- Optimisez les coûts et gérez le cycle de vie du cluster : lorsque vous utilisez des pipelines automatisés, gérez le cycle de vie du cluster en tenant compte de la fréquence d'exécution.
- Pour les exécutions peu fréquentes, ajoutez une dernière étape de pipeline pour supprimer le cluster et réduire les coûts. Cela implique généralement de créer un composant de pipeline personnalisé qui appelle la fonction de suppression.
- Pour les exécutions fréquentes, laissez le cluster actif afin de réduire le temps de démarrage des jobs.