

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
<a name="tutorial-inferentia-mxnet-neuron-serving"></a>

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). Le MMS est un easy-to-use outil flexible destiné à servir des modèles d'apprentissage profond entraînés à l'aide de n'importe quel framework d'apprentissage automatique ou d'apprentissage profond. Ce tutoriel inclut une étape de compilation à l'aide de AWS Neuron et une implémentation du MMS à l'aide de. MXNet

 Pour plus d'informations sur le SDK Neuron, consultez la documentation du SDK [AWS Neuron](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/mxnet-neuron/index.html). 

**Topics**
+ [Conditions préalables](#tutorial-inferentia-mxnet-neuron-serving-prerequisites)
+ [Activation de l'environnement Conda](#tutorial-inferentia-mxnet-neuron-serving-activate)
+ [Téléchargement de l'exemple de code](#tutorial-inferentia-mxnet-neuron-serving-download)
+ [Compilation du modèle.](#tutorial-inferentia-mxnet-neuron-serving-compile)
+ [Exécution de l'inférence](#tutorial-inferentia-mxnet-neuron-serving-inference)

## Conditions préalables
<a name="tutorial-inferentia-mxnet-neuron-serving-prerequisites"></a>

 Avant d'utiliser ce didacticiel, vous devez avoir terminé les étapes de configuration figurant dans [Lancement d'une instance DLAMI avec Neuron AWS](tutorial-inferentia-launching.md). Vous devez également être familiarisé avec le deep learning et l'utilisation du DLAMI. 

## Activation de l'environnement Conda
<a name="tutorial-inferentia-mxnet-neuron-serving-activate"></a>

 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
<a name="tutorial-inferentia-mxnet-neuron-serving-download"></a>

 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.
<a name="tutorial-inferentia-mxnet-neuron-serving-compile"></a>

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
<a name="tutorial-inferentia-mxnet-neuron-serving-inference"></a>

Démarrez le serveur multimodèle et chargez le modèle qui utilise l' RESTful API à l'aide des 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 l' RESTful API et arrêtez le serveur de modèles à 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
```