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.
Passen Sie Ihren eigenen Trainingscontainer an
Um Ihr eigenes Trainingsmodell auszuführen, erstellen Sie einen Docker-Container mit dem Amazon SageMaker Training Toolkit
Schritt 1: Erstellen einer SageMaker Notebook-Instance
Öffnen Sie die Amazon- SageMaker Konsole unter https://console.aws.amazon.com/sagemaker/
. -
Wählen Sie im linken Navigationsbereich Notebook, wählen Sie danach Notebook-Instanzen und dann Erstelle eine Notebook-Instanze.
-
Geben Sie auf der Seite Notebook-Instanze erstellen folgende Informationen ein:
-
Geben Sie unter Notebook instance name (Name der Notebook-Instance)
RunScriptNotebookInstance
ein. -
Wählen Sie für Notebook instance type (Typ der Notebook-Instance)
ml.t2.medium
aus. -
Im Abschnitt Genehmigung und Verschlüsselung gehen Sie wie folgt vor:
-
Wählen Sie für IAM Role (IAM-Rolle) die Option Create a New Role (Neue Rolle erstellen) aus. Dies öffnet ein neues Fenster.
-
Wählen Sie auf der Seite IAM-Rolle erstellen die Option Bestimmte S3-Buckets aus, geben Sie einen Amazon S3-Bucket mit dem Namen
sagemaker-run-script
an und wählen Sie dann Rolle erstellen aus.SageMaker erstellt eine IAM-Rolle mit dem Namen
AmazonSageMaker-ExecutionRole-
. Beispiel:YYYYMMDD
THHmmSS
AmazonSageMaker-ExecutionRole-20190429T110788
Beachten Sie, dass bei der Namenskonvention für Ausführungsrollen das Datum und die Uhrzeit verwendet werden, zu denen die Rolle erstellt wurde, getrennt durch einenT
.
-
-
Wählen Sie für Root Access (Root-Zugriff) die Option Enabled (Aktiviert) aus.
-
Wählen Sie Create notebook instance (Notebook-Instance erstellen) aus.
-
-
Auf der Seite Notebook-Instanzen lautet der Status Ausstehend. Es kann einige Minuten dauern, SageMaker bis Amazon eine Machine Learning-Compute-Instance startet – in diesem Fall startet es eine Notebook-Instance – und ihr ein ML-Speichervolume anfügt. Die Notebook-Instance verfügt über einen vorkonfigurierten Jupyter-Notebook-Server und mehrere Anaconda-Bibliotheken. Weitere Informationen finden Sie unter . CreateNotebookInstance.
-
Klicken Sie auf den Namen des Notizbuches, das Sie gerade erstellt haben. Dies öffnet eine neue Seite.
-
Kopieren Sie im Abschnitt Berechtigungen und Verschlüsselung die ARN-Nummer der IAM-Rolle und fügen Sie sie in eine Notepad-Datei ein, um sie vorübergehend zu speichern. Sie verwenden diese ARN-Nummer der IAM-Rolle später, um einen lokalen Trainingsschätzer in der Notebook-Instance zu konfigurieren. Die ARN-Nummer der IAM-Rolle sieht wie folgt aus:
'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'
-
Nachdem sich der Status der Notebook-Instance in geändert hatInService, wählen Sie Öffnen aus JupyterLab.
Schritt 2: Erstellen und Hochladen der Dockerdatei und der Python-Trainingsskripte
-
Nachdem JupyterLab geöffnet wurde, erstellen Sie einen neuen Ordner im Stammverzeichnis Ihres JupyterLab. Wählen Sie links oben das Symbol für Neuer Ordner und geben Sie dann den Ordnernamen ein
docker_test_folder
. -
Erstellen Sie in dem
docker_test_folder
Verzeichnis eineDockerfile
Textdatei.-
Wählen Sie das Symbol Neuer Launcher (+) links oben.
-
Wählen Sie im rechten Bereich unter dem Abschnitt Andere die Option Textdatei aus.
-
Fügen Sie den folgenden
Dockerfile
Beispielcode in Ihre Textdatei ein.#Download an open source TensorFlow Docker image FROM tensorflow/tensorflow:latest-gpu-jupyter # Install sagemaker-training toolkit that contains the common functionality necessary to create a container compatible with SageMaker and the Python SDK. RUN pip3 install sagemaker-training # Copies the training code inside the container COPY train.py /opt/ml/code/train.py # Defines train.py as script entrypoint ENV SAGEMAKER_PROGRAM train.py
Das Dockerfile-Skript führt die folgenden Aufgaben aus:
-
FROM tensorflow/tensorflow:latest-gpu-jupyter
– Lädt das neueste TensorFlow Docker-Basis-Image herunter. Sie können dies durch jedes Docker-Basis-Image ersetzen, das Sie zum Erstellen von Containern verwenden möchten, sowie durch AWS vorgefertigte Container-Basis-Images. -
RUN pip install sagemaker-training
– Installiert das SageMaker Training Toolkit, das die allgemeine Funktionalität enthält, die zum Erstellen eines mit kompatiblen Containers erforderlich ist SageMaker. -
COPY train.py /opt/ml/code/train.py
– Kopiert das Skript an den Speicherort innerhalb des Containers, der von erwartet wird SageMaker. Das Skript muss sich in diesem Ordner befinden. -
ENV SAGEMAKER_PROGRAM train.py
— Verwendet Ihr Trainingsskripttrain.py
als Einstiegsskript, das in den/opt/ml/code
Ordner des Containers kopiert wird. Dies ist die einzige Umgebungsvariable, die Sie angeben müssen, wenn Sie Ihren eigenen Container erstellen.
-
-
In der linken Verzeichnisnavigation wird der Name der Textdatei automatisch auf
untitled.txt
festgelegt. Um die Datei umzubenennen, klicken Sie mit der rechten Maustaste auf die Datei, wählen Sie Umbenennen, benennen Sie die Datei aufDockerfile
um ohne die.txt
Erweiterung, und drücken Sie dann aufCtrl+s
oderCommand+s
, um die Datei zu speichern.
-
-
Laden Sie ein Trainingsskript
train.py
in dendocker_test_folder
hoch. Sie können das folgende Beispielskript verwenden, um ein Modell zu erstellen, das handgeschriebene Ziffern liest, die mit dem MNIST-Datensatzfür diese Übung trainiert wurden. import tensorflow as tf import os mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1) model_save_dir = f"{os.environ.get('SM_MODEL_DIR')}/1" model.evaluate(x_test, y_test) tf.saved_model.save(model, model_save_dir)
Schritt 3: Erstellen des Containers
-
Öffnen Sie im JupyterLab Stammverzeichnis ein Jupyter-Notebook. Um ein neues Notizbuch zu öffnen, wählen Sie das Symbol New Launch und wählen Sie dann im Abschnitt Notebook die neueste Version von conda_tensorflow2 aus.
-
Führen Sie in der ersten Notebookzelle den folgenden Befehl aus, um in das
docker_test_folder
Verzeichnis zu wechseln:cd ~/SageMaker/docker_test_folder
Dies gibt Ihr aktuelles Verzeichnis wie folgt zurück:
! pwd
output: /home/ec2-user/SageMaker/docker_test_folder
-
Zum Erstellen des Docker-Containers führen Sie den folgenden Docker-Build-Befehl, einschließlich der Leertaste gefolgt vom Punkt am Ende, aus.
! docker build -t tf-custom-container-test .
Der Docker-Build-Befehl muss von dem von Ihnen erstellten Docker-Verzeichnis aus ausgeführt werden. In diesem Fall ist dies
docker_test_folder
.Anmerkung
Wenn Sie die folgende Fehlermeldung erhalten, dass Docker das Dockerfile nicht finden kann, stellen Sie sicher, dass das Dockerfile den richtigen Namen hat und im Verzeichnis gespeichert wurde.
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/SageMaker/docker/Dockerfile: no such file or directory
Denken Sie daran, dass
docker
im aktuellen Verzeichnis spezifisch nachDockerfile
, ohne Erweiterung, sucht. Wenn Sie sie anders benannt haben, können Sie den Dateinamen manuell mit dem-f
-Argument übergeben. Wenn Sie Ihre Docker-Datei beispielsweise als benanntDockerfile-text.txt
haben, führen Sie den folgenden Befehl aus:! docker build -t tf-custom-container-test -f Dockerfile-text.txt .
Schritt 4: Testen des Containers
-
Um den Container lokal für die Notebook-Instance zu testen, öffnen Sie ein Jupyter-Notebook. Wählen Sie New Launcher und wählen Sie im Notebook Bereich die neueste Version von conda_tensorflow2 aus.
-
Fügen Sie das folgende Beispielskript in die Notebook-Codezelle ein, um einen SageMaker Schätzer zu konfigurieren.
import sagemaker from sagemaker.estimator import Estimator estimator = Estimator(image_uri='
tf-custom-container-test
', role=sagemaker.get_execution_role()
, instance_count=1
, instance_type='local'
) estimator.fit()Im vorherigen Codebeispiel
sagemaker.get_execution_role()
wird für dasrole
Argument angegeben, um die für die SageMaker Sitzung eingerichtete Rolle automatisch abzurufen. Sie können ihn auch durch den String-Wert der ARN-Nummer der IAM-Rolle ersetzen, die Sie bei der Konfiguration der Notebook-Instance verwendet haben. Der ARN sollte wie folgt aussehen:'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'
. -
Führen Sie die Code-Zelle aus. Dieser Test gibt die Konfiguration der Schulungsumgebung, die Werte für die Umgebungsvariablen, die Quelle der Daten sowie den Verlust und die Genauigkeit aus, die bei der Schulung erreicht wurden.
Schritt 5: Senden des Containers an die Amazon Elastic Container Registry (Amazon ECR)
-
Nachdem Sie diesen lokalen Modus-Test erfolgreich ausgeführt haben, können Sie den Docker-Container zu Amazon ECR senden und es zum Ausführen von Trainingsaufträgen verwenden. Wenn Sie anstelle von Amazon ECR ein privates Docker-Verzeichnis verwenden möchten, finden Sie weitere Informationen unter Senden Sie Ihren Training-Container zu einem privaten Verzeichnis.
Führen Sie die folgenden Befehlszeilen in einer Notizbuchzelle aus.
%%sh # Specify an algorithm name algorithm_name=
tf-custom-container-test
account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly aws ecr get-login-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}Anmerkung
Dieses Bash-Shell-Skript kann ein Berechtigungsproblem auslösen, das der folgenden Fehlermeldung ähnelt:
"denied: User: [ARN] is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:us-east-1:[id]:repository/tf-custom-container-test"
Wenn dieser Fehler auftritt, müssen Sie die AmazonEC2ContainerRegistryFullAccess-Richtlinie an Ihre IAM-Rolle anfügen. Gehen Sie zur IAM-Konsole
, wählen Sie im linken Navigationsbereich Rollen aus und suchen Sie nach der IAMRole, die Sie für die Notebook-Instanze verwendet haben. Wählen Sie auf der Registerkarte Berechtigung die Schaltfläche Richtlinien anfügen und suchen Sie nach der AmazonEC2ContainerRegistryFullAccess-Richtlinie. Aktivieren Sie das Kontrollkästchen für die Richtlinie und wählen Sie zum Abschluss Berechtigungen hinzufügen aus. -
Führen Sie den folgenden Code in einer Studio-Notebook-Zelle aus, um das Amazon ECR-Image Ihres Trainingscontainers aufzurufen.
import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'tf-custom-container-test' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) byoc_image_uri # This should return something like # 111122223333.dkr.ecr.us-east-2.amazonaws.com/sagemaker-byoc-test:latest
-
Verwenden Sie die aus dem vorherigen Schritt
ecr_image
abgerufene , um ein SageMaker Schätzerobjekt zu konfigurieren. Das folgende Codebeispiel konfiguriert einen SageMaker Schätzer mitbyoc_image_uri
und initiiert einen Schulungsauftrag auf einer Amazon EC2-Instance. -
Wenn Sie Ihr Modell mithilfe Ihres eigenen Containers bereitstellen möchten, finden Sie weitere Informationen unter Anpassung Ihres eigenen Inferenz-Containers. Sie können auch einen AWS Framework-Container verwenden, der ein TensorFlow Modell bereitstellen kann. Um das Beispielmodell zum Lesen handgeschriebener Ziffern bereitzustellen, geben Sie das folgende Beispielskript in dasselbe Notizbuch ein, mit dem Sie Ihr Modell im vorherigen Unterschritt trainiert haben, um die für die Bereitstellung erforderlichen Image-URIs (Universal Resource Identifier) zu erhalten, und stellen Sie das Modell bereit.
import boto3 import sagemaker #obtain image uris from sagemaker import image_uris container = image_uris.retrieve(framework='tensorflow',region='us-west-2',version='2.11.0', image_scope='inference',instance_type='ml.g4dn.xlarge') #create the model entity, endpoint configuration and endpoint predictor = estimator.deploy(1,instance_type='ml.g4dn.xlarge',image_uri=container)
Testen Sie Ihr Modell anhand einer handgeschriebenen Beispielziffer aus dem MNIST-Datensatz anhand des folgenden Codebeispiels.
#Retrieve an example test dataset to test import numpy as np import matplotlib.pyplot as plt from keras.datasets import mnist # Load the MNIST dataset and split it into training and testing sets (x_train, y_train), (x_test, y_test) = mnist.load_data() # Select a random example from the training set example_index = np.random.randint(0, x_train.shape[0]) example_image = x_train[example_index] example_label = y_train[example_index] # Print the label and show the image print(f"Label: {example_label}") plt.imshow(example_image, cmap='gray') plt.show()
Konvertieren Sie die handgeschriebene Testziffer in ein Formular, das erfassen und eine Testvorhersage treffen TensorFlow kann.
from sagemaker.serializers import JSONSerializer data = {"instances": example_image.tolist()} predictor.serializer=JSONSerializer() #update the predictor to use the JSONSerializer predictor.predict(data) #make the prediction
Ein vollständiges Beispiel, das zeigt, wie Sie einen benutzerdefinierten Container lokal testen und an ein Amazon-ECR-Image übertragen, finden Sie im Beispiel-Notebook Building Your Own TensorFlow Container
Tipp
Verwenden Sie Amazon SageMaker Debugger, um Trainingsaufträge zu profilieren und zu debuggen, um Probleme mit der Systemauslastung (wie CPU-Engpässe und GPU-Unterauslastung) zu überwachen und Trainingsprobleme zu identifizieren (wie Überanpassung, Übertraining, explodierende Tensoren und verschwindende Gradienten). Weitere Informationen finden Sie unter Verwenden Sie Debugger mit benutzerdefinierten Trainingscontainern.
Schritt 6: Bereinigen von Ressourcen
So bereinigen Sie Ressourcen im Anschluss an das Einstiegsbeispiel
-
Öffnen Sie die SageMaker -Konsole
, wählen Sie die Notebook-Instance RunScriptNotebookInstanceaus, wählen Sie Aktionen und dann Stoppen aus. Das Anhalten der Instance kann einige Minuten dauern. -
Nachdem sich der Instanz-Status auf Gestoppt geändert hat, wählen Sie Aktionen, dann Löschen und anschließend im Dialogfeld Löschen aus. Das Löschen der Instanz kann einige Minuten dauern. Die Notebook-Instanz verschwindet aus der Tabelle, wenn sie gelöscht wurde.
-
Öffnen Sie die Amazon S3-Konsole
und löschen Sie den Bucket, den Sie zum Speichern von Modellartefakten und dem Trainingsdataset erstellt haben. -
Öffnen Sie die IAM-Konsole
und löschen Sie die IAM-Rolle. Wenn Sie Berechtigungsrichtlinien erstellt haben, können Sie diese ebenfalls löschen. Anmerkung
Der Docker-Container wird nach seiner Ausführung automatisch beendet. Sie müssen ihn nicht löschen.
Blogs und Fallstudien
In den folgenden Blogs werden Fallstudien zur Verwendung benutzerdefinierter Trainingscontainer in Amazon behandelt SageMaker.
-
Warum Sie Ihren eigenen Container zu Amazon bringen SageMaker und wie Sie ihn richtig machen können,
Medium (20. Januar 2023)