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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 使用MXNet实现生产级神经网络模型量化推理相关的知识,希望对你有一定的参考价值。

[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)

以上是关于markdown 使用MXNet实现生产级神经网络模型量化推理的主要内容,如果未能解决你的问题,请参考以下文章

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

技术观点实现 MXNet 数据可视化

经典卷积神经网络(LeNetAlexNetVGGGoogleNetResNet)的实现(MXNet版本)

MXBoard | 实现 MXNet 数据可视化

AWS研究热点:BMXNet – 基于MXNet的开源二进神经网络实现

MXNet数据加载