BERT部署加速622%,YOLOv7部署加速590%,这款开源压缩神器火了!

导读  

众所周知,计算机视觉技术(CV)是企业人工智能应用比重最高的领域之一。为降低企业成本,工程师们一直在探索各类模型压缩技术,来产出“更准、更小、更快”的AI模型部署落地。而在自然语言处理领域(NLP)中,随着模型精度的不断提升,模型的规模也越来越大,例如以BERT、GPT为代表的预训练模型等,这成为企业NLP模型部署落地的拦路虎。

本文为大家介绍一个低成本高收益AI模型自动压缩工具(ACT, Auto Compression Toolkit),无需修改训练源代码,通过几十分钟量化训练,保证模型精度的同时,极大的减小模型体积,降低显存占用,提升模型推理速度,助力AI模型的快速落地。

使用ACT中的基于知识蒸馏的量化训练方法训练YOLOv7模型,与原始的FP32模型相比,INT8量化后的模型减小75%,在NVIDIA GPU上推理加速5.89倍。使用ACT中的非结构化稀疏和蒸馏方法训练PP-HumanSeg模型,与压缩前相比在ARM CPU上推理加速达1.49倍

表1 自动压缩工具在CV模型上的压缩效果和推理加速

2a23e2b8a248ecddb0258bb9dade69a7.png

利用ACT中的结构化稀疏和蒸馏量化方法训练ERNIE3.0模型,与原始的FP32对比,INT8量化后的模型减小185%,在NVIDIA GPU上推理加速6.37倍

表2 自动压缩工具在NLP模型上的压缩效果和推理加速

a1a94554ea6f86eab9892103eed310fc.png

本文将从以下6个方面进一步技术解读,全文大约3900字,预计阅读时长5分钟。

四步YOLOv7自动压缩实战

四步BERT自动压缩实战


模型的推理部署

直播课报名

自动压缩技术解读


未来工作展望

感谢大家Star关注:

https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression

加入自动压缩技术交流群

7551f674f8b83a6dac1118476df425a6.png入群福利

  • 获取自动化压缩详解本次升级内容的直播课链接

  • 获取压缩团队整理的重磅学习大礼包,包括:

  1. 深度学习课程

  2. 压缩方向顶会论文合集

  3. 压缩历次发版直播课程视频

  4. 百度最高奖获得者:模型压缩架构师培训课资料

a2176e2c53c554bf795631e46df34ee3.png

ae765acb26c0204b41cd021898f7b95e.png入群方式

  1. 扫码关注公众号,填写问卷进入微信群

  2. 直播前,福利公布到群公告

383788d252530a661d589238ea17774f.png

01

四步YOLOv7自动压缩实战

1.准备预测模型:导出ONNX模型。

git clone https://github.com/WongKinYiu/yolov7.git
cd yolov7
python export.py --weights yolov7-tiny.pt --grid

2.准备训练数据&定义DataLoader:准备COCO或者VOC格式的数据。定义数据预处理模块。其中,数据预处理Reader的设置如下:

train_dataset = paddle.vision.datasets.ImageFolder(global_config['image_path'], transform=yolo_image_preprocess)
train_loader = paddle.io.DataLoader(train_dataset,batch_size=1,shuffle=True,drop_last=True,num_workers=0)

3.定义配置文件:定义量化训练的配置文件,Distillation表示蒸馏参数配置,Quantization表示量化参数配置,TrainConfig表示训练时的训练轮数、优化器等设置。具体超参的设置可以参考ACT超参设置文档

Distillation: # 蒸馏参数设置alpha: 1.0 # 蒸馏loss所占权重
loss: soft_labelQuantization:  # 量化参数设置use_pact: true  # 是否使用PACT量化算法activation_quantize_type: 'moving_average_abs_max'   # 激活量化方式,选择'moving_average_abs_max'即可quantize_op_types:  # 需要量化的OP类型,可以是conv2d、depthwise_conv2d、mul、matmul_v2等- conv2d- depthwise_conv2dTrainConfig:   # 训练的配置train_iter: 3000   # 训练的轮数eval_iter: 1000    # 训练中每次评估精度的间隔轮数learning_rate: 0.00001  # 训练学习率optimizer_builder:  # 优化器设置optimizer: type: SGDweight_decay: 4.0e-05

4.开始压缩:两行代码就可以开始ACT量化训练。启动ACT时,需要传入模型文件的路径(model_dir)、模型文件名(model_filename)、参数文件名称(params_filename)、压缩后模型存储路径(save_dir)、压缩配置文件(config)、dataloader和评估精度的eval_callback。

from paddleslim.auto_compression import AutoCompression
ac = AutoCompression(model_dir=global_config["model_dir"],model_filename=global_config["model_filename"],params_filename=global_config["params_filename"],save_dir=FLAGS.save_dir,config=all_config,train_dataloader=train_loader,eval_callback=eval_function)
ac.compress()

02

四步BERT自动压缩实战

1.准备预测模型

Paddle模型可跳过该步骤,直接进行压缩;PyTorch模型,使用以下两种任一方法,完成模型转换后,即可开始模型压缩工作。

  • 使用PyTorch2Paddle(在X2Paddle工具箱中)直接将PyTorch动态图模型转为飞桨静态图模型;(以下代码使用该方法)

  • 使用ONNX2Paddle将PyTorch动态图模型保存为ONNX格式后再转为飞桨静态图模型。

import torch
import numpy as np
# 将PyTorch模型设置为eval模式
torch_model.eval()
# 构建输入,
input_ids = torch.zeros([batch_size, max_length]).long()
token_type_ids = torch.zeros([batch_size, max_length]).long()
attention_msk = torch.zeros([batch_size, max_length]).long()
# 进行转换
from x2paddle.convert import pytorch2paddle
pytorch2paddle(torch_model,save_dir='./x2paddle_cola/',jit_type="trace",  input_examples=[input_ids, attention_msk, token_type_ids])

2.准备训练数据&定义DataLoader。本案例默认以GLUE数据进行自动压缩实验,PaddleNLP会自动下载对应数据集。

03e910896f5bd48283a97aa1f2ac8167.png

4d1e035b6c41cfad70050370a6e4f535.png

9be78767637ad592fb19d5f8cb58df1f.png

3.定义配置文件。如果自动压缩针对Transformer encoder结构的模型没有指定具体的压缩策略的话,会自动选择结构化剪枝和量化进行压缩。如果想单独设置某一种压缩策略,可以参考的具体的超参设置ACT超参设置文档

### 训练配置
train_config = {"epochs": 3,               ### 压缩训练epoch数量"eval_iter": 855,         ### 训练多少轮数进行一次测试"learning_rate": 1.0e-6,   ### 压缩训练过程中的学习率"optimizer_builder": {     ### 优化器配置"optimizer": {"type": "AdamW"},"weight_decay": 0.01  ### 权重衰减值},"origin_metric": 0.6006    ### 压缩前模型精度,用来确认转换过来的模型和实现的dataloader是否正确
}

4.开始压缩。两行代码就可以开始ACT量化训练。启动ACT时,需要传入模型文件的路径(model_dir)、模型文件名(model_filename)、参数文件名称(params_filename)、压缩后模型存储路径(save_dir)、压缩配置文件(config)、dataloader和评估精度的eval_callback。

### 调用自动压缩接口ac = AutoCompression(model_dir='./x2paddle_cola',model_filename='model.pdmodel',params_filename='model.pdiparams',save_dir=save_dir,config={'TrainConfig': train_config}, #config,train_dataloader=train_dataloader,eval_callback=eval_function,eval_dataloader=eval_dataloader)
ac.compress()

以上是精简后的关键代码,如果想快速体验,可以根据

https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/pytorch_huggingface中的示例文档及代码进行体验。

训练完成后会在save_dir路径下产出model.pdmodel和model.pdiparams文件。至此,完成了模型训练压缩工作,推理部署参考下一节内容。

03

模型的推理部署

基于压缩训练后的模型,开发者可以直接使用FastDeploy推理部署套件完成部署落地。在使用FastDeploy部署时,开发者可以根据需要,使用一行代码切换Paddle Inference、Paddle Lite、TensorRT、OpenVINO、ONNX Runtime和RKNN等不同后端,来实现不同硬件的部署落地。

04

直播报名

想了解AI模型压缩策略,了解更多自动压缩工具的算法和能力,快快扫码加群关注我们的直播间吧!

直播时间: 2022年11月7日(下周一)和11月8日(下周二)20:30-21:30,欢迎大家扫码报名。

d332457740308c77cf1e114957d3b92c.png

05

自动压缩技术解读

1

研发模型自动压缩工具的动机和思考

模型剪枝是模型压缩的重要手段,在实际使用中有如下2点困难:

1) 直接使用剪枝损失比较大,无法满足精度要求

  • 结构化剪枝是裁剪掉网络中不重要的神经元。虽然剪枝后会重新训练,但通常比较难恢复预训练模型中的一些信息,导致剪枝后模型的精度下降。如果加上预训练数据进行重新训练,会大大增加剪枝的成本。

2) 模型剪枝需要修改训练代码,操作复杂,技术门槛高

结构化剪枝包括以下3步:

  • 根据规则计算神经元的重要性;

  • 根据重要性对模型神经元进行剪枝;

  • 重新训练剪枝后的模型。

这些步骤需要开发者在原本的训练代码中直接调用剪枝的相关接口,并进行分步操作。通常项目工程相当复杂,修改训练代码技术复杂度高、时间成本高昂。

模型量化提升模型推理速度的手段之一,实际使用中有如下3点困难:

1)模型激活值分布不均匀,导致量化误差大

过度训练是导致模型激活值分布不均匀的原因之一。例如在YOLOv6s迭代过程中,为了让模型更好地收敛,通常需要延长模型训练周期。但随之也会带来一些隐患,比如模型在COCO数据集上出现了过拟合,某些层的数值分布极端化,这些状况增加了量化的噪声。我们分析了YOLOv6s每层Conv的量化精度,发现某些层精度下降的特别严重,由此导致了YOLOv6s模型离线量化后在验证集上的精度下降了10%,无法达到业务要求。

2)任务复杂度高,模型精度受量化误差的影响大

任务复杂度越高,模型量化带来的精度损失越大。目标检测融合了目标定位和目标分类两种任务,整体的复杂度相对较高,因此它的精度受量化的影响更大。普通的离线量化无法改变模型激活值的数值分布,只会让量化scale适应该分布。遇到数值分布不均匀的激活值,离线量化的量化误差会很大。

3)量化训练需修改训练代码,复杂度高,技术门槛高

相比离线量化(Post Training Quantization),量化训练能减少离线量化精度掉点的程度。量化训练方法在训练过程中,不断地调整激活的数值分布,使激活的分布更适合量化。但是,量化训练使用成本比较高,体现在以下两方面,一方面是人力成本高,为了实现量化训练,需要修改模型的组网和训练代码,插入模拟量化操作。另一方面为时间成本高,训练时需要加载完整训练集做训练。

2

模型自动压缩工具-结构化剪枝和量化解析

ACT支持对NLP模型的压缩算法自动组合。ACT会对模型结构进行判断,如果是Transformer类型的模型的话,自动选择『结构化剪枝』和『量化』进行串行压缩。以上2个模块的具体技术解析如下:

1) 结构化剪枝技术包含以下4个步骤:

  • 构造教师模型:加载推理模型,并且在内存中复制一份推理模型作为教师模型。

  • 构造结构化剪枝模型:对原始模型的参数和注意力头进行重要性重排序,把重要参数和注意力头排在参数的前侧,然后对模型进行结构化剪枝,按照比例减掉不重要的参数和注意力头。结构化剪枝之后的模型作为学生模型,进行压缩训练。

  • 添加蒸馏loss:自动分析模型结构,寻找最后一个包含有可训练参数的算子的输出作为蒸馏结点。

  • 蒸馏训练:使用原始模型的输出,来监督结构化剪枝后模型的输出,进行结构化剪枝的训练,完成整体的压缩流程。

4b7cfc1a4d8f5d0b38b6d37278a984c4.png

图 结构化剪枝+蒸馏实现剪枝操作

2) 量化技术:

  • 量化策略自动选择:ACT包含离线量化量化训练两种量化策略,在对NLP模型进行量化的时候会对量化策略进行自动选择。先运行少量离线量化,如果精度损失大,则转为使用蒸馏量化训练对模型进行量化压缩。如果精度损失小,则使用离线量化超参搜索进行量化。

91c5066a3ad485f91561cda415af37ce.png

图 NLP模型中的量化策略

  • 蒸馏量化训练具体步骤包括如下3步(CV任务多使用该技术):

a) 构造教师模型:加载推理模型文件,并将推理模型在内存中复制一份,作为知识蒸馏中的教师模型,原模型则作为学生模型。

b) 添加loss:自动地分析模型结构,寻找适合添加蒸馏loss的层,一般是最后一个带可训练参数的层。比如,检测模型head有多个分支的话,会将每个head最后一个conv作为蒸馏节点。

c) 蒸馏训练:教师模型通过蒸馏 loss 监督原模型的稀疏训练或量化训练,完成模型压缩的过程。

1ce1da7493d132ee38b19bf286cef65a.gif

图 量化蒸馏训练技术动图

ACT还支持更多功能,包括离线量化超参搜索、算法自动组合和硬件感知等,来满足CV和NLP模型的各类压缩需求。功能详情以及ACT在更多场景的应用,请参见自动压缩工具首页介绍。

f0e642b07820bd23951f4191c8ef69e2.png

这么好的项目,欢迎大家点star鼓励并前来体验!

https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression

06

未来工作展望

ACT自动化压缩工具将支持更多AI模型(Transformer、FastSpeech2等)的自动化压缩。我们将继续升级ACT能力,进一步降低压缩后的精度损失,提升压缩效率,在更多场景下验证结构化剪枝、非结构化稀疏的功能,带来极致的压缩加速体验。ACT自动化压缩工具将支持完善更多的部署方法,包括Paddle Inference、Paddle Lite和ONNX Runtime等FastDeploy中的各种后端推理引擎,进一步助力AI模型的工程落地。

表格指标说明

测试环境与补充说明:表格中mAPval指模型对应论文中的指标,譬如YOLOv5是在COCO测试集测试,MobileNetV3是在Imagenet数据集上测试。

【更多精彩直播推荐】

48a31b845a96cf701af08d33fc5efcbb.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

文章目录1. 题目2. 解题2.1 map2.2 树状数组1. 题目 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入…

python常用函数的用法_python中常用函数整理

1、map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象。 class map(object):""" map(func, *iterables) --> map objectMake an iterator that computes the…

.NET中得到计算机硬件信息

VB.NET中得到计算机硬件信息 本文汇集了在.net中得到计算机硬件信息的一些功能。 得到显示器分辨率 Dim X As Short System.http://dev.21tx.com/os/windows/" target"_blank">Windows.Forms.Screen.PrimaryScreen.Bounds.Width Dim Y As Short System.…

diffusion新高度!可一次性生成200张图??

文 | Pine 明敏(凹非寺)源 | 量子位给AI一个提示词,一次性出200张图!生成速度嗖嗖的,不到3分钟全搞定。喜欢哪张任君挑选,还能直接二次调整编辑。咱就是说,这回用AI画画,终于不废人了…

转正

三个月的时间悄悄的溜走这也是我走出学校之前与社会的一段磨合期感觉自己是幸运的因为在我身边总是可以遇到很多很好的朋友一起陪伴着走过风风雨雨或许生活是残酷的或许我们总是会遇到这样那样不如意的事情但是只要我们勇敢的去面对雨后的天空总会有绚丽的彩虹不要埋怨命运因为…

程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。 注意,不是必须有这些素因子,而是必须不包含其他的素因子。 例如,前几个数按顺序应该是 1,3,5,7&…

python怎么封装供java调用_python调用第三方java包实例

先看结果:对于python与java的互调,我一开始是用的py4j,但是后来发现在使用方法的时候,不知道如何在python中导入jar包,然后网上的资料也比较少。后来想不出来办法,又看到有Jpype这个东东。博友们说Jpype的安装比较不好…

推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上

文 | 天于刀刀他来了他来了!他带着他的裁员方案走来了!带着他的水槽 sink in 的第一天,全球打工人的目光不由自主地聚焦于这个神奇的男人身上:paypal 帮派元老,特斯拉 starlink 创始人,埃隆火星人马斯克&am…

*如何循序渐进向DotNet架构师发展(转)

微软的DotNet开发绝对是属于那种入门容易提高难的技术。而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的。特别是在大型软件项目中,架构师是项目核心成员,承上启下,因此RUP方法论也认同以架构为核心,体现4…

如何利用python整合excel_使用 Python 合并多个格式一致的 Excel 文件(推荐)

一 问题描述 最近朋友在工作中遇到这样一个问题,她每天都要处理如下一批 Excel 表格:每个表格的都只有一个 sheet,表格的前两行为表格标题及表头,表格的最后一行是相关人员签字。最终目标是将每个表格的内容合并到一个 Excel 表格…

程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)

1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。 给定两个列表,一个…

神经网络的简单偏好

文 | 许志钦知乎(已授权)源 | 天天机器学习作者注记我是2017年11月开始接触深度学习,至今刚好五年。2019年10月入职上海交大,至今三年,刚好第一阶段考核。2022年8月19号,我在第一届中国机器学习与科学应用大…

电影的音乐

Yann Tiersen,法国代表作:《天使爱美丽》《再见,列宁》 对于大家来说,一提到扬蒂尔森(Yann Tiersen)想到的便是《天使爱美丽》。的确《天使爱美丽》使这位法国音乐人一夜成为世界注目的艺术家。在我看来《天使爱美丽》的导演让皮埃尔热内(Jea…

python 列表写入csv_Python将字典数据写入CSV文件

# -*- coding: utf-8 -*- import os import time import csv class WriteCSV(): """定义成员变量""" def __init__(self): pass def init(self, info_list, info_dict_list): self.info_list info_list self.info_dict_list info_dict_list de…

数据结构--并查集(Disjoint-Set)

文章目录1. 并查集2. 操作2.1 初始化2.2 查询2.3 合并2.4 孤立3. 完整代码4. 相关题目5. 参考1. 并查集 并查集是一种树型的数据结构用于处理一些不相交集合(Disjoint Sets)的合并及查询问题 2. 操作 2.1 初始化 把每个点所在集合初始化为其自身&…

推特裁员大反转!马斯克哭求被裁员工回来

编 | Aeneas 好困源 | 新智元马斯克裁完一半员工后,发现推特运转不了了,现在正哭求一些人回来,堪称爽文情节了。打脸大戏来了!马斯克在上周五「灭掉」一半员工后,就后悔了。现在公司正在紧急联系数十名被裁的员工&…

Visual Studio 2008 Shell(翻译)

如果你现在在创建软件开发工具,你现在可以选择基于Visual Studio 2008 Shell。一个流行的Visual Studio 开发环境,Visual Studio Shell提供了一些核心功能,使你能够创建独一无二的应用程序,弹性的自定义能力帮助你推出更加特别的产…

word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分

当我们需要批量生成名片,合同,成绩单等有相同内容的文件时,使用word邮件合并功能非常方便。如果你还需要把word文件发给不同的人就需要再拆分一下,用复制粘贴的方法拆分word,数量一多不仅效率低,还会因为文…

程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)

文章目录1. 题目2. 解题2.1 排序双指针2.2 哈希map1. 题目 设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 示例 1: 输入: nums [5,6,5], target 11 输出: [[5,6]]示例 2: 输入: nums [5,6,5,6], target 11 输出: [[5,6],[5…

ICLR 2023 最高分论文被锤抄袭??

文 | 智商掉了一地究竟是Git Clone还是Git Re-Basin?被评论区长文石锤!如上图所示,ICLR 2023 官方近期正式宣布评审工作已结束,评分最高的 Git Re-Basin 这项神经网络启发性新研究探索了在深度学习中,SGD算法在高维非凸…