带您了解昇腾模型压缩工具

本文分享自华为云社区《【CANN文档速递11期】带您了解昇腾模型压缩工具》,作者: 昇腾 CANN 。
什么是 AMCT,它能做什么?
昇腾模型压缩工具(Ascend Model Compression Toolkit,简称 AMCT)是一个针对昇腾芯片亲和的深度学习模型压缩工具包,提供量化、张量分解等多种模型压缩特性,致力于帮助用户高效实现模型的小型化。
它实现了神经网络模型中数据与权重 8 比特量化、张量分解、模型部署优化(主要为 BN 融合)的功能,该工具将量化和模型转换分开,实现对模型中可量化算子的独立量化,最终输出量化后的模型。
其中,量化后的仿真模型可以在 CPU 或者 GPU 上运行,完成精度仿真;量化后的部署模型可以部署在昇腾 AI 处理器上运行,达到提升推理性能的目的。
AMCT 功能介绍

AMCT 使用的模型压缩方法有:量化、张量分解、模型部署优化(主要为 BN 融合)。
量化:指对模型的权重(weight)和数据(activation)进行低比特处理,让最终生成的网络模型更加轻量化,从而达到节省网络模型存储空间、降低传输时延、提高计算效率,达到性能提升与优化的目标。其原理如下图所示:

量化根据是否需要重训练,分为训练后量化和量化感知训练。
训练后量化(Post-Training Quantization,简称 PTQ)
在模型训练结束之后进行的量化,再对训练好的模型进行权重和数据的量化,进而加速模型推理速度。
量化感知训练(Quantization-Aware Training,简称 QAT)
在量化过程中,对模型进行训练的一种量化。QAT 会在训练过程中引入伪量化的操作(从浮点量化到定点,再还原到浮点的操作),用来模拟前向推理时量化带来的误差,并借助训练让模型权重能更好地适应这种量化的信息损失,从而提升量化精度。
模型部署优化:主要为算子融合功能,指通过数学等价,将模型中的多个算子运算融合为单算子运算,以减少实际前向过程中的运算量,如将卷积层和 BN 层融合为一个卷积层。该功能在量化过程中实现,当前仅支持 BN 融合。其原理如下图所示:

张量分解:通过分解卷积核的张量,可以将一个大卷积核分解为两个小卷积核的连乘,即将卷积核分解为低秩的张量,从而降低存储空间和计算量,降低推理开销。其原理如下图所示:

AMCT 量化方式
AMCT 支持两种方式的量化:命令行方式和 Python API 接口方式,区别如下:

如果用户想快速体验 AMCT,则可以使用命令行方式进行训练后量化 ,如果想体验更多功能,比如量化感知训练,则必须使用 Python API 接口方式实现。
如何使用 AMCT
下图展示了使用 AMCT 进行量化的简单流程,用于需要先在符合版本要求的 Linux 服务器部署 AMCT,完成模型量化操作,输出可部署的量化模型;然后借助 ATC 工具转成适配昇腾 AI 处理器的.om 离线模型;最后使用.om 离线模型,在昇腾 AI 处理器完成推理业务。

下面以 Caffe 框架 ResNet-50 网络模型为例,为您演示如何借助 AMCT 进行命令行方式的量化。
1. 通过昇腾社区获取 AMCT 软件包,并完成安装。
在任意路径执行 amct_caffe calibration --help 命令,若回显参数信息,则说明 AMCT 能正常使用。
2. 准备要进行量化的模型文件*.prototxt、权重文件*.caffemodel、以及与模型匹配的二进制数据集上传到 AMCT 所在 Linux 服务器。
3. 执行如下命令进行训练后量化。

参数解释如下:
--model:原始网络模型文件路径与文件名。
--weight:原始网络模型权重文件路径与文件名。
--save_path:量化后模型的存放路径。
--input_shape:指定模型输入数据的 shape。
--data_dir:二进制数据集路径。
--data_types:输入数据的类型。
4. 量化完成后,在{save_path}参数指定路径下可以查看量化后的模型。
5. (后续处理)用户使用上述量化后的模型,借助 ATC 工具转成适配昇腾 AI 处理器的.om 离线模型,然后在安装昇腾 AI 处理器的服务器完成推理业务。
AMCT 更多功能
下面介绍 Caffe 框架下通过 Python API 接口方式实现的各种功能。
训练后量化
接口调用流程

代码示例
1. 导入 AMCT 包。

2. 调用 AMCT,量化模型。
a. 解析用户模型,生成量化配置文件。

b. 初始化 AMCT,读取用户量化配置文件、解析用户模型文件、生成用户内部修改模型的 Graph IR。

c. 执行图融合、执行权重离线量化以及插入数据量化层得到校准模型,从而在后续校准推理过程中执行数据量化动作。

d. 执行校准模型推理,完成数据量化(借助用户原始 Caffe 环境) 。

e. 执行量化后图优化动作,并保存得到最终的量化部署模型(deploy)和量化仿真模型(fake_quant)。

量化感知训练
接口调用流程

代码示例
1. 导入 AMCT 包。

2. 调用 AMCT,量化模型。
a. 解析用户模型,生成量化配置文件。

b. 修改模型,插入伪量化层并存为新的模型文件。

c. 使用修改后的模型,创建反向梯度,在训练集上做训练,训练量化因子(借助用户原始 Caffe 环境)。

d. 保存模型。

张量分解
接口调用流程

代码示例
1. 导入 AMCT 相关模块。

2. 调用接口执行张量分解。

3. 对分解后的模型进行 finetune,输出最终分解后的模型。
更多介绍
关于文中命令行方式更多参数、Python API 方式接口介绍以及 TensorFlow、ONNX、PyTorch、MindSpore 等框架的 AMCT 用法介绍,请登录昇腾社区,阅读相关文档:https://www.hiascend.com/document

昇腾 CANN 文档中心致力于为开发者提供更优质的内容和更便捷的开发体验,助力 CANN 开发者共建 AI 生态。任何意见和建议都可以在昇腾社区反馈,您的每一份关注都是我们前进的动力。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/c16a89b6aec4b0d28821a1a40】。文章转载请联系作者。
评论