Von HyperPod bereitgestellte Basis-Lebenszyklusskripte - Amazon SageMaker AI

Von HyperPod bereitgestellte Basis-Lebenszyklusskripte

In diesem Abschnitt werden Sie Schritt für Schritt von oben nach unten durch alle Komponenten des grundlegenden Ablaufs zur Einrichtung von Slurm auf HyperPod geführt. Er beginnt mit der Vorbereitung einer Anforderung zur Erstellung eines HyperPod-Clusters, um die CreateCluster-API auszuführen, und behandelt dann die hierarchische Struktur bis hin zu den Lebenszyklusskripten im Detail. Verwenden Sie die Beispiel-Lebenszyklusskripte, die im GitHub-Repository von Awsome Distributed Training bereitgestellt werden. Klonen Sie das Repository, indem Sie den folgenden Befehl ausführen.

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

Die grundlegenden Lebenszyklusskripte für die Einrichtung eines Slurm-Clusters auf SageMaker HyperPod sind unter 1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config verfügbar.

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

Das folgende Flussdiagramm zeigt eine detaillierte Übersicht darüber, wie Sie die Basis-Lebenszyklusskripte gestalten sollten. In den Beschreibungen unter dem Diagramm und im Verfahrensleitfaden wird erläutert, wie sie während des CreateCluster-API-Aufrufs von HyperPod funktionieren.

Ein detailliertes Flussdiagramm zur Erstellung von HyperPod-Clustern und zur Struktur von Lebenszyklusskripten.

Abbildung: Ein detailliertes Flussdiagramm zur Erstellung von HyperPod-Clustern und zur Struktur von Lebenszyklusskripten. (1) Die gestrichelten Pfeile zeigen in die Richtung, in die die Kästen „aufgerufen“ werden, und veranschaulichen den Ablauf der Vorbereitung von Konfigurationsdateien und Lebenszyklusskripten. Der erste Schritt besteht in der Vorbereitung von provisioning_parameters.json und den Lebenszyklusskripten. Diese werden dann für eine gemeinsame Ausführung in der richtigen Reihenfolge in lifecycle_script.py codiert. Die Ausführung des lifecycle_script.py-Skripts erfolgt durch das on_create.sh-Shell-Skript, das im Terminal der HyperPod-Instance ausgeführt wird. (2) Die durchgezogenen Pfeile zeigen den Hauptablauf der HyperPod-Clustererstellung und wie die Felder „aufgerufen“ oder „übermittelt“ werden. Für die Clustererstellungsanforderung ist on_create.sh entweder in create_cluster.json oder im Anforderungsformular Cluster erstellen in der Benutzeroberfläche der Konsole erforderlich. Nachdem Sie die Anforderung übermittelt haben, führt HyperPod die CreateCluster-API basierend auf den angegebenen Konfigurationsinformationen aus der Anforderung und den Lebenszyklusskripten aus. (3) Der gepunktete Pfeil zeigt an, dass die HyperPod-Plattform während der Bereitstellung von Cluster-Ressourcen Instances resource_config.json im Cluster erstellt. resource_config.json enthält Ressourceninformationen zum HyperPod-Cluster wie den Cluster-ARN, Instance-Typen und IP-Adressen. Es ist wichtig zu beachten, dass Sie die Lebenszyklusskripte so vorbereiten sollten, dass sie die resource_config.json-Datei während der Clustererstellung erwarten. Weitere Informationen finden Sie in der folgenden Verfahrensanleitung.

In der folgende Verfahrensanleitung wird erklärt, was bei der Erstellung eines HyperPod-Clusters geschieht und wie die Basis-Lebenszyklusskripte aufgebaut sind.

  1. create_cluster.json: Um eine Anforderung zur Erstellung eines HyperPod-Clusters zu stellen, erstellen Sie eine Anforderungsdatei im JSON-Format. In diesem Beispiel für bewährte Methoden gehen wir davon aus, dass die Anforderungsdatei create_cluster.json heißt. Schreiben Sie create_cluster.json, um einen HyperPod-Cluster mit Instance-Gruppen bereitzustellen. Es empfiehlt sich, dieselbe Anzahl an Instance-Gruppen hinzuzufügen wie die Anzahl der Slurm-Knoten, die Sie auf dem HyperPod-Cluster konfigurieren möchten. Stellen Sie sicher, dass Sie den Instance-Gruppen, die Sie den Slurm-Knoten zuweisen möchten, eindeutige Namen geben.

    Außerdem müssen Sie einen S3-Bucket-Pfad angeben, um Ihren gesamten Satz an Konfigurationsdateien und Lebenszyklusskripten im Feldnamen InstanceGroups.LifeCycleConfig.SourceS3Uri im CreateCluster-Anforderungsformular zu speichern, und den Dateinamen eines Einstiegspunkt-Shell-Skripts (angenommen, es heißt on_create.sh) als InstanceGroups.LifeCycleConfig.OnCreate angeben.

    Anmerkung

    Wenn Sie das zu übermittelnde Formular zum Erstellen eines Clusters in der Benutzeroberfläche der HyperPod-Konsole verwenden, verwaltet die Konsole das Ausfüllen und Übermitteln der CreateCluster-Anforderung in Ihrem Namen und führt die CreateCluster-API im Backend aus. In diesem Fall müssen Sie create_cluster.json nicht erstellen. Achten Sie stattdessen darauf, dass Sie die richtigen Informationen zur Cluster-Konfiguration in das zu übermittelnde Formular Cluster erstellen eingeben.

  2. on_create.sh: Für jede Instance-Gruppe müssen Sie ein Einstiegspunkt-Shell-Skript,on_create.sh, bereitstellen, um Befehle auszuführen, Skripte zur Installation von Softwarepaketen auszuführen und die HyperPod-Clusterumgebung mit Slurm einzurichten. Die beiden Dinge, die Sie vorbereiten müssen, sind eine von HyperPod für die Einrichtung von Slurm erforderliche Datei und eine Reihe von Lebenszyklusskripten für die Installation von Softwarepaketen. Dieses Skript sollte so geschrieben werden, dass es die folgenden Dateien findet und ausführt, wie im Beispielskript unter on_create.sh gezeigt.

    Anmerkung

    Stellen Sie sicher, dass Sie den gesamten Satz von Lebenszyklusskripten an den in den S3-Speicherort hochladen, den Sie in create_cluster.json angeben. Sie sollten Ihre provisioning_parameters.json auch an demselben Speicherort speichern.

    1. provisioning_parameters.json – Das ist ein Konfigurationsformular für die Bereitstellung von Slurm-Knoten auf HyperPod. Das on_create.sh-Skript findet diese JSON-Datei und definiert eine Umgebungsvariable, um den Pfad zu ihr zu identifizieren. Über diese JSON-Datei können Sie Slurm-Knoten und Speicheroptionen wie Amazon FSx für Lustre für Slurm konfigurieren, mit denen Slurm kommunizieren soll. Stellen Sie in provisioning_parameters.json sicher, dass Sie die Instance-Gruppen des HyperPod-Clusters mit den in create_cluster.json angegebenen Namen den Slurm-Knoten entsprechend Ihrer geplanten Konfiguration zuweisen.

      Das folgende Diagramm zeigt ein Beispiel dafür, wie die beiden JSON-Konfigurationsdateien create_cluster.json und provisioning_parameters.json geschrieben werden sollten, um HyperPod-Instance-Gruppen zu Slurm-Knoten zuzuweisen. In diesem Beispiel gehen wir von der Einrichtung von drei Slurm-Knoten aus: Controller-Knoten (Verwaltung), Anmeldeknoten (optional) und Rechenknoten (Worker).

      Tipp

      Um Ihnen bei der Validierung dieser beiden JSON-Dateien zu helfen, stellt Ihnen das HyperPod-Serviceteam ein Validierungsskript zur Verfügung, validate-config.py. Weitere Informationen hierzu finden Sie unter Validieren der JSON-Konfigurationsdateien vor der Erstellung eines Slurm-Clusters auf HyperPod.

      Direkter Vergleich zwischen .json-Dateien.

      Abbildung: Direkter Vergleich zwischen create_cluster.json für die HyperPod-Clustererstellung und provisiong_params.json für die Slurm-Konfiguration. Die Anzahl der Instance-Gruppen in create_cluster.json sollte der Anzahl der Knoten entsprechen, die Sie als Slurm-Knoten konfigurieren möchten. Im Fall des Beispiels in der Abbildung werden drei Slurm-Knoten auf einem HyperPod-Cluster mit drei Instance-Gruppen konfiguriert. Sie sollten die Instance-Gruppen des HyperPod-Clusters den Slurm-Knoten zuweisen, indem Sie die Instance-Gruppennamen entsprechend angeben.

    2. resource_config.json: Während der Clustererstellung wird das lifecycle_script.py-Skript so geschrieben, dass es eine resource_config.json-Datei von HyperPod erwartet. Diese Datei enthält Informationen über den Cluster, z. B. Instance-Typen und IP-Adressen.

      Wenn Sie die CreateCluster-API ausführen, erstellt HyperPod eine Ressourcenkonfigurationsdatei unter /opt/ml/config/resource_config.json, die auf der create_cluster.json-Datei basiert. Der Dateipfad wird in der Umgebungsvariablen namens SAGEMAKER_RESOURCE_CONFIG_PATH gespeichert.

      Wichtig

      Die resource_config.json-Datei wird automatisch von der HyperPod-Plattform generiert und Sie müssen sie NICHT erstellen. Der folgende Code zeigt ein Beispiel für resource_config.json, die aus der Clustererstellung basierend auf create_cluster.json im vorherigen Schritt erstellt würde, und soll Ihnen helfen zu verstehen, was im Backend geschieht und wie eine automatisch generierte resource_config.json aussehen würde.

      { "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: Dies ist das Haupt-Python-Skript, das während der Bereitstellung gemeinsam Lebenszyklusskripte ausführt, die Slurm auf dem HyperPod-Cluster einrichten. Dieses Skript liest in provisioning_parameters.json und resource_config.json aus den in on_create.sh angegebenen oder identifizierten Pfaden, übergibt die relevanten Informationen an jedes Lebenszyklusskript und führt dann die Lebenszyklusskripte der Reihe nach aus.

      Lebenszyklusskripte sind eine Reihe von Skripten, die Sie vollständig flexibel anpassen können, um Softwarepakete zu installieren und während der Clustererstellung notwendige oder benutzerdefinierte Konfigurationen vorzunehmen, z. B. Slurm einrichten, Benutzer anlegen, Conda oder Docker installieren. Das Beispiel-Skript lifecycle_script.py ist darauf vorbereitet, andere Basis-Lebenszyklusskripte im Repository auszuführen, z. B. Slurm-Daemons (start_slurm.sh) zu starten, Amazon FSx für Lustre (mount_fsx.sh) zu mounten und MariaDB-Abrechnung (setup_mariadb_accounting.sh) sowie RDS-Abrechnung (setup_rds_accounting.sh) einzurichten. Sie können auch weitere Skripte hinzufügen, diese im selben Verzeichnis zusammenfassen und Codezeilen zu lifecycle_script.py hinzufügen, damit HyperPod die Skripte ausführt. Weitere Informationen zu den Basis-Lebenszyklusskripten finden Sie auch unter 3.1 Lebenszyklusskripte im GitHub-Repository von Awsome Distributed Training.

      Anmerkung

      HyperPod führt SageMaker HyperPod DLAMI auf jeder Instance eines Clusters aus und die AMI verfügt über vorinstallierte Softwarepakete, die mit den HyperPod-Funktionen kompatibel sind. Beachten Sie, dass Sie bei der Neuinstallation eines der vorinstallierten Pakete für die Installation kompatibler Pakete verantwortlich sind. Beachten Sie außerdem, dass einige HyperPod-Funktionen möglicherweise nicht wie erwartet funktionieren.

      Zusätzlich zu den Standardeinstellungen sind weitere Skripte zur Installation der folgenden Software im utils-Ordner verfügbar. Die lifecycle_script.py-Datei enthält bereits Codezeilen zum Ausführen der Installationsskripte. Suchen Sie diese Zeilen anhand der folgenden Angaben und entfernen Sie die Kommentare, um sie zu aktivieren.

      1. Die folgenden Codezeilen beziehen sich auf die Installation von Docker, Enroot und Pyxis. Diese Pakete sind erforderlich, um Docker-Container auf einem Slurm-Cluster auszuführen.

        Um diesen Installationsschritt zu aktivieren, legen Sie den enable_docker_enroot_pyxis-Parameter in der config.py-Datei auf True fest.

        # 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. Sie können Ihren HyperPod-Cluster mit Amazon Managed Service für Prometheus und Amazon Managed Grafana integrieren, um Metriken über den HyperPod-Cluster und die Cluster-Knoten in Dashboards von Amazon Managed Grafana zu exportieren. Um Metriken zu exportieren und das Slurm-Dashboard, das Dashboard von NVIDIA DCGM Exporter und das EFA-Metrics-Dashboard auf Amazon Managed Grafana zu verwenden, müssen Sie den Slurm-Exporter für Prometheus, den NVIDIA-DCGM-Exporter und den EFA-Knoten-Exporter installieren. Weitere Informationen zur Installation der Exportpakete und zur Verwendung von Grafana-Dashboards in einem Workspace von Amazon Managed Grafana finden Sie unter Überwachung der Clusterressourcen von SageMaker HyperPod.

        Um diesen Installationsschritt zu aktivieren, legen Sie den enable_observability-Parameter in der config.py-Datei auf True fest.

        # 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. Stellen Sie sicher, dass Sie alle Konfigurationsdateien und Einrichtungsskripte aus Schritt 2 in den S3-Bucket hochladen, den Sie in der CreateCluster-Anforderung in Schritt 1 angegeben haben. Nehmen wir beispielsweise an, dass Ihre create_cluster.json Folgendes enthält.

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

    Dann sollte ihr on_create.sh, lifecycle_script.py, provisioning_parameters.json und alle anderen Einrichtungsskripte enthalten. Angenommen, Sie haben die Dateien wie folgt in einem lokalen Ordner vorbereitet.

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

    Verwenden Sie den S3-Befehl wie folgt, um die Dateien hochzuladen.

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