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.
Erweitern eines vorgefertigten Containers
Wenn ein vorgefertigter SageMaker-AI-Container nicht alle Ihre Anforderungen erfüllt, können Sie das bestehende Image an Ihre Bedürfnisse anpassen. Auch wenn es direkte Unterstützung für Ihre Umgebung oder Ihr Framework gibt, möchten Sie vielleicht zusätzliche Funktionen hinzufügen oder Ihre Container-Umgebung anders konfigurieren. Durch die Erweiterung eines vorgefertigten Images können Sie die enthaltenen Deep-Learning-Bibliotheken und -Einstellungen nutzen, ohne ein Image von Grund auf neu erstellen zu müssen. Sie können den Container erweitern, um Bibliotheken hinzuzufügen, Einstellungen zu ändern und zusätzliche Abhängigkeiten zu installieren.
Das folgende Tutorial zeigt, wie Sie ein vorgefertigtes SageMaker-Image erweitern und in Amazon ECR veröffentlichen.
Themen
Anforderungen für die Erweiterung eines vorgefertigten Containers
Um ein vorgefertigtes SageMaker-Image zu erweitern, müssen Sie die folgenden Umgebungsvariablen in Ihrem Dockerfile festlegen. Weitere Informationen zu Umgebungsvariablen mit SageMaker-AI-Containern finden Sie im GitHub-Repository des SageMaker AI Training Toolkit
SAGEMAKER_SUBMIT_DIRECTORY: Das Verzeichnis innerhalb des Containers, in dem sich das Python-Skript für das Training befindet.SAGEMAKER_PROGRAM: Das Python-Skript, das aufgerufen und als Eintrittspunkt für das Training verwendet werden soll.
Sie können auch zusätzliche Bibliotheken installieren, indem Sie Folgendes in Ihrem Dockerfile aufnehmen:
RUN pip install<library>
Das folgende Tutorial zeigt, wie diese Umgebungsvariablen verwendet werden.
Erweitern von SageMaker-AI-Containern zur Ausführung eines Python-Skripts
In diesem Tutorial erfahren Sie, wie Sie den PyTorch-Container von SageMaker AI mit einer Python-Datei erweitern, die den CIFAR-10-Datensatz verwendet. Durch die Erweiterung des PyTorch-Containers von SageMaker AI nutzen Sie die bestehende Trainingslösung, die für die Zusammenarbeit mit SageMaker AI entwickelt wurde. In diesem Tutorial wird ein Trainings-Image erweitert, es können jedoch dieselben Schritte unternommen werden, um ein Inferenz-Image zu erweitern. Die vollständige Liste der verfügbaren Images finden Sie unter Verfügbare Deep-Learning-Container-Images
Um Ihr eigenes Trainingsmodell mit den SageMaker-AI-Containern auszuführen, erstellen Sie einen Docker-Container über eine SageMaker AI-Notebook-Instance.
Schritt 1: Erstellen einer SageMaker-Notebook-Instance
-
Öffnen Sie die SageMaker-AI-Konsole
. -
Wählen Sie im linken Navigationsbereich Notebook, wählen Sie danach Notebook-Instances und anschließend Notebook-Instance erstellen.
-
Geben Sie auf der Seite Notebook-Instance erstellen folgende Informationen ein:
-
Geben Sie unter Notebook instance name (Name der Notebook-Instance)
RunScriptNotebookInstanceein. -
Wählen Sie für Notebook instance type (Typ der Notebook-Instance)
ml.t2.mediumaus. -
Im Abschnitt Berechtigungen 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.
-
Wählen Sie auf der Seite IAM-Rolle erstellen die Option Spezifische S3-Buckets aus, spezifizieren Sie einen S3-Bucket mit dem Namen
sagemaker-run-scriptund wählen Sie dann Rolle erstellen aus.SageMaker AI erstellt eine IAM-Rolle mit dem Namen
AmazonSageMaker-ExecutionRole-, wie z. B.YYYYMMDDTHHmmSSAmazonSageMaker-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-Zugriff die Option Aktiviert aus.
-
Wählen Sie Create notebook instance (Notebook-Instance erstellen) aus.
-
-
Auf der Seite Notebook-Instances lautet der Status Ausstehend. Es kann einige Minuten dauern, bis Amazon SageMaker AI eine Rechen-Instance für Machine Learning startet – in diesem Fall startet es 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.
Kopieren Sie im Abschnitt Berechtigungen und Verschlüsselung die IAM-Rollen-ARN-Nummer 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'-
Nachdem sich der Status der Notebook-Instance auf InService geändert hat, wählen Sie JupyterLab öffnen.
Schritt 2: Erstellen und Hochladen der Dockerdatei und der Python-Trainingsskripte
-
Erstellen Sie nach dem Öffnen von JupyterLab einen neuen Ordner im Heimatverzeichnis Ihres JupyterLab. Wählen Sie links oben das Symbol Neuer Ordner und geben Sie dann den Ordnernamen
docker_test_folderein. -
Erstellen Sie in dem Verzeichnis
docker_test_foldereine Datei namensDockerfile.-
Wählen Sie das Symbol Neuer Launcher (+) in der oberen linken Ecke.
-
Wählen Sie im rechten Bereich unter dem Abschnitt Andere die Option Textdatei.
-
Fügen Sie den folgenden
Dockerfile-Beispielcode in Ihre Textdatei ein.# SageMaker PyTorch image FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04 ENV PATH="/opt/ml/code:${PATH}" # this environment variable is used by the SageMaker PyTorch container to determine our user code directory. ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code # /opt/ml and all subdirectories are utilized by SageMaker, use the /code subdirectory to store your user code. COPY cifar10.py /opt/ml/code/cifar10.py # Defines cifar10.py as script entrypoint ENV SAGEMAKER_PROGRAM cifar10.pyDas Dockerfile-Skript führt die folgenden Aufgaben aus:
-
FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04– Lädt das PyTorch-Basis-Image von SageMaker AI herunter. Sie können dies durch ein beliebiges Basis-Image von SageMaker AI ersetzen, das Sie zum Erstellen von Containern verwenden möchten. -
ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code– Legt/opt/ml/codeals Trainingsskriptverzeichnis fest. -
COPY cifar10.py /opt/ml/code/cifar10.py– Kopiert das Skript in den von SageMaker AI erwarteten Speicherort innerhalb des Containers. Das Skript muss sich in diesem Ordner befinden. -
ENV SAGEMAKER_PROGRAM cifar10.py– Legt Ihrcifar10.py-Trainingsskript als Einstiegsskript fest.
-
-
In der linken Verzeichnisnavigation wird der Name der Textdatei automatisch auf
untitled.txtfestgelegt. Um die Datei umzubenennen, klicken Sie mit der rechten Maustaste auf die Datei, wählen Sie Umbenennen, benennen Sie die Datei inDockerfileohne die.txt-Erweiterung um und drücken Sie dann aufCtrl+soderCommand+s, um die Datei zu speichern.
-
-
Erstellen Sie oder laden Sie ein Trainingsskript
cifar10.pyin derdocker_test_folderhoch. Sie können das folgende Beispiel-Skript für diese Übung nutzen.import ast import argparse import logging import os import torch import torch.distributed as dist import torch.nn as nn import torch.nn.parallel import torch.optim import torch.utils.data import torch.utils.data.distributed import torchvision import torchvision.models import torchvision.transforms as transforms import torch.nn.functional as F logger=logging.getLogger(__name__) logger.setLevel(logging.DEBUG) classes=('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') # https://github.com/pytorch/tutorials/blob/master/beginner_source/blitz/cifar10_tutorial.py#L118 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1=nn.Conv2d(3, 6, 5) self.pool=nn.MaxPool2d(2, 2) self.conv2=nn.Conv2d(6, 16, 5) self.fc1=nn.Linear(16 * 5 * 5, 120) self.fc2=nn.Linear(120, 84) self.fc3=nn.Linear(84, 10) def forward(self, x): x=self.pool(F.relu(self.conv1(x))) x=self.pool(F.relu(self.conv2(x))) x=x.view(-1, 16 * 5 * 5) x=F.relu(self.fc1(x)) x=F.relu(self.fc2(x)) x=self.fc3(x) return x def _train(args): is_distributed=len(args.hosts) > 1 and args.dist_backend is not None logger.debug("Distributed training - {}".format(is_distributed)) if is_distributed: # Initialize the distributed environment. world_size=len(args.hosts) os.environ['WORLD_SIZE']=str(world_size) host_rank=args.hosts.index(args.current_host) dist.init_process_group(backend=args.dist_backend, rank=host_rank, world_size=world_size) logger.info( 'Initialized the distributed environment: \'{}\' backend on {} nodes. '.format( args.dist_backend, dist.get_world_size()) + 'Current host rank is {}. Using cuda: {}. Number of gpus: {}'.format( dist.get_rank(), torch.cuda.is_available(), args.num_gpus)) device='cuda' if torch.cuda.is_available() else 'cpu' logger.info("Device Type: {}".format(device)) logger.info("Loading Cifar10 dataset") transform=transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset=torchvision.datasets.CIFAR10(root=args.data_dir, train=True, download=False, transform=transform) train_loader=torch.utils.data.DataLoader(trainset, batch_size=args.batch_size, shuffle=True, num_workers=args.workers) testset=torchvision.datasets.CIFAR10(root=args.data_dir, train=False, download=False, transform=transform) test_loader=torch.utils.data.DataLoader(testset, batch_size=args.batch_size, shuffle=False, num_workers=args.workers) logger.info("Model loaded") model=Net() if torch.cuda.device_count() > 1: logger.info("Gpu count: {}".format(torch.cuda.device_count())) model=nn.DataParallel(model) model=model.to(device) criterion=nn.CrossEntropyLoss().to(device) optimizer=torch.optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) for epoch in range(0, args.epochs): running_loss=0.0 for i, data in enumerate(train_loader): # get the inputs inputs, labels=data inputs, labels=inputs.to(device), labels.to(device) # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs=model(inputs) loss=criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss=0.0 print('Finished Training') return _save_model(model, args.model_dir) def _save_model(model, model_dir): logger.info("Saving the model.") path=os.path.join(model_dir, 'model.pth') # recommended way from http://pytorch.org/docs/master/notes/serialization.html torch.save(model.cpu().state_dict(), path) def model_fn(model_dir): logger.info('model_fn') device="cuda" if torch.cuda.is_available() else "cpu" model=Net() if torch.cuda.device_count() > 1: logger.info("Gpu count: {}".format(torch.cuda.device_count())) model=nn.DataParallel(model) with open(os.path.join(model_dir, 'model.pth'), 'rb') as f: model.load_state_dict(torch.load(f)) return model.to(device) if __name__ == '__main__': parser=argparse.ArgumentParser() parser.add_argument('--workers', type=int, default=2, metavar='W', help='number of data loading workers (default: 2)') parser.add_argument('--epochs', type=int, default=2, metavar='E', help='number of total epochs to run (default: 2)') parser.add_argument('--batch-size', type=int, default=4, metavar='BS', help='batch size (default: 4)') parser.add_argument('--lr', type=float, default=0.001, metavar='LR', help='initial learning rate (default: 0.001)') parser.add_argument('--momentum', type=float, default=0.9, metavar='M', help='momentum (default: 0.9)') parser.add_argument('--dist-backend', type=str, default='gloo', help='distributed backend (default: gloo)') # The parameters below retrieve their default values from SageMaker environment variables, which are # instantiated by the SageMaker containers framework. # https://github.com/aws/sagemaker-containers#how-a-script-is-executed-inside-the-container parser.add_argument('--hosts', type=str, default=ast.literal_eval(os.environ['SM_HOSTS'])) parser.add_argument('--current-host', type=str, default=os.environ['SM_CURRENT_HOST']) parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR']) parser.add_argument('--data-dir', type=str, default=os.environ['SM_CHANNEL_TRAINING']) parser.add_argument('--num-gpus', type=int, default=os.environ['SM_NUM_GPUS']) _train(parser.parse_args())
Schritt 3: Erstellen des Containers
-
Öffnen Sie im JupyterLab-Heimatsverzeichnis ein Jupyter Notebook. Um ein neues Notebook zu öffnen, wählen Sie das Symbol Neuer Start und dann conda_pytorch_p39 im Abschnitt Notebook.
-
Führen Sie den folgenden Befehl in der ersten Notebook-Zelle aus, um in das Verzeichnis
docker_test_folderzu wechseln:% cd ~/SageMaker/docker_test_folderDies gibt Ihr aktuelles Verzeichnis wie folgt zurück:
! pwdoutput: /home/ec2-user/SageMaker/docker_test_folder -
Melden Sie sich bei Docker an, um auf den Basis-Container zuzugreifen:
! aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 763104351884.dkr.ecr.us-east-1.amazonaws.com -
Zum Erstellen des Docker-Containers führen Sie den folgenden Docker-Build-Befehl, einschließlich des Punkts am Ende, aus:
! docker build -t pytorch-extended-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 directoryDenken Sie daran, dass
dockerim aktuellen Verzeichnis spezifisch nach einer Datei namensDockerfileohne Erweiterung sucht. Wenn Sie sie anders benannt haben, können Sie den Dateinamen manuell mit dem-f-Flag übergeben. Wenn Sie Ihre Docker-Datei beispielsweiseDockerfile-text.txtbenannt 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 Neuer Launcher und dann Notebook im
conda_pytorch_p39-Framework aus. Der Rest der Codeausschnitte muss von der Jupyter-Notebook-Instance aus ausgeführt werden. -
Laden Sie den CIFAR-10-Datensatz herunter.
import torch import torchvision import torchvision.transforms as transforms def _get_transform(): return transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) def get_train_data_loader(data_dir='/tmp/pytorch/cifar-10-data'): transform=_get_transform() trainset=torchvision.datasets.CIFAR10(root=data_dir, train=True, download=True, transform=transform) return torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) def get_test_data_loader(data_dir='/tmp/pytorch/cifar-10-data'): transform=_get_transform() testset=torchvision.datasets.CIFAR10(root=data_dir, train=False, download=True, transform=transform) return torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) trainloader=get_train_data_loader('/tmp/pytorch-example/cifar-10-data') testloader=get_test_data_loader('/tmp/pytorch-example/cifar-10-data') -
Setzen Sie
roleauf die Rolle, mit der Sie Ihr Jupyter Notebook erstellt haben. Dies wird verwendet, um Ihren SageMaker-AI-Schätzer zu konfigurieren.from sagemaker import get_execution_role role=get_execution_role() -
Fügen Sie das folgende Beispielskript in die Notebook-Codezelle ein, um einen SageMaker-AI-Schätzer mithilfe Ihres erweiterten Containers zu konfigurieren.
from sagemaker.estimator import Estimator hyperparameters={'epochs': 1} estimator=Estimator( image_uri='pytorch-extended-container-test', role=role, instance_count=1, instance_type='local', hyperparameters=hyperparameters ) estimator.fit('file:///tmp/pytorch-example/cifar-10-data') -
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 in die Amazon Elastic Container Registry (Amazon ECR)
Nachdem Sie den Test im lokalen Modus erfolgreich durchgeführt haben, können Sie den Docker-Container an Amazon ECR senden und ihn zur Ausführung von Trainingsaufträgen verwenden.
Führen Sie die folgenden Befehlszeilen in einer Notebook-Zelle aus.
%%sh # Specify an algorithm name algorithm_name=pytorch-extended-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) 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 # Log into Docker 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}-
Nachdem Sie den Container gesendet haben, können Sie das Amazon-ECR-Image von überall in der SageMaker-AI-Umgebung aufrufen. Führen Sie das folgende Codebeispiel in der nächsten Notebook-Zelle aus.
Wenn Sie diesen Trainings-Container mit SageMaker Studio verwenden möchten, um seine Visualisierungs-Feature zu nutzen, können Sie auch den folgenden Code in einer Studio-Notebook-Zelle ausführen, um das Amazon-ECR-Image Ihres Trainings-Containers aufzurufen.
import boto3 client=boto3.client('sts') account=client.get_caller_identity()['Account'] my_session=boto3.session.Session() region=my_session.region_name algorithm_name="pytorch-extended-container-test" ecr_image='{}.dkr.ecr.{}.amazonaws.com/{}:latest'.format(account, region, algorithm_name) ecr_image # This should return something like # 12-digits-of-your-account.dkr.ecr.us-east-2.amazonaws.com/tf-2.2-test:latest Verwenden Sie das aus dem vorherigen Schritt abgerufene
ecr_image, um ein SageMaker-AI-Schätzerobjekt zu konfigurieren. Das folgende Codebeispiel konfiguriert einen PyTorch-Schätzer von SageMaker AI.import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator=Estimator( image_uri=ecr_image, role=get_execution_role(), base_job_name='pytorch-extended-container-test', instance_count=1, instance_type='ml.p2.xlarge' ) # start training estimator.fit() # deploy the trained model predictor=estimator.deploy(1, instance_type)
Schritt 6: Bereinigen von Ressourcen
So bereinigen Sie die Ressourcen, wenn Sie mit dem Beispiel Erste Schritte fertig sind
-
Öffnen Sie die SageMaker-AI-Konsole
, wählen Sie die Notebook-Instance RunScriptNotebookInstance und dann Aktionen und wählen Sie Stopp aus. Das Anhalten der Instance kann einige Minuten dauern. -
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.
-
Öffnen Sie die Amazon S3-Konsole
und löschen Sie den Bucket, den Sie zum Speichern von Modellartefakten und dem Trainingsdatensatz 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.