[PYTHON] [Azure] Déployer le modèle ML créé localement dans le cloud

introduction

"J'ai fait un modèle de ML et je veux en faire un service Web ..." "Si je le fais, c'est le cloud, mais je ne sais pas comment le faire ..." C'est un mémo quand je pensais avoir même déployé le modèle réalisé avec Azure.

Quant à Azure, je n'ai trouvé aucun article en japonais par rapport à AWS, j'ai donc eu du mal.

Si vous souhaitez faire la même chose, veuillez vous y référer.

supposition

Cette fois, nous déploierons le cGAN créé dans l'article "CGAN (GAN conditionnel) pour générer MNIST (KMNIST)".

environnement

Apparemment, Azure ne prend pas en charge python3.7, je l'ai donc recréé avec python3.6.

cloudpickle est un module de décapage d'un modèle créé avec PyTorch. L'utilisation est presque la même qu'un cornichon normal.

Utilisez le fichier .pkl </ code> créé avec le code près de la fin de ce qui précède tel quel.

Les choses nécessaires

  • Abonnement Azure (la version d'essai gratuite est OK)
  • Éditeur de code source approprié

Je veux l'essayer, alors j'utiliserai ici le module de requêtes python sur le notebook jupyter.

procédure

① Créer une ressource depuis Azure home

スライド1.JPG

Créez un groupe de ressources en sélectionnant «Groupe de ressources» -> «Ajouter» sur l'écran d'accueil du portail Azure. Vous pouvez utiliser le groupe de ressources d'origine pour les étapes suivantes. Par conséquent, si vous disposez d'un groupe existant, vous n'avez pas à le créer.

Ici, créez-le en tant que "** FaaS-resource " comme nom du groupe de ressources. La région peut être n'importe quoi, mais laissez-la comme " Est du Japon **".

② Créer un espace de travail pour Azure Machine Learning

スライド2.JPG

Nous utiliserons les fonctionnalités d'Azure Machine Learning (AzureML), nous allons donc créer des ressources pour AzureML. À partir de la page d'accueil du portail Azure, saisissez «Machine Learning» dans «Create Resource» et il devrait sortir. Créez avec "Créer". スライド3.JPG Ensuite, un écran comme celui-ci apparaîtra. Entrez le nom de l'espace de travail (n'importe quel nom convient), sélectionnez l'abonnement et sélectionnez celui que vous avez créé précédemment comme groupe de ressources. L'édition de l'espace de travail est OK avec "** Basic **".

③ Enregistrez le modèle

Après avoir créé AzureML, accédez à Azure Machine Learning Studio à partir de «Essayer Azure Machine Learning Studio» sur l'écran de l'espace de travail. スライド4.JPG L'écran devrait ressembler à ceci. Cliquez sur "Modèle" dans "Actifs" sur la gauche pour enregistrer le modèle ML créé localement. スライド5.JPG Lorsque vous cliquez sur «Enregistrer le modèle», un écran de saisie du contour du modèle apparaîtra, alors saisissez le nom et la description (non obligatoire). Cette fois, nous utiliserons le modèle créé avec PyTorch, alors sélectionnez "** PyTorch ", entrez la version du framework sous la forme " 1.4.0 **" et entrez le fichier modèle .pkl </ code>. Sélectionner.

Lorsque vous enregistrez un modèle, le modèle que vous venez d'enregistrer sera affiché sur la page "Liste des modèles".

Au fait

Vous pouvez utiliser le notebook jupyter à partir de «Notebook» sur l'écran d'Azure Machine Learning Studio. De la formation du modèle au déploiement, vous pouvez également opérer sur ce notebook Jupyter, Tutoriel de la documentation officielle Azure -deploy-models-with-aml) a un exemple de la procédure.

④ Déployez le modèle

Vous pouvez sélectionner le modèle enregistré dans la «Liste des modèles» et le déployer à partir de «Déployer». スライド6.JPG Un écran comme celui-ci apparaîtra. Entrez le nom et la description (non requis), sélectionnez "** ACI **" (= Azure Container Instance) comme type de calcul, puis sélectionnez le fichier de script d'entrée et le fichier de dépendance Conda, respectivement. Cela sera discuté plus tard.

Sélectionnez maintenant "Déployer" et le déploiement commencera. À ce stade, vous pouvez modifier le nombre de cœurs de processeur et la taille de la mémoire de la machine virtuelle à télécharger à partir des «Conditions détaillées» ci-dessous, mais la valeur par défaut est également acceptable.

Fichier de script d'entrée

Comme expliqué dans Official Azure Documents, les services Web déployés avec ACI Il prend maintenant les données envoyées par le client, les transmet au modèle et renvoie le résultat obtenu au client. C'est ce fichier qui définit ce flux.

Créez-le avec un éditeur de code source approprié.

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):
        #Génération de bruit
        noise = torch.normal(mean = 0.5, std = 1, size = (1, z_dim))
    
        #Générer une étiquette à mettre dans le générateur
        tmp = np.identity(num_class)[int(num)]
        tmp = np.array(tmp, dtype = np.float32)
        label = [tmp]
    
        #Génération d'échantillons avec Generator
        sample = model(noise, torch.Tensor(label)).detach()

        #Format et 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

Deux fonctions sont définies.

  • La fonction init () </ code> est appelée une seule fois lorsque le service démarre et charge le modèle.
  • La fonction run (raw_data) </ code> définit comment transmettre les données reçues au modèle et renvoyer le résultat au client.

Lorsque vous enregistrez un modèle, le modèle est enregistré dans un répertoire appelé AZUREML_MODEL_DIR </ code>, appelez-le donc. De plus, comme les données envoyées par le client sont au format json, nous les retirons, mettons l'étiquette dans le modèle (Générateur de cGAN), et retournons le résultat. À ce stade, le dernier retour dans le code ci-dessus est des données de type liste de python, mais il semble qu'il soit converti au format json avant de l'envoyer au client côté Azure, donc c'estcôté client Vous devez le faire avec json.loads () `.

Fichier de dépendance Conda

Le nom est le même, mais c'est un fichier qui définit les packages Conda nécessaires. Ceci est également créé au format .yml avec un éditeur de code source.

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

Je viens de changer le .yml de la documentation officielle. En cela, ʻazureml-defaults` semble être un paquetage nécessaire pour héberger un service Web, il est donc essentiel. Il doit être légèrement modifié en fonction du package utilisé pour le modèle.

⑤ Confirmation du déploiement

Le déploiement prend beaucoup de temps. Je pense que cela dépend de l'environnement, mais cela m'a pris environ 10 à 15 minutes. Vérifiez si le déploiement a réussi.

Si vous recherchez dans le groupe de ressources que vous utilisez à partir de l'accueil du portail Azure dans «Groupe de ressources», l'instance de conteneur créée s'affichera après un certain temps à compter du début du déploiement. Accédez à la page de cette instance de conteneur. Azure.jpg Cette fois, je l'ai déployé avec le nom "** kmnist-cgan **" plus tôt, donc le nom de l'instance de conteneur est celui-là. Lorsque vous ouvrez "Conteneur" dans "Paramètres", l'écran ci-dessus apparaîtra, et si le "Statut" (cadre rouge) des trois conteneurs passe de "En attente" à "En cours d'exécution", le déploiement est réussi.

À propos, si une erreur se produit pendant le processus de déploiement, les détails de l'erreur seront affichés dans la section «Journal» ci-dessous. En particulier, les bogues à l'intérieur de score.py et les erreurs pendant le traitement des requêtes sont affichés cette fois dans le journal du conteneur" kmnist-cgan ", donc regarder ici peut être utile pour le dépannage.

⑥ Essayez d'utiliser le service déployé

Ce que j'ai déployé ici est "cGAN **", qui renvoie un caractère brouillé lorsque vous entrez un caractère **. Essayez ceci localement.

Une fois le déploiement terminé et le service Web prêt à être utilisé, l'adresse IP et le nom de domaine complet seront affichés sur la page de l'instance de conteneur Azure, utilisez-le.

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

url = "http://[FQDN de l'instance de conteneur créée]/score"

strings = input()

#Générer le numéro cible à l'aide du modèle extrait
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")

Écrivez un code comme celui-ci et essayez-le. Puisque l'entrée est acceptée par ʻinput () `, lorsque vous tapez les caractères de manière appropriée, une telle image sera affichée à la fin. FaaS-test.png N'est-ce pas "OK"?

finalement

J'ai essayé de déployer le modèle ML créé sur Azure. Je ne pense pas que la méthode elle-même soit si difficile. Au moins, je pense que c'est plus facile que de déployer dans le bloc-notes jupyter d'Azure Machine Learning Studio, alors essayez-le.