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.
Wie Amazon SageMaker AI Ihr Trainings-Image ausführt
Sie können ein benutzerdefiniertes Eintrittspunkt-Skript verwenden, um die Infrastruktur für das Training in einer Produktionsumgebung zu automatisieren. Wenn Sie Ihr Entrypoint-Skript an Ihren Docker-Container übergeben, können Sie es auch als eigenständiges Skript ausführen, ohne Ihre Images neu erstellen zu müssen. SageMaker AI verarbeitet Ihr Trainings-Image mithilfe eines Docker-Container-Eintrittspunktskripts.
In diesem Abschnitt erfahren Sie, wie Sie einen benutzerdefinierten Eintrittspunkt verwenden, ohne das Trainingstoolkit zu verwenden. Wenn Sie einen benutzerdefinierten Eintrittspunkt verwenden möchten, aber nicht mit der manuellen Konfiguration eines Docker-Containers vertraut sind, empfehlen wir Ihnen, stattdessen die SageMaker-Trainingsstoolkit-Bibliothek
Standardmäßig sucht SageMaker AI nach einem Skript welches train heißt in Ihrem Container. Sie können Ihren eigenen benutzerdefinierten Eintrittspunkt auch manuell angeben, indem Sie die Parameter ContainerArguments und ContainerEntrypoint der AlgorithmSpecification API verwenden.
Sie haben die folgenden zwei Optionen, um Ihren Docker-Container manuell für die Ausführung Ihres Images zu konfigurieren.
-
Verwenden Sie die CreateTrainingJob-API und einen Docker-Container mit einer darin enthaltenen Entrypoint-Anweisung.
-
Verwenden Sie die
CreateTrainingJobAPI 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ätzersource_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 Eintrittspunkt-Skript, das einen Schätzer enthält, finden Sie unter Bring Your Own Model with SageMaker AI Script Mode
Das Modelltraining von SageMaker AI unterstützt leistungsstarke Verzeichnis-Buckets von S3 Express One Zone als Dateneingabeort für den Dateimodus, den Schnelldateimodus und den Pipe-Modus. Sie können Verzeichnis-Buckets von S3 Express One Zone auch zum Speichern Ihrer Trainingsdaten verwenden. Um S3 Express One Zone zu verwenden, geben Sie den URI eines Verzeichnis-Buckets von S3 Express One Zone anstelle eines Allzweck-Buckets von Amazon S3 an. Sie können Ihre SageMaker-AI-Ausgabedaten in Verzeichnis-Buckets nur mit serverseitiger Verschlüsselung mit von Amazon S3 verwalteten Schlüsseln (SSE-S3) verschlüsseln. Die serverseitige Verschlüsselung mit AWS KMS-Schlüsseln (SSE-KMS) wird derzeit für das Speichern von SageMaker-AI-Ausgabedaten in Verzeichnis-Buckets nicht 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 AI kann ein Entrypoint-Skript ausführen, das in Ihrem Docker-Container gebündelt ist.
-
Standardmäßig führt Amazon SageMaker AI den folgenden Container aus.
docker runimagetrain -
SageMaker AI überschreibt alle Standard-CMD
-Anweisungen in einem Container, indem das trainArgument hinter dem Image-Namen angegeben wird. Verwenden Sie in Ihrem Docker-Container die folgendeexecForm derENTRYPOINTAnweisung.ENTRYPOINT ["executable", "param1", "param2", ...]Das folgende Beispiel zeigt, wie Sie eine
k-means-algorithm.pygenannte Python-Eintrittspunktanweisung angeben.ENTRYPOINT ["python", "k-means-algorithm.py"]Das
exec-Formular derENTRYPOINT-Anweisung startet die ausführbare Datei direkt, nicht als untergeordnetes Element von/bin/sh. Dadurch kann es Signale wieSIGTERMundSIGKILLvon SageMaker APIs empfangen. Die folgenden Bedingungen gelten für die Verwendung der SageMaker-Apis.-
Die
CreateTrainingJobAPI verfügt über eine Abbruchbedingung, die SageMaker AI anweist, das Modelltraining nach einer bestimmten Zeit zu beenden. -
Im Folgenden wird die
StopTrainingJobAPI dargestellt. Diese API gibt das Äquivalent desdocker stopmit einer 2-minütigen Zeitüberschreitung aus, um den angegebenen Container ordnungsgemäß zu beenden.docker stop -t 120Der Befehl versucht, den ausgeführten Container durch das Senden eines
SIGTERM-Signals zu beenden. Nach der 2-minütigen Zeitüberschreitung sendet die APISIGKILLund hält die Container zwangsweise an. Wenn der ContainerSIGTERMordnungsgemäß verarbeitet und sich innerhalb von 120 Sekunden nach Erhalt der Meldung beendet, wird keinSIGKILLgesendet.
Wenn Sie auf die Zwischenmodell-Artefakte zugreifen möchten, nachdem SageMaker AI das Training beendet hat, fügen Sie Code für das Speichern von Artefakten in Ihren
SIGTERM-Handler ein. -
-
Wenn Sie vorhaben, GPU-Geräte für das Modelltraining zu verwenden, stellen Sie sicher, dass Ihre Container
nvidia-docker-kompatibel sind. Binden Sie nur das CUDA-Toolkit in Container ein; bündeln Sie keine NVIDIA-Treiber mit dem Image. Mehr Informationen übernvidia-dockerfinden Sie unter NVIDIA/nvidia-docker. -
Sie können den
tini-Initialisierer nicht als Einstiegsskript in SageMaker-AI-Containern verwenden, da er durch die Argumentetrainundserveverwirrt wird. -
/opt/mlund alle Unterverzeichnisse sind für die SageMaker-Training reserviert. 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-Bucket oder mithilfe der 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.
-
Kopieren Sie Ihr Shell-Skript aus Ihrem Arbeitsverzeichnis in Ihren Docker-Container. Der folgende Codeausschnitt kopiert ein benutzerdefiniertes Eintrittspunktskript
custom_entrypoint.shaus dem aktuellen Arbeitsverzeichnis in einen Docker-Container, der sich inmydirbefindet. 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/ -
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 Amazon ECR-Benutzerhandbuch folgen.
-
Starten Sie den Trainingsjob, indem Sie den folgenden Befehl AWS CLI 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.
-
Kopieren Sie Ihr Python-Skript aus Ihrem Arbeitsverzeichnis in Ihren Docker-Container. Der folgende Codeausschnitt kopiert ein benutzerdefiniertes Eintrittspunktskript
custom_entrypoint.pyaus dem aktuellen Arbeitsverzeichnis in einen Docker-Container, der sich inmydirbefindet.FROM<base-docker-image>:<tag># Copy custom entrypoint from current dir to /mydir on container COPY./custom_entrypoint.py /mydir/ -
Starten Sie den Trainingsjob, indem Sie den folgenden Befehl AWS CLI 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 Parameter ContainerEntrypoint and ContainerArguments der AlgorithmSpecification API an. 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
ContainerEntrypointangeben, lautet die Anforderungssyntax mithilfe der CreateTrainingJob-API wie folgt.{ "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }Anschließend führt das SageMaker-Trainings-Backend Ihren benutzerdefinierten Eintrittspunkt wie folgt aus.
docker run --entrypoint<ContainerEntrypoint>imageAnmerkung
Wenn
ContainerEntrypointangegeben ist, führt das SageMaker-Trainings-Backend das Bild mit dem angegebenen Eintrittspunkt aus und überschreibt die StandardeinstellungENTRYPOINTim Bild. -
Wenn Sie nur angeben
ContainerArguments, geht SageMaker AI davon aus, dass der Docker-Container ein Eintrittspunktskript enthält. Die Anfragesyntax, die dieCreateTrainingJobAPI verwendet, lautet wie folgt.{ "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }Das SageMaker-Trainings-Backend führt Ihren benutzerdefinierten Eintrittspunkt wie folgt aus.
docker run image<ContainerArguments> -
Wenn Sie sowohl
ContainerEntrypointals auchContainerArgumentsangeben, lautet die Anfragesyntax mithilfe derCreateTrainingJobAPI wie folgt.{ "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }Das SageMaker-Trainings-Backend führt Ihren benutzerdefinierten Eintrittspunkt wie folgt aus.
docker run --entrypoint<ContainerEntrypoint>image<ContainerArguments>
Sie können jede unterstützte InputDataConfig Quelle in der CreateTrainingJob API verwenden, um ein Einstiegsskript zur Ausführung Ihres Trainings-Images bereitzustellen.
Stellen Sie Ihr Einstiegs-Skript in einem Amazon-S3-Bucket bereit
Um ein benutzerdefiniertes Eintrittspunktskript mithilfe eines S3-Buckets bereitzustellen, verwenden Sie den S3DataSource Parameter der DataSource-API, um den Speicherort des Skripts anzugeben. Wenn Sie den S3DataSource Parameter verwenden, ist Folgendes erforderlich.
-
Der InputMode muss vom Typ
Filesein. -
Der S3DataDistributionType muss
FullyReplicatedsein.
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 mit AWS CLI direkt oder mit einer JSON-Datei.
Konfigurieren Sie den Eingabedatenkanal mit 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 CreateTrainingJob-API definierte Anforderungssyntax verwenden.
// 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 direkt mit AWS CLI
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}'