So SageMaker betreibt Amazon Ihr Trainingsimage - Amazon SageMaker

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

So SageMaker betreibt Amazon Ihr Trainingsimage

Sie können ein benutzerdefiniertes Eintrittspunkt-Skript verwenden, um die Infrastruktur für das Training in einer Produktionsumgebung zu automatisieren. Wenn Sie Ihr Einstiegs-Skript in Ihren Docker-Container übergeben, können Sie es auch als eigenständiges Skript ausführen, ohne Ihre Images neu erstellen zu müssen. SageMakerverarbeitet Ihr Trainings-Image mithilfe eines Docker-Container-Einstiegspunktskripts.

In diesem Abschnitt erfahren Sie, wie Sie einen benutzerdefinierten Eintrittspunkt verwenden, ohne das Trainingstoolkit zu verwenden. Wenn Sie einen benutzerdefinierten Einstiegspunkt verwenden möchten, aber nicht mit der manuellen Konfiguration eines Docker-Containers vertraut sind, empfehlen wir Ihnen, stattdessen die Training Toolkit-Bibliothek zu verwenden. SageMaker Weitere Informationen zur Verwendung des Trainingstoolkits finden Sie unter Passen Sie Ihren eigenen Trainingscontainer an.

Sucht standardmäßig nach einem Skript, das SageMaker in Ihrem Container aufgerufen wird. train Sie können Ihren eigenen benutzerdefinierten Einstiegspunkt auch manuell angeben, indem Sie die ContainerEntrypoint Parameter ContainerArguments und von verwenden. AlgorithmSpecificationAPI

Sie haben die folgenden zwei Optionen, um Ihren Docker-Container manuell für die Ausführung Ihres Images zu konfigurieren.

  • Verwenden Sie den CreateTrainingJobAPIund einen Docker-Container mit einer darin enthaltenen Entrypoint-Anweisung.

  • Verwenden Sie den CreateTrainingJob API und übergeben Sie Ihr Trainingsskript von außerhalb Ihres Docker-Containers.

Wenn Sie Ihr Trainingsskript von außerhalb Ihres Docker-Containers übergeben, müssen Sie den Docker-Container nicht neu erstellen, wenn Sie Ihr Skript aktualisieren. Sie können auch mehrere verschiedene Skripte verwenden, um sie im selben Container auszuführen.

Ihr Einstiegsskript sollte Trainingscode für Ihr Image enthalten. Wenn Sie den optionalen source_dir Parameter in einem Schätzer verwenden, sollte er auf den relativen Amazon S3-Pfad zu dem Ordner verweisen, der Ihr Einstiegsskript enthält. Mit dem Parameter source_dir können Sie auf mehrere Dateien verweisen. Wenn Sie source_dir nicht verwenden, können Sie den Eintrittspunkt mithilfe des entry_point Parameters angeben. Ein Beispiel für ein benutzerdefiniertes Einstiegspunkt-Skript, das einen Schätzer enthält, finden Sie unter Bring Your Own Model with Script Mode. SageMaker

SageMaker Das Modelltraining unterstützt leistungsstarke S3 Express One Zone-Verzeichnis-Buckets als Dateneingabeort für den Dateimodus, den Schnelldateimodus und den Pipe-Modus. Sie können auch S3 Express One Zone-Verzeichnis-Buckets verwenden, um Ihre Trainingsergebnisse zu speichern. Um S3 Express One Zone zu verwenden, geben Sie einen S3 Express One Zone-Verzeichnis-Bucket anstelle eines Amazon S3 S3-Allzweck-Buckets an. URI Sie können Ihre SageMaker Ausgabedaten in Verzeichnis-Buckets nur mit serverseitiger Verschlüsselung mit verwalteten Amazon S3 S3-Schlüsseln (SSE-S3) verschlüsseln. Die serverseitige Verschlüsselung mit AWS KMS Schlüsseln (SSE-KMS) wird derzeit nicht für das Speichern von SageMaker Ausgabedaten in Verzeichnis-Buckets unterstützt. Weitere Informationen finden Sie unter S3 Express One Zone.

Führen Sie einen Trainingsjob mit einem Entrypoint-Skript aus, das im Docker-Container gebündelt ist

SageMaker kann ein Entrypoint-Skript ausführen, das in Ihrem Docker-Container gebündelt ist.

  • Standardmäßig SageMaker führt Amazon den folgenden Container aus.

    docker run image train
  • SageMaker überschreibt alle CMDStandardanweisungen in einem Container, indem das train Argument hinter dem Bildnamen angegeben wird. Verwenden Sie in Ihrem Docker-Container die folgende exec Form der ENTRYPOINT Anweisung.

    ENTRYPOINT ["executable", "param1", "param2", ...]

    Das folgende Beispiel zeigt, wie Sie eine k-means-algorithm.py genannte Python-Eintrittspunktanweisung angeben.

    ENTRYPOINT ["python", "k-means-algorithm.py"]

    Das exec-Formular der ENTRYPOINT-Anweisung startet die ausführbare Datei direkt, nicht als untergeordnetes Element von /bin/sh. Dadurch kann es Signale wie SIGTERM und SIGKILL von SageMaker APIs empfangen. Die folgenden Bedingungen gelten für die Verwendung von SageMaker APIs.

    • Der CreateTrainingJobAPIhat eine Stoppbedingung, die anweist SageMaker , das Modelltraining nach einer bestimmten Zeit zu beenden.

    • Das Folgende zeigt die StopTrainingJobAPI. Dadurch wird API das Äquivalent zu dem Befehl docker stop ausgegeben, mit einem 2-minütigen Timeout, um den angegebenen Container ordnungsgemäß anzuhalten.

      docker stop -t 120

      Der Befehl versucht, den ausgeführten Container durch das Senden eines SIGTERM-Signals zu beenden. Nach dem 2-minütigen Timeout API sendet der die Container SIGKILL und stoppt sie gewaltsam. Wenn der Container SIGTERM ordnungsgemäß verarbeitet und sich innerhalb von 120 Sekunden nach Erhalt der Meldung beendet, wird kein SIGKILL gesendet.

    Wenn Sie nach SageMaker Beendigung des Trainings auf die Artefakte des Zwischenmodells zugreifen möchten, fügen Sie Code für das Speichern von Artefakten in Ihrem Handler hinzu. SIGTERM

  • Wenn Sie GPU Geräte für das Modelltraining verwenden möchten, stellen Sie sicher, dass Ihre Container nvidia-docker kompatibel sind. Nehmen Sie nur das CUDA Toolkit in Containern auf, bündeln Sie keine NVIDIA Treiber mit dem Image. Weitere Informationen zu finden Sie unter nvidia-docker NVIDIA/nvidia-docker.

  • Sie können den tini Initialisierer nicht als Ihr Einstiegspunktskript in SageMaker Containern verwenden, da er durch die Argumente und verwirrt wird. train serve

  • /opt/mlund alle Unterverzeichnisse sind durch Training reserviert. SageMaker Achten Sie beim Erstellen des Docker-Images Ihres Algorithmus darauf, dass Sie keine Daten, die für Ihren Algorithmus erforderlich sind, in diesem Verzeichnis ablegen. Denn wenn Sie dies tun, sind die Daten während des Trainings möglicherweise nicht mehr sichtbar.

Um Ihre Shell- oder Python-Skripte in Ihrem Docker-Image zu bündeln oder das Skript in einem Amazon S3 S3-Bucket oder mithilfe von AWS Command Line Interface (CLI) bereitzustellen, fahren Sie mit dem folgenden Abschnitt fort.

Bündeln Sie Ihr Shell-Skript in einem Docker-Container

Wenn Sie ein benutzerdefiniertes Shell-Skript in Ihrem Docker-Image bündeln möchten, gehen Sie wie folgt vor.

  1. Kopieren Sie Ihr Shell-Skript aus Ihrem Arbeitsverzeichnis in Ihren Docker-Container. Der folgende Codeausschnitt kopiert ein benutzerdefiniertes Eintrittspunktskript custom_entrypoint.sh aus dem aktuellen Arbeitsverzeichnis in einen Docker-Container, der sich in mydir befindet. Im folgenden Beispiel wird davon ausgegangen, dass auf dem Docker-Basis-Image Python installiert ist.

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.sh /mydir/
  2. Erstellen Sie einen Docker-Container und übertragen Sie ihn in die Amazon Elastic Container Registry (Amazon ECR), indem Sie den Anweisungen unter Pushing a Docker Image im ECRAmazon-Benutzerhandbuch folgen.

  3. Starten Sie den Trainingsjob, indem Sie den folgenden AWS CLI Befehl ausführen.

    aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/mydir/custom_entrypoint.sh"]}' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'

Bündeln Sie Ihr Python-Skript in einem Docker-Container

Gehen Sie wie folgt vor, um ein benutzerdefiniertes Python-Skript in Ihrem Docker-Image zu bündeln.

  1. Kopieren Sie Ihr Python-Skript aus Ihrem Arbeitsverzeichnis in Ihren Docker-Container. Der folgende Codeausschnitt kopiert ein benutzerdefiniertes Eintrittspunktskript custom_entrypoint.py aus dem aktuellen Arbeitsverzeichnis in einen Docker-Container, der sich in mydir befindet.

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.py /mydir/
  2. Starten Sie den Trainingsjob, indem Sie den folgenden AWS CLI Befehl ausführen.

    --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["python"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py"]}' \

Führen Sie einen Trainingsjob mit einem Eintrittspunktskript außerhalb des Docker-Containers aus

Sie können Ihren eigenen Docker-Container für das Training verwenden und ein Entrypoint-Skript von außerhalb des Docker-Containers übergeben. Die Strukturierung Ihres Entrypoint-Skripts außerhalb des Containers bietet einige Vorteile. Wenn Sie Ihr Einstiegs-Skript aktualisieren, müssen Sie den Docker-Container nicht neu erstellen. Sie können auch mehrere verschiedene Skripte verwenden, um sie im selben Container auszuführen.

Geben Sie den Speicherort Ihres Trainingsskripts mithilfe der ContainerArguments Parameter ContainerEntrypoint und von an AlgorithmSpecificationAPI. Diese Eintrittspunkte und Argumente verhalten sich genauso wie Docker-Eintrittspunkte und Argumente. Die Werte in diesen Parametern überschreiben die entsprechenden Werte ENTRYPOINT oder CMD die als Teil des Docker-Containers bereitgestellten Werte.

Wenn Sie Ihr benutzerdefiniertes Eintrittspunkt-Skript an Ihren Docker-Trainingscontainer übergeben, bestimmen die von Ihnen angegebenen Eingaben das Verhalten des Containers.

  • Wenn Sie beispielsweise nur ContainerEntrypoint angeben, CreateTrainingJob API lautet die Anforderungssyntax unter Verwendung von wie folgt.

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }

    Anschließend führt das SageMaker Trainings-Backend Ihren benutzerdefinierten Einstiegspunkt wie folgt aus.

    docker run --entrypoint <ContainerEntrypoint> image
    Anmerkung

    Wenn ContainerEntrypoint angegeben, führt das SageMaker Trainings-Backend das Image mit dem angegebenen Einstiegspunkt aus und überschreibt den Standard im Bild. ENTRYPOINT

  • Wenn Sie nur angebenContainerArguments, SageMaker wird davon ausgegangen, dass der Docker-Container ein Einstiegspunktskript enthält. Die Anforderungssyntax, die den verwendet, lautet wie CreateTrainingJob API folgt.

    { "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }

    Das SageMaker Trainings-Backend führt Ihren benutzerdefinierten Einstiegspunkt wie folgt aus.

    docker run image <ContainerArguments>
  • Wenn Sie sowohl als auch angebenContainerArguments, lautet die ContainerEntrypoint Anforderungssyntax mit der CreateTrainingJob API wie folgt.

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }

    Das SageMaker Trainings-Backend führt Ihren benutzerdefinierten Einstiegspunkt wie folgt aus.

    docker run --entrypoint <ContainerEntrypoint> image <ContainerArguments>

Sie können jede unterstützte InputDataConfig Quelle in verwenden, CreateTrainingJob API um ein Einstiegsskript für die Ausführung Ihres Trainings-Images bereitzustellen.

Stellen Sie Ihr Einstiegs-Skript in einem Amazon-S3-Bucket bereit

Um ein benutzerdefiniertes Einstiegspunktskript mithilfe eines S3-Buckets bereitzustellen, verwenden Sie den S3DataSource Parameter von, DataSourceAPIum den Speicherort des Skripts anzugeben. Wenn Sie den S3DataSource Parameter verwenden, ist Folgendes erforderlich.

Im folgenden Beispiel befindet sich ein Skript namens custom_entrypoint.sh in einem Pfad zu einem s3://<bucket-name>/<bucket prefix>/custom_entrypoint.sh S3-Bucket.

#!/bin/bash echo "Running custom_entrypoint.sh" echo "Hello you have provided the following arguments: " "$@"

Als Nächstes müssen Sie die Konfiguration des Eingabedatenkanals für die Ausführung eines Trainingsjobs festlegen. Tun Sie dies entweder AWS CLI direkt oder mit einer JSON Datei.

Konfigurieren Sie den Eingabedatenkanal AWS CLI mithilfe einer JSON Datei

Um Ihren Eingabedatenkanal mit einer JSON Datei zu konfigurieren, verwenden Sie AWS CLI ihn wie in der folgenden Codestruktur gezeigt. Stellen Sie sicher, dass alle folgenden Felder die in der definierte Anforderungssyntax verwenden CreateTrainingJobAPI.

// run-my-training-job.json { "AlgorithmSpecification": { "ContainerEntrypoint": ["/bin/sh"], "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"], ... }, "InputDataConfig": [ { "ChannelName": "<your_channel_name>", "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://<bucket-name>/<bucket_prefix>" } }, "InputMode": "File", }, ...] }

Führen Sie als Nächstes den AWS CLI Befehl aus, um den Trainingsjob aus der JSON Datei wie folgt zu starten.

aws sagemaker create-training-job --cli-input-json file://run-my-training-job.json

Konfigurieren Sie den Eingabedatenkanal AWS CLI direkt

Verwenden Sie die folgende AWS CLI Codestruktur, um Ihren Eingabedatenkanal ohne JSON Datei zu konfigurieren.

aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"]}' \ --input-data-config '[{ \ "ChannelName":"<your_channel_name>", \ "DataSource":{ \ "S3DataSource":{ \ "S3DataType":"S3Prefix", \ "S3Uri":"s3://<bucket-name>/<bucket_prefix>", \ "S3DataDistributionType":"FullyReplicated"}}}]' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'