Usando o MXNet -Neuron Model Serving - AWS Deep Learning AMIs

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usando o MXNet -Neuron Model Serving

Neste tutorial, você aprende a usar um MXNet modelo pré-treinado para realizar a classificação de imagens em tempo real com o Multi Model Server ()MMS. MMSé uma easy-to-use ferramenta flexível para servir modelos de aprendizado profundo que são treinados usando qualquer estrutura de aprendizado de máquina ou aprendizado profundo. Este tutorial inclui uma etapa de compilação usando o AWS Neuron e uma implementação do MMS uso. MXNet

Para obter mais informações sobre o NeuronSDK, consulte a documentação do AWS Neuron. SDK

Pré-requisitos

Antes de usar este tutorial, você precisa ter concluído os passos da configuração em Iniciando uma DLAMI instância com o AWS Neuron. Você também deve estar familiarizado com o aprendizado profundo e com o uso doDLAMI.

Ative o ambiente Conda

Ative o ambiente MXNet -Neuron conda usando o seguinte comando:

source activate aws_neuron_mxnet_p36

Para sair do ambiente Conda atual, execute:

source deactivate

Faça download do código de exemplo

Para executar o exemplo, faça download do código de exemplo usando os seguintes comandos:

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

Compile o modelo.

Crie um script Python chamado multi-model-server-compile.py com o conteúdo a seguir. Esse script compila o modelo ResNet 50 para o alvo do 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 o modelo, use o seguinte comando:

python multi-model-server-compile.py

A saída será semelhante a:

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

Crie um arquivo chamado signature.json com o seguinte conteúdo para configurar o nome e a forma de entrada:

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

Faça download do arquivo synset.txt usando o seguinte comando: Esse arquivo é uma lista de nomes para classes de ImageNet predição.

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

Crie uma classe de serviço personalizada seguindo o modelo na pasta model_server_template. Copie o modelo para o diretório de trabalho atual usando o seguinte comando:

cp -r ../model_service_template/* .

Edite o módulo mxnet_model_service.py para substituir o contexto mx.cpu() pelo contexto mx.neuron(), da seguinte forma. Você também precisa comentar a cópia de dados desnecessária model_input porque MXNet -Neuron não suporta o NDArray e o 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]

Empacote o modelo com arquivador de modelos, usando os seguintes comandos:

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

Execute a inferência

Inicie o Multi Model Server e carregue o modelo que usa o RESTful API usando os seguintes comandos. Certifique-se de que o neuron-rtd está sendo executado com as configurações padrão.

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

Execute a inferência usando uma imagem de exemplo com os seguintes 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

A saída será semelhante a:

[   {     "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 limpar após o teste, emita um comando delete por meio do RESTful API e interrompa o servidor do modelo usando os seguintes comandos:

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

A seguinte saída deverá ser mostrada:

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