SageMaker ist ein Dienst, der einen vollständigen Satz von Workloads für maschinelles Lernen bereitstellt. Unter Verwendung der in S3 usw. gespeicherten Daten bietet es alle Funktionen, die für maschinelle Lernprojekte erforderlich sind, z. B. Modellentwicklung mit Jupyter-Notebook, Codeverwaltung mit Git-Repository, Erstellung von Schulungsjobs, Hosting von Inferenzendpunkten. Ich werde.
Ich habe im Amazon Web Services-Blog "Bereitstellen eines PyTorch-Modells für groß angelegte Inferenzen mit TorchServe" gelesen und versucht, das Modell mit Amazon SageMaker zu hosten. Im Folgenden werden wir das Verfahren und die Geschichte dazu vorstellen.
Den Konvertierungsteil des Modells finden Sie in diesem Artikel.
Erstellen Sie zunächst einen Bucket in S3. Diesmal habe ich einen Eimer namens "Torchserve-Modell" erstellt. Die Region ist "Asien-Pazifik (Tokio)" und alles außer dem Namen ist die Standardeinstellung.
Wenn Sie die Amazon SageMaker-Konsole öffnen, wird im linken Bereich ein Menü angezeigt.
Wählen Sie im Notebook-Menü die Option Notebook-Instanz aus und klicken Sie auf Notebook-Instanz erstellen. Legen Sie die folgenden Elemente für die Instanzeinstellungen fest und legen Sie die anderen als Standard fest.
Geben Sie im Bildschirm zum Erstellen von IAM-Rollen den zuvor erstellten S3-Bucket an.
Klicken Sie nach Eingabe der Einstellungen auf Notebook-Instanz erstellen. Sie kehren zum Bildschirm der Notebook-Instanz zurück. Klicken Sie daher auf den Namen der erstellten Instanz, um den Detailbildschirm aufzurufen. Öffnen Sie über den ARN-Link für die IAM-Rolle den IAM-Bildschirm, klicken Sie auf "Richtlinie anhängen" und fügen Sie die Richtlinie "Amazon EC2ContainerRegistryFullAccess" hinzu. Dies ist die Richtlinie, die Sie benötigen, um später mit ECR zu arbeiten.
Wenn der Status In Betrieb wird, starten Sie JupyterLab mit "Open JupyterLab".
Starten Sie zuerst das Terminal von Other of Laucher.
sh-4.2$ ls
anaconda3 Nvidia_Cloud_EULA.pdf sample-notebooks tools
examples README sample-notebooks-1594876987 tutorials
LICENSE SageMaker src
sh-4.2$ ls SageMaker/
lost+found
Der Explorer auf der linken Seite des Bildschirms zeigt die Dateien unter "SageMaker /" an.
Git ist ebenfalls installiert.
sh-4.2$ git --version
git version 2.14.5
Im Folgenden erstellen wir ein Notizbuch und hosten das Modell. Sie können dies jedoch auch mit dem Tutorial-Notizbuch tun. Sie können den Beispielcode mit SageMaker /
klonen.
sh-4.2$ cd SageMaker
sh-4.2$ git clone https://github.com/shashankprasanna/torchserve-examples.git
Alle Schritte sind in deploy_torchserve.ipynb
beschrieben. Wenn Sie das Notizbuch öffnen, werden Sie gefragt, welchen Python-Kernel Sie verwenden möchten. Wählen Sie daher "conda_pytorch_p36" aus.
Erstellen Sie zunächst einen neuen Ordner über die Ordnerschaltfläche im linken Bereich und doppelklicken Sie, um den erstellten Ordner aufzurufen. Erstellen Sie dann ein Notizbuch.
Wählen Sie das Notizbuch mit conda_pytorch_p36
aus. Benennen Sie das Notizbuch in "deploy_torchserve.ipynb" um.
Führt eine Bibliotheksinstallation durch, die das Pytorch-Modell für die Bereitstellung in der Zelle transformiert.
deploy_torchserve.ipynb
!git clone https://github.com/pytorch/serve.git
!pip install serve/model-archiver/
Dieses Mal werden wir das densenet161
Modell hosten. Laden Sie die trainierte Gewichtsdatei herunter. Da die Beispielmodellklasse in der zuvor geklonten Bibliothek enthalten ist, verwenden Sie die Weight-Datei und die Klasse, um sie in das gehostete Format zu konvertieren.
deploy_torchserve.ipynb
!wget -q https://download.pytorch.org/models/densenet161-8d451a50.pth
deploy_torchserve.ipynb
model_file_name = 'densenet161'
!torch-model-archiver --model-name {model_file_name} \
--version 1.0 --model-file serve/examples/image_classifier/densenet_161/model.py \
--serialized-file densenet161-8d451a50.pth \
--extra-files serve/examples/image_classifier/index_to_name.json \
--handler image_classifier
Bei der Ausführung wird densenet161.mar
in das aktuelle Verzeichnis ausgegeben.
Speichern Sie die erstellte Datei in S3.
deploy_torchserve.ipynb
#Erstellen Sie eine Boto3-Sitzung, um Informationen zu Regionen und Konten abzurufen
import boto3, time, json
sess = boto3.Session()
sm = sess.client('sagemaker')
region = sess.region_name
account = boto3.client('sts').get_caller_identity().get('Account')
import sagemaker
role = sagemaker.get_execution_role()
sagemaker_session = sagemaker.Session(boto_session=sess)
#Der Inhalt ist übrigens wie folgt.
# print(region, account, role)
# ap-northeast-1
# xxxxxxxxxxxx
# arn:aws:iam::xxxxxxxxxxxx:role/service-role/AmazonSageMaker-ExecutionRole-20200716T140377
deploy_torchserve.ipynb
#Geben Sie den Namen des Amazon SageMaker S3-Buckets an
bucket_name = 'torchserve-model'
prefix = 'torchserve'
# print(bucket_name, prefix)
# sagemaker-ap-northeast-1-xxxxxxxxxxxx torchserve
deploy_torchserve.ipynb
#Amazon SageMaker hat ein Teermodell.Da angenommen wird, dass es sich in der gz-Datei befindet, densenet161.Komprimierter Teer aus der Mar-Datei.Erstellen Sie eine gz-Datei.
!tar cvfz {model_file_name}.tar.gz densenet161.mar
deploy_torchserve.ipynb
#Laden Sie das Modell in den S3-Bucket unter dem Modellverzeichnis hoch.
!aws s3 cp {model_file_name}.tar.gz s3://{bucket_name}/{prefix}/models/
Erstellen Sie als Nächstes eine Containerregistrierung mit ECR.
deploy_torchserve.ipynb
registry_name = 'torchserve'
!aws ecr create-repository --repository-name torchserve
# {
# "repository": {
# "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/torchserve",
# "registryId": "xxxxxxxxxxxx:repository",
# "repositoryName": "torchserve",
# "repositoryUri": "xxxxxxxxxxxx:repository.dkr.ecr.ap-northeast-1.amazonaws.com/torchserve",
# "createdAt": 1594893256.0,
# "imageTagMutability": "MUTABLE",
# "imageScanningConfiguration": {
# "scanOnPush": false
# }
# }
# }
Wenn Sie das Notizbuch verlassen haben, klicken Sie im linken Bereich auf die Schaltfläche "+" und wählen Sie im Launcher "Textdatei" aus, um eine Docker-Datei zu erstellen.
Dockerfile
FROM ubuntu:18.04
ENV PYTHONUNBUFFERED TRUE
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
fakeroot \
ca-certificates \
dpkg-dev \
g++ \
python3-dev \
openjdk-11-jdk \
curl \
vim \
&& rm -rf /var/lib/apt/lists/* \
&& cd /tmp \
&& curl -O https://bootstrap.pypa.io/get-pip.py \
&& python3 get-pip.py
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1
RUN update-alternatives --install /usr/local/bin/pip pip /usr/local/bin/pip3 1
RUN pip install --no-cache-dir psutil \
--no-cache-dir torch \
--no-cache-dir torchvision
ADD serve serve
RUN pip install ../serve/
COPY dockerd-entrypoint.sh /usr/local/bin/dockerd-entrypoint.sh
RUN chmod +x /usr/local/bin/dockerd-entrypoint.sh
RUN mkdir -p /home/model-server/ && mkdir -p /home/model-server/tmp
COPY config.properties /home/model-server/config.properties
WORKDIR /home/model-server
ENV TEMP=/home/model-server/tmp
ENTRYPOINT ["/usr/local/bin/dockerd-entrypoint.sh"]
CMD ["serve"]
Der Inhalt von Dockerfike wird wie folgt eingestellt.
--PYTHONUNBUFFERED TRUE
verhindert, dass stdout und stderr puffern.
- no-install -empfehlungen
ist nicht erforderlich, empfohlene Pakete nicht installieren.
--update-alternatives
[ändert die Priorität] für Python und pip (https://codechacha.com/de/change-python-version/).Erstellen Sie auch "dockerd-entrypoint.sh" und "config.properties".
dockerd-entrypoint.sh
#!/bin/bash
set -e
if [[ "$1" = "serve" ]]; then
shift 1
printenv
ls /opt
torchserve --start --ts-config /home/model-server/config.properties
else
eval "$@"
fi
# prevent docker exit
tail -f /dev/null
Der folgende Code wurde für das Shell-Skript geschrieben.
--set -e
: Wenn ein Fehler auftritt, wird das Shell-Skript dort gestoppt.
-- $ 1
: Dies ist das erste Argument.
--shift 1
: Verschiebt die Reihenfolge der Argumente. Auf diese Weise können Sie Argumente an den nächsten Befehl übergeben, als ob er von Anfang an gegeben worden wäre.
--printenv
: Druckt den Inhalt von Umgebungsvariablen. * Es wird in Cloud Watch-Protokollen ausgegeben, die später eingeführt werden.
--eval "$ @"
: Erweitern Sie das Argument als Befehl und führen Sie diesen Befehl aus. Wird verwendet, wenn andere Befehle als "Serve" ausgeführt werden.
--tail -f / dev / null
: Dummy-Befehl, um den Container am Laufen zu halten.
config.properties
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
number_of_netty_threads=32
job_queue_size=1000
model_store=/opt/ml/model
load_models=all
Es ist eine Ergänzung über die Einstellung. Weitere Informationen finden Sie unter hier.
--number_of_netty_threads
: Die Gesamtzahl der Threads am Frontend, standardmäßig die Anzahl der in der JVM verfügbaren logischen Prozessoren.
--job_queue_size
: Die Anzahl der Inferenzjobs, die das Front-End vor dem Back-End in die Warteschlange stellt, ist standardmäßig 100.
--model_store
: Der Speicherort des Modells. * Bei Verwendung von SageMaker wird das Modell von S3 in / opt / ml / model /
gespeichert.
--load_models
: Gleicher Effekt wie –models
beim Start. Geben Sie das Modell an, das bereitgestellt werden soll. Wenn "alle", stellen Sie alle in "model_store" gespeicherten Modelle bereit.
Erstellen Sie ein Container-Image und speichern Sie es in der Registrierung. "v1" ist das Bild-Tag und "Bild" ist der Bildname einschließlich des Tags. Geben Sie bei Verwendung von ECR einen Bildnamen gemäß den Regeln von
Der Bau dauerte ungefähr 15 Minuten.
deploy_torchserve.ipynb
image_label = 'v1'
image = f'{account}.dkr.ecr.{region}.amazonaws.com/{registry_name}:{image_label}'
# print(image_label, image)
# v1 xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/torchserve:v1
deploy_torchserve.ipynb
!docker build -t {registry_name}:{image_label} .
!$(aws ecr get-login --no-include-email --region {region})
!docker tag {registry_name}:{image_label} {image}
!docker push {image}
# Sending build context to Docker daemon 399.7MB
# Step 1/16 : FROM ubuntu:18.04
# 18.04: Pulling from library/ubuntu
# 5296b23d: Pulling fs layer
# 2a4a0f38: Pulling fs layer
# ...
# 9d6bc5ec: Preparing
# 0faa4f76: Pushed 1.503GB/1.499GBv1: digest:
# sha256:bb75ec50d8b0eaeea67f24ce072bce8b70262b99a826e808c35882619d093b4e size: 3247
Es ist endlich Zeit, den Inferenzendpunkt zu hosten. Erstellen Sie ein Modell für die Bereitstellung mit dem folgenden Code.
deploy_torchserve.ipynb
import sagemaker
from sagemaker.model import Model
from sagemaker.predictor import RealTimePredictor
role = sagemaker.get_execution_role()
model_data = f's3://{bucket_name}/{prefix}/models/{model_file_name}.tar.gz'
sm_model_name = 'torchserve-densenet161'
torchserve_model = Model(model_data = model_data,
image = image,
role = role,
predictor_cls=RealTimePredictor,
name = sm_model_name)
Stellen Sie den Endpunkt mit dem folgenden Code bereit. Die Bereitstellung dauerte ca. 5 Minuten.
deploy_torchserve.ipynb
endpoint_name = 'torchserve-endpoint-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
predictor = torchserve_model.deploy(instance_type='ml.m4.xlarge',
initial_instance_count=1,
endpoint_name = endpoint_name)
Sie können den Fortschritt der Bereitstellung in Cloud Watch-Protokollen sehen. Sie können die Liste der Endpunkte anzeigen, indem Sie die Cloud Watch-Konsole öffnen, im linken Bereich auf Protokollgruppen klicken und in der Suchleiste "/ aws / sagemaker / Endpoints" eingeben.
Sie können das Bereitstellungsprotokoll anzeigen, indem Sie auf klicken, um den Detailbildschirm zu öffnen und das Protokoll in Log Stream zu überprüfen.
Wenn die Bereitstellung nicht erfolgreich ist, wird meiner Meinung nach ein Fehler ausgegeben. Übrigens: Wenn ein Fehler auftritt, wird die erneute Bereitstellung etwa eine Stunde lang wiederholt. Wenn Sie also der Meinung sind, dass etwas nicht stimmt, sollten Sie das Protokoll so bald wie möglich überprüfen.
Stellen Sie eine Anfrage, um zu sehen, ob es richtig funktioniert.
deploy_torchserve.ipynb
!wget -q https://s3.amazonaws.com/model-server/inputs/kitten.jpg
file_name = 'kitten.jpg'
with open(file_name, 'rb') as f:
payload = f.read()
payload = payload
response = predictor.predict(data=payload)
print(*json.loads(response), sep = '\n')
# {'tiger_cat': 0.4693359136581421}
# {'tabby': 0.4633873701095581}
# {'Egyptian_cat': 0.06456154584884644}
# {'lynx': 0.001282821292988956}
# {'plastic_bag': 0.00023323031200561672}
Wenn Sie die "Prädiktor" -Instanz erhalten können, können Sie eine Anfrage mit der oben beschriebenen Methode stellen. Wenn Sie jedoch eine Anfrage von außen stellen, benötigen Sie ein SDK. Öffnen Sie eine interaktive Python-Shell auf einem externen PC und versuchen Sie, eine Anfrage mit "boto3" zu stellen.
$ !wget -q https://s3.amazonaws.com/model-server/inputs/kitten.jpg
$ python
>>> import json
>>> import boto3
>>> endpoint_name = 'torchserve-endpoint-2020-07-16-13-16-12'
>>> file_name = 'kitten.jpg'
>>> with open(file_name, 'rb') as f:
... payload = f.read()
... payload = payload
>>> client = boto3.client('runtime.sagemaker',
aws_access_key_id='XXXXXXXXXXXXXXXXXXXX',
aws_secret_access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
region_name='ap-northeast-1')
>>> response = client.invoke_endpoint(EndpointName=endpoint_name,
... ContentType='application/x-image',
... Body=payload)
>>> print(*json.loads(response['Body'].read()), sep = '\n')
{'tiger_cat': 0.4693359136581421}
{'tabby': 0.4633873701095581}
{'Egyptian_cat': 0.06456154584884644}
{'lynx': 0.001282821292988956}
{'plastic_bag': 0.00023323031200561672}
Ich konnte bestätigen, dass die Antwort korrekt zurückgegeben wurde.
Sie können das bereitgestellte Modell, die Bereitstellungseinstellungen und die Endpunktinformationen auch über die Konsole überprüfen.
Wie war es (lacht)? SageMaker ist sehr praktisch. Wäre es nicht viel einfacher, ein bisschen Inferenz im Backend zu hosten? Wenn Sie die Benutzeroberfläche anpassen möchten, scheint Flexiblere Anpassung möglich zu sein Da TorchServe von anderen als SageMaker (vorheriger Artikel) bereitgestellt werden kann, scheint es besser, es gemäß dem TorchServe-Format für die Wiederverwendung in AWS zu entwickeln.
Recommended Posts