4. Compiler使用与模型部署指南



  • Compiler使用与模型部署指南

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

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

    Note:

    1. 本教程中各步骤均通过提前编写好的python文件实现,详细的实现方法请参考对应.py文件。
    2. Linux用户需要进入docker,并在docker中执行本教程中涉及compiler的所有步骤。docker的进入方法如下:
    sudo docker start Rainbuilder
    sudo docker exec -ti Rainbuilder bash
    

    1. Rainbuilder Compiler介绍与说明

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

    SG flow.jpg

    RbCli命令由五个部分组成:RbCli freezeRbCli sgRbCli 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:
    export  Export model coefficient from SG IR
    freeze  Freeze a TensorFlow model from checkpoints
    opt     Optimization SG from given SG IR
    quant   Quant SG from given SG IR
    sg      Generate SG IR from given frozen model
    

    Note:
    我们在Hands_on文件夹下的compiler文件夹中预置了本教程所需的所有指令脚本,用户可以通过依次运行这些脚本完成模型的编译。本教程的讲解也将基于这些脚本进行。

    2. 模型预处理

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

    LeNet为例,以下为LeNet的模型结构:

    def mnist_model_fn(inputs, mode):
      """Model function for LeNet."""
    
      with tf.variable_scope("Lenet"):
    
          input_layer = tf.reshape(inputs, [-1, 28, 28, 1])
    
          with tf.variable_scope("conv1"):
              conv1 = tf.layers.conv2d(inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
    
          with tf.variable_scope("pool1"):
              pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
    
          with tf.variable_scope("conv2"):
              conv2 = tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
    
          with tf.variable_scope("pool2"):
              pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
    
          pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64])
    
          with tf.variable_scope("fc1"):
              dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
    
          dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
    
          with tf.variable_scope("fc2"):
              logits = tf.layers.dense(inputs=dropout, units=10)
    
      return logits
    

    之后我们需要将其输入设置为placeholder,并且将batch_size置1。

    def restore(ckpt_filename, output_path):
      """
      Args:
      ckpt_filename: Original checkpoint file path, such as ~/tmp/lenet/model.ckpt-2000.
      output_path: Newly generated checkpoint file path, such as ~/tmp/new_lenet/model.ckpt
      """
    
      # We use tf.placeholder as input and set the batch size to 1
      x = tf.placeholder(tf.float32, shape=[1, 28, 28, 1], name="img")
      logits = mnist_model_fn(x, False)
    
      with tf.Session() as sess:
          saver = tf.train.Saver()
          saver.restore(sess, ckpt_filename)
          saver.save(sess, output_path)
    

    完成了模型预处理后,模型便能被compiler正确编译。

    Note:
    在“目标检测模型训练教程”中,我们已经使用./5_run_truncate_model.sh脚本完成了模型的预处理。对于想要编译自己算法的用户,需要按照以上步骤相关操作。

    3. RbCli的使用步骤

    在“目标检测模型训练教程”中,我们在/algorithm路径下得到了一个经过训练的推演模型inference_modelinference_model文件中的文件结构如下所示:

    --inference_model
        |--ckpt.meta
        |--ckpt.data-00000-of-00001
        |--ckpt.index
        |--checkpoint
    

    接下来我将以该推演模型为基础,一步步讲解如何通过compiler将该模型部署在雨人FPGA加速卡上。

    3.1 冻结模型RbCli freeze

    step 1

    3.1.1 使用方式

    RbCli freeze的使用方式如下,其中[Model_dir]为训练完成的模型的路径。

    RbCli freeze [Model_dir] -m [Output_path]
    

    3.1.2 命令描述

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

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

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

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

    3.1.3 命令参数介绍

    RbCli freeze的具体描述如下:

        $ RbCli freeze --help
        Usage: RbCli freeze [OPTIONS] MODEL_DIR
    
        Freeze a TensorFlow model from checkpoints
    
        Options:
        -m, --model-file PATH         Freeze model file path with .pb suffix. If it
                                      is not specified, default generated in the
                                      current directory, name model.pb
        -o, --output-node-names TEXT  Output node names, comma separated. If it is
                                      not specified, the default by RbCli to find
                                      and then you choose.
        --help                        Show this message and exit.
    
    • MODEL_DIR:必需参数,代表模型文件的存放路径。

    • --model-file: 可选参数, 用于指定输出的*.pb文件的名称,如果不指定具体名称, 会在当前执行命令的路径下生成一个名称为 model.pb的文件。

    • --output-node-names: 可选参数,定义指定冻结的节点,如果需要多个输出节点,需要输入输出的节点名称并以逗号分开。如果该参数没有定义, RbCli会自动分析模型并找出有可能的输出节点并选择他们。

    3.1.4 使用实例

    本示例的模型checkpoint文件保存在/algorithm/inference_model文件夹中。

    进入compiler文件夹,其中1_RbCli_freeze.sh为冻结模型脚本。通过单击鼠标右键打开终端,输入指令cat 1_RbCli_freeze.sh命令来观察脚本中具体的指令内容。

    1_RbCli_freeze.sh脚本中的命令如下:

    RbCli freeze ../algorithm/inference_model \                 #指定需要进行冻结的模型的路径
    	     --model-file=./model_compilation/ssd.pb        #将冻结完成从的模型存放至指定路径下,并将冻结模型取名为ssd.pb
    

    之后运行该脚本,即可进行模型冻结。

    ./1_RbCli_freeze.sh
    

    运行后,会出现如下信息,用于指定输出节点。

    You haven't specified any output node, please select one or many from the following list:
    [  0] ssd_KYnet_v2/softmax_4/Reshape_1
    [  1] ssd_KYnet_v2/block8_box/Reshape
    [  2] ssd_KYnet_v2/softmax_2/Reshape_1
    [  3] ssd_KYnet_v2/softmax/Reshape_1
    [  4] ssd_KYnet_v2/block7_box/Reshape
    [  5] ssd_KYnet_v2/softmax_1/Reshape_1
    [  6] ssd_KYnet_v2/block4_box/Reshape
    [  7] ssd_KYnet_v2/block9_box/Reshape
    [  8] ssd_KYnet_v2/block10_box/Reshape
    [  9] ssd_KYnet_v2/softmax_3/Reshape_1
    Please enter the indices of output nodes, separated by ','. If you want to select all, please enter 'all': 
    

    如果只有部分节点是输出节点,则可以通过节点序号来选择输出的节点名称(例如:0,1,2,3),如果所有节点都是输出节点,则可以直接输入all来选择所有输出节点。

    输入all之后,运行成功的结果显示如下:

    Select output node names: ['ssd_KYnet_v2/block9_box/Reshape', 'ssd_KYnet_v2/softmax/Reshape_1', 'ssd_KYnet_v2/block7_box/Reshape', 'ssd_KYnet_v2/block10_box/Reshape', 'ssd_KYnet_v2/block8_box/Reshape', 'ssd_KYnet_v2/softmax_4/Reshape_1', 'ssd_KYnet_v2/softmax_1/Reshape_1', 'ssd_KYnet_v2/softmax_3/Reshape_1', 'ssd_KYnet_v2/block4_box/Reshape', 'ssd_KYnet_v2/softmax_2/Reshape_1']
    Freezing /tmp/ssd_ckpt to ssd.pb ...
    

    3.1.5 其他用法

    也可以通过在运行RbCli feeze命令时,通过指定输出节点名称指定输出节点,命令如下所示:

    RbCli freeze /tmp/ssd_ckpt \
        --model-file=/tmp/ssd_model/ssd.pb \
        --output-node-names=ssd_KYnet_v2/softmax_4/Reshape_1,....
    

    输出结果如下所示:

    Output node names: ['ssd_KYnet_v2/softmax_3/Reshape_1', 'ssd_KYnet_v2/block7_box/Reshape', 'ssd_KYnet_v2/softmax_4/Reshape_1', 'ssd_KYnet_v2/block4_box/Reshape', 'ssd_KYnet_v2/softmax_2/Reshape_1', 'ssd_KYnet_v2/softmax/Reshape_1', 'ssd_KYnet_v2/block8_box/Reshape', 'ssd_KYnet_v2/block9_box/Reshape', 'ssd_KYnet_v2/block10_box/Reshape', 'ssd_KYnet_v2/softmax_1/Reshape_1']
    Freezing /tmp/ssd_ckpt to ssd.pb ...
    

    由于RbCli可以自动搜索输出节点,在运行RbCli freeze时不要指定节点名称或序号,让编译器自动完成输出节点检测。只有当特定的输出节点没有找到,或者某一个节点名称出现错误时,再使用指定节点输出功能。

    Note:
    可以通过使用 RbCli freeze --help 查看RbCli freeze的命令选项。

    3.2 生成SG RbCli sg

    step 5

    3.2.1 使用方式

    RbCli sg的使用方式如下:

    RbCli sg [Model_file]
    

    3.2.2 命令描述

    RbCli sg命令以上一步的冻结模型*.pb文件作为输入,生成SG IR文件,SG IR是流图的中间表达形式。流图主要由两部分构成:

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

    3.2.3 命令参数介绍

    RbCli sg指令的具体描述如下:

        $ RbCli sg --help
    
        Usage: RbCli sg [OPTIONS] MODEL_FILE
    
        Generate SG IR from given frozen model
    
        Options:
        -n, --model-name TEXT           Model name.
        -o, --output-dir PATH           Output directory, save generated SG IR.
        -s, --input-image-shape TEXT    A default shape of the input image for the
                                        model.
        -f, --data-format TEXT          One of channels_last or
                                        channels_first, like 'NCHW' is
                                        0,2,3,1.
        -c, --custom-layer-config PATH 
        
        -v, --version TEXT              Specify the generated SG IR version, you can choose
                                        v1 and v2, default is v2
        --with-json BOOLEAN             Whether to export the json file of SG IR, default False
        --with-coeff BOOLEAN            Whether to export model coefficients such as
                                        weights and bais, default False
        --help                          Show this message and exit.
    
    • -n 用于修改*.pb文件的名称。
    • -o 用于指定输出的模型描述文件的存放路径,若不指定,RbCli将会在把输出的文件保存当前目录下。
    • -s 用于指定模型输入图片的形状,如1,256,256,3。如果输入的模型shape是动态变换的,使用该参数设置特定的shape。
    • -f 选择数据的shape的排列方式,可以输入0,1,2,3,1代表batch size,2代表channel,3代表height,4代表width。
    • -c 用于指定用户模型中自定义层配置文件(json)的路径。
    • -v 用于为*.pbtxt设置版本号,可以输入V1或者V2,默认为V2
    • --with-json: 导出json文件,默认为false
    • --with-coeff: 设定是否导出模型的参数比如权重weights和偏置bias

    3.2.3 使用实例

    在上一步使用RbCli freeze完成冻结模型的操作后,可以在/compiler/model_compilation中得到如下文件结构:

    --model_compilation
        |--ssd.pb
    

    compiler路径下有脚本2_RbCli_sg.sh,该脚本用于模型SG的生成,通过运行cat 2_RbCli_sg.sh命令可以观察脚本中的具体命令内容:

    RbCli sg ./model_compilation/ssd.pb \ 
    	 --output-dir ./model_compilation/
    

    该指令的作用是通过冻结模型文件ssd.pb生成数据流图SG IR,并制定输出到/model_compilation路径下。

    输入如下命令并回车以执行生SG操作:

    ./2_RbCli_sg.sh
    

    运行该命令后,运行显示如下

    2019-04-23 07:55:00 INFO loading TensorFlow model from model.pb.
    2019-04-23 07:55:00 INFO Without specifying an input image shape, find the shape in the model as [1, 256, 256, 3].
    2019-04-23 07:55:00 INFO Rewriting the input TensorFlow Graph for convenient SG generation.
    2019-04-23 07:55:00 INFO Running model inference, it may take a while ...
    2019-04-23 07:55:00 INFO Extracted 61 sub-graph patterns from the model
    2019-04-23 07:55:00 WARNING We cannot find "data_format" in the placeholder. We will try to resolve "data_format" in post-process
    Generating SG from model.pb to ./ssd_model/model_sg.pbtxt
    SG written to protobuf file ./ssd_model/model_sg.pbtxt
    Dumping data to h5 file ./ssd_model/model_sg.h5
    

    得到以下结果:

    --model_compilation
        |--ssd.pb
        |--ssd_sg.pbtxt         ---------------> Model structure file.
        |--ssd_sg.h5            ---------------> Model data, h5py format
    

    3.3 量化RbCli quant

    step 2

    3.3.1 使用方式

    RbCli quant命令的使用方法如下:

    RbCli quant [*.pbtxt] [*.h5] [preprocess_script] \
                --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.3.3 命令参数介绍

    RbCli quant命令的详细描述如下:

    $ RbCli quant --help
    
    Usage: RbCli quant [OPTIONS] SG_DEF_FILE SG_H5_FILE PREPROCESS_PY
    
    Quant SG from given SG IR
    
    Options:
    --float-coeff PATH        Folder path for model coefficients.
    --img-dir PATH            Input data set directory path used for SG
                              quantization, default current directory.
    --preprocess-range TEXT   Theoretical input range of the model after pre-
                              processing. the format is 'min,max', defalut is
                              0,255
    --output-dir PATH         Output directory, save Quant SG IR.
    --with-sim BOOLEAN        Save the pbtxt used by the runtime sim model.
    --with-fakequant BOOLEAN  Save quantized results.
    --with-coeff BOOLEAN      Whether to export model quant coefficients.
    --gpu-config PATH         GPU configuration file.
    --help                    Show this message and exit.
    
    • --preprocess-range 在对输入图片进行前处理之后,理论上的模型输入值范围,该参数指定最小值与最大值min,max, 默认的输入范围是0,255。
    • --img-dir: 在进行SG IR量化操作所需要输入数据路径。
    • --output-dir: 量化结果的输出路径。
    • --with-coeff: 设定是否导出模型的参数比如权重weights和偏置bias
    • --gpu-config: GPU配置文件,使量化操作在GPU上运行。由RainBuilder Compiler提供配置文件。
    • --with-sim: 调试参数,实际使用中无需特别指定。
    • --with-fakequant: 调试参数,实际使用中无需特别指定。

    3.3.4 使用实例

    compiler下有一个名称为3_RbCli_quant.sh的脚本,同样地,运行cat 3_RbCli_quant.sh命令可以观察脚本中的指令内容:

    RbCli quant ./model_compilation/ssd_sg.pbtxt \              #模型结构文件
    	    ./model_compilation/ssd_sg.h5 \                 #模型参数文件
    	    ./preprocess_ssd.py  \                          #前处理脚本
    	    --preprocess-range -123,151 \
    	    --img-dir ./fddb/ \
    	    --with-coeff True \
    	    --output-dir ./model_compilation/
    

    执行量化操作所需要的3个必要文件/参数:

    • ssd_sg.pbtxt: 模型结构文件。
    • ssd_sg.h5: 模型参数。
    • preprocess_ssd.py: SSD模型的前处理脚本。

    通过执行./3_RbCli_quant.sh脚本进行量化操作后,运行过程显示如下:

    2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_loc/Conv2D_weights's data
    2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_loc/Conv2D_bias's data
    2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_cls/Conv2D_weights's data
    2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_cls/Conv2D_bias's data
    2019-04-23 08:22:14 INFO Export model coeff succeeded.
    2019-04-23 08:22:15 INFO Create a quantitative training sg successfully.
    231img [00:49, 1.88img/s]
    

    由于fddb数据库中有大概2800张人脸图片,因此在CPU上需要花费较长的时间完成量化。

    量化完成之后,得到的结果如下:

    --model_compilation
        |--ssd.pb
        |--ssd_sg.pbtxt                    ---------------> Model structure file.
        |--ssd_sg.h5                       ---------------> Model data, h5py format
        |--ssd_float_coeff                 ---------------> Unquantized model coefficients
        |--ssd_quant_sg.pbtxt              ---------------> Quantized model structure file
        |--ssd_quant_coeff                 ---------------> Quantized model coefficients
    

    3.4 优化命令 RbCli opt

    step 3

    3.4.1 使用方式

    RbCli opt命令的使用方式如下,其中opt_config为板卡的描述文件,该文件用于分配模型中不同节点的运算执行设备。

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

    3.4.2 命令描述

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

    RbCli opt命令实现2种针对FPGA硬件的优化:

    优化策略 功能
    Device 为SG节点分配执行设备(FPGA或CPU)
    Fusion 将多个算子融合为一个以提高资源和计算效率

    3.4.3 命令参数介绍

    RbCli opt命令的详细描述如下:

    $ RbCli opt --help
    
    Usage: RbCli opt [OPTIONS] SG_DEF_FILE SG_H5_FILE OPT_CONFIG
    
    Optimization SG from given SG IR
    
    Options:
    -o, --output-dir PATH  Output directory, save Opt SG IR. If not specified,
                            the default is to the directory where the sg_def_file
                            file is located.
    --with-json BOOLEAN     Export json file, default False
    --with-coeff BOOLEAN    Whether to export model parameters such as weights
                            and bais
    --help                  Show this message and exit.
    
    • SG_DEF_FILE: 量化后的模型结构。
    • SG_H5_FILE: 模型参数。
    • OPT_CONFIG: 板卡硬件参数定义文件。
    • o:用于指定输出路径

    3.4.4 使用实例

    compiler路径下运行cat 4_RbCli_opt.sh命令可观察脚本中的具体命令:

    RbCli opt ./model_compilation/ssd_quant_sg.pbtxt \
    	  ./model_compilation/ssd_sg.h5 \
    	  CAISA.pbtxt  \                                    #板卡参数定义文件
    	  --output-dir ./model_compilation/
    

    在板卡参数定义文件CAISA.pbtxt中,我们声明了雨人FPGA加速卡V3.1所具有的硬件资源,以及节点融合的规则。

    运行./4_RbCli_opt.sh之后,其过程显示如下:

    2019-04-23 08:56:29 INFO Load optimize config from file: rainman_board_v3_8bit.pbtxt
    2019-04-23 08:56:29 INFO Running optimization pass "Device Optimization" ...
    2019-04-23 08:56:29 INFO Running optimization pass "Fold Pad Optimisation" ...
    2019-04-23 08:56:29 INFO Running optimization pass "Fusion Optimization" ...
    2019-04-23 08:56:29 INFO Running optimization pass "Custom Fusion Optimization" ...
    2019-04-23 08:56:29 INFO Running optimization pass "Hardare Fusion Optimisation" ...
    2019-04-23 08:56:29 INFO Hardare Fusion Optimisation optimization pass over.
    2019-04-23 08:56:29 INFO Running optimization pass "Data Copy Optimisation" ...
    Optimization SG written to protobuf file /workspace/test/ssd_model/ssd_opt_sg.pbtxt
    

    执行优化命令之后得到ssd_opt_sg.pbtxt文件,该文件为根据硬件板卡配置优化后的模型结构文件:

    --model_compilation
        |--ssd.pb
        |--ssd_sg.pbtxt                    ---------------> Model structure file.
        |--ssd_sg.h5                       ---------------> Model data, h5py format
        |--ssd_float_coeff                 ---------------> Unquantized model coefficients
        |--ssd_quant_sg.pbtxt              ---------------> Quantized model structure file
        |--ssd_quant_coeff                 ---------------> Quantized model coefficients
        |--ssd_opt_sg.pbtxt                ---------------> Quantized & Optimized model structure file
    

    3.5 导出 RbCli export

    step 4

    3.5.1 使用方式

    RbCli export的使用方式如下:

    RbCli export [SG_DEF_FILE] [SG_H5_FILE] -o [Output_path]
    

    3.5.2 命令描述

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

    3.5.3 指令说明

        $ RbCli export --help
    
        Usage: RbCli export [OPTIONS] SG_DEF_FILE SG_H5_FILE
    
        Export model coefficient from SG IR
    
        Options:
        -o, --output-dir PATH       The data storage folder path, if not specified,
                                    the default is to the directory where the
                                    sg_def_file file is located.
        --with-feature-map BOOLEAN  Whether to export the feature map
        --help                      Show this message and exit.
    

    3.5.4 使用实例

    compiler路径下执行运行如下命令以导出模型及其参数:

    ./5_RbCli_export.sh
    

    该脚本中的具体命令如下:

    RbCli export ./model_compilation/ssd_quant_sg.pbtxt \
                 ./model_compilation/ssd_sg.h5  \
                 --output-dir ./model_compilation/quant
    

    最后得到:

    --model_compilation
        |--ssd.pb
        |--ssd_sg.pbtxt                    ---------------> Model structure file.
        |--ssd_sg.h5                       ---------------> Model data, h5py format
        |--ssd_float_coeff                 ---------------> Unquantized model coefficients
        |--ssd_quant_sg.pbtxt              ---------------> Quantized model structure file
        |--ssd_quant_coeff                 ---------------> Quantized model coefficients
        |--ssd_opt_sg.pbtxt                ---------------> Quantized & Optimized model structure file
        |--quant
        |    |--float_little
    

    至此,模型的结构描述文件ssd_opt_sg.pbtxt和模型的参数文件quant生成完毕,通过在FPGA上部署这两个文件,便能够实现对该模型的加速。

    4. 模型在FPGA上的部署流程

    step 6

    4.1 登录雨人FPGA加速卡

    在“板卡架构升级与编译环境安装指南”中,我们已经介绍了如何对虚拟机进行配置并登录板卡。在本教程中,我们已经提前对虚拟机进行了相关配置,用户只需在连接板卡后,在右上角菜单栏中的控制->设置->网路中选择对应连接界面,同时在左上角的网络图标中选择board网络即可。

    network 1

    network 2

    连接成功后,可以通过ping 192.168.123.8来测试连接是否正常。

    ping

    确认连接正常后,便可以通过如下命令登录板卡。

    ssh root@192.168.123.8          #板卡登录密码:letmein
    

    如下图所示,当出现#时说明已经成功登录板卡。

    ssh

    4.2 模型部署文件准备

    SSD模型在雨人FPGA加速卡上部署需要三个模型相关文件,分别为:

    • post_param,后处理文件,该文件在"目标检测模型训练教程"中生成,存放路径为/Hands_on/algorithm/
    • ssd_opt_sg.pbtxt,量化并优化后的模型结构文件,存放路径为/Hands_on/compiler/model_compilation/
    • quant,量化并优化后的模型参数文件,存放路径与结构文件一致,为/Hands_on/compiler/model_compilation/

    我们可以通过简单的复制+粘贴将这三个文件拷贝/Hands_on/deployment/object_detection/ssd下,至此,/depoyment/object_detection/ssd的文件结构为:

    --ssd
        |--ssd_opt_sg.pbtxt
        |--ssd_config.txt
        |--post_param
        |--quant
        |   |--float_little
    

    4.3 模型文件向板卡的拷贝

    /Hands_on/deployment路径下打开新终端,通过如下命令将整个object_detection文件夹拷贝至板卡中:

    sudo scp -r ./object_detection root@192.168.123.8:/       #密码:letmein
    

    scp

    之后,在板卡中进入deployment文件夹,通过执行./run.sh指令运行模型。

    ./run.sh脚本中的具体指令如下:

    export LD_LIBRARY_PATH=/cr_lib                      #导入环境变量
    ./image_object_detection \
        --sg ./ssd/ssd_opt_sg.pbtxt \
        --data ./ssd/quant/float_little/ \
        --config_file ./ssd/ssd_config.txt \            #SSD后处理配置文件
        --images ./images_ssd/ \
        --param_path ./ssd/post_param/ \
        --batch 1 \
        --num_threads 2 \
        --async=True \
        --processor ssd
    

    运行过程如下图所示:

    run

    4.4 查看运行结果

    模型运行的结果保存在板卡/deployment/images_ssd中,并以*_result.jpg结尾。

    在桌面上打开一个终端,输入如下指令,将结果从板卡中拷贝至桌面上:

    sudo scp root@192.168.123.8:/deployment/images_ssd/*_result.jpg ~/Desktop
    #其中密码为letmein
    

    其中一个结果如下:

    result ssd

    4.5 可执行文件image_object_detection的说明

    可以发现,在./run.sh脚本中,我们使用了一个名为image_object_detection的可执行程序,并向其输入了相应的参数以执行模型。

    image_object_detection是我们预先编译好的runner程序,该程序基于runtime开发。我们将会在“RbRuntime使用指南”中详细介绍具体的开发方法。

    5. 练习: 预训练图像分类算法的部署

    我们在/Hands_on/deployment中还放置了一个经过训练的ResNet-50模型image_classifier

    用户可以通过同第三节的步骤一般,将整个image_classifier拷贝至板卡中,并运行run.sh脚本进行运算。并将运算结果拷贝出来,观察结果。



  • @Frank 请问你所使用的环境是我们提供的virtualbox镜像还是docker呢?如果是docker,首先需要确保Hands_on文件在/home/[user_name]/workspace文件夹下。在进入docker之后,在docker中通过cd命令进入docker的workspace文件夹,之后再执行该命令,具体的进入方法在文章开头的第一个Note里。



  • 你好,请问这个教程的第一步怎么跑啊,为什么我在compiler文件夹下面输入

    ./1_RbCli_freeze.sh
    

    会提示说

    ./1_RbCli_freeze.sh: 行 1: RbCli: 未找到命令
    

    我应该怎么来compiler这些东西啊


登录后回复