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

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

使用 MXNet-Neuron 模型处理

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

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

先决条件

使用本教程之前,您应已完成 启动带有神经元的 DLAMI 实例 Amazon 中的设置步骤。您还应该熟悉深度学习知识以及如何使用 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