专栏算法工具链「天工开物」AI 工具链课程(三)- 量化训练基础知识

「天工开物」AI 工具链课程(三)- 量化训练基础知识

witwolf2020-06-01
785
0

引言

随着越来越多的 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类型的数据上,大体分为两个步骤:

  1. 把float32数据映射到int8类型的数据

  2. 截断超出int8表示范围的数据

我们来看下面的例子:

步骤一: 定义一个映射系数s, 使用s去缩放float32的数据x, x_prime=s*x,然后把 x_prime近似到相邻的整数
步骤二: 因为int8的范围是[-128, 127],因此,还需要把数据截断到[-128,127]
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')

量化训练的基本流程

从开始训练到产出可以在BPU上运行的模型,分为以下几个步骤,我们称之为 定网络结构、 模拟量化训练过程、吸收BN训练过程、BPU模型定点化过程

1. 定义网络结构

使用地平线AI量化框架训练模型,第一步当然是先定义一个网络结构。最终的模型需要运行在BPU上面,硬件原生支持的Layer和Operator会有些许限制。我们定义的网络结构需要满足这些限制条件。目前主要支持的模型结构有: SSD, YOLOV3, Faster-RCNN, MobileNet V1, MobileNet V2, ResetNet18 , Resnet50 , VGG, MobileNet-backbone, Mask-RCNN , UNet等,当然其它满足的限制条件也支持。 更多内容请查阅文档 5.3. 算法模型的限制 6.训练工具和教程

2. 模拟量化训练过程

模拟量化训练过程和普通的浮点训练过程相同,因为是模拟量化训练,在这个过程中,相关的操作均使用浮点数去模拟定点数(x_float = x_int / 2^shift),在初始化训练过程中,参数特征均为int8表示,并且移位值都是固定的,同时会插入浮点的 Bach Normalization ,这个步骤需要完成一个完整的训练,使得模型的精度达到预期。这个步骤结束之后,得到的模型卷积部分的参数是定点的,但是BN仍然保持原始的float32。

3. 吸收BN训练过程

在大部分神经网络中,大家都会采用BN进行归一化,那么BN这一层的计算在芯片上是否是必须存在的呢,我们可以分析一下BN的计算:

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

4. BPU模型定点化

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

至此,量化相关的基础知识已经介绍完毕。如果您想了解更多的信息,请查阅文档 6.训练工具和教程
算法工具链
官方教程
评论0
0/1000