hewumars
6/17/2019 - 2:47 PM

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

[TOC]

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

介绍

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

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

在实际生产环境中部署深度学习基础架构时,高性能和经济高效的服务是关键。因此,许多云服务提供商(CSP)和硬件供应商已经优化了他们的服务和架构来进行推理,例如Amazon SageMaker,来自亚马逊网络服务(AWS)的Deep Learning AMIsIntel®Deep Learning Boost(Intel® DL Boost),包括第二代Intel®Xeon®可扩展处理器中的矢量神经网络指令(VNNI)。

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

新的量化方法和运算符融合可在当前AWS * EC2 CPU实例中实现高达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文件)和参数。

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

加速

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

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

部署你的模型

客户可以使用校准工具和API轻松地将float32模型量化为INT8模型。此外,Apache MXNet正式提供两种量化示例:用于图像分类和对象检测的量化(SSD-VGG16)。用户还可以引用量化API,将它们集成到实际工作负载中。

最新的MXNet版本1.4.0支持无符号量化。新的量化功能,如带符号量化和量化完全连接,可从MXNet github仓库的每日构建Nightly build或主分支获得。

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

准备

使用以下命令安装MXNet的最新发行版(带Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN)支持)。

pip install --pre mxnet-mkl

根据Training instructions去训练PascalVOC数据集的FP32 SSD-VGG16_reduced_300x300模型 你还可以下载我们的SSD-VGG16预训练模型打包的二进制数据。创建模型和数据目录(如果它们不存在),解压缩zip文件,然后按如下方式重命名未压缩的文件。

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

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

# 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提供校准脚本。用户可以设置不同的配置来将float32 SSD-VGG16型号量化为INT8型号,包括批量大小,校准批次数,校准模式,输入数据的量化目标数据类型,排除层和数据加载器的其他配置。我们可以使用以下命令进行量化。默认情况下,此脚本使用五个批次(每批32个样本)进行初始校准。

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推理

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

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

检测可视化

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

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

# 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_

性能

在本节中,我们将展示更多网络及其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所示)。