基于第二代英特尔® 至强® 可扩展处理器的 PADDLEPADDLE* 对 INT8 推理的支持

2019 年 04 月 05 日

PaddlePaddle*(并行分布式深度学习)是百度开发的一种开源深度学习框架,既可供内部使用,也可供更广大深度学习社区使用。自2016 年以来,英特尔和百度携手合作,根据百度的关键在线部署要求优化 PaddlePaddle 性能,以进行深度学习训练和推理。

虽然深度神经网络(DNN) 针对各种计算任务表现出一流的精度,但由于推理工作负载的计算复杂性高,因而在企业级部署中仍然面临重重挑战。为克服这一问题,我们目前正在积极研究 INT8 推理等关键技术。

百度最近宣布发布 PaddlePaddle v1.3,这是第一个在第二代英特尔® 至强® 可扩展处理器1上使用英特尔® 深度学习加速(英特尔® DL Boost)支持 INT8 推理的深度学习框架,它采用面向深度神经网络的英特尔® 数学核心函数库(英特尔® MKL-DNN)。新一代处理器还包括整数矢量神经网络指令(VNNI),它可以提高 INT8 数据类型的乘-加-累加运算的吞吐量,而且有助于提高深度神经网络中使用的低精度卷积和矩阵-矩阵乘法运算的性能。有了这种硬件加速支持,低精度推理能增加每秒计算的运算数,降低对内存访问的要求,提高缓存利用率,增大吞吐量和降低延迟。

首先,本文将讨论 PaddlePaddle v1.3 版本中最近实现的 INT8 推理离线支持。另外还会阐述如何实现 INT8 模型,并演示第二代英特尔® 至强® 可扩展处理器的性能。最后,本文将呈现集成整个PaddlePaddle 微框架的 INT8 解决方案。

1.INT8 推理

INT8 推理需要用到两种主要组件:

1.      校准工具

2.      INT8 运算/内核

1.1 校准工具

使用校准工具对校准数据集运行 FP32 推理,以此收集张量统计,将图形从 FP32 转换为 INT8,并生成 INT8 模型。图 1 显示校准工具的基本流程,包括张量统计收集和图形转换,其中灰色框表示校准工具的输入/输出,蓝色框表示校准工具中的模块。该工具在 PaddlePaddle v1.3 版本中作为 Python* 实用工具存在。有关更多详细信息,请参阅 Python 代码

图 1.校准工具的基本流程。灰色框表示校准工具的输入/输出,蓝色框表示校准工具中的模块。

英语

中文

Calibration Dataset

校准数据集

FP32 Model and Weight

FP32 模型和权重

Tensor Statics Collection

张量统计收集

Activation Tensor

激活张量

Weight Tensor

权重张量

Graph Transformation

图形转换

Model and Weight for INT8 Inference

INT8 推理的模型与权重


·         张量统计收集。用户需要选择校准数据集,用于代表在将模型部署到生产中时将使用的数据集。根据用户准备的校准数据集和优化的 FP32 模型,采样过程将收集 FP32 张量以供激活。有关更多详细信息,请参阅示例数据 Python API (paddle.fluid.contrib.Calibrator.sample_data)。请注意,用户在准备校准数据集时可以指定批处理大小和迭代次数。

·         图形转换。图形转换使用 FP32 张量执行以下四步。有关更多详细信息,请参阅保存_int8_模型 Python API。

1.      通过用户指定的量化算法计算位阶

a.       量化算法:MAX 和 KL。MAX 是找出绝对值最大值的默认算法,KL 则是通过熵找出合理值的替代算法。为满足精度目标,用户可以调整算法。

b.      基于收集的张量统计计算量化位阶的公式:

·         如果整个张量非负(例如 ReLU),则激活位阶 = 255/MAX

·         如果张量为负值,则激活位阶 = 127/MAX

·         权重位阶 = 127/MAX

2.      分析图形并根据支持的 INT8 运算列表(Conv2D 和 Pool2D)插入量化/反量化运算

3.      将量化位阶作为运算属性加入卷积

4.      保存量化的 INT8 模型从而进行推理部署

借助校准工具,FP32 模型被量化为 INT8 模型。图 2 分两个阶段显示典型图形转换:1)在中间阶段,围绕卷积运算插入量化运算和反量化运算(方括号部分),2)通过消除不必要的量化运算和反量化运算(灰色遮罩框)优化中间图形,此外,量化位阶将作为属性添加到 INT8 图形的量化卷积运算中。

图 2.从 FP32 到 INT8 模型的图形转换。

英语

中文

FP32 Tensor

FP32 张量

ConvOp

卷积运算

ConvOp

卷积运算

FP32 Graph

FP32 图形

FP32 Tensor

FP32 张量

QuantizeOp

量化运算

Quantized ConvOp

量化后的卷积运算

DequantizeOp

反量化运算

Quantized Op

反量化后的运算

Quantized ConvOp

量化后的卷积运算

Dequantize ConvOp

反量化后的卷积运算

Intermediate

中间阶段

FP32 Tensor

FP32 张量

QuantizeOp

量化运算

Quantized ConvOp

量化后的卷积运算

Quantized ConvOp

量化后的卷积运算

Dequantize ConvOp

反量化后的卷积运算

INT8 Graph

INT8 图形


1.2 INT8 运算/内核

PaddlePaddle v1.3 支持四种 INT8 运算,包括两种新增的 INT8 运算(量化和反量化)以及两种新增的 INT8 内核(Conv2D 和 Pool2D)。这些运算之所以率先获得支持,是因为它们是深受欢迎的 CNN 模型中广泛使用的运算,也是彰显 INT8 与生俱来的能力时必须进行的运算。我们使用输入和输出数据类型定义支持的 INT8 运算(对于 S8,为带符号 INT8;对于 U8,则为无符号 INT8):

·         INT8 运算量化:支持从 FP32 量化为 S8/U8

·         INT8 运算反量化:支持从 S8/U8 反量化为 FP32

·         INT8 内核卷积:支持 INT8 Conv2D 计算;输入为 S8/U8,权重为 S8;输出为 S8/U8/FP32

·         INT8 内核池:支持 INT8 Pool2D 计算;输入为 S8/U8;输出与输入相同

为支持百度所需的其他模型,目前正在开发更多 INT8 运算/内核,其中包括 Requantize、Concat、Reshape、Transpose 和 MatMul。

2.INT8 的实现与结果

我们选择了 ResNet-50 和 MobileNet-V1 作为两个典型的 CNN。在下文中,我们提供了如何从基于 ResNet-50 的 FP32 实现 INT8 模型的说明,然后演示了采用英特尔® 深度学习加速的第二代英特尔® 至强® 可扩展处理器的性能。

2.1 INT8 的实现

根据现有 FP32 模型和 Python 预测器实现 INT8 模型只需三步:

1.      构建校准对象。它接受 FP32 模型、校准算法和便于 FP32 推理采样的参数。

calibrator = paddle.fluid.contrib.Calibrator ( # Step 1 program=infer_program, # required, FP32 program pretrained_model=model_path, # required, FP32 pretrained model algo=algo, # required, calibration algorithm; MAX (default) or KL exe=exe, # required, executor output=int8_model, # required, INT8 model feed_var_names=feed_dict, # required, feed dict fetch_list=fetch_targets) # required, fetch targets

2.

_, acc1, _ = exe.run( program, feed={feed_dict[0]: image, feed_dict[1]: label}, fetch_list=fetch_targets) calibrator.sample_data() # Step 2

3.

calibrator.save_int8_model() # Step 3

遵循以上三步即可生成 INT8 模型。完整说明见 PaddlePaddle 公共存储库中的 README,示例代码则作为测试用例添加。使用生成的模型,用户可以在 Python API 或 C-API 中执行 INT8 推理,并展示 INT8 推理相较于 FP32 推理的出色精度和性能。

2.2 INT8 的结果

我们在基于 ResNet-50 和 MobileNet-V1 的第二代英特尔® 至强® 可扩展处理器上测量了精度和性能,并展示了 INT8 推理相较于 FP32 推理的出色精度和性能。

表 1.FP32 和 INT8 的精度

表 1 显示了对 ImageNet 完整验证数据集测量的最高精度,其中包含 50,000 张图片2。ResNet-50 v1.5 和 MobileNet-V1 的最高精度分别表现出 0.4% 和 0.31% 的损失。FP32 和 INT8 之间允许存在 1% 的精度损失,这是 INT8 推理的一项标准。

表 2.FP32 和 INT8 吞吐量性能(单一批处理,单核)

表 2 显示英特尔® 至强® 金牌 6271 处理器单路上的 FP32 和 INT8 的吞吐量。表中的吞吐量是基于百度的业务部署要求,采用单个批量大小和单核测量而得。该表显示,在采用英特尔® 深度学习加速的情况下,INT8 推理比 FP32 推理的性能显著提高,由 2.2 倍提高到 2.8 倍。

3. INT8 量化对 PaddlePaddle 微框架的影响

PaddlePaddle 定义了一种微框架,它包括量化、剪枝和蒸馏。作为量化的一部分,v1.3 中的 INT8 校准工具将基于统一的 PASS 策略进行细化,并将微框架作为训练后的量化进行集成。特别是,Python 中的图形转换将应用于相应 C ++ Pass 的一组新 API,并且还会开发 C++ 预测器。

图 3:PaddlePaddle 微框架

英语

中文

CompressPass

CompressPass

Distillation Strategy

蒸馏策略

FSP distiller

FSP 蒸馏器

Plain distiller

普通蒸馏器

Quanlization Strategy

量化策略

Dynamic Quanlizer

动态量化器

Static Quanlizer

静态量化器

PlainPruner Strategy

普通剪枝器策略

AutoPruner Strategy

自动剪枝器策略

SensetivePruner Strategy

敏感剪枝器策略

Structure Pruner

结构剪枝器

Ratio Pruner

比率剪枝器

Threshold Pruner

阈值剪枝器

FCFusePass(python)

FCFusePass(python)

ConvBNFusePass(python)

ConvBNFusePass(python)

PruneParamPass(python)

PruneParamPass(python)

FSPDistillationPass(python)

FSPDistillationPass(python)

FCFusePass(C++)

FCFusePass(C++)

ConvBNFusePass(C++)

ConvBNFusePass(C++)

Graph python API

Graph python API

Graph C++ API

Graph C++ API

Program

程序

Paddle framework

Paddle 框架

 

此外,在英特尔® 至强® 可扩展处理器和第二代英特尔® 至强® 可扩展处理器上,训练感知量化将利用基于现有高效英特尔® MKL-DNN 的 INT8 运算/内核进行量化感知 INT8 训练。量化感知训练通常既对前向传递也对后向传递模拟权重和激活的量化,从而对训练时的量化效果建模。训练后量化是一种轻量型量化解决方案,它可以使用校准工具生成量化模型,而训练感知量化的宗旨,则是在训练后量化不充分的情况下,通过模拟训练期间的量化误差,来进一步减轻精度损失。图 4 显示了 PaddlePaddle 微框架内关键组件的关系。

图 4. INT8 运算/内核和微框架的校准支持。

英语

中文

INT8 Ops/Kernals

INT8 运算/内核

Training-aware Quantization (Slim Framework)

训练感知量化(微框架)

Post-training Quantization (Slim Framework)

训练后量化(微框架)

Calibration Support

校准支持

 

4. 摘要

在本文中,我们讨论了百度发布的 PaddlePaddle v1.3 中 INT8 推理支持的设计。我们还提供了如何从现有 FP32 模型实现 INT8 模型的说明,并演示了采用英特尔® 深度学习加速的第二代英特尔® 至强® 可扩展处理器的性能提升情况。

在未来,我们计划实现更多 INT8 模型和更多 INT8 运算/内核,以改进推理并满足百度的要求。此外,我们还希望与百度合作,为 PaddlePaddle 微框架做出更多贡献。

作者

Haihao Shen

高级深度学习工程师

标签

英特尔® 至强® 处理器 通用 一般 推理

做出贡献的其他人士

英特尔:Xiaoli Liu, Guoming Zhang, Chuanqi Wang, Liangang Zhang, Brian Liu, Bingyang Huang, Krzysztof Binias, Wojciech Uss, Sylwester Fraczek, Jason Wang, Frank Zhang, Sophie Chen, Eric Lin, Andres Rodrigues, Emily Hutson

百度:Tao Luo, Jian Tang, Zhen Wang, Qingqing Dang, Chunwei Yan, Xin Pan, Tiezhu Gao

通知和免责声明

性能测试中使用的软件和工作负荷可能仅在英特尔微处理器上进行了性能优化。

诸如 SYSmark 和 MobileMark 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能。上述任何要素的变动都有可能导致测试结果的变化。请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。有关更多完整信息,请访问 www.intel.cn/benchmarks。

配置:英特尔® 至强® 金牌 6271 CPU @ 2.60GHz;硬件:启用睿频,启用超线程,软件:PaddlePaddle v1.3,英特尔 MKL-DNN v0.18;性能测量:实际数据,单一批处理,单核(其他内核闲置)。

人工智能开发

英特尔® 技术可以针对您的AI开发需求进行定制,帮助您为每项工作找到最佳技术解决方案。英特尔还为开发人员、数据科学家提供AI理论和精选案例,为用户提供前沿的AI资讯和丰富的线上线下活动。

了解更多

人工智能应用

深度学习、机器学习以及预测性分析对数据中心、工作站和设备提出了独特的要求。英特尔® 技术可以帮助您实现从医学发现到自动驾驶汽车智能的重大突破。

了解更多