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 führt Amazon Ihr Trainings-Image aus
Sie können ein benutzerdefiniertes Einstiegspunkt-Skript verwenden, um die Infrastruktur für das Training in einer Produktionsumgebung zu automatisieren. Wenn Sie Ihr Einstiegspunktskript an Ihren Docker-Container übergeben, können Sie es auch als eigenständiges Skript ausführen, ohne Ihre Images neu zu erstellen. SageMaker verarbeitet Ihr Trainingsbild mit einem Docker-Container-Einstiegspunktskript.
In diesem Abschnitt erfahren Sie, wie Sie einen benutzerdefinierten Einstiegspunkt verwenden, ohne das Trainingstoolkit zu verwenden. Wenn Sie einen benutzerdefinierten Einstiegspunkt verwenden möchten, aber mit der manuellen Konfiguration eines Docker-Containers nicht vertraut sind, empfehlen wir Ihnen, stattdessen die SageMaker Trainings-Toolkit-Bibliothek
Standardmäßig SageMaker sucht nach einem Skript namens train
in Ihrem Container. Sie können Ihren eigenen benutzerdefinierten Einstiegspunkt auch manuell angeben, indem Sie die ContainerEntrypoint
Parameter ContainerArguments
und 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 Einstiegspunkt-Anweisung.
-
Verwenden Sie die
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ätzersource_dir
können Sie auf mehrere Dateien verweisen. Wenn Sie source_dir
nicht verwenden, können Sie den Einstiegspunkt mithilfe des entry_point
Parameters angeben. Ein Beispiel für ein benutzerdefiniertes Einstiegspunktskript, das einen Schätzer enthält, finden Sie unter Bring Your Own Model with SageMaker Script Mode.
SageMaker -Modelltraining unterstützt leistungsstarke Verzeichnis-Buckets von S3 Express One Zone als Dateneingabespeicherort für den Dateimodus, den schnellen Dateimodus und den Pipe-Modus. Sie können auch Verzeichnis-Buckets von S3 Express One Zone verwenden, um Ihre Trainingsausgabe zu speichern. Um S3 Express One Zone zu verwenden, geben Sie den URI eines S3 Express One Zone-Verzeichnis-Buckets anstelle eines Amazon S3-Allzweck-Buckets an. 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 Einstiegspunktskript 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 Standard-CMD
-Anweisungen in einem Container, indem das train
Argument hinter dem Image-Namen angegeben wird. Verwenden Sie in Ihrem Docker-Container die folgendeexec
Form derENTRYPOINT
Anweisung.ENTRYPOINT ["
executable
", "param1
", "param2
", ...]Das folgende Beispiel zeigt, wie Sie eine
k-means-algorithm.py
genannte Python-Einstiegspunktanweisung 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
. Auf diese Weise kann es Signale wieSIGTERM
undSIGKILL
von SageMaker APIs empfangen. Bei Verwendung der SageMaker APIs gelten die folgenden Bedingungen.-
Die
CreateTrainingJob
API verfügt über eine Stoppbedingung, die SageMaker anweist, das Modelltraining nach einer bestimmten Zeit zu beenden. -
Im Folgenden wird die
StopTrainingJob
API dargestellt. Diese API gibt das Äquivalent desdocker stop
mit einer 2-minütigen Zeitüberschreitung aus, um den angegebenen Container ordnungsgemäß zu beenden.docker stop -t 120
Der Befehl versucht, den ausgeführten Container durch das Senden eines
SIGTERM
-Signals zu beenden. Nach der 2-minütigen Zeitüberschreitung sendet die APISIGKILL
und hält die Container zwangsweise an. Wenn der ContainerSIGTERM
ordnungsgemäß verarbeitet und sich innerhalb von 120 Sekunden nach Erhalt der Meldung beendet, wird keinSIGKILL
gesendet.
Wenn Sie Zugriff auf die Zwischenmodellartefakte haben möchten, nachdem das Training SageMaker beendet hat, fügen Sie Code hinzu, um das Speichern von Artefakten in Ihrem
SIGTERM
Handler zu verwalten. -
-
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-docker
finden Sie unter NVIDIA/nvidia-docker. -
Sie können den
tini
Initialisierer nicht als Einstiegspunktskript in SageMaker Containern verwenden, daserve
er durch die Argumentetrain
und verwirrt wird. -
/opt/ml
und alle Unterverzeichnisse sind für das 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.
Fahren Sie mit dem folgenden Abschnitt fort, 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.
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 Einstiegspunktskript
custom_entrypoint.sh
aus dem aktuellen Arbeitsverzeichnis in einen Docker-Container, der sich inmydir
befindet. Im folgenden Beispiel wird davon ausgegangen, dass auf dem Docker-Basisabbild 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 Trainingsauftrag, 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.
-
Kopieren Sie Ihr Python-Skript aus Ihrem Arbeitsverzeichnis in Ihren Docker-Container. Der folgende Codeausschnitt kopiert ein benutzerdefiniertes Einstiegspunktskript
custom_entrypoint.py
aus dem aktuellen Arbeitsverzeichnis in einen Docker-Container, der sich inmydir
befindet.FROM
<base-docker-image>
:<tag>
# Copy custom entrypoint from current dir to /mydir on container COPY./custom_entrypoint.py /mydir/
-
Starten Sie den Trainingsauftrag, 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 Einstiegspunktskript 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 der AlgorithmSpecification API an. Diese Einstiegspunkte und Argumente verhalten sich genauso wie Docker-Einstiegspunkte 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 Einstiegspunkt-Skript an Ihren Docker-Trainingscontainer übergeben, bestimmen die von Ihnen angegebenen Eingaben das Verhalten des Containers.
-
Wenn Sie beispielsweise nur angeben
ContainerEntrypoint
, sieht die Anforderungssyntax mithilfe der CreateTrainingJob API wie folgt aus.{ "AlgorithmSpecification": { "ContainerEntrypoint": ["
string
"], ... } }Anschließend führt das SageMaker Trainings-Backend Ihren benutzerdefinierten Einstiegspunkt wie folgt aus.
docker run --entrypoint
<ContainerEntrypoint>
imageAnmerkung
Wenn angegeben
ContainerEntrypoint
ist, führt das SageMaker Trainings-Backend das Bild mit dem angegebenen Einstiegspunkt aus und überschreibt die StandardeinstellungENTRYPOINT
im Bild. -
Wenn Sie nur angeben
ContainerArguments
, SageMaker wird davon ausgegangen, dass der Docker-Container ein Einstiegspunktskript enthält. Die Anfragesyntax, die dieCreateTrainingJob
API verwendet, lautet wie folgt.{ "AlgorithmSpecification": { "ContainerArguments": ["
arg1
", "arg2
"], ... } }Das SageMaker Trainings-Backend führt Ihren benutzerdefinierten Einstiegspunkt wie folgt aus.
docker run image
<ContainerArguments>
-
Wenn Sie sowohl
ContainerEntrypoint
als auchContainerArguments
angeben, lautet die Anfragesyntax mithilfe derCreateTrainingJob
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 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 Einstiegspunktskript mithilfe eines S3-Buckets bereitzustellen, verwenden Sie den DataSource-S3DataSource
Parameter der API, um den Speicherort des Skripts anzugeben. Wenn Sie den S3DataSource
Parameter verwenden, ist Folgendes erforderlich.
-
Der InputMode muss vom Typ sein
File
. -
Der S3DataDistributionType muss sein
FullyReplicated
.
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. Verwenden Sie dazu entweder AWS CLI direkt oder mit einer JSON-Datei.
Konfigurieren des Eingabedatenkanals mit AWS CLI mit einer JSON-Datei
Um Ihren Eingabedatenkanal mit einer JSON-Datei zu konfigurieren, verwenden Sie , AWS CLI wie in der folgenden Codestruktur gezeigt. Stellen Sie sicher, dass alle der 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 Trainingsauftrag wie folgt aus der JSON-Datei zu starten.
aws sagemaker create-training-job --cli-input-json file:
//run-my-training-job.json
Konfigurieren des Eingabedatenkanals mit 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
}'