[PYTHON] Ich habe versucht, Pytorchs Deep-Learning-Modell mit TorchServe auf Amazon SageMaker zu hosten

Einführung

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.

Verfahren

Erstellen eines S3-Buckets

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.

Erstellung einer Notebook-Instanz

Wenn Sie die Amazon SageMaker-Konsole öffnen, wird im linken Bereich ein Menü angezeigt.

スクリーンショット 2020-07-16 13.58.16.png

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. スクリーンショット 2020-07-16 14.02.50.png

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

スクリーンショット 2020-07-16 14.38.06.png

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.

スクリーンショット 2020-07-16 14.41.47.png

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.

Modell Host

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.

スクリーンショット 2020-07-16 19.17.15.png

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.

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 / : an. entspricht dem Rückgabewert "repositoryUri", als die Registrierung erstellt wurde.

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.

スクリーンショット 2020-07-16 22.33.13.png

Sie können das Bereitstellungsprotokoll anzeigen, indem Sie auf klicken, um den Detailbildschirm zu öffnen und das Protokoll in Log Stream zu überprüfen.

スクリーンショット 2020-07-16 22.35.02.png

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.

スクリーンショット 2020-07-16 22.32.46.png

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. スクリーンショット 2020-07-16 22.47.36.png スクリーンショット 2020-07-16 22.47.41.png スクリーンショット 2020-07-16 23.59.20.png

abschließend

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

Ich habe versucht, Pytorchs Deep-Learning-Modell mit TorchServe auf Amazon SageMaker zu hosten
Ich habe versucht, ein Deep-Learning-Modell von TensorFlow mit TensorFlow Serving zu hosten
Ich habe versucht, ein Beispielmodell von Pytorch mit TorchServe zu hosten
Ich habe versucht, mit Theano tief zu lernen
Ich habe versucht, tief zu lernen
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, mit PyBrain verstärkt zu lernen
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Bilderkennungsmodell mit Deep Learning im Jahr 2016
[Kaggle] Ich habe versucht, Ensemble mit LightGBM zu lernen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe die gängige Geschichte der Vorhersage des Nikkei-Durchschnitts mithilfe von Deep Learning (Backtest) ausprobiert.
Ich habe versucht, Remote API mit GAE / J zu verwenden
Ein Amateur versuchte Deep Learning mit Caffe (Einführung)
Ein Amateur versuchte Deep Learning mit Caffe (Übung)
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ich habe versucht, Flask auf Raspberry Pi 3 Model B + mit Nginx und uWSGI auszuführen
[Pythonocc] Ich habe versucht, CAD auf einem Jupyter-Notebook zu verwenden
Ich habe versucht, das Objekterkennungs-Tutorial mit dem neuesten Deep-Learning-Algorithmus auszuführen
Ich habe versucht, verschiedene Methoden für maschinelles Lernen (Vorhersagemodell) mithilfe von Scicit-Learn zu implementieren
Ein Amateur hat Deep Learning mit Caffe ausprobiert (Übersicht)
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, meinen eigenen Datensatz mit Chainer Trainer zu lernen
Ich habe versucht, PySpark von Jupyter 4.x auf EMR zu verwenden
Ich habe versucht, Dropout zu erklären
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
[Mit Bild] Ich habe versucht, neofetch auf verschiedenen Betriebssystemen zu verwenden!
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, mit "Syncthing" Dateien auf mehreren PCs zu synchronisieren
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe ein VGG16-Modell mit TensorFlow gemacht (unterwegs)