Script del ciclo di vita di base forniti da HyperPod - Amazon SageMaker AI

Script del ciclo di vita di base forniti da HyperPod

Questa sezione illustra ogni componente del flusso di base per la configurazione di Slurm su HyperPod, organizzata con un approccio dall’alto verso il basso. Inizia dalla preparazione di una richiesta di creazione del cluster HyperPod per eseguire l’API CreateCluster e prosegue approfondendo la struttura gerarchica fino agli script del ciclo di vita. Utilizza gli script del ciclo di vita di esempio forniti nel repository GitHub Awsome Distributed Training. Clona il repository con il comando seguente.

git clone https://github.com/aws-samples/awsome-distributed-training/

Gli script del ciclo di vita di base per la configurazione di un cluster Slurm su SageMaker HyperPod sono disponibili in 1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config.

cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config

Il diagramma di flusso seguente mostra una panoramica dettagliata di come progettare gli script del ciclo di vita di base. Le descrizioni sotto il diagramma e la guida alle procedure ne spiegano il funzionamento durante la chiamata API CreateCluster di HyperPod.

Un diagramma di flusso dettagliato della creazione del cluster HyperPod e della struttura degli script del ciclo di vita.

Figura: un diagramma di flusso dettagliato della creazione del cluster HyperPod e della struttura degli script del ciclo di vita. (1) Le frecce tratteggiate indicano il punto in cui vengono “richiamate” le caselle e mostrano il flusso dei file di configurazione e la preparazione degli script del ciclo di vita. Il processo inizia dalla preparazione del file provisioning_parameters.json e degli script del ciclo di vita. Questi vengono quindi codificati in lifecycle_script.py per essere eseguiti in ordine collettivamente. Inoltre, lo script lifecycle_script.py viene eseguito dallo script shell on_create.sh e l’operazione deve aver luogo nel terminale dell’istanza HyperPod. (2) Le frecce piene mostrano il flusso principale di creazione del cluster HyperPod e il modo in cui le caselle vengono “richiamate” o “inviate”. on_create.sh è necessario per la richiesta di creazione del cluster, in create_cluster.json o nel modulo di richiesta Crea un cluster nell’interfaccia utente della console. Dopo aver inviato la richiesta, HyperPod esegue l’API CreateCluster in base alle informazioni di configurazione fornite dalla richiesta e dagli script del ciclo di vita. (3) La freccia punteggiata indica che la piattaforma HyperPod crea resource_config.json nelle istanze del cluster durante il provisioning delle risorse del cluster. resource_config.json contiene informazioni sulle risorse del cluster HyperPod come l’ARN del cluster, i tipi di istanze e gli indirizzi IP. È importante notare che gli script del ciclo di vita vanno preparati in modo che prevedano il file resource_config.json durante la creazione del cluster. Per ulteriori informazioni, consulta la guida con le procedure di seguito.

La guida alle procedure seguente spiega cosa succede durante la creazione del cluster HyperPod e come sono progettati gli script del ciclo di vita di base.

  1. create_cluster.json: per inviare una richiesta di creazione del cluster HyperPod, devi preparare un file di richiesta CreateCluster in formato JSON. In questo esempio di best practice, supponiamo che il file di richiesta si chiami create_cluster.json. Scrivi create_cluster.json per allocare gruppi di istanze a un cluster HyperPod. La best practice prevede l’aggiunta di un numero di gruppi di istanze pari al numero di nodi Slurm da configurare sul cluster HyperPod. Assicurati di assegnare nomi distintivi ai gruppi di istanze che assegnerai ai nodi Slurm che intendi configurare.

    Inoltre, devi specificare un percorso al bucket S3 per archiviare l’intero set di file di configurazione e script del ciclo di vita nel campo InstanceGroups.LifeCycleConfig.SourceS3Uri del modulo di richiesta CreateCluster. Inoltre, devi specificare il nome del file di uno script shell del punto di ingresso (chiamato, supponiamo, on_create.sh) in InstanceGroups.LifeCycleConfig.OnCreate.

    Nota

    Se utilizzi il modulo di invio Crea un cluster nell’interfaccia utente della console HyperPod, la console gestisce la compilazione e l’invio della richiesta CreateCluster al posto tuo ed esegue l’API CreateCluster nel backend. In questo caso, non è necessario crearecreate_cluster.json, ma assicurati di specificare le informazioni corrette sulla configurazione del cluster nel modulo di invio Crea un cluster.

  2. on_create.sh: per ogni gruppo di istanze, devi fornire uno script shell del punto di ingresso, on_create.sh per eseguire i comandi, eseguire script per installare pacchetti software e configurare l’ambiente cluster HyperPod con Slurm. Devi preparare due cose: provisioning_parameters.json, richiesto da HyperPod per configurare Slurm, e una serie di script del ciclo di vita per l’installazione dei pacchetti software. Questo script deve essere scritto per trovare ed eseguire i file seguenti, come mostrato nello script di esempio in on_create.sh.

    Nota

    Assicurati di caricare l’intero set di script del ciclo di vita nella posizione S3 specificata in create_cluster.json. Anche il file provisioning_parameters.json deve trovarsi nella stessa posizione.

    1. provisioning_parameters.json: questo è un Modulo di configurazione per il provisioning dei nodi Slurm su HyperPod. Lo script on_create.sh trova questo file JSON e definisce la variabile di ambiente per identificarne il percorso. Tramite questo file JSON, puoi configurare nodi Slurm e opzioni di archiviazione come Amazon FSx per Lustre con cui Slurm può comunicare. In provisioning_parameters.json, assicurati di assegnare i gruppi di istanze del cluster HyperPod utilizzando correttamente i nomi specificati in create_cluster.json per i nodi Slurm in base a come intendi configurarli.

      Il diagramma seguente mostra un esempio di come i due file di configurazione JSON create_cluster.json e provisioning_parameters.json devono essere scritti per assegnare i gruppi di istanze HyperPod ai nodi Slurm. In questo esempio, supponiamo di dover configurare tre nodi Slurm: il nodo controller (gestione), il nodo login (facoltativo) e il nodo di calcolo (worker).

      Suggerimento

      Per aiutarti a convalidare questi due file JSON, il team di assistenza HyperPod fornisce uno script di convalida, validate-config.py. Per ulteriori informazioni, consulta Convalida dei file di configurazione JSON prima di creare un cluster Slurm su HyperPod.

      Confronto diretto tra file .json.

      Figura: un confronto diretto tra create_cluster.json per la creazione di cluster HyperPod e provisiong_params.json per la configurazione di Slurm. Il numero di gruppi di istanze in create_cluster.json deve corrispondere al numero di nodi che intendi configurare come nodi Slurm. Nel caso dell’esempio in figura, verranno configurati tre nodi Slurm su un cluster HyperPod composto da tre gruppi di istanze. È necessario assegnare i gruppi di istanze del cluster HyperPod ai nodi Slurm specificando in modo appropriato i nomi dei gruppi di istanze.

    2. resource_config.json: durante la creazione del cluster, lo script lifecycle_script.py viene scritto in modo da prevedere un file resource_config.json da HyperPod. Questo file contiene informazioni sul cluster, ad esempio i tipi di istanze e gli indirizzi IP.

      Quando esegui l’API CreateCluster, HyperPod crea un file di configurazione delle risorse in /opt/ml/config/resource_config.json in base al file create_cluster.json. Il percorso del file viene salvato nella variabile di ambiente denominata SAGEMAKER_RESOURCE_CONFIG_PATH.

      Importante

      NON è necessario creare il file resource_config.json perché viene generato automaticamente dalla piattaforma HyperPod. Il codice seguente, che mostra un esempio del file resource_config.json generato dalla creazione del cluster in base al file create_cluster.json della fase precedente, ti aiuta a capire cosa succede nel backend e come è fatto un file resource_config.json generato automaticamente.

      { "ClusterConfig": { "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde01234yz", "ClusterName": "your-hyperpod-cluster" }, "InstanceGroups": [ { "Name": "controller-machine", "InstanceType": "ml.c5.xlarge", "Instances": [ { "InstanceName": "controller-machine-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] }, { "Name": "login-group", "InstanceType": "ml.m5.xlarge", "Instances": [ { "InstanceName": "login-group-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] }, { "Name": "compute-nodes", "InstanceType": "ml.trn1.32xlarge", "Instances": [ { "InstanceName": "compute-nodes-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-2", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-3", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-4", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] } ] }
    3. lifecycle_script.py: questo è lo script Python principale che esegue collettivamente gli script del ciclo di vita configurando Slurm sul cluster HyperPod durante il provisioning. Questo script legge provisioning_parameters.json e resource_config.json nei percorsi specificati o identificati in on_create.sh, passa le informazioni pertinenti a ogni script del ciclo di vita e quindi esegue in ordine gli script del ciclo di vita.

      Gli script del ciclo di vita sono un set di script che offre la massima flessibilità di personalizzazione e consente di installare pacchetti software e impostare le configurazioni necessarie o personalizzate durante la creazione di cluster, ad esempio la configurazione di Slurm, la creazione di utenti e l’installazione di Conda o Docker. Lo script lifecycle_script.py di esempio è pronto per eseguire altri script del ciclo di vita di base nel repository, ad esempio per l’avvio di deamons Slurm (start_slurm.sh), il montaggio di Amazon FSx per Lustre (mount_fsx.sh) e la configurazione dell’accounting MariaDB (setup_mariadb_accounting.sh) e RDS (setup_rds_accounting.sh). Puoi anche aggiungere altri script, posizionarli nella stessa directory e aggiungere righe di codice a lifecycle_script.py per consentire a HyperPod di eseguire gli script. Per ulteriori informazioni sugli script del ciclo di vita di base, consulta anche 3.1 Lifecycle scripts in Awsome Distributed Training GitHub repository.

      Nota

      HyperPod esegue DLAMI di SageMaker HyperPod su ogni istanza di un cluster e l’AMI dispone di pacchetti software preinstallati che garantiscono la compatibilità con le funzionalità di HyperPod. Tieni presente che, se reinstalli uno qualsiasi dei pacchetti preinstallati, hai la responsabilità di installare i pacchetti compatibili. Inoltre, alcune funzionalità di HyperPod potrebbero non funzionare come previsto.

      Oltre alle configurazioni predefinite, nella cartella utils sono disponibili altri script per l’installazione dei software seguenti. Il file lifecycle_script.py è già pronto per includere righe di codice per l’esecuzione degli script di installazione, quindi consulta le indicazioni seguenti per cercare tali righe e rimuovi i commenti per attivarle.

      1. Le righe di codice seguenti servono per l’installazione di Docker, Enroot e Pyxis. Questi pacchetti sono necessari per eseguire i container Docker su un cluster Slurm.

        Per abilitare questa fase di installazione, imposta il parametro enable_docker_enroot_pyxis su True nel file config.py.

        # Install Docker/Enroot/Pyxis if Config.enable_docker_enroot_pyxis: ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_enroot_pyxis.sh").run(node_type)
      2. Puoi integrare il tuo cluster HyperPod con Servizio gestito da Amazon per Prometheus e Grafana gestito da Amazon per esportare le metriche relative al cluster e ai nodi del cluster HyperPod nelle dashboard di Grafana gestito da Amazon. Per esportare le metriche e utilizzare la dashboard Slurm, la dashboard NVIDIA DCGM Exporter e la dashboard delle metriche EFA su Grafana gestito da Amazon, devi installare lo strumento di esportazione Slurm per Prometheus, lo strumento di esportazione NVIDIA DCGM e lo strumento di esportazione di nodi EFA. Per ulteriori informazioni sull’installazione dei pacchetti di esportazione e sull’utilizzo delle dashboard Grafana in uno spazio di lavoro Grafana gestito da Amazon, consulta Monitoraggio delle risorse del cluster SageMaker HyperPod.

        Per abilitare questa fase di installazione, imposta il parametro enable_observability su True nel file config.py.

        # Install metric exporting software and Prometheus for observability if Config.enable_observability: if node_type == SlurmNodeType.COMPUTE_NODE: ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_dcgm_exporter.sh").run() ExecuteBashScript("./utils/install_efa_node_exporter.sh").run() if node_type == SlurmNodeType.HEAD_NODE: wait_for_scontrol() ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_slurm_exporter.sh").run() ExecuteBashScript("./utils/install_prometheus.sh").run()
  3. Assicurati di caricare tutti i file e gli script di configurazione della Fase 2 nel bucket S3 fornito nella richiesta CreateCluster della Fase 1. Ad esempio, presupponi che create_cluster.json contenga quanto segue:

    "LifeCycleConfig": { "SourceS3URI": "s3://sagemaker-hyperpod-lifecycle/src", "OnCreate": "on_create.sh" }

    Di conseguenza, "s3://sagemaker-hyperpod-lifecycle/src" dovrebbe contenere on_create.sh, lifecycle_script.py, provisioning_parameters.json e tutti gli altri script di configurazione. Supponi di aver preparato i file in una cartella locale come segue.

    └── lifecycle_files // your local folder ├── provisioning_parameters.json ├── on_create.sh ├── lifecycle_script.py └── ... // more setup scrips to be fed into lifecycle_script.py

    Per caricare i file, utilizza il comando S3 come segue.

    aws s3 cp --recursive ./lifecycle_scripts s3://sagemaker-hyperpod-lifecycle/src