写点什么

SageMaker Neo 优化目标检测模型加速推理

  • 2021 年 12 月 23 日
  • 本文字数:3008 字

    阅读完需:约 10 分钟

SageMaker Neo优化目标检测模型加速推理



摘要


该文以目标检测模型着手,演示如何一步步基于 SageMaker Neo 对训练后的模型文件进行编译优化,来提升模型的推理速度。文中以yolo3_mobilenet1.0_coco模型为例,分别演示模型准备,模型 Neo 编译,模型导出推理测试,可视化等过程,推理结果显示基于 SageMaker Neo 可以显著提升推理速度,达到一倍以上的加速。



📢 想学习更多人工智能与机器学习前沿案例?来 2021 亚马逊云科技中国峰会与业内领先的技术践行者们一起探讨交流吧!点击图片报名吧~


模型准备


在利用 SageMaker Neo 编译模型之前,首先需要根据神经网络的框架准备模型,具体可以参考官方指南 Compile and Deploy Models with Neo:

https://docs.aws.amazon.com/sagemaker/latest/dg/neo-compilation-preparing-model.html


不同的框架对模型的要求各不相同,以 MXNet 框架为例,其模型的要求描述为:


MXNet models must be saved as a single symbol file *-symbol.json and a single parameter *.params files.
复制代码


为了说明整个 SageMaker Neo 优化的详细流程,该文档以

yolo3_mobilenet1.0_coco人形检测模型为例进行模型准备,Neo 编译,以及测试。


模型准备分为两步,分别如下:


第一步:下载

yolo3_mobilenet1.0_coco 人形检测模型:


wget -c https://ipc-models-zoo.s3.amazonaws.com/body-detector/body_detector_yolo3_mobilenet1.0_coco-0000.paramswget -c https://ipc-models-zoo.s3.amazonaws.com/body-detector/body_detector_yolo3_mobilenet1.0_coco-symbol.json
复制代码


第二步:将上述两个文件打成.tar.gz 包,即执行如下 python 脚本:


import tarfiletar = tarfile.open("body_detector_yolo3_mobilenet1.0_coco.tar.gz", "w:gz")for name in ["body_detector_yolo3_mobilenet1.0_coco-0000.params", "body_detector_yolo3_mobilenet1.0_coco-symbol.json"]:tar.add(name)tar.close()Python
复制代码


脚本执行完毕,会在当前目录生成名为

body_detector_yolo3_mobilenet1.0_coco.tar.gz
复制代码

的文件,该文件为 SageMaker Neo 编译任务的输入。


Neo 编译作业


SageMaker Neo 编译作业可以直接在 SageMaker 控制台实现,它的输入是一个 S3 桶路径,优化后的模型导出也是一个 S3 桶路径,整个过程如下:


1.将其中生成的

body_detector_yolo3_mobilenet1.0_coco.tar.gz
复制代码

上传至任意一个指定的 S3 桶路径,如

s3://object-det-neo/input/body_detector_yolo3_mobilenet1.0_coco.tar.gz
复制代码


2.进入 SageMaker 控制台,点击左侧导航栏推理-编译作业,创建编译作业,输入作业名称,创建具有 S3 桶访问权限的 IAM 角色,输入配置中的选项包括:


  • 模型构件的位置: 模型存储的 S3 桶路径

  • 数据输入配置: 即模型的推理时输入尺寸,该指南中以宽高比为 3:2 的图像为基准,输入尺度为

  • {"data": [13416624]

机器学习框架: 由于该指南以 MXNet 为例,故选择 MXNet


3.输出配置选项包括:


  • 目标设备/目标平台:选择目标平

  • 操作系统:选择 LINUX;

  • 架构:选择 X86_64

  • 加速器:选择 NVIDIA

  • 编译器选项:输入

  • {"gpu-code": "sm_75", "trt-ver": "7.0.0", "cuda-ver": "10.1"}

S3 输出位置:指定优化后的模型输出,如

  • s3://object-det-neo/output/

加密密钥:保持默认(无自定义加密)


最后点击提交,等待 3-5 分钟,待编译作业状态显示完成后编译后的模型(如

s3://object-det-neo/output/body_detector_yolo3_mobilenet1.0_coco-LINUX_X86_64_NVIDIA.tar.gz
复制代码

)便会输出到指定的 S3 桶位置。


EC2 推理速度测试


启动 EC2 实例


进入 EC2 控制台,启动实例,选择 Amazon 系统镜像(AMI)为


Deep Learning AMI (Amazon Linux 2) Version 44.0 - ami-01f1817a8a0c23c2e,
复制代码


选择实例类型为 g4dn.xlarge,点击下一步配置实例详细信息,保持默认,点击下一步添加存储,保持默认根卷大小 95GiB,点击下一步添加标签(可选),点击下一步配置安组,保持默认,点击审核和启动,选择现有密钥对或创建新密钥对,点击启动。


稍等几分钟,等待实例的状态检查初始化完成后,通过 terminal 链接该实例:


ssh -i "your_key.pem" ec2-user@ec2-xxx-xxx-xx-xxx.compute-1.amazonaws.com
复制代码


推理测试


通过 SSH 登录链接到实例之后,下载推理测试的代码和模型(未经过 Neo 优化的和经过 Neo 优化的),具体执行命令如下所示:


git clone https://github.com/aws-samples/amazon-ipc-ai-saas.gitcd amazon-ipc-ai-saas/source/neomkdir -p models/human_body_detectorcd models/human_body_detectorwget -c https://ipc-models-zoo.s3.amazonaws.com/body-detector/body_detector_yolo3_mobilenet1.0_coco-0000.paramswget -c https://ipc-models-zoo.s3.amazonaws.com/body-detector/body_detector_yolo3_mobilenet1.0_coco-symbol.json
cd ../../mkdir -p models/human_body_detector_neocd models/human_body_detector_neowget -c https://ipc-models-zoo.s3.amazonaws.com/body-detector/body_detector_yolo3_mobilenet1.0_coco-LINUX_X86_64_NVIDIA.tar.gztar -zxvf body_detector_yolo3_mobilenet1.0_coco-LINUX_X86_64_NVIDIA.tar.gz
复制代码


上述命令执行之后,在 neo/目录下的结构如下所示:


.├── eval.py├── models│   ├── human_body_detector│   │   ├── body_detector_yolo3_mobilenet1.0_coco-0000.params│   │   └── body_detector_yolo3_mobilenet1.0_coco-symbol.json│   └── human_body_detector_neo│       ├── compiled.meta│       ├── compiled_model.json│       ├── compiled.params│       ├── compiled.so│       └── manifest└── test_1280x1920x3.jpg
复制代码


安装neo-ai-dlr软件和gluoncv依赖包,参考https://github.com/neo-ai/neo-ai-dlr/releases;这里测试平台为 Amazon g4dn.xlarge,安装命令如下:


wget -c https://neo-ai-dlr-release.s3-us-west-2.amazonaws.com/v1.9.0/gpu/dlr-1.9.0-py3-none-any.whlsource activate mxnet_latest_p37pip3 install dlr-1.9.0-py3-none-any.whlpip3 install gluoncv==0.8.0
复制代码


退回到neo/目录,执行速度评估脚本eval.py,如下所示:


python3 eval.py
复制代码


运行结果会直接打印在 terminal 之上,同时也会将推理的结果绘制出来并保存到当前目录下(未经 SageMaker Neo 优化的检测结果body_det_vis.jpg,经 SageMaker Neo 优化后的推理模型检测结果body_det_vis_with_neo.jpg)。

未经 Neo 优化和经过 Neo 优化后的推理结果可视化分别如下所示:




可以看出 SageMaker Neo 的优化基本没有影响到检测的精确度,运行时间开销输出结果如下:


[NEO Optimization Disabled] Time Cost per Frame (input size = 1x3x416x624) = 23.388335704803467 ms[NEO Optimization Enabled] Time Cost per Frame (input size = 1x3x416x624) = 10.05416750907898 ms
复制代码


SageMaker Neo 优化过的模型可以将推理速度提升一倍以上,该推理时间不含将图像进行 base64 解码以及 resize 的部分。


注意:在测试结束之后,关闭该实例,避免产生不必要的费用。


本篇作者


徐高伟

亚马逊云科技解决方案架构师

负责基于亚马逊云科技的云计算方案的咨询与架构设计,致力于亚马逊云科技云服务在汽车,物联网,人工智能等行业的应用和推广。在加入亚马逊云科技之前曾在 BMW 无人驾驶研发中心担任机器人和人工智能专家,负责无人车环境感知,行为预测和决策规划研发。


用户头像

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
SageMaker Neo优化目标检测模型加速推理