[CN] 入门培训3:Plumber使用指南



  • Plumber使用说明

    目录

    Plumber是用于生成基于FPGA的高性能CNN推理系统的工具链。Plumber以高级CNN描述和TensorFlow的训练数据为输入,输出一个经过优化的可运行的软件程序以及硬件设计

    注意:目前Plumber支持TensorFlow最低版本为1.6.

    名词解释

    • SGNode: SGNode是Plumber对模型内部的一组计算方式的高级描述,如卷积计算中有偏移加和激活函数计算,SGNode把它们包含在一起表示。
    • SG: Streaming Graph, 数据流图,Plumber内部的数据结构,它由一系列SGNode组成。
    • SG IR: 对SG进行序列化,生成的文件称之为SG IR(.pb, .pbtxt),它们使用跨平台高性能的protobuf协议的文件格式。
    • 固化模型: 使用TensorFlow训练的模型,一般会被保存为检查点文件,其中模型的参数和图结构都分散在不同的文件中,而Plumber期望得到一个把模型和参数都固定到同一个文件的模型,所以有了固化模型这个命令。

    开始使用

    正常的模型编译需要经过四个步骤,生成SG -> 优化SG -> 为硬件优化SG -> 导出数据,这四个步骤是互相依赖的关系,执行的时候切记按照顺序执行。

    1. 固化模型

    请参考实例1_plumber_freeze.sh

    plumber_cli freeze ./inference_model/ -d tmp
    

    第一个参数./inference_model在TensorFlow训练过程中被保存的检查点文件,它是一个必须要提供的参数,文件夹内应只包含以下文件:

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

    如果你的文件夹中有checkpoint文件,而里面的model_checkpoint_path的路径还是训练时的绝对路径,会导致固化模型失败。

    第二个参数-d ./tmp是指定冻结后模型的保存路径,这里指定为一个文件夹,并且可以是不存在的文件夹,Plumber会自动创建。文件夹中会生成model.pb文件,这种文件是protobuf协议的文件格式。

    其他命令选项

    --output-file-name

    生成固化模型的文件路径。如果只想生成固化后的模型文件,可以使用此选项,如果用于编译模型,请选择-d指定一个文件路径的选项。

    --output-node-names

    指定输出节点名称的选项,多个输出节点使用英文逗号分隔,作为可选参数,如果不指定,Plumber会自动分析模型寻找可能的输出节点,并供你选择,如:

    # plumber_cli freeze ~/tmp/ssd_ckpt -d ~/tml/ssd
    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': all
    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']
    2018-09-30 15:44:28 INFO Initialising with model directory ...
    Converted 48 variables to const ops.
    Successfully writen the frozen graph to ~/tmp/ssd/model.pb
    

    --use-scope-match

    布尔值,Plumber自动寻找可能的输出节点模式,默认根据节点的Scope来寻找,这样可以过滤许多不必要的训练图,从而让缩小正确的数据节点列表。如果你的模型中没有使用Scope,设置为False效果会更好。可以使用-m True--use-scope-match=True

    注意: 如果忘记了它的参数选项,可以使用plumber_cli freeze --help来查看命令选项

    2. 生成SG

    请参考实例2_plumber_genSG.sh

    plumber_cli sg -d ./tmp -s 1,256,256,3
    

    第一个参数-d ./tmp指定被固化后的模型文件路径,并且固化模型的文件名称符合model.pb格式。

    第二参数-s 1,256,256,3,指定模型的输入形状(input shape)对应于TensorFlow的数据格式,根据模型输入,其输入应为NHWCNCHW

    3. 优化SG

    请参考实例3_plumber_SG_opt.sh

    plumber_cli sg_opt -d tmp
    

    优化SG主要对模型进行数据位宽、精度和数据稀疏性分析。只需要指定plumber sg 命令编译后的文件夹路径,该文件夹路径包含了sg命令生成的所有文件。

    4. 为硬件优化SG

    请参考实例4_plumber_HDL_opt.sh

    plumber_cli hdl_opt ./rainman_board_v3.pbtxt -d tmp
    

    -d tmp你应该很熟悉了,之前几个命令步骤生成的文件存放路径,rainman_board_v3.pbtxt是板卡参数定义文件,针对不同的板卡,硬件优化执行不同的优化操作,并分配不同的硬件执行设备。在步骤中会生成model_hdl_sg.pbtxt文件,它将作为Raintime的模型输入。

    在此步骤中执行3个优化过程。

    步骤名称 功能
    融合 将多个算子融合成一个
    设备 使用执行设备标记SG节点
    设计 设计空间探索

    5. 导出数据

    请参考实例5_plumber_export_data.sh
    导出模型中的参数和每一个SGNode的输入和输出结果。

    plumber_cli export -d tmp -b 16 -ib 9 -fb 6 --use-hdl=True
    

    -d tmp 指定前面编译步骤生成的文件路径,-b 16指定导出定点数据的位宽,默认支持8-bits, 16-bits, 32-bits,根据你的模型数据来决定。在板卡上我们是使用定点数据来进行计算,所以需要知道数据位宽,同时还需指定数据精度,-ib 指定为整数位宽9位,-fb小数位宽6位,还剩一位为符号位。--use-hdl=True则指定使用硬件优化后的SG作为输入来导出数据。

    导出的数据存放在/app/tmp/data_hdl中,里面有四个文件夹,分为:

    • 大端浮点数据存放在float_big文件
    • 大端定点数据存放在fixed_big文件
    • 小端浮点数据存放在float_little文件
    • 小端定点数据存放在fixed_little文件

    如果我并不知道我的模型中数据的大小范围,我该如何选择定点数据的精度? 你可以通过不指定-ib-fb的操作来让Plumber根据模型数据自动计算它们的最佳比例。