随着深度学习技术渗透入越来越多领域,人工智能在边缘侧的大规模应用被提上日程。尤其这两年人工智能-计算机视觉方向在安全生产、工业质检、智能硬件等应用场景中在广泛应用,这些应用场景往往对性能及数据安全有苛刻的要求,故而在边缘计算、移动终端、嵌入式终端的产品落地也随之进入白热化阶段。
终端落地很重要的两个指标依旧是推理时间和存储开销。网络模型压缩的需求越来越大,模型量化应运而生。本篇我们将探讨模型量化的概念原理、优缺点及EasyDL-EasyEdge模型量化的实现方法。
- 什么是量化
所谓量化,就是把模型参数从浮点数转换成整数的一种模型压缩技术。工业界量化一般指int8,8表示存储一个权重元素所需的位数。把fp32的值经过线性变换转换成int8,网络中耗时的卷积层计算就成了整数的计算,运算量将大大降低,int8 使用的比特数只有 fp32的25%,模型推理所占的内存也随之降低。
- 为什么需要量化
用我们最日常的边缘设备——手机来举个例子。
目前的手机一般配备4G或6G内存来支持程序运行,即便部署相对较小的ResNet-50网络来对单张图片进行分类,运行一次就至少需要98M内存和3.8GFLOPs的计算量。而图像相关的应用程序通常需要实时处理摄像头接入的视频图像数据,这意味着至少30 FPS,那么除了内存容量和CPU计算的问题,还会存在内存带宽问题。模型在每次预测时都会使用模型的权重,因此,运行模型就需要3GB/s 的内存带宽。如果后台同时运行多个程序,甚至都可以明显感受到手机变得卡顿。并且,CPU的高速运行又会带来电池的飞速消耗。
(智能设备:我真的太难了)
内存不够?运行慢?耗电快?这些问题统统交给模型量化来解决!让量化为AI落地来发电!
- EasyDL-EasyEdge模型量化
EasyDL-EasyEdge是百度推出的端计算模型生成和服务平台,可基于多种EasyDL或BML训练所得、或者用户本地上传的各类深度学习框架、网络结构的模型,快捷生成端计算模型及封装SDK,已经适配15种AI芯片与4大主流操作系统。EasyDL-EasyEdge后台在生成端计算模型过程中,会根据用户的选择进行模型的低比特量化操作,在不降低模型精度或者损失略微精度的前提下,减小模型的体积,提升模型的运行速度。
EasyDL-EasyEdge量化从算法上可以分为训练后量化和量化训练,根据目标端模型的不同又可以分为PaddleSlim、OpenVINO、NNIE和TensorRT的量化
量化是从r(fp32)到q(int8)的线性映射。
r和q的关系如下:
量化参数:
• 缩放因子(scale):S
• 偏移量(offset):Z
如何确定缩放因子和偏移量的值?目前EasyDL-EasyEdge采用的方法有:
• abs_max: ±abs_max 映射为±127,偏移量Z恒为0(PaddleSlim量化)
• min_max: min映射为-127, max映射为127,偏移量需要计算(OpenVINO量化)
abs_max映射说明示意图
min_max映射说明示意图
EasyDL-EasyEdge量化采用了训练后量化和量化训练两种算法。
• 训练后量化:固定权重值,将权重提前量化, 权重进行的是逐通道量化——以通道为单位,每个channel单独使用一组S和Z;使用少量校准数据,在校准过程中观察模型的行为来计算激活张量的比例因子和偏差。整个量化过程最快只需2分钟。
• 量化训练:权重需要训练学习(Fine-Tune),采用量化训练得到的int8模型在效果上通常会比训练后量化的模型更好,但量化过程需要的时间也会稍微长一些。
目前在EasyDL-EasyEdge的多种部署方式里均可以获取量化加速模型的服务。比如在本地部署里,选择通用小型设备获取ARM加速版本或选择服务器获取CPU加速版等等。
在设备上使用量化后的模型,会发现设备功耗更低、推理更快。比如使用EasyDL经典版高精度分类模型,在通用x86 CPU上单张图片推理时间从128ms缩短至30ms,高性能分类模型单张图片推理时间从99ms缩短至15ms,性能大幅提升。
(x86 CPU版SDK量化前后性能数据对比表)
而整个生成量化模型的过程你都无需费神,只要交给EasyDL-EasyEdge!快来一起体验量化带来的变化吧!
目前,EasyDL零门槛AI开发平台与全功能AI开发平台BML也均集成了EasyEdge的全部服务,端到端实现从模型开发到模型量化,输出离线SDK的一站式开发流程,可便捷获取高精度高性能的离线服务。
EasyEdge官网地址:https://ai.baidu.com/easyedge/
安排上了吗?
安排上了
安排一下