Utilisation de MXNet -Neuron Model Serving - AWS Apprentissage profond (deep learning) AMIs

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de MXNet -Neuron Model Serving

Dans ce didacticiel, vous apprendrez à utiliser un MXNet modèle préentraîné pour effectuer une classification d'images en temps réel avec Multi Model Server (MMS). MMSest un easy-to-use outil flexible destiné à servir des modèles de deep learning formés à l'aide de n'importe quel framework d'apprentissage automatique ou d'apprentissage profond. Ce didacticiel inclut une étape de compilation à l'aide de AWS Neuron et une implémentation de l'MMSutilisation MXNet de.

Pour plus d'informations sur le NeuronSDK, consultez la documentation du AWS Neuron SDK.

Prérequis

Avant d'utiliser ce didacticiel, vous devez avoir terminé les étapes de configuration figurant dans Lancer une DLAMI instance avec AWS Neuron. Vous devriez également être familiarisé avec le deep learning et l'utilisation du DLAMI.

Activation de l'environnement Conda

Activez l'environnement MXNet -Neuron conda à l'aide de la commande suivante :

source activate aws_neuron_mxnet_p36

Pour quitter l'environnement Conda actuel, exécutez :

source deactivate

Téléchargement de l'exemple de code

Pour exécuter cet exemple, téléchargez l'exemple de code à l'aide des commandes suivantes :

git clone https://github.com/awslabs/multi-model-server cd multi-model-server/examples/mxnet_vision

Compilation du modèle.

Créez un script Python appelé multi-model-server-compile.py avec le contenu suivant. Ce script compile le modèle ResNet 50 sur la cible de l'appareil Inferentia.

import mxnet as mx from mxnet.contrib import neuron import numpy as np path='http://data.mxnet.io/models/imagenet/' mx.test_utils.download(path+'resnet/50-layers/resnet-50-0000.params') mx.test_utils.download(path+'resnet/50-layers/resnet-50-symbol.json') mx.test_utils.download(path+'synset.txt') nn_name = "resnet-50" #Load a model sym, args, auxs = mx.model.load_checkpoint(nn_name, 0) #Define compilation parameters#  - input shape and dtype inputs = {'data' : mx.nd.zeros([1,3,224,224], dtype='float32') } # compile graph to inferentia target csym, cargs, cauxs = neuron.compile(sym, args, auxs, inputs) # save compiled model mx.model.save_checkpoint(nn_name + "_compiled", 0, csym, cargs, cauxs)

Pour compiler le modèle, utilisez la commande suivante :

python multi-model-server-compile.py

Le résultat doit être similaire à ce qui suit :

... [21:18:40] src/nnvm/legacy_json_util.cc:209: Loading symbol saved by previous version v0.8.0. Attempting to upgrade... [21:18:40] src/nnvm/legacy_json_util.cc:217: Symbol successfully upgraded! [21:19:00] src/operator/subgraph/build_subgraph.cc:698: start to execute partition graph. [21:19:00] src/nnvm/legacy_json_util.cc:209: Loading symbol saved by previous version v0.8.0. Attempting to upgrade... [21:19:00] src/nnvm/legacy_json_util.cc:217: Symbol successfully upgraded!

Créez un fichier nommé signature.json avec le contenu suivant pour configurer le nom et la forme de l'entrée :

{   "inputs": [     {       "data_name": "data",       "data_shape": [         1,         3,         224,         224       ]     }   ] }

Téléchargez le fichier synset.txt à l'aide de la commande suivante. Ce fichier est une liste de noms pour les classes de ImageNet prédiction.

curl -O https://s3.amazonaws.com/model-server/model_archive_1.0/examples/squeezenet_v1.1/synset.txt

Créez une classe de service personnalisée en suivant le modèle figurant dans le dossier model_server_template. Copiez le modèle dans votre répertoire de travail actuel à l'aide de la commande suivante :

cp -r ../model_service_template/* .

Modifiez le module mxnet_model_service.py pour remplacer le contexte mx.cpu() par le contexte mx.neuron() comme suit. Vous devez également commenter la copie de données inutile model_input car MXNet -Neuron ne prend pas en charge le NDArray et Gluon. APIs

... self.mxnet_ctx = mx.neuron() if gpu_id is None else mx.gpu(gpu_id) ... #model_input = [item.as_in_context(self.mxnet_ctx) for item in model_input]

Empaquetez le modèle avec l'archiveur de modèle à l'aide des commandes suivantes :

cd ~/multi-model-server/examples model-archiver --force --model-name resnet-50_compiled --model-path mxnet_vision --handler mxnet_vision_service:handle

Exécution de l'inférence

Démarrez le serveur multimodèle et chargez le modèle qui utilise le en RESTful API utilisant les commandes suivantes. Assurez-vous que neuron-rtd s'exécute avec les paramètres par défaut.

cd ~/multi-model-server/ multi-model-server --start --model-store examples > /dev/null # Pipe to log file if you want to keep a log of MMS curl -v -X POST "http://localhost:8081/models?initial_workers=1&max_workers=4&synchronous=true&url=resnet-50_compiled.mar" sleep 10 # allow sufficient time to load model

Exécutez l'inférence à l'aide d'un exemple d'image avec les commandes suivantes :

curl -O https://raw.githubusercontent.com/awslabs/multi-model-server/master/docs/images/kitten_small.jpg curl -X POST http://127.0.0.1:8080/predictions/resnet-50_compiled -T kitten_small.jpg

Le résultat doit être similaire à ce qui suit :

[   {     "probability": 0.6388034820556641,     "class": "n02123045 tabby, tabby cat"   },   {     "probability": 0.16900072991847992,     "class": "n02123159 tiger cat"   },   {     "probability": 0.12221276015043259,     "class": "n02124075 Egyptian cat"   },   {     "probability": 0.028706775978207588,     "class": "n02127052 lynx, catamount"   },   {     "probability": 0.01915954425930977,     "class": "n02129604 tiger, Panthera tigris"   } ]

Pour effectuer un nettoyage après le test, émettez une commande de suppression via le serveur modèle RESTful API et arrêtez le modèle à l'aide des commandes suivantes :

curl -X DELETE http://127.0.0.1:8081/models/resnet-50_compiled multi-model-server --stop

Vous devriez voir la sortie suivante :

{   "status": "Model \"resnet-50_compiled\" unregistered" } Model server stopped. Found 1 models and 1 NCGs. Unloading 10001 (MODEL_STATUS_STARTED) :: success Destroying NCG 1 :: success