本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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