Den eigenen Trainingscontainer anpassen - Amazon SageMaker KI

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.

Den eigenen Trainingscontainer anpassen

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

Schritt 1: Erstellen Sie eine SageMaker Notebook-Instance

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

  2. Wählen Sie im linken Navigationsbereich Notebook, wählen Sie danach Notebook-Instances und anschließend Notebook-Instance erstellen.

  3. Geben Sie auf der Seite Notebook-Instance 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 Berechtigungen 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 AI erstellt eine IAM-Rolle mit dem NamenAmazonSageMaker-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-Instances lautet der Status Ausstehend. Es kann einige Minuten dauern, bis Amazon SageMaker AI eine Recheninstanz für maschinelles Lernen startet — in diesem Fall startet sie eine Notebook-Instance — und ihr ein ML-Speichervolume anhängt. 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 Notebooks, 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 IAM-Rollen-ARN-Nummer 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-Instanz auf geändert hat InService, wählen Sie Öffnen JupyterLab.

Schritt 2: Erstellen und Hochladen der Dockerdatei und der Python-Trainingsskripte

  1. Erstellen Sie nach dem JupyterLab Öffnen einen neuen Ordner im Home-Verzeichnis Ihres JupyterLab. Wählen Sie links oben das Symbol Neuer Ordner und geben Sie dann den Ordnernamen docker_test_folder ein.

  2. Erstellen Sie in dem Verzeichnis docker_test_folder eine Datei namens Dockerfile.

    1. Wählen Sie das Symbol Neuer Launcher (+) in der oberen linken Ecke.

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

    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 AI 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 AI Training Toolkit, das die allgemeinen Funktionen enthält, die zur Erstellung eines mit KI kompatiblen Containers erforderlich sind. SageMaker

      • COPY train.py /opt/ml/code/train.py— Kopiert das Skript an die Stelle innerhalb des Containers, die von der SageMaker KI erwartet wird. 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 in 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 Home-Verzeichnis ein Jupyter-Notizbuch. Um ein neues Notebook 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 den folgenden Befehl in der ersten Notebook-Zelle aus, um in das Verzeichnis docker_test_folder 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 der von Ihnen erstellten Docker-Registry 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 einer Datei namens 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 Bereich Notebook die neueste Version von conda_tensorflow2 aus.

  2. Fügen Sie das folgende Beispielskript in die Notebook-Codezelle ein, um einen SageMaker AI Estimator 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, automatisch die für die SageMaker AI-Sitzung eingerichtete Rolle 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 Trainingsumgebung, die Werte für die Umgebungsvariablen, die Quelle der Daten sowie den Verlust und die Genauigkeit aus, die bei dem Training 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 ihn zum Ausführen von Trainingsaufträgen verwenden. Wenn Sie anstelle von Amazon ECR eine private Docker-Registry 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 Notebook-Zelle 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 EC2ContainerRegistryFullAccessAmazon-Richtlinie an Ihre IAM-Rolle anhängen. Gehen Sie zur IAM-Konsole, wählen Sie im linken Navigationsbereich Rollen aus und suchen Sie nach der Instance, die IAMrole Sie für die Notebook-Instance verwendet haben. Wählen Sie auf der Registerkarte „Genehmigung“ die Schaltfläche „Richtlinien anhängen“ und suchen Sie nach der EC2ContainerRegistryFullAccessAmazon-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 das aus dem vorherigen Schritt ecr_image abgerufene Objekt, um ein SageMaker AI-Estimator-Objekt zu konfigurieren. Das folgende Codebeispiel konfiguriert einen SageMaker KI-Schätzer mit dem byoc_image_uri und initiiert einen Trainingsjob auf einer Amazon-Instance. EC2

    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 Modell bereitstellen kann. TensorFlow Um das Beispielmodell zum Lesen handgeschriebener Ziffern bereitzustellen, geben Sie das folgende Beispielskript in dasselbe Notizbuch ein, mit dem Sie Ihr Modell im vorherigen Teilschritt trainiert haben, um das für die Bereitstellung benötigte Image URIs (Universal Resource Identifiers) 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()

    Wandeln Sie die handgeschriebene Testziffer in ein Formular um, das Daten aufnehmen und eine Testprognose erstellen 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 auf ein Amazon ECR-Image übertragen können, finden Sie im Beispielnotizbuch Building Your TensorFlow Own Container.

Tipp

Verwenden Sie Amazon Debugger, um Trainingsjobs 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). SageMaker 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 AI-Konsole, wählen Sie die Notebook-Instance aus, wählen Sie Aktionen und dann Stopp. RunScriptNotebookInstance Das Anhalten der Instance kann einige Minuten dauern.

  2. Nachdem sich der Instance-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 Instance kann einige Minuten dauern. Die Notebook-Instance 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 Trainingsdatensatz 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 von benutzerdefinierten Trainingscontainern in Amazon SageMaker AI behandelt.