View a markdown version of this page

使用 MXNet-Neuron 模型服务 - Amazon Deep Learning AMIs
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 MXNet-Neuron 模型服务

在本教程中,您将学习如何使用预训练的 MXNet 模型,通过多模型服务器 (MMS) 执行实时图像分类。MMS 是一款灵活且易于使用的工具,可提供使用任何机器学习或深度学习框架训练的深度学习模型。本教程包括使用 Ne Amazon uron 的编译步骤和使用 MXNet 实现彩信。

有关 Neuron SDK 的更多信息,请参阅 Amazon Neuron SDK 文档

前提条件

使用本教程之前,您应已完成 使用以下命令启动 DLAMI 实例 Amazon Neuron 中的设置步骤。您还应该熟悉深度学习知识以及如何使用 DLAMI。

激活 Conda 环境

使用以下命令激活 MXNet-Neuron conda 环境:

source activate aws_neuron_mxnet_p36

要退出当前 Conda 环境,请运行:

source deactivate

下载示例代码

要运行本示例,请使用以下命令下载示例代码:

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

编译模型

创建一个名为 multi-model-server-compile.py 的 Python 脚本,其中包含以下内容。此脚本将 ResNet 50 模型编译为 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)

要编译模型,请使用以下命令:

python multi-model-server-compile.py

您的输出应与以下内容类似:

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

创建一个名为 signature.json 的文件,其中包含以下内容,以便配置输入名称和形状:

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

使用以下命令下载 synset.txt 文件。此文件是 ImageNet 预测类的名称列表。

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

基于 model_server_template 文件夹中的模板,创建自定义服务类。使用以下命令,将模板复制到您的当前工作目录中:

cp -r ../model_service_template/* .

编辑 mxnet_model_service.py 模块,将 mx.cpu() 上下文替换为 mx.neuron() 上下文,如下所示。你还需要注释掉不必要的数据副本,model_input因为 MXNet-Neuron 不支持 ndaRray 和 Gluon API。

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

使用以下命令,通过模型归档程序对模型进行打包:

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

运行推理

使用以下命令启动多模型服务器并加载使用 RESTful API 的模型。确保 neuron-rtd 正在使用默认设置运行。

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

通过以下命令,使用示例图像运行推理:

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

您的输出应与以下内容类似:

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

要执行测试后清理,请通过 RESTful API 发出删除命令,并使用以下命令停止模型服务器:

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

您应看到以下输出:

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