RainBuilder介绍及使用指南



  • RainBuilder介绍及使用指南







    本教程旨在介绍RainBuilder编译工具中编译器Compiler的使用方法,以及模型在FPGA加速卡上的部署流程。

    Note:

    1. 本教程中各步骤均通过提前编写好的shell脚本文件实现。
    2. Linux用户需要进入docker,并在docker中执行本教程中涉及compiler的所有步骤。docker的进入方法如下:
    sudo docker start <container>
    sudo docker exec -ti <container> /bin/bash
    



    〇、资料下载

    资料名称 下载地址
    NA-100a http://cloud.corerain.com:8082/share.cgi?ssid=0eoxsbj
    NA-100a-docs http://cloud.corerain.com:8082/share.cgi?ssid=05t030q
    corerain-datasets http://cloud.corerain.com:8082/share.cgi?ssid=0PSeFUu
    corerain-public-tools http://cloud.corerain.com:8082/share.cgi?ssid=0TKhYIi
    • NA-100a:包含每次发布的CAISA软件包,其子路径为独立的软件版本,建议始终使用最新的发行版本。每一个软件发行版路径内包含CAISA的硬件bitstream,RainBuilder安装包,pcie驱动,案例工程(源码发布)。

    • NA-100a-docs:包含四个文档:

      • 星空加速卡产品介绍:星空加速卡的产品规格信息及板卡安装指南。
      • 浪潮 FPGA 加速卡用户手册:浪潮原厂参考手册

      以上两个文档与发布版本无关。

      • 星空加速卡教程:星空加速卡案例工程的操作说明,包含快速指南,用户在安装好板卡后,从该文档开始对板卡进行操作和了解。
      • 星空加速卡用户手册:星空加速卡开发时的调用指令和API集合,建议用户在了解加速卡使用后,参考该文档进行二次开发。

      ​ 以上两个文档与软件发布版本相关,请对应下载与版本匹配的文档。

    • corerain-datasets:鲲云测试用的公有数据集,由于数据量较大,下载后请保存长期使用。

    • corerain-public-tools:包含一些工具包,可根据需要进行下载,同时,使用案例里的网络也会在该路径下备份




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

    1. 如何通过RainBuilder将模型部署至星空FPGA加速卡。
    2. 编译器命令行工具RbCli的使用。
    3. 编译器Runtime的使用。



    一、 RbCompiler介绍与说明

    在“CAISA架构与Rainbuilder编译工具介绍”中我们已经介绍了CompilerCompiler通过命令行工具RbCli实现对网络模型进行解析和转换。

    RbCli命令由五个部分组成:RbCli freezeRbCli tf/onnx/caffeRbCli quantRbCli optRbCli export,描述如下:

    # RbCli
    Usage: RbCli [OPTIONS] COMMAND [ARGS]...
    
      RbCompiler CLI: a command-line tool for the RainBuilder Compiler.
    
    Options:
      --debug / --no-debug
      -v, --version
      --help                Show this message and exit.
    
    Commands:
      freeze  Freeze a TensorFlow model from checkpoints
      tf      Generate SG IR from given tf frozen model
      caffe   Generate SG IR from given caffe model
      onnx    Generate SG IR from given onnx model
      quant   Quant SG from given SG IR
      opt     Optimization SG from given SG IR
    

    Note:
    在“CAISA架构与Rainbuilder编译工具介绍”中,我们已经介绍了运行星空加速卡所需的下载资料,解压NA-100a后,在R2500004201908/corerain-use-cases/02-rainbuilder/frontend-tools`文件夹中预置了本教程所需的所有指令脚本,用户可以通过依次运行这些脚本完成模型的编译。本教程的讲解也将基于这些脚本进行。




    二、 模型预处理

    由于模型在训练结束之后仍然保留着训练的状态,比如数据的输入仍然为一个队列,输入的shapebatch_size仍然为一个比较大的值。因此,在使用compiler进行模型编译之前,我们需要对模型进行一些预处理,使其能够被compiler正确编译。之后我们需要将其输入设置为placeholder,并且将batch_size置1。完成了模型预处理后,模型便能被compiler正确编译。




    三、 RbCli的使用步骤

    在“CAISA架构与Rainbuilder编译工具介绍”中介绍了运行星空加速卡所需的下载资料,我们在R2500003201908/corerain-use-cases/02-rainbuilder/reference-models路径下预置了经过训练的推演模型,且均已转换为pb文件。

    接下来我们将讲解如何通过compiler将该模型部署在星空FPGA加速卡上。

    3.1 冻结模型 RbCli freeze(TensorFlow特有,可选)

    TensorFlow在训练时通常使用checkpoint作为输出模型的格式,如果用户使用checkpoint模型格式,则需要在reference-models中建立一个对应的文件夹,并将checkpoint对应的模型文件放置其中。

    3.1.1 运行脚本

    ./00-freeze.sh <net name>
    

    具体命令如下:

    RbCli freeze ${MODELS_PATH}/${NET_NAME}/ckpt -m ${MODELS_PATH}/${NET_NAME}/${NET_NAME}.pb
    

    3.1.2 命令描述

    冻结命令RbCli freeze是将TensorFlow checkpoint路径下模型训练完成后的结果转化为冻结模型*.pb,一个训练完成的神经网络模型在checkpoint文件夹路径下应该包含以下三个文件:

    1. *.meta: 模型的Meta信息。
    2. *.data*: 训练数据文件。
    3. *.index: 索引文件。

    Note:
    在模型训练过程中,TensorFlow会保存所有阶段性训练的结果。在进行冻结模型前,需要在checkpoint文件中选择其中一个训练结果的文件路径,不能将所有保存下来的训练路径都存放在checkpoint文件中。

    以上三个文件为RbCli freeze的输入,输出为冻结模型文件*.pb,它定义了推理图的结构与各层神经网络的参数。


    3.2 生成SG RbCli sg

    3.2.1 运行脚本

    #TensorFlow
    ./01-sg.sh tf <net name>
    #Caffe
    ./01-sg.sh caffe <net name>
    #ONNX
    ./01-sg.sh onnx <net name>
    

    具体命令如下:

    #TensorFlow
    RbCli tf MODEL_FILE
    #Caffe
    RbCli caffe CAFFE_GRAPH CAFFE_MODEL
    #ONNX
    RbCli onnx MODEL_FILE
    

    3.2.2 命令描述

    RbCli tf命令以上一步的冻结模型*.pb文件作为输入,生成SG IR文件。

    RbCli caffe命令以caffe模型的.prototxt文件路径和.caffemodel文件路径作为输入,生成SG IR文件。

    RbCli onnx命令以onnx模型的.onnx文件路径作为输入,生成SG IR文件。

    SG IR是流图的中间表达形式。流图主要由两部分构成:

    1. 模型结构文件:使用protobuf协议,保存在以.pbtxt为后缀的文件中。
    2. 模型参数文件:使用h5py格式保存在以.h5为后缀的文件中。

    3.3 量化SG RbCli quant

    3.3.1 运行脚本

    ./02-quant.sh <netname>
    

    具体命令如下:

    RbCli quant [SG_DEF_FILE] [SG_H5_FILE] [PREPROCESS_PY]
           --preprocess-range -123, 151 
           --img-dir [Database_path] 
           --output-dir [Frozen_Model_path] 
           --with-coeff True
    

    3.3.2 命令描述

    可以使用RbCli quantSG IR进行8-bit量化操作。在执行此操作前,用户需要提前准备一定量的实际数据,数据应尽量与目标场景中的实际数据相似,并且使用python作为数据的处理方式。


    3.4 优化命令 RbCli opt

    3.4.1 运行脚本

    ./03-opt <netname>
    

    具体命令的如下:

    RbCli opt  SG_DEF_FILE SG_H5_FILE OPT_CONFIG
    

    其中opt_config为板卡的描述文件,该文件用于分配模型中不同节点的运算执行设备。

    RbCli opt [*_sg.pbtxt] [*_sg.h5] [opt_config] -o [Output_path]
    

    3.4.2 命令描述

    如果需要将神经网络模型部署在星空FPGA加速卡上执行,则需要生成匹配硬件计算资源的模型文件。所以,本步骤首先根据硬件的计算资源配置,将多个SGNode算子操作融合为一个计算操作,节省IO的时间损耗;另外,由于每个硬件板卡的计算资源和架构各有不同,不是所有SGNode都可以部署FPGA上实现硬件加速,有一些特殊计算操作需要分配到CPU上运行;最后,该步骤还会根据硬件加速板卡的硬件资源配置评估最佳的计算资源和并行度参数。




    4. RbRuntime介绍及使用流程

    4.1 简介

    RbRuntime作为RainBuilder的后端,配合RbCompiler使用,用于加载并运行RbCompiler生成的模型文件pbtxt和参数,生成对应的模型图SG,SG包含pbtxt文件里描述的所有节点,根据节点创建对应的OP,加载模型参数和输入数据,并调度计算节点,按照拓扑顺序将节点部署再相应的设备上执行计算,返回模型的计算结果。


    4.2 使用流程

    使用RbRuntime进行模型推理的基本流程为:

    ​ 1、读取pbtxt

    ​ 2、创建SG

    ​ 3、加载模型参数数据

    ​ 4、创建SGRunner

    ​ 5、准备输入数据

    ​ 6、运行计算图并获取计算结果

    以下提供一个简单的示例流程,假设已有yolo-v3的模型数据,其目录包括以下文件:

    • yolov3_sg.pbtxt
    • yolov3_coeff/float_little/

    1、根据pbtxt初始化SGDef

    this->sg_def = LoadSGDefFromFile("yolov3_sg.pbtxt");
    

    2、将SGDef数据转换为SG对象

    this->sg = BuildSG(this->sg_def);
    

    3、加载模型参数并确定输入节点信息

    this->const_data = LoadSGDataMapFromDir("yolov3_coeff/float_little");
    this->input_node_def = FindImageInput(this->sg_def);
    

    4、创建 SGRunner,指定工作线程数为 num_threads

    this->runner = BuildSGRunner(this->sg, this->const_data, num_threads);
    

    5、创建输入的 SGDataMap,并指定预处理和后处理函数 preprocessor_func 和 postprocessor_func 为预处理和后处理函数。

    //input_image_file_path 为输入图片的路径。 
    auto input_data_map = CreateInputSGDataMap(input_image_file_path, 
                input_node_def, 
                preprocessor_func); 
    input_data_map->SetupPostprocessor(postprocessor_func)
    

    前后处理函数

     auto post_processor = [=](SGDataMap *pOutputDataMap) {
     auto output_image_path = GetResultImagePath(image_path);
     processor->PostProcess(pOutputDataMap);
     processor->Print(pOutputDataMap, 5);
     cv::Mat image = cv::imread(image_path);
     processor->Draw(pOutputDataMap, image);
     processor->Write(pOutputDataMap, image, output_image_path);
     return 0;
    };
    input_data_map->SetupPostprocessor(post_processor);
    

    6、启动Runner开始计算并得到结果

    同步模式

    auto output_data_map = runner->Run(sg, const_data, input_data_map);
    

    异步模式

    auto futureobj = runner->RunAsync(sg, const_data, input_data_map);
    //do something else
    auto output_data_map = futureobj.get();
    

登录后回复