Passen Sie Ihren eigenen Trainingscontainer an - 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.

Passen Sie Ihren eigenen Trainingscontainer an

Um Ihr eigenes Trainingsmodell auszuführen, erstellen Sie einen Docker-Container mit dem Amazon SageMaker Training Toolkit über eine Amazon- SageMaker Notebook-Instance.

Schritt 1: Erstellen einer SageMaker Notebook-Instance

  1. Öffnen Sie die Amazon- SageMaker Konsole unter https://console.aws.amazon.com/sagemaker/.

  2. Wählen Sie im linken Navigationsbereich Notebook, wählen Sie danach Notebook-Instanzen und dann Erstelle eine Notebook-Instanze.

  3. Geben Sie auf der Seite Notebook-Instanze erstellen folgende Informationen ein:

    1. Geben Sie unter Notebook instance name (Name der Notebook-Instance) RunScriptNotebookInstance ein.

    2. Wählen Sie für Notebook instance type (Typ der Notebook-Instance) ml.t2.medium aus.

    3. Im Abschnitt Genehmigung und Verschlüsselung gehen Sie wie folgt vor:

      1. Wählen Sie für IAM Role (IAM-Rolle) die Option Create a New Role (Neue Rolle erstellen) aus. Dies öffnet ein neues Fenster.

      2. 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-YYYYMMDDTHHmmSS. Beispiel: 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 einen T.

    4. Wählen Sie für Root Access (Root-Zugriff) die Option Enabled (Aktiviert) aus.

    5. Wählen Sie Create notebook instance (Notebook-Instance erstellen) aus.

  4. 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.

  5. Klicken Sie auf den Namen des Notizbuches, das Sie gerade erstellt haben. Dies öffnet eine neue Seite.

  6. 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'

  7. 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

  1. 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.

  2. Erstellen Sie in dem docker_test_folder Verzeichnis eine Dockerfile Textdatei.

    1. Wählen Sie das Symbol Neuer Launcher (+) links oben.

    2. Wählen Sie im rechten Bereich unter dem Abschnitt Andere die Option Textdatei aus.

    3. 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 Trainingsskript train.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.

    4. 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 auf Dockerfile um ohne die .txt Erweiterung, und drücken Sie dann auf Ctrl+s oder Command+s, um die Datei zu speichern.

  3. Laden Sie ein Trainingsskript train.py in den docker_test_folder hoch. Sie können das folgende Beispielskript verwenden, um ein Modell zu erstellen, das handgeschriebene Ziffern liest, die mit dem MNIST-Datensatz fü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

  1. Ö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.

  2. 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

  3. 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 nach Dockerfile, 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 benannt Dockerfile-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

  1. 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.

  2. 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 das role 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'.

  3. 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)

  1. 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.

  2. 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
  3. 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 mit byoc_image_uri und initiiert einen Schulungsauftrag auf einer Amazon EC2-Instance.

    SageMaker Python SDK v1
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.g4dn.xlarge') #train your model estimator.fit()
    SageMaker Python SDK v2
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.g4dn.xlarge') #train your model estimator.fit()
  4. 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
  1. Ö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.

  2. 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.

  3. Öffnen Sie die Amazon S3-Konsole und löschen Sie den Bucket, den Sie zum Speichern von Modellartefakten und dem Trainingsdataset erstellt haben.

  4. Ö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.