[PYTHON] [Azure] Bereitstellen eines lokal erstellten ML-Modells in der Cloud

Einführung

"Ich habe ein Modell von ML erstellt und möchte daraus einen Webdienst machen ..." "Wenn ich es mache, ist es die Wolke, aber ich weiß nicht, wie ich es machen soll ..." Es ist ein Memo, als ich dachte, dass ich das mit Azure erstellte Modell sogar bereitgestellt habe.

In Bezug auf Azure konnte ich im Vergleich zu AWS keine Artikel auf Japanisch finden, daher hatte ich es schwer.

Wenn Sie dasselbe tun möchten, beziehen Sie sich bitte darauf.

Annahme

Dieses Mal werden wir das im Artikel "CGAN (bedingte GAN) zur Erstellung von MNIST (KMNIST)" erstellte cGAN bereitstellen.

Umgebung

Anscheinend unterstützt Azure Python3.7 nicht, daher habe ich es mit Python3.6 neu erstellt.

cloudpickle ist ein Modul zum Beizen eines mit PyTorch erstellten Modells. Die Verwendung ist fast die gleiche wie bei einer normalen Gurke.

Verwenden Sie die Datei .pkl </ code>, die mit dem Code am Ende des obigen Abschnitts erstellt wurde.

Dinge notwendig

  • Azure-Abonnement (kostenlose Testversion ist in Ordnung)
  • Geeigneter Quellcode-Editor

Ich möchte es ausprobieren, daher werde ich hier das Python-Anforderungsmodul auf dem Jupiter-Notebook verwenden.

Verfahren

① Erstellen Sie eine Ressource von Azure Home aus

スライド1.JPG

Erstellen Sie eine Ressourcengruppe, indem Sie auf dem Startbildschirm des Azure-Portals "Ressourcengruppe" -> "Hinzufügen" auswählen. Sie können die ursprüngliche Ressourcengruppe für die folgenden Schritte verwenden. Wenn Sie also über eine vorhandene Gruppe verfügen, müssen Sie diese nicht erstellen.

Erstellen Sie hier als Ressourcengruppenname "** FaaS-Ressource ". Die Region kann alles sein, aber lassen Sie es als " Ostjapan **".

② Erstellen Sie einen Arbeitsbereich für Azure Machine Learning

スライド2.JPG

Da wir die Funktionen von Azure Machine Learning (AzureML) verwenden, werden wir Ressourcen für AzureML erstellen. Geben Sie in der Startseite des Azure-Portals unter "Ressource erstellen" "Maschinelles Lernen" ein, und es sollte herauskommen. Erstellen Sie mit "Erstellen". スライド3.JPG Daraufhin wird ein Bildschirm wie dieser angezeigt. Geben Sie den Namen des Arbeitsbereichs ein (jeder Name ist in Ordnung), wählen Sie das Abonnement aus und wählen Sie das zuvor erstellte als Ressourcengruppe aus. Die Workspace Edition ist mit "** Basic **" in Ordnung.

③ Registrieren Sie das Modell

Wechseln Sie nach dem Erstellen von AzureML unter "Azure Machine Learning Studio testen" auf dem Arbeitsbereich zu Azure Machine Learning Studio. スライド4.JPG Der Bildschirm sollte so aussehen. Klicken Sie links unter "Assets" auf "Model", um das lokal erstellte ML-Modell zu registrieren. スライド5.JPG Wenn Sie auf "Modell registrieren" klicken, wird ein Bildschirm zur Eingabe des Umrisses des Modells angezeigt. Geben Sie daher den Namen und die Beschreibung ein (nicht erforderlich). Dieses Mal verwenden wir das mit PyTorch erstellte Modell. Wählen Sie also "** PyTorch " aus, geben Sie die Framework-Version als " 1.4.0 **" ein und geben Sie die Datei "model .pkl </ code>" ein. Wählen.

Wenn Sie ein Modell registrieren, wird das gerade registrierte Modell auf der Seite "Modellliste" angezeigt.

Apropos

Sie können das Jupyter-Notizbuch über "Notizbuch" auf dem Bildschirm von Azure Machine Learning Studio bedienen. Von der Modellschulung bis zur Bereitstellung können Sie auch dieses Jupyter-Notizbuch Lernprogramm der offiziellen Azure-Dokumentation verwenden. -deploy-models-with-aml) hat ein Beispiel für die Prozedur.

④ Stellen Sie das Modell bereit

Sie können das in der "Modellliste" registrierte Modell auswählen und unter "Bereitstellen" bereitstellen. スライド6.JPG Ein Bildschirm wie dieser wird angezeigt. Geben Sie den Namen und die Beschreibung ein (nicht erforderlich), wählen Sie "** ACI **" (= Azure Container Instance) als Computertyp aus und wählen Sie die Eingabeskriptdatei bzw. die Conda-Abhängigkeitsdatei aus. Dies wird später besprochen.

Wählen Sie nun "Bereitstellen" und die Bereitstellung wird gestartet. Zu diesem Zeitpunkt können Sie die Anzahl der CPU-Kerne und die Speichergröße der virtuellen Maschine, die hochgeladen werden soll, unter den folgenden "Detaillierten Bedingungen" ändern. Die Standardeinstellung ist jedoch ebenfalls akzeptabel.

Eintragsskriptdatei

Wie in Offizielle Azure-Dokumentation erläutert, werden Webdienste mit ACI bereitgestellt Jetzt werden die vom Client gesendeten Daten übernommen, an das Modell übergeben und das resultierende Ergebnis an den Client zurückgegeben. Es ist diese Datei, die diesen Fluss definiert.

Erstellen Sie es mit einem geeigneten Quellcode-Editor.

score.py



# coding: utf-8
# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.3.2
#   kernelspec:
#     display_name: Python 3.6 - AzureML
#     language: python
#     name: python3-azureml
# ---

import torch
import torchvision
import torchvision.transforms as transforms
import numpy as np
import os
import torch.nn as nn
import torch.nn.functional as F
import cloudpickle
from azureml.core.model import Model
import json

def init():
    global model
    path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'KMNIST_cGAN.pkl')
    with open(path, 'rb')as f:
        model = cloudpickle.load(f)
    
def run(raw_data):
    indexs = json.loads(raw_data)["indexs"]
    index_list = indexs.split(',')
    num_class = 49
    z_dim = 100

    for i, num in enumerate(index_list):
        #Geräuschentwicklung
        noise = torch.normal(mean = 0.5, std = 1, size = (1, z_dim))
    
        #Generieren Sie ein Etikett, das in den Generator eingefügt werden soll
        tmp = np.identity(num_class)[int(num)]
        tmp = np.array(tmp, dtype = np.float32)
        label = [tmp]
    
        #Probengenerierung mit Generator
        sample = model(noise, torch.Tensor(label)).detach()

        #Format und Liste
        sample = sample.reshape((28,28))
        img = sample.detach().numpy().tolist()
        
        if i == 0:
            comp_img = img
        else:
            comp_img.extend(img)
    
    return comp_img

Es sind zwei Funktionen definiert.

  • Die Funktion init () </ code> wird nur einmal aufgerufen, wenn der Dienst gestartet und das Modell geladen wird.
  • Die Funktion run (raw_data) </ code> definiert, wie die empfangenen Daten an das Modell übergeben und das Ergebnis an den Client zurückgegeben werden.

Wenn Sie ein Modell registrieren, wird das Modell in einem Verzeichnis namens AZUREML_MODEL_DIR </ code> gespeichert. Rufen Sie es also auf. Da die vom Client gesendeten Daten im JSON-Format vorliegen, nehmen wir sie heraus, fügen das Etikett in das Modell (Generator von cGAN) ein und geben das Ergebnis zurück. Zu diesem Zeitpunkt sind die letzten Rückgaben im obigen Code die Daten vom Typ "Liste" von Python, aber es scheint, dass sie in das JSON-Format konvertiert werden, bevor sie an den Client auf der Azure-Seite gesendet werden, also "auf der Clientseite" Sie müssen es mit json.loads () `tun.

Conda-Abhängigkeitsdatei

Der Name ist derselbe, aber es ist eine Datei, die die erforderlichen Conda-Pakete definiert. Dies wird auch im .yml -Format mit einem Quellcode-Editor erstellt.

myenv.yml


# Conda environment specification. The dependencies defined in this file will
# be automatically provisioned for runs with userManagedDependencies=False.

# Details about the Conda environment file format:
# https://conda.io/docs/user-guide/tasks/manage-environments.html#create-env-file-manually

name: project_environment
dependencies:
  # The python interpreter version.
  # Currently Azure ML only supports 3.5.2 and later.
- python=3.6.2

- pip:
  - azureml-defaults
  - azureml-sdk
  - azureml-contrib-services
- numpy
- pytorch
- torchvision
- cloudpickle
channels:
- conda-forge
- pytorch

Ich habe gerade die ".yml" aus der offiziellen Dokumentation geändert. In diesem Fall scheint "Azureml-Standard" ein notwendiges Paket zu sein, um einen Webdienst zu hosten, daher ist es wichtig. Es muss je nach dem für das Modell verwendeten Paket ein wenig geändert werden.

⑤ Bestätigung der Bereitstellung

Die Bereitstellung dauert lange. Ich denke, es hängt von der Umgebung ab, aber ich habe ungefähr 10 bis 15 Minuten gebraucht. Überprüfen Sie, ob die Bereitstellung erfolgreich ist.

Wenn Sie in der Ressourcengruppe, die Sie verwenden, von der Startseite des Azure-Portals in "Ressourcengruppe" aus suchen, wird die erstellte Containerinstanz nach einer Weile ab dem Start der Bereitstellung angezeigt. Wechseln Sie zur Seite für diese Containerinstanz. Azure.jpg Dieses Mal habe ich es früher mit dem Namen "** kmnist-cgan **" bereitgestellt, daher lautet der Name der Containerinstanz so. Wenn Sie "Container" in "Einstellungen" öffnen, wird der obige Bildschirm angezeigt. Wenn sich der "Status" (roter Rahmen) der drei Container von "Warten" in "Ausführen" ändert, ist die Bereitstellung erfolgreich.

Übrigens, wenn während des Bereitstellungsprozesses ein Fehler auftritt, werden die Fehlerdetails im Abschnitt "Protokoll" unten angezeigt. Insbesondere Fehler in score.py und Fehler während der Anforderungsverarbeitung werden dieses Mal im Protokoll des Containers" kmnist-cgan "angezeigt. Daher kann es hilfreich sein, hier nachzuschauen, um Fehler zu beheben.

⑥ Versuchen Sie, den bereitgestellten Dienst zu verwenden

Was ich hier bereitgestellt habe, ist "cGAN **", das ein durcheinandergebrachtes Zeichen zurückgibt, wenn Sie ein ** Zeichen eingeben. Versuchen Sie dies lokal.

Sobald die Bereitstellung abgeschlossen ist und der Webdienst zur Verwendung bereit ist, werden die IP-Adresse und der vollqualifizierte Domänenname auf der Azure-Containerinstanzseite angezeigt. Verwenden Sie diese Option.

import requests
import json
import matplotlib.pyplot as plt
%matplotlib inline

url = "http://[FQDN der erstellten Containerinstanz]/score"

strings = input()

#Generieren Sie die Zielnummer mit dem extrahierten Modell
def FaaS_KMNIST(url, strings):
    letter = 'Aiue Okakikuke Kosashi Suseso Tachi Nune no Hahifuhe Homami Mumemoya Yuyorari Rurerowa ゐ'
    indexs = ""
    input_data = {}
    for i in range(len(strings)):
        str_index = letter.index(strings[i])
        indexs += str(str_index)
        if i != len(strings)-1:
            indexs += ','
        
    print(indexs)
    input_data["indexs"] = str(indexs)
    input_data = json.dumps(input_data)
    headers = {"Content-Type":"application/json"}
    
    resp = requests.post(url, input_data, headers=headers)
    
    result = json.loads(resp.text)
    
    return result

response = FaaS_KMNIST(url, strings)

plt.imshow(response,cmap ="gray")

Schreiben Sie einen Code wie diesen und probieren Sie ihn aus. Da die Eingabe von "input ()" akzeptiert wird, wird bei entsprechender Eingabe der Zeichen am Ende ein solches Bild angezeigt. FaaS-test.png Ist es nicht "OK"?

Schließlich

Ich habe versucht, das erstellte ML-Modell in Azure bereitzustellen. Ich denke nicht, dass die Methode selbst so schwierig ist. Zumindest denke ich, dass dies einfacher ist als die Bereitstellung im Jupyter-Notizbuch von Azure Machine Learning Studio. Probieren Sie es also aus.