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
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
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.
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.
-
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 Anforderungsdateicreate_cluster.jsonheißt. Schreiben Siecreate_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.SourceS3UriimCreateCluster-Anforderungsformular zu speichern, und den Dateinamen eines Einstiegspunkt-Shell-Skripts (angenommen, es heißton_create.sh) alsInstanceGroups.LifeCycleConfig.OnCreateangeben.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 dieCreateCluster-API im Backend aus. In diesem Fall müssen Siecreate_cluster.jsonnicht erstellen. Achten Sie stattdessen darauf, dass Sie die richtigen Informationen zur Cluster-Konfiguration in das zu übermittelnde Formular Cluster erstellen eingeben. -
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 unteron_create.shgezeigt. Anmerkung
Stellen Sie sicher, dass Sie den gesamten Satz von Lebenszyklusskripten an den in den S3-Speicherort hochladen, den Sie in
create_cluster.jsonangeben. Sie sollten Ihreprovisioning_parameters.jsonauch an demselben Speicherort speichern.-
provisioning_parameters.json– Das ist ein Konfigurationsformular für die Bereitstellung von Slurm-Knoten auf HyperPod. Dason_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 inprovisioning_parameters.jsonsicher, dass Sie die Instance-Gruppen des HyperPod-Clusters mit den increate_cluster.jsonangegebenen Namen den Slurm-Knoten entsprechend Ihrer geplanten Konfiguration zuweisen.Das folgende Diagramm zeigt ein Beispiel dafür, wie die beiden JSON-Konfigurationsdateien
create_cluster.jsonundprovisioning_parameters.jsongeschrieben 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.
Abbildung: Direkter Vergleich zwischen
create_cluster.jsonfür die HyperPod-Clustererstellung undprovisiong_params.jsonfür die Slurm-Konfiguration. Die Anzahl der Instance-Gruppen increate_cluster.jsonsollte 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. -
resource_config.json: Während der Clustererstellung wird daslifecycle_script.py-Skript so geschrieben, dass es eineresource_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 dercreate_cluster.json-Datei basiert. Der Dateipfad wird in der Umgebungsvariablen namensSAGEMAKER_RESOURCE_CONFIG_PATHgespeichert.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ürresource_config.json, die aus der Clustererstellung basierend aufcreate_cluster.jsonim vorherigen Schritt erstellt würde, und soll Ihnen helfen zu verstehen, was im Backend geschieht und wie eine automatisch generierteresource_config.jsonaussehen 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" } ] } ] } -
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 inprovisioning_parameters.jsonundresource_config.jsonaus den inon_create.shangegebenen 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.pyist 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.pyhinzufügen, damit HyperPod die Skripte ausführt. Weitere Informationen zu den Basis-Lebenszyklusskripten finden Sie auch unter 3.1 Lebenszyklusskripteim 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.-
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 derconfig.py-Datei auf Truefest.# 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) -
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 derconfig.py-Datei auf Truefest.# 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()
-
-
-
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 Ihrecreate_cluster.jsonFolgendes enthält."LifeCycleConfig": { "SourceS3URI": "s3://sagemaker-hyperpod-lifecycle/src", "OnCreate": "on_create.sh" }Dann sollte ihr
on_create.sh,lifecycle_script.py,provisioning_parameters.jsonund 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.pyVerwenden Sie den S3-Befehl wie folgt, um die Dateien hochzuladen.
aws s3 cp --recursive./lifecycle_scriptss3://sagemaker-hyperpod-lifecycle/src