入门教程0:CAISA架构与Rainbuilder编译工具介绍



  • CAISA架构与Rainbuilder编译工具介绍

    通过本教程,用户能够了解或掌握:

    1. CAISA架构的基本原理
    2. 什么是Rainbuiler编译工具
    3. Rainbuilder编译工具的基本使用方法

    一、CAISA架构介绍

    CAISA Structure

    定制人工智能数据流架构CAISA(Custom AI Streaming Accelerator)具有高度可拓展性和适用于多种深度学习算法的通用性,实测能够实现硬件90%的理论峰值性能。

    在进行神经网络计算时,神经网络有很多复杂的操作,比如卷积, 池化,激活函数等各种各样的操作。为了保证芯片能够高效地完成这些计算,我们需要保证每个时钟周期都在进行有效的计算。而其本质问题则是什么样的架构能够保证高计算效率。芯片计算效率为实际性能与峰值性能的比。

    由于传统指令集架构在运行时需要对指令集编码与译码操作,这就使得在单位指令周期内,存储单元和计算单元的有效操作降低,从而导致算法性能无法很好地提升。

    而自研的芯片架构抛弃了指令集,将人工智能模块的模块变成了简单的流水线操作,因此在数据流处理中完全不涉及指令集的解码译码,这就使得所有的存储单元和计算单元90%以上的时钟周期都在做有效的操作,从而在硬件层面上实现算法性能的提升。

    目前CAISA架构所支持的算子列表如下:

    DNN Support Matrix

    二、编译工具RainBuilder介绍

    随着深度学习技术的快速发展,深度神经网络(CNN)逐渐成为了计算机视觉(CV)领域应用开发的首选。尽管CNN在很多经典CV问题上的效果远超传统机器学习算法,其需求的高计算量也对CNN在很多场景的落地提出了很大挑战。RainBuilder是一款专为深度学习设计的End-to-End开发套件,旨在为深度学习算法提供高效且简单易用的底层硬件解决方案。

    Rainbuilder由RbRuntimeRbCompiler两部分构成,Rainbuilder的原理如下图所示:

    working process

    用户在TensorFlow、Caffe等深度学习框架下开发的算法模型,通过RainBuilder Compiler(下文称为RbCompiler)进行全自动算法模型编译优化,并提取数据流中间表达式SG IR。模型编译过程中自动进行数据量化、节点融合、软硬件分割等操作。

    RainBuilder Runtime(下文称为RbRuntime)负责根据SG IR自动生成C/C++ API接口,算法开发者调用API接口加速人工智能计算模块后,可迅速进行拓展开发、完成完整的人工智能应用开发。Runtime支持性能模块分析、性能量化分析、软件调度等自动化优化模块。

    RainBuilder Driver是底层CAISA架构的相关驱动模块,支持CAISA硬件架构驱动、硬件模块计算调度、以及硬件模型分析。对于应用开发者透明,自动进行细粒度性能优化及调度。

    因此对于开发者来说,具体的RainBuilder的使用流程如下图所示:

    using process

    接下来将分别介绍RbCompilerRbRuntime的使用流程

    1. RbCompiler使用流程介绍

    在介绍RbCompiler的使用过程前,我们需要提前熟悉下列关键词:

    • SG: Streaming Graph, Plumber使用的数据结构, 每个SG图由一些列SGNodes组成。
    • SG IR: 将SG串行组合链接得到的结果称为SR IR, SR IR文件使用protobuf文件格式,由模型结构文件(.pbtxt)和模型数据文件(.bin)组成。
    • SGNode: SGNode 描述了在Plumber模型中的一些列计算方式,举例来说,一个卷积计算可以代表一个SGNode。

    RbCompiler对于算法模型的操作流程如下图所示:

    SG flow.jpg

    freeze:冻结模型,将算法模型的图结构和该模型权重固化到一起。

    生成SG:生成数据流图的中间表达式。

    量化SG:对SG IR进行8bit量化,精度损失可以接受的情况下进行位宽压缩,从而减少计算资源的消耗。

    优化SG:根据FPGA加速卡的计算资源配置,进行算子的融合和SG节点的硬件分配。

    导出:导出SG IR模型和模型参数,导出的参数数据类型(32bit,16bit或8bit)根据*.pbtxt模型文件中节点数据类型不同而不同, 导出的参数将以*.bin文件保存。

    2. RbCompiler支持的TensorFlow API和神经网络层

    RbCompiler可支持解析的TensorFlow算子与API列表如下:

    Layer Supported APIs
    Input tf.placeholder
    Convolution slim.conv2d slim.convolution2d_transpose
    Pooling slim.max_pool2d tf.layers.average_pooling2d
    BatchNormal slim.batch_norm
    FullyConnected slim.fully_connected
    Activation tf.nn.relu tf.nn.leaky_relu
    Reshape tf.reshape
    Flatten tf.layers.flatten slim.flatten tf.reshape
    ArgMax tf.argmax
    Softmax tf.nn.softmax
    Pad tf.pad
    Split tf.split
    Unstack tf.unstack
    Shortcut tf.add
    Concat tf.concat
    Global average pooling tf.reduce_mean
    Upsample tf.image.resize_bilinear tf.image.resize_nearest_neighbor

    RbCompiler的限制:

    1. Input: 需要保证提供shape的具体参数值,不能使用None。如果有Batch size,需要将其设置为1。
    2. BatchNormal: 需要保证选项is_training=False
    3. Pad: 需要保证mode='CONSTANT', 并且pad_top == pad_bottom == pad_left == pad_right。

    3. RbRuntime介绍使用流程

    RbRuntime又称(Runtime)是运行在鲲云加速卡上的计算图运行时和卷积神经网络计算库。它接收compiler输出的SG描述和权值文件,根据SG描述部署计算过程并执行计算,通过权值文件初始化计算节点所依赖的数据。

    RbRuntime可以根据SG描述所提供的每个节点的信息,给不同的节点分配不同的计算函数、数据类型、计算设备。同时runtime也提供了简洁的调用接口,仅需几行代码即可将runtime的计算功能整合到目标应用中。

    RbRuntime运行图如下: