Scripts de ciclo de vida básicos que proporciona HyperPod - Amazon SageMaker AI

Scripts de ciclo de vida básicos que proporciona HyperPod

En esta sección, se explican todos los componentes del proceso básico de configuración de Slurm en HyperPod con un enfoque descendente. Se empieza con la preparación de una solicitud de creación de un clúster de HyperPod para ejecutar la API CreateCluster y luego se profundiza en la estructura jerárquica hasta llegar a los scripts de ciclo de vida. Utilice los scripts de ciclo de vida de ejemplo que se proporcionan en el repositorio de GitHub de Awsome Distributed Training. Clone el repositorio ejecutando el siguiente comando.

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

Los scripts de ciclo de vida básicos para configurar un clúster de Slurm en SageMaker HyperPod están disponibles en 1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config.

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

En el siguiente diagrama de flujo, se muestra una descripción detallada de cómo debe diseñar los scripts de ciclo de vida básicos. En las descripciones que aparecen debajo del diagrama y en la guía de procedimientos, se explica cómo funcionan durante la llamada a la API CreateCluster de HyperPod.

Diagrama de flujo detallado de la creación de clústeres de HyperPod y la estructura de los scripts de ciclo de vida.

Figura: diagrama de flujo detallado de la creación de clústeres de HyperPod y la estructura de los scripts de ciclo de vida. (1) Las flechas discontinuas se dirigen hacia donde se llaman los cuadros y muestran el flujo de preparación de los archivos de configuración y los scripts de ciclo de vida. Comienza con la preparación de provisioning_parameters.json y los scripts de ciclo de vida. Luego estos se codifican en lifecycle_script.py para permitir una ejecución colectiva en orden. Y la ejecución del script lifecycle_script.py se realiza mediante el script de intérprete de comandos on_create.sh, que se ejecuta en el terminal de instancias de HyperPod. (2) Las flechas continuas muestran el flujo principal de creación del clúster de HyperPod e indican cómo se llaman o se envían los cuadros. Es necesario usar on_create.sh para la solicitud de creación del clúster, ya sea en create_cluster.json o en el formulario de solicitud Crear un clúster de la interfaz de usuario de la consola. Tras enviar la solicitud, HyperPod ejecuta la API CreateCluster en función de la información de configuración proporcionada en la solicitud y en los scripts de ciclo de vida. (3) La flecha de puntos indica que la plataforma de HyperPod crea resource_config.json en las instancias del clúster durante el aprovisionamiento de los recursos del clúster. resource_config.json contiene información sobre los recursos del clúster de HyperPod, como el ARN del clúster, los tipos de instancias y las direcciones IP. Es importante tener en cuenta que debe preparar los scripts de ciclo de vida para que esperen el archivo resource_config.json durante la creación del clúster. Para obtener más información, consulte la guía de procedimientos que se incluye a continuación.

En la siguiente guía de procedimientos, se explica qué ocurre durante la creación de un clúster de HyperPod y cómo se diseñan los scripts de ciclo de vida básicos.

  1. create_cluster.json: para enviar una solicitud de creación de un clúster de HyperPod, debe preparar un archivo de solicitud CreateCluster en formato JSON. En este ejemplo de prácticas recomendadas, asumimos que el archivo de solicitud se denomina create_cluster.json. Escriba create_cluster.json para aprovisionar un clúster de HyperPod con grupos de instancias. La práctica recomendada consiste en añadir el mismo número de grupos de instancias que de nodos de Slurm que piensa configurar en el clúster de HyperPod. Asegúrese de asignar nombres distintivos a los grupos de instancias que asignará a los nodos de Slurm que piensa configurar.

    Además, debe especificar una ruta de bucket de S3 para almacenar todo el conjunto de archivos de configuración y scripts de ciclo de vida en el nombre de campo InstanceGroups.LifeCycleConfig.SourceS3Uri del formulario de solicitud CreateCluster, y especificar el nombre de archivo de un script de intérprete de comandos de punto de entrada (supongamos que se denomina on_create.sh) en InstanceGroups.LifeCycleConfig.OnCreate.

    nota

    Si utiliza el formulario de envío Crear un clúster en la interfaz de usuario de la consola de HyperPod, la consola se encarga de rellenar y enviar la solicitud CreateCluster en su nombre, y ejecuta la API CreateCluster en el backend. En este caso, no es necesario que cree create_cluster.json; en cambio, debe asegurarse de especificar la información de configuración del clúster correcta en el formulario de envío Crear un clúster.

  2. on_create.sh: para cada grupo de instancias, debe proporcionar un script de intérprete de comandos de punto de entrada, on_create.sh, para ejecutar comandos, ejecutar scripts para instalar paquetes de software y configurar el entorno del clúster de HyperPod con Slurm. Los dos elementos que debe preparar son un provisioning_parameters.json que necesita HyperPod para configurar Slurm y un conjunto de scripts de ciclo de vida para instalar paquetes de software. Este script debe escribirse para buscar y ejecutar los siguientes archivos, tal y como se muestra en el script de ejemplo que aparece en on_create.sh.

    nota

    Asegúrese de cargar todo el conjunto de scripts de ciclo de vida en la ubicación de S3 que especifique en create_cluster.json. También debe colocar el archivo provisioning_parameters.json en la misma ubicación.

    1. provisioning_parameters.json: este es un Formulario de configuración para el aprovisionamiento de nodos de Slurm en HyperPod. El script on_create.sh busca este archivo JSON y define la variable de entorno para identificar la ruta al mismo. A través de este archivo JSON, puede configurar los nodos de Slurm y las opciones de almacenamiento, como Amazon FSx para Lustre, para que se comunique Slurm. En provisioning_parameters.json, asegúrese de asignar los grupos de instancias del clúster de HyperPod utilizando los nombres especificados en create_cluster.json para los nodos de Slurm, más o menos en función de cómo tenga pensado configurarlos.

      En el siguiente diagrama, se muestra un ejemplo de cómo se deben escribir los dos archivos de configuración de JSON create_cluster.json y provisioning_parameters.json para asignar grupos de instancias de HyperPod a los nodos de Slurm. En este ejemplo, asumimos que se configuran tres nodos de Slurm: el nodo controlador (de administración), el nodo de inicio de sesión (que es opcional) y el nodo de computación (de trabajo).

      sugerencia

      Para ayudarle a validar estos dos archivos JSON, el equipo de servicio de HyperPod proporciona un script de validación, validate-config.py. Para obtener más información, consulte Validación de los archivos de configuración JSON antes de crear un clúster de Slurm en HyperPod.

      Comparación directa entre archivos .json.

      Figura: comparación directa entre create_cluster.json para la creación de clústeres de HyperPod y provisiong_params.json para la configuración de Slurm. El número de grupos de instancias en create_cluster.json debe coincidir con el número de nodos que desea configurar como nodos de Slurm. En el caso del ejemplo de la figura, se configurarán tres nodos de Slurm en un clúster de HyperPod de tres grupos de instancias. Debe asignar los grupos de instancias del clúster de HyperPod a los nodos de Slurm especificando los nombres de los grupos de instancias correspondientes.

    2. resource_config.json: durante la creación del clúster, el script lifecycle_script.py se escribe para que espere un archivo resource_config.json de HyperPod. Este archivo contiene información sobre el clúster, como los tipos de instancias y las direcciones IP.

      Al ejecutar la API CreateCluster, HyperPod crea un archivo de configuración de recursos en /opt/ml/config/resource_config.json basado en el archivo create_cluster.json. La ruta del archivo se guarda en la variable de entorno denominada SAGEMAKER_RESOURCE_CONFIG_PATH.

      importante

      La plataforma de HyperPod genera automáticamente el archivo resource_config.json y NO es necesario crearlo. El siguiente código sirve para mostrar un ejemplo del archivo resource_config.json que se crearía a partir de la creación de un clúster en función del archivo create_cluster.json del paso anterior. Además, le ayudará a entender qué ocurre en el backend y qué aspecto tendría un archivo resource_config.json generado automáticamente.

      { "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: este es el script principal de Python que ejecuta de forma colectiva los scripts de ciclo de vida que configuran Slurm en el clúster de HyperPod mientras se aprovisiona. Este script lee en provisioning_parameters.json y resource_config.json desde las rutas especificadas o identificadas en on_create.sh, pasa la información relevante a cada script de ciclo de vida y, a continuación, ejecuta los scripts de ciclo de vida en orden.

      Los scripts de ciclo de vida son un conjunto de scripts que puede personalizar con total flexibilidad para instalar paquetes de software y establecer las configuraciones necesarias o personalizadas durante la creación del clúster, como la configuración de Slurm, la creación de usuarios o la instalación de Conda o Docker. El script lifecycle_script.py de ejemplo está preparado para ejecutar otros scripts de ciclo de vida básicos en el repositorio, como la inicialización de deamons de Slurm (start_slurm.sh), el montaje de Amazon FSx para Lustre (mount_fsx.sh), y la configuración de la contabilidad de MariaDB (setup_mariadb_accounting.sh) y la contabilidad de RDS (setup_rds_accounting.sh). También puede añadir más scripts, empaquetarlos en el mismo directorio y añadir líneas de código en lifecycle_script.py para que HyperPod ejecute los scripts. Para obtener más información sobre los scripts de ciclo de vida básicos, consulte también la sección 3.1 Lifecycle scripts en el repositorio de GitHub de Awsome Distributed Training.

      nota

      HyperPod ejecuta DLAMI de SageMaker HyperPod en cada una de las instancias de un clúster, y la AMI tiene paquetes de software preinstalados que cumplen con las compatibilidades entre ellos y las funcionalidades de HyperPod. Tenga en cuenta que, si reinstala alguno de los paquetes preinstalados, es su responsabilidad instalar paquetes compatibles y que es posible que algunas funcionalidades de HyperPod no funcionen del modo esperado.

      Además de las configuraciones predeterminadas, en la carpeta utils hay más scripts para instalar el siguiente software. El archivo lifecycle_script.py ya está preparado para incluir líneas de código para ejecutar los scripts de instalación, así que consulte los siguientes elementos para buscar esas líneas y quitar las marcas de comentario para activarlas.

      1. Las siguientes líneas de código sirven para instalar Docker, Enroot y Pyxis. Estos paquetes son necesarios para ejecutar contenedores de Docker en un clúster de Slurm.

        Para habilitar este paso de instalación, defina el parámetro enable_docker_enroot_pyxis para True en el archivo 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. Puede integrar el clúster de HyperPod con Amazon Managed Service para Prometheus y Amazon Managed Grafana para exportar métricas sobre el clúster de HyperPod y los nodos del clúster a los paneles de Amazon Managed Grafana. Para exportar métricas y usar el panel de Slurm, el panel de NVIDIA DCGM Exporter y el panel de métricas de EFA en Amazon Managed Grafana, debe instalar el exportador de Slurm para Prometheus, el exportador de NVIDIA DCGM y el exportador de nodos de EFA. Para obtener más información sobre la instalación de los paquetes de exportador y el uso de los paneles de Grafana en un espacio de trabajo de Amazon Managed Grafana, consulte Supervisión de los recursos del clúster de SageMaker HyperPod.

        Para habilitar este paso de instalación, defina el parámetro enable_observability para True en el archivo 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. Asegúrese de cargar todos los archivos de configuración y los scripts de configuración del Paso 2 en el bucket de S3 que haya indicado en la solicitud CreateCluster del paso 1. Por ejemplo, supongamos que su solicitud create_cluster.json tiene lo siguiente.

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

    En este caso, "s3://sagemaker-hyperpod-lifecycle/src" debería contener on_create.sh, lifecycle_script.py, provisioning_parameters.json y todos los demás scripts de configuración. Suponga que ha preparado los archivos en una carpeta local de la siguiente manera.

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

    Para cargar los archivos, utilice el comando de S3 de la siguiente manera.

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