View a markdown version of this page

Uso de MXNet-Neuron Model Serving - AWS Deep Learning AMIs

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de MXNet-Neuron Model Serving

En este tutorial, aprenderá a utilizar un modelo de MXNet previamente entrenado para realizar la clasificación de imágenes en tiempo real con Multi Model Server (MMS). MMS es una herramienta flexible y fácil de usar para distribuir modelos de aprendizaje profundo que se entrenan mediante cualquier marco de trabajo de aprendizaje automático o aprendizaje profundo. Este tutorial incluye un paso de compilación con AWS Neuron y una implementación de MMS con MXNet.

Para obtener más información sobre el SDK de Neuron, consulte la documentación del SDK de AWS Neuron.

Requisitos previos

Antes de utilizar este tutorial, debería haber completado los pasos de configuración de Lanzamiento de una instancia DLAMI con AWS Neuron. También debe estar familiarizado con el aprendizaje profundo y con el uso de la DLAMI.

Activación del entorno Conda

Active el entorno MXNet-Neuron conda mediante el siguiente comando:

source activate aws_neuron_mxnet_p36

Para salir del entorno Conda actual, ejecute:

source deactivate

Descarga del código de ejemplo

Para ejecutar este ejemplo, descargue el código de ejemplo mediante los siguientes comandos:

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

Compile el modelo.

Cree un script de Python denominado multi-model-server-compile.py con el siguiente contenido. Este script compila el modelo ResNet 50 con el objetivo del dispositivo 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)

Para compilar el modelo, utilice el siguiente comando:

python multi-model-server-compile.py

El resultado debería tener el siguiente aspecto:

... [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!

Cree un archivo signature.json con el siguiente contenido para configurar el nombre y la forma de entrada:

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

Descargue el archivo synset.txt con el siguiente comando. Este archivo es una lista de nombres para ImageNet las clases de predicción.

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

Cree una clase de servicio personalizada siguiendo la plantilla de la carpeta model_server_template. Copie la plantilla en su directorio de trabajo actual mediante el siguiente comando:

cp -r ../model_service_template/* .

Edite el módulo mxnet_model_service.py para reemplazar el contexto mx.cpu() por el contexto mx.neuron() de la siguiente manera. También debe comentar la copia de datos innecesaria, model_input ya que MXNet-Neuron no es compatible con las API NdArray y Gluon.

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

Empaquete el modelo con model-archiver utilizando los siguientes comandos:

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

Ejecutar inferencia

Inicie Multi Model Server y cargue el modelo que utiliza la API RESTful mediante los siguientes comandos. Asegúrese de que neuron-rtd se está ejecutando con la configuración predeterminada.

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

Ejecute la inferencia utilizando una imagen de ejemplo con los siguientes comandos:

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

El resultado debería tener el siguiente aspecto:

[   {     "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"   } ]

Para limpiar después de la prueba, ejecute un comando delete a través de la API RESTful y detenga el servidor modelo mediante los siguientes comandos:

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

Debería ver los siguientes datos de salida:

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