Les clusters d'entraînement Vertex AI utilisent Simple Linux Utility for Resource Management (Slurm) comme orchestrateur pour gérer et planifier les tâches sur votre cluster.
Slurm est un système de gestion de clusters et de planification de tâches Open Source largement utilisé, connu pour son évolutivité et sa tolérance aux pannes.
Principales fonctionnalités de Slurm
- Slurm alloue un ensemble de nœuds de calcul à l'usage exclusif d'une tâche spécifique pendant une période définie. Cela garantit qu'une tâche dispose d'un accès dédié aux ressources dont elle a besoin pour s'exécuter sans interférence.
- Slurm fournit un framework pour gérer le cycle de vie complet d'une tâche, de l'envoi à l'exécution, en passant par la surveillance et l'achèvement. Ce système est spécialement conçu pour gérer les tâches parallèles qui s'exécutent sur un ensemble de nœuds alloués.
- Slurm gère une file d'attente de tâches en attente à l'aide d'un moteur de hiérarchisation sophistiqué pour arbitrer l'accès aux ressources de calcul. En tenant compte de facteurs tels que la taille de la tâche, 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 tâches, vous devez définir la structure fondamentale de votre cluster Slurm. Cette section décrit 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 d'accueil 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 que les utilisateurs interagissent 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 à installer en tant que répertoire /home sur tous les nœuds du cluster. Cela fournit un répertoire d'accueil partagé et persistant pour tous les utilisateurs.
Vous devez fournir le nom complet de la ressource de l'instance Filestore pour cette valeur.
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, mais 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 spécifique à la tâche et l'utilisation de la mémoire, 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 hiérarchisation des tâches, les clusters d'entraînement Vertex AI vous permettent de configurer la préemption des tâches de Slurm. La préemption fonctionne avec le plug-in de priorité multifactorielle pour déterminer si les tâches en cours d'exécution doivent être mises 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 | Entier | 0 |
| PRIORITY_WEIGHT_ASSOC | Entier | 0 |
| PRIORITY_WEIGHT_FAIRSHARE | Entier | 0 |
| PRIORITY_WEIGHT_JOB_SIZE | Entier | 0 |
| PRIORITY_WEIGHT_PARTITION | Entier | 0 |
| PRIORITY_WEIGHT_QOS | Entier | 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 tâche à l'aide des champs suivants :
prolog_bash_scripts: liste de chaînes, où chaque chaîne contient l'intégralité d'un script Bash à exécuter avant le début de la tâche.epilog_bash_scripts: liste de chaînes, où chaque chaîne contient l'intégralité d'un script Bash à exécuter une fois la tâche terminée.
Cela est utile pour configurer un environnement de tâche 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 du cluster
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.
Gestion des comptes 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é des tâches
Pour vérifier les composants de priorité de chaque tâche dans la file d'attente, utilisez l'utilitaire sprio. Cela est utile pour 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 de Slurm.
Étape suivante
La section suivante 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éployer 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érer le cycle de vie de votre modèle : utilisez Vertex AI Model Registry pour gérer les versions, 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.
- Surveiller 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 des exécutions de votre pipeline pour déboguer les problèmes et optimiser votre orchestration.
- Surveillance des modèles : 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, ce qui permet de maintenir la précision du modèle au fil du temps.
- Optimiser les coûts et gérer 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 afin de 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 tâches.