markdown使用mxnet实现生产级神经网络模型量化推理(代码片段)

author author     2022-12-13     784

关键词:

[TOC]

# 使用MXNet实现生产级神经网络模型量化推理

## 介绍

在深度学习中,推理用于部署预训练的神经网络模型来执行图像分类,对象检测和其他预测任务。在现实世界中,尤其是企业中,推理非常重要,因为它是分析流程的一个阶段,根据生产级数据向终端用户提供有价值的结果。来自终端用户的大量推理请求不断被路由到全世界的云服务器。

推理性能的主要衡量标准是延迟latency,或完成预测所需的时间 - 更短的延迟可确保良好的用户体验。单批推断在生产级推理中非常常见,因此它具有CPU友好性。

在实际生产环境中部署深度学习基础架构时,高性能和经济高效的服务是关键。因此,许多云服务提供商(CSP)和硬件供应商已经优化了他们的服务和架构来进行推理,例如[Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/deploy-model.html),来自亚马逊网络服务(AWS)的[Deep Learning AMIs](https://aws.amazon.com/blogs/machine-learning/aws-deep-learning-amis-now-come-with-tensorflow-1-13-mxnet-1-4-and-support-amazon-linux-2/)和[Intel®Deep Learning Boost]()(Intel® DL Boost),包括第二代Intel®Xeon®可扩展处理器中的矢量神经网络指令(VNNI)。

Apache MXNet* 社区提供了量化方法,以提高性能并降低推理的部署成本。精度较低有两个主要好处(INT8)。首先,可以通过低精度指令加速计算,如VNNI。其次,精度较低的数据类型可节省内存带宽,并可实现更好的cache局部性和节能效果。

新的量化方法和运算符融合可在当前[AWS * EC2 CPU](https://amazonaws-china.com/ec2/instance-types/c5/)实例中实现高达3.7倍的性能加速(图6,mobilenet v1 BS = 64),在支持Intel DL Boost的硬件下,将达到更高的吞吐量,并且精度下降不到0.5%。

## 模型量化

Apache MXNet支持从float32的模型量化到有符号的INT8(s8)或无符号的INT8(u8)。 s8设计用于一般推理,u8专用于CNN。对于大多数CNN,Relu用作激活功能,因此输出激活是非负的。因此,u8的好处是显而易见的 - 我们可以再使用一位数据来获得更好的准确性accuracy。

INT8推理管道包括两个基于训练的FP32模型的阶段,包括保存的模型(json文件)和参数。

![Fig 1. MXNet int8 inference pipeline](https://cdn-images-1.medium.com/max/1200/1*mi1gzbtXE_XoVjFk9Iw-eg.png)

- **校准量化(离线阶段)**。在此阶段,来自验证数据集(1-5%)的一小部分图像将用于收集统计信息,包括基于熵理论的最小/最大范围或最佳阈值,并定义缩放因子scale用于对称量化和每层的执行性能。此阶段的输出是校准模型,包括保存为JSON文件和参数文件的量化运算符。
- **INT8推理(运行时阶段)**。量化和校准的模型应该是一对可以像原始模型一样加载和推理的JSON和param文件,它们除了速度更快和很小的精度差异。

## 加速

Apache MXNet提供了许多高级功能来加速推理量化,包括`量化数据加载`,`离线校准`,`图优化`等。Apache MXNet是第一个提供完全量化的INT8网络的深度学习框架之一,从数据加载到具有生产级质量的计算密集型操作。在量化网络中,常见的计算模式,如conv+relu,它们由图优化器融合,因此整个量化网络比原始网络更紧凑和有效。例如,下面的ResNet 50 v1图显示了优化和量化之前和之后的网络变化。

![Fig 2. ResNet50 V1 Architecture (Left: FP32 Right: INT8)](https://cdn-images-1.medium.com/max/1200/1*wRJI4mcbroIH9zJ4CKAnFw.png)

当用户在不同硬件上部署模型时,所有这些功能对用户都是透明的。换句话说,终端用户无需更改其生产代码,并且在切换到新的AWS EC2实例(例如启用了英特尔®DLBoost的实例)时可以获得性能提升。

![Fig 3. Intel® Deep Learning Boost](https://cdn-images-1.medium.com/max/1200/1*vj2qHEcc-wHzg5yV-iuGqw.png)

## 部署你的模型

客户可以使用校准工具和API轻松地将float32模型量化为INT8模型。此外,Apache MXNet正式提供两种量化示例:用于[图像分类](https://github.com/apache/incubator-mxnet/tree/master/example/quantization)和对象检测的量化([SSD-VGG16](https://github.com/apache/incubator-mxnet/tree/master/example/ssd))。用户还可以引用[量化API](https://github.com/apache/incubator-mxnet/blob/master/python/mxnet/contrib/quantization.py),将它们集成到实际工作负载中。

最新的MXNet版本1.4.0支持无符号量化。新的量化功能,如带符号量化和量化完全连接,可从[MXNet github仓库](https://github.com/apache/incubator-mxnet)的每日构建Nightly build或主分支获得。

下面以SSD-VGG16为例,说明MXNet模型量化的实现和结果。

## 准备

使用以下命令安装MXNet的最新发行版(带[Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN)](https://github.com/intel/mkl-dnn)支持)。

```shell
pip install --pre mxnet-mkl
```

 根据[Training instructions](https://github.com/apache/incubator-mxnet/tree/master/example/ssd#train-the-model)去训练PascalVOC数据集的FP32 **SSD-VGG16_reduced_300x300**模型 你还可以下载我们[的SSD-VGG16预训练模型](http://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/ssd_vgg16_reduced_300-dd479559.zip)和[打包的二进制数据](http://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/dataset/ssd-val-fc19a535.zip)。创建模型和数据目录(如果它们不存在),解压缩zip文件,然后按如下方式重命名未压缩的文件。

```
data/
    |--val.rec
    |--val.lxt
    |--val.idx
model/
    |--ssd_vgg16_reduced_300–0000.params
    |--ssd_vgg16_reduced_300-symbol.json
```

然后,你可以使用以下命令来验证float32预训练模型:

```shell
# USE MKLDNN AS SUBGRAPH BACKEND
export MXNET_SUBGRAPH_BACKEND=MKLDNN
python evaluate.py --cpu --num-batch 10 --batch-size 224 --deploy --prefix=./model/ssd_
```

## 校准

MXNet为SSD-VGG16提供[校准脚本](https://github.com/apache/incubator-mxnet/blob/master/example/ssd/quantization.py)。用户可以设置不同的配置来将float32 SSD-VGG16型号量化为INT8型号,包括批量大小,校准批次数,校准模式,输入数据的量化目标数据类型,排除层和数据加载器的其他配置。我们可以使用以下命令进行量化。默认情况下,此脚本使用五个批次(每批32个样本)进行初始校准。

```shell
python quantization.py
```

量化后,INT8模型将保存在模型字典中,如下所示。

```
data/
    |--val.rec
    |--val.lxt
    |--val.idx
model/
    |--ssd_vgg16_reduced_300–0000.params
    |--ssd_vgg16_reduced_300-symbol.json
    |--cqssd_vgg16_reduced_300–0000.params
    |--cqssd_vgg16_reduced_300-symbol.json
```

## 部署INT8推理

使用以下命令启动推理模型。

```shell
python evaluate.py --cpu --num-batch 10 --batch-size 224 --deploy --prefix=./model/cqssd_
```

## 检测可视化

从Pascal VOC2007验证数据集中选择一个图像,检测结果应如下所示。第一张图显示了float32推理的检测结果,第二张图显示了INT8推断的检测结果。

使用以下命令可视化检测。

```shell
# Download demo image
python data/demo/download_demo_images.py
# visualize float32 detection
python demo.py --cpu --network vgg16_reduced --data-shape 300 --deploy --prefix=./model/ssd_
# visualize int8 detection
python demo.py --cpu --network vgg16_reduced --data-shape 300 --deploy --prefix=./model/cqssd_
```

![Fig 4.1. SSD-VGG Detection, FP32](https://cdn-images-1.medium.com/max/1200/1*e2qV0ceVyz4nsFpaWjfx-A.png)

![Fig 4.2. SSD-VGG Detection, INT8](https://cdn-images-1.medium.com/max/1200/1*GAZvMvEckbUWd__x7CIvvw.png)

## 性能

在本节中,我们将展示更多网络及其INT8性能。以下CPU性能来自AWS EC2 C5.18x大型实例,带有36个Intel®Xeon®Platinum8124M CPU内核。请参阅通知和免责声明中的完整配置详细信息。

对于延迟结果,在单批量大小中,较低的运行时是更好得。 ResNet-50和MobileNet V1网络在不到7毫秒的时间内完成。特别是对于边缘端模型MobileNet1,延迟要好得多在2.03毫秒。

对于所选型号,量化方法将吞吐量性能从1.96倍提高到3.72倍。 MXNet的量化流程确保了精度的小幅降低(小于0.5%,如图7所示)。

![Fig 5. MXNet* Fusion and Quantization Latency](https://cdn-images-1.medium.com/max/1200/1*LXXGgshGYbiYTqsUmZ5kvw.png)

![Fig 6. MXNet* Fusion and Quantization Speedup](https://cdn-images-1.medium.com/max/1200/1*t9R5YcoMkz0rnoV_Brpisw.png)

![Fig 7. MXNet* Fusion and Quantization Accuracy](https://cdn-images-1.medium.com/max/1200/1*eFJR9vfDIXOvb5KP-kvWbg.png)

![](https://cdn-images-1.medium.com/max/1200/1*XXrSKoZr4AGwkzN5CrqzyA.png)

经典卷积神经网络(lenetalexnetvgggooglenetresnet)的实现(mxnet版本)(代码片段)

http://www.cnblogs.com/infaraway/p/8523341.html卷积神经网络(ConvolutionalNeuralNetwork,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。  其中文章 详解卷积神经网络(CNN... 查看详情

mxnet数据加载

...ataIterator参考网站一.介绍MXNet主要使用迭代器(Iterator)来为神经网络提 查看详情

aws研究热点:bmxnet–基于mxnet的开源二进神经网络实现

http://www.atyun.com/9625.html最近提出的二进神经网络(BNN)可以通过应用逐位运算替代标准算术运算来大大减少存储器大小和存取率。通过显着提高运行时的效率并降低能耗,让最先进的深度学习模型也能在低功耗设备上使用。这种... 查看详情

markdown[来自源代码的mxnet构建]这太不可思议了,我终于设法构建了mxnet#mxnet#build(代码片段)

查看详情

如何使用网络库实现应用级消息收发

网络客户端ISocketClient和网络会话ISocketSession都继承了ISocketRemoteISocketRemote表示远程通信,核心就是收发数据。下面是ISocketRemote接口的主要实现///<summary>远程通信Socket,仅具有收发功能</summary>publicinterfaceISocketRemote:ISocket{#... 查看详情

mxnet常见问题1怎么创建新运算符(网络层)(代码片段)

...0c;你有两个选择:用前端语言(比如python)、使用CustomOp创建新运算符,运行在CPU或者GPU上。不同的实现方式,运行速度可能很快(如果你只用mx.nd下的运算符)或者很慢(如果你使用.asnumpy()把数据... 查看详情

jupyter通过notedown使用markdown(代码片段)

...沐老师的mxnet教程,在使用jupyter的时候打开教程发现全是markdown源文,没有展示markdown格式的文字。1Reason源代码是用markdown格式存储的,而不是jupyter默认的ipynb格式。jupyter要通过notedown插件来使用markdown。2Solution我浏览的时候教程... 查看详情

mxnet官方教程3symbol-神经网络图和自动区分(代码片段)

...,仅通过NDArray,我们可以定义且训练一个完整的神经网络。NDArray可以在任何前端语言上执行高效的指令式科学计算,所以你可能会疑惑:为什么我们不直接使用NDArray 查看详情

markdown语法--整理(代码片段)

Markdown基本语法[TOC]优点:1、因为是纯文本,所以只要支持Markdown的地方都能获得一样的编辑效果,可以让作者摆脱排版的困扰,专心写作。2、操作简单。比如:word编辑时标记个标题,先选中内容,再点击导航栏的标题按钮,选... 查看详情

etcdv3版本生产级集群搭建以及实现一键启动脚本

...6.集群主机免密登陆二、集群启动与验证2.1.一键启动脚本实现2.2.验证集群本专栏的上一篇文章写了《长篇图解etcd核心应用场景及编码实战》,本文继续。后续计划章节内容如下:《长篇图解etcd核心应用场景及编码实战》《搭建... 查看详情

生产级nodejs开发实践-使用连接池

...交道。起因(传统模式,读取数据库)大家都知道和这些使用tcp连接的服务传递数据的都必须要打开一个连接-connection例如我们打开一个数据库并执行一段sql,通常都是connection=open"mysql://127.0.0.1:3306/db"(打开数据库,并取得持有连... 查看详情

能提高生产率的markdown介绍

Markdown是什么?Markdown是一种轻量级标记语言,创始人为約翰·格魯伯(英语:JohnGruber)。它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”。这种语言吸收了很多在电子邮件中已有的纯文... 查看详情

markdown基础语法整理

标题级别(一共六级)(建议在#后加一个空格比较标准)通过在文字下方添加“=”和“-”,他们分别表示一级标题和二级标题。在文字开头加上“#”,通过“#”数量表示几级标题。(共1~6级标题,级别越小字体越大)列表无序... 查看详情

mac+anaconda安装mxnet(代码片段)

第一步:安装Anaconda早期安装的是TensorFlow,使用的前置安装工具是Anaconda。总体感觉是:这个工具很好用!故Anaconda详细安装的步骤省略,这个不太费事。第二步:安装MXNet起因是从网络上搞到一本李沐大师参与编写的《动手学深... 查看详情

半天完成markdown的初级学习

(一)为何学习MarkDown   作为编程开发人员免不了编写自己的工作日志以及开发文档,编写文档的软件有很多,常用的有txt文本编辑器、word、html甚至是ps。但是这些软件或多或少都存在一定的缺陷,文本编辑器太过轻量仅... 查看详情

mxnet和pytorch哪个比较好用?

参考技术A根据你自己的使用习惯吧,各有各的优势。如果想要跑一跑已经有的深度学习代码,其实选择已经有的样例比较方便的就可以了。如果真的要走在前沿,你会发现任何一个工具都不能为完全满足需求,如果是初学者你... 查看详情

生产级服务器软件

...【发布时间】:2010-11-0506:17:24【问题描述】:我目前正在使用XAMPP在我的笔记本电脑上测试和运行我的网站。是否有任何(良好的、生产级的、免费的、基于AMP的)服务器软件?或者我是否可以手动修复XAMPP中的安全漏洞(例如... 查看详情

案例分享电力设备生产数据的多层分组统计报表实现

...常是左右级嵌套,有时甚至要求相同内容的单元格合并,使用Table控件,有太多的局限,有了矩表控件,通过简单的拖拽就能轻松实现多层分组报表,不管有多少个分组和分组小计都能简单解决。下面会通过一个 查看详情