

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
<a name="adapt-training-container"></a>

Um Ihr eigenes Trainingsmodell auszuführen, erstellen Sie mithilfe des [Amazon SageMaker Training Toolkit über eine SageMaker Amazon-Notebook-Instance](https://github.com/aws/sagemaker-training-toolkit) einen Docker-Container.

## Schritt 1: Erstellen Sie eine SageMaker Notebook-Instance
<a name="byoc-training-step1"></a>

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

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

1. Geben Sie auf der Seite **Notebook-Instance erstellen** folgende Informationen ein: 

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

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

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

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

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

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

1. 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](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateNotebookInstance.html). 

   

1. Klicken Sie auf den **Namen** des Notebooks, das Sie gerade erstellt haben. Dies öffnet eine neue Seite.

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

1. 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
<a name="byoc-training-step2"></a>

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. 

1. Erstellen Sie in dem Verzeichnis `docker_test_folder` eine Datei namens `Dockerfile`. 

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

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

   1. 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](https://github.com/aws/sagemaker-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.

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

1. 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](https://en.wikipedia.org/wiki/MNIST_database) 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
<a name="byoc-training-step3"></a>

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\$1tensorflow2** aus.

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

1. 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
<a name="byoc-training-step4"></a>

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\$1tensorflow2** aus. 

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

1. 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)
<a name="byoc-training-step5"></a>

1. Nachdem Sie diesen lokalen Modus-Test erfolgreich ausgeführt haben, können Sie den Docker-Container zu [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 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](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers-adapt-your-own-private-registry.html).

   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](https://console.aws.amazon.com/iam/home), 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.

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

1. 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 AI-Schätzer mit dem `byoc_image_uri` und initiiert einen Trainingsjob auf einer Amazon EC2 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()
   ```

------

1. Wenn Sie Ihr Modell mithilfe Ihres eigenen Containers bereitstellen möchten, finden Sie weitere Informationen unter [Anpassung Ihres eigenen Inferenz-Containers](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-inference-container.html). 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 ein benutzerdefinierter Container lokal getestet und auf ein Amazon ECR-Image übertragen wird, finden Sie im Beispielnotizbuch [Building Your TensorFlow Own Container](https://sagemaker-examples.readthedocs.io/en/latest/advanced_functionality/tensorflow_bring_your_own/tensorflow_bring_your_own.html).

**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 den Debugger mit benutzerdefinierten Trainingscontainern](debugger-bring-your-own-container.md).

## Schritt 6: Bereinigen von Ressourcen
<a name="byoc-training-step6"></a>

**So bereinigen Sie Ressourcen im Anschluss an das Einstiegsbeispiel**

1. ****Öffnen Sie die [SageMaker AI-Konsole, wählen Sie die Notebook-Instance](https://console.aws.amazon.com/sagemaker/) aus, wählen Sie Aktionen und dann Stopp. **RunScriptNotebookInstance****** Das Anhalten der Instance kann einige Minuten dauern. 

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

1. Öffnen Sie die [Amazon S3-Konsole](https://console.aws.amazon.com/s3/) und löschen Sie den Bucket, den Sie zum Speichern von Modellartefakten und dem Trainingsdatensatz erstellt haben. 

1. Öffnen Sie die [IAM-Konsole](https://console.aws.amazon.com/iam/) 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
<a name="byoc-blogs-and-examples"></a>

In den folgenden Blogs werden Fallstudien zur Verwendung von benutzerdefinierten Trainingscontainern in Amazon SageMaker AI behandelt.
+ [Warum sollten Sie Ihren eigenen Container zu Amazon SageMaker AI bringen und wie Sie es richtig machen](https://medium.com/@pandey.vikesh/why-bring-your-own-container-to-amazon-sagemaker-and-how-to-do-it-right-bc158fe41ed1), *Medium* (20. Januar 2023)