专栏算法工具链【入门课程】04-AI 开发流程介绍 - 算法训练

【入门课程】04-AI 开发流程介绍 - 算法训练

mengjia.yan2020-04-10
1627
3

AI开发流程
——算法部分

引言

在这个部分,你将会了解到在96board上面你能够实现的算法功能(有:classification (分类),detection(检测),segmentation(分割), instance segmentation,示例如图1),训练能够在96board上面使用的模型需要的步骤(量化训练,模型编译),以及地平线为大家方便实现整个流程提供的工具。

图表 1:96board上你能够实现的算法功能示例

具体地说,在算法功能的部分,你能够实现的如图2所示的算法,覆盖了大量的比较常用的轻量型模型结构,以及主流的benchmark如Imagenet, MSCOCO等。通过我们提供的解决方案,你可以高效便利地在96board上面实现并且应用这些算法

图表 2

这里要引入一个概念,解决方案。解决方案就是地平线根据不同的算法功能提供的将环境搭建,模型搭建,算法实现,模型训练,模型编译都实现好,以及串在一起,进行数据和参数简单调整后就能够得到在96board上面使用的模型的工具和代码实现。使用地平线提供的算法解决方案,可以很容易地得到能够在96board上面跑的实时的,和GPU上面训练类似精度的模型。

先验知识

进入正式介绍之前,我们先回顾一些算法的先验知识。首先,我们常提到的算法这个词的具体含义,可以展示为图3的步骤:我们先有一些数据(比如一副图),这一副图可能会需要做一些预处理或者前处理之后,送入到一个模型里面。模型会得到关于这个输入数据的预测结果,这个预测结果可能是一串数字,通过对这个预测结果做处理,我们最终会得到我们要的预测效果。现在我们常用的算法是深度学习或者机器学习的算法,想了解这个部分的一些知识可以去看一下相关的入门课程,比如:http://cs231n.stanford.edu

图表 3

深度学习或者机器学习算法之所以成为学习,是因为他们能够去设置一个loss function,然后这对于这个loss function的结果对模型的参数进行调整,如图4. Loss function是使用预测结果和真实结果(ground truth)来计算一个损失,然后通过梯度下降的方法把损失往回传给网络的每一层,以此来更新模型参数。

图表 4

这样的深度学习和机器学习算法已经有很多训练框架能够帮助我们高效地实现模型在GPU上面的训练,比如pytorch: https://pytorch.org, MXNet: https://mxnet.apache.org, TensorFlow: https://www.tensorflow.org.有了这些训练框架,我们可以比较容易地搭建一个CNN以及loss function进行训练,得到可以在GPU上面跑的模型。但是,这样得到的模型能够高效地在GPU上面使用,却无法在边缘硬件上面高效地使用,比如96board,因为芯片支持的operator和计算方式与GPU上有所不同。因此,如果要得到能够在96board这样的边缘性计算设备上面使用的模型,还要再多两个步骤,就是量化训练和模型编译,见图5.

图表 5

在地平线的解决方案中,变为大家提供实现以上流程的工具:docker帮助便捷搭建环境, Tensorflow(MXNet) plugin帮助量化训练, 编译工具编译模型,见图6.

图表 6

Workflow

整体的开发流程workflow如图7所示,首先是环境搭建,可以使用我们提供的docker方便快捷在linux上面搭建环境。然后是模型搭建,可以使用我们提供的TensorFlow(MXNet) plugin。紧接着就是量化训练,使用我们推荐的量化模型训练流程,可以得到定点模型。最后是模型编译,使用我们提供的编译工具能够把模型转化为能够在96board上面使用的格式。

图表 7

接下来我们介绍每个部分。

l Docker

首先是docker,也就是环境搭建。我们提供了软件包和docker。其中软件包里面包含内容如图8所示。
安装教程主要参考:(后续开放)

图表 8

在算法部分主要涉及到到是HBDK包,TensorFlow Horizon算法包,这些在TensorFlow镜像(docker)里面都已经包含。所以直接安装docker就可以进行算法相关的模型训练和编译了。要特别提到的是其他环境的支持,如图9,需要Python3.6版本以及CUDA10.

图表 9

l TensorFlow plugin

接下来是训练框架工具,TensorFlow plugin的介绍。我们提供的horizon_plugin_tensorflow包里面包含如图10。

图表 10

我们提供的TensorFlow plugin是基于公版的TensorFlow之上,所以公版的TensorFlow相关功能也是可以使用的。和公版的差异之处在于我们提供支持量化的十三种layer,其中有九种layer是常用的layer,如图11。除此之外,为了方便训练,我们提供了五种mode。使用这五种mode可能很方便配置训练的阶段和参数。具体这五种mode的情况后面量化训练部分会进行讲解,另外可以点击以下链接了解更多信息。
(后续开放)

因为96board上面数据输入的格式是YUV格式,而不是我们常用的RGB的格式,所以需要使用我们提供的data augmentation工具在数据读入之后做预处理再送入网络。

图表 11

因为我们的芯片上面支持有限,所以对于模型的网络结构和operator都会一定的限制,具体参考:
(后续开放)

l 量化训练

量化训练是训练能够在芯片上面使用模型的一个非常重要的部分。如果在GPU上面运行的话是不需要太多量化的操作,但是为了在边缘型设备上面能够更有效地利用算力实现更快的速度,所以现在很多在芯片上面使用的网络都会进行量化。我们主要使用的量化方式是移位实现用int8代替float32的网络的参数,使得模型在芯片上面运行的时候更高效,更省内存和功耗。主要的好处如图12所示。具体的量化方式可参考:
(后续开放)

图表 12

如果直接对训练好的浮点(float32)模型进行量化得到定点(int8)模型,那么会损失比较多的精度。因此我们提供的是一种量化训练方案。也就是我们的operator或者layer是支持量化训练的 (训练的时候weight和bias量化为fake int8)。并且为了提升定点模型的精度,我们将量化训练分为两个阶段(也是因为BatchNorm layer不支持量化)。第一个阶段训练中,conv等layer中的weight和bias都是fake int8状态,但是BatchNorm layer的variance和mean都是float32。在第二阶段的训练当中,将BatchNorm layer的variance 和mean可以量化到前一层的Conv参数当中,然后去掉BN这一层再进行finetune。这样在第二阶段训练当中就没有BN并且都是可量化的参数。这样的两阶段训练训练得到的定点模型的精度可以和用浮点模式训练的浮点模型的精度相当。具体参考:
(后续开放)

图表 13

在我们讲解完量化训练之后,我们可以再回到我们在TensorFlow plugin中提供的五种mode。这里详细介绍其中四种mode,如图14。其中kFloatTraining mode就是一般在GPU上面使用的浮点训练方式,在定点模型训练中不是必要的步骤。kTrainingWithBN是刚刚我们提到的量化训练第一阶段。kTrainingWithouBN是刚刚我们提到的量化训练的第二阶段,吸收BN的参数,没有BN层的阶段。kIntInference是进行定点模型inference的mode。

图表 14

l 编译工具

在模型训练完毕之后,我们会得到模型文件比如用TensorFlow进行训练的话会得到pb文件,用MXNet进行训练的话会得到params和json文件。有了这些文件之后我们需要用编译工具进行模型编译,得到能够在芯片上面使用的目标文件.hbm。这样的模型编译可以使用我们提供的编译工具X2/J2 Compilation Tools (HBDK)进行实现。我们的编译工具提供的功能如图15所示。

图表 15

想到得到编译好的模型其实使用模型编译工具hbdk-cc就可以了,但是我们提供了很多其他功能,是因为在模型编译好之后的验证工作非常重要。要进行模型编译之后的验证工作,需要提前了解三个概念:BPU开发板,BPU模拟器和TensorFlow预测库。BPU开发板也就是我们使用的96board,搭载了我们的BPU芯片。BPU模拟器是模型编译工具提供的可以在PC上面模拟BPU开发板inference效果的模拟器。TensorFlow预测库就是在X86上面能够使用的可以进行定点模型inference的预测库。我们编译好的模型验证方式就是比对这三种平台上面输出的结果(相同输入输出数值)是否一致,如图16(BPU对应BPU开发板,simulator对应BPU模拟器)。如果一致,那么模型编译就没有问题,编译好的模型可以上板使用。如果不一致,那么其中可能某些环节产生了问题,可能存在bug,需要反馈给我们的技术支持人员进行调试。

图表 16

相关参考:(后续开放)

总结

到此,我们整个AI开发流程的算法部分的就基本介绍完毕了。回顾一下,我们的算法开发流程一共有四个阶段,第一个阶段是环境搭建(docker),第二个阶段是模型搭建(TensorFlow Plugin), 第三个阶段是量化训练,第四个阶段是模型编译。每个阶段你可以参考的资料我汇总如下,希望能够帮助到你。如果有其他不了解的问题,可以在社区发帖提问,或者将问题发邮件到我的邮箱(mengjia.yan@horizon.ai),我会帮助大家解答问题。

深度学习入门:http://cs231n.stanford.edu

环境搭建: 后续开放

TensorFlow Plugin(模型搭建):后续开放
模型网络结构和op限制:后续开放

量化训练:后续开放

模型编译:后续开放

算法工具链
官方教程
+5
评论2
0/1000
  • sz
    Lv.1

    模型的算力和计算量是什么意思?怎么得到的?

    2020-04-17
    0
    1
    • hbdk回复sz:

      您想问的是不是芯片的算力?芯片的算力是根据芯片上的AI加速模块的实际资源配置(乘法器的数量、工作的频率等)决定的。

      模型的计算量是累加出来的。比如一个卷积操作,实际的实现包含6层循环。6层循环的最内层是一个乘法和一个加法运算,最内层乘法和加法的数量,就决定了此卷积层的计算量。整个模型的计算量,就是这些卷积层计算量的累加。

      2020-04-21
      0
  • wenhao.zou
    Lv.1

    图标16太小了,看不清

    2020-04-14
    0
    0