引言
随着越来越多的 AI 模型需要被部署到嵌入式设备上 ( 如 AI 智能摄像头,智能车载设备,家用设备等),AI 计算推理效率已经成为了一个关键问题。使用8位定点量化表示的计算可以大大加速模型的运行速度,同时降低功耗。这点对于无法高效运行浮点计算的移动设备和嵌入式应用非常有用。
使用地平线天工开物 AI 工具链,我们提供两种获取定点模型的途径:
一、训练使用 AI 工具链进行量化训练,直接得到定点模型;
二、训练得到浮点模型,然后再对浮点模型进行量化转换得到定点模型(使用浮点转定点工具)。
本节课程将介绍第一种方式:量化训练。关于第二种方式(使用浮点转定点工具),我们会逐步开放。如果您感兴趣,请邮件至 forum-bd@horizon.ai 咨询)。
量化训练
我们的 AI 量化训练工具基于Tensorflow,将量化训练方法集成到Horizon Tensorflow Plugin中,用于构建网络、定义损失函数等。
什么是量化训练
简单地说,量化就是将神经网络的浮点运算转化为定点运算,量化训练就是在训练中使用(模拟)定点数进行模型训练,在训练结束之后得到定点模型。
量化的优势
为什么要量化呢? 尽管训练一个量化模型比训练一个浮点模型要复杂得多。但在实际应用部署场景,量化模型比浮点模型有以下优势:
- 节省存储成本 和float32的模型相比,int8的模型可以节省75%的存储成本
- 节省带宽,降低功耗芯片在计算过程中,从DRAM加载数据到SRAM的时间成本和功耗成本非常高,获取8位值只需要25%的内存和带宽, 可以大幅节省数据加载的功耗和带宽
- 节省计算成本 由于计算完全是在 8 位输入和输出上执行的,数据计算指令设计更简单,效率更高
量化训练的方法
所谓量化无非是把float32的数据近似到int8类型的数据上,大体分为两个步骤:
把float32数据映射到int8类型的数据
截断超出int8表示范围的数据
我们来看下面的例子:
import numpy as np
# 缩放数据
x_prime = s * x
# 近似到相邻的整数
x_prime = np.floor(x_prime)
# 截断超出 int8 表示的数据范围
x_prime = np.clip(x_prime, -128, 127)
# 转换成 int8 类型
x_prime = x_prime.astype('int8')
量化训练的基本流程
1. 定义网络结构
2. 模拟量化训练过程
3. 吸收BN训练过程

从上面这个公式中我们发现,BN的相关参数完全可以吸收到卷积的weight和bias中去而不会有任何损失。当模型收敛到合理的数值之后,可以把BN吸收到相邻Conv (或其它Op)的参数中,移除BN。因为吸收完BN之后,Conv的参数的范围和粒度都有可能发生变化,因此,这个过程中,我们会为每个吸收BN之后的卷积核去寻找一个合适的移位值,然后对吸收BN之后的参数重新进行量化。在这个过程中,不可避免产生误差,因此,需要继续训练这个没有BN的网络。

4. BPU模型定点化
上述训练得到的定点模型是使用浮点模拟的定点,要想把模型跑到BPU上,还需要把模拟定点模型转换成真正的定点模型。
