文档首页 > > 用户指南> 自定义算子开发> 网络运行验证(推理)

网络运行验证(推理)

分享
更新时间:2020/08/25 GMT+08:00

简介

ACL(Ascend Computing Language)提供算子和模型的加载与执行功能,通过ACL进行单算子验证的主要流程为:通过ACL将自定义算子转换为单算子模型文件,为此模型输入用户构造的测试数据二进制文件,进行单算子模型的推理操作,通过查看输出结果验证算子的执行结果是否正确。

环境准备

  • 通过ACL进行单算子验证需要在本地编译,在硬件设备上执行,所以需要参考配置编译环境配置交叉编译环境。
  • 通过ACL进行单算子验证需要在硬件设备上执行,所以首先参考设备管理在Mind Studio上添加硬件设备。

数据准备

运行ACL单算子测试用例前,用户需要自行构造算子测试数据的二进制文件,二进制文件以input_x.bin命名,x请从0开始命名,例如input_0.bin,input_1.bin。

配置算子信息

  1. 在算子工程目录下的“tbe/testcases/acl_op/run/out/test_data/config/op_list.txt”文件中配置算子描述信息,此文件用于ACL生成单算子模型文件时提供算子信息。

    Mind Studio生成的模板如图1所示。

    图1 算子信息配置模板

    用户需要在此文件中分别配置算子的类型,输入数据及输出数据的描述。

    • 若算子存在属性信息,请在"attr":[]标记对中进行添加,如下所示:
       "attr": [
            {
              "name": "alpha",
              "type": "float",
              "value": 1.0
            },
            {
              "name": "beta",
              "type": "float",
              "value": 0.0
            },
            {
              "name": "transpose_a",
              "type": "bool",
              "value": false
            }
      ]
    • 若算子有多条输入,请在"input_desc"[]标记对中添加多条描述信息,以{}进行标记,每条记录间用“,”分隔。
    • 若算子有多条输出,请在"output_desc"[]标记对中添加多条描述信息,以{}进行标记,每条记录间用“,”分隔。

    Add算子的配置示例如下所示:

    [
      {
        "op": "Add",
        "attr":[],
        "input_desc": [
          {
            "format": "ND",
            "shape": [8, 16],
            "type": "int32"
          },
          {
            "format": "ND",
            "shape": [8, 16],
            "type": "int32"
          }
        ],
        "output_desc": [
          {
            "format": "ND",
            "shape": [8, 16],
            "type": "int32"
          }
        ]
      }
    ]

  2. 在算子工程目录下的/tbe/testcases/acl_op/src/main.cpp中的CreateOpDesc()函数中配置算子执行时所需信息。

    样例代码如下所示:

    OperatorDesc CreateOpDesc()
    {
        // define operator
        std::vector<int64_t> shape{8, 16};    //构造的算子输入的shape
        std::string opType = "Add";           //算子类型
        aclDataType dataType = ACL_INT32;     //构造的测试数据的数据类型
        aclFormat format = ACL_FORMAT_ND;     //测试数据的排布格式
        OperatorDesc opDesc(opType);
        opDesc.AddInputTensorDesc(dataType, shape.size(), shape.data(), format);  //算子输入
        opDesc.AddInputTensorDesc(dataType, shape.size(), shape.data(), format);  //算子输入
        opDesc.AddOutputTensorDesc(dataType, shape.size(), shape.data(), format); //算子输出
        return opDesc;
    }
    • 若算子有多个输入、输出,可基于以上代码进行修改,每一个算子输入使用一条opDesc.AddInputTensorDesc( )语句进行构造,每一个算子输出使用一条opDesc.AddOutputTensorDesc( )语句进行构造。
    • 若多条输入的shape、dataType与format取值不同,请自行基于此代码定义多个shape、dataType与format变量,dataType与format的取值范围请参考《应用软件开发指南》中的“ACL API参考”章节中的“aclDataType”“aclFormat”
    • 若算子存在属性,需要在return opDesc之前构造算子属性对象,并设置每一个属性的值,如下所示:
         auto opAttr = opDesc.opAttr;
         aclopSetAttrInt(opAttr, "N", 2);
         aclopSetAttrInt(opAttr, "concat_dim", 1);

      不同类型的属性调用的aclopSetAttr*的接口不同,详细的接口可参见《应用软件开发指南》中的“ACL API参考”章节中的“aclopAttr”类型的接口。

  3. 在算子工程目录下的/tbe/testcases/acl_op/src/main.cpp中的main()函数中进行算子验证启动代码开发。

    用户可直接取消模板中的注释代码,如下所示:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    int main()
    {
       //设置输出文件路径
        std::string output = "./result_files";
        if (access(output.c_str(), 0) == -1) {
            int ret = mkdir(output.c_str(), 0700);
            if (ret == 0) {
                INFO_LOG("make output directory successfully");
            }
            else {
                ERROR_LOG("make output directory fail");
                return FAILED;
            }
        }
        //初始化ACL
        if (aclInit("test_data/config/acl.json") != ACL_ERROR_NONE) {
            ERROR_LOG("Init acl failed");
            return FAILED;
        }
    
        int deviceId = 0;      //设置需要运行的设备ID
        //设置模型文件的相对路径,op_models表示在当前工程的out/op_models目录下生成模型文件
        if (aclopSetModelDir("op_models") != ACL_ERROR_NONE) {   
            std::cerr << "Load single op model failed" << std::endl;
            return FAILED;
        }
        //指定用于运算的Device
        if (aclrtSetDevice(deviceId) != ACL_ERROR_NONE) {
            std::cerr << "Open device failed. device id = " << deviceId << std::endl;
            return FAILED;
        }
        INFO_LOG("Open device[%d] success", deviceId);
        //获取昇腾AI处理器运行模式
        aclrtRunMode runMode;
        if (aclrtGetRunMode(&runMode) != ACL_ERROR_NONE) {
            ERROR_LOG("acl get run mode failed");
            return FAILED;
        }
        g_isDevice = (runMode == ACL_DEVICE);
       //执行算子
        if (!RunAddOp()) {
            (void) aclrtResetDevice(deviceId);
            return FAILED;
        }
        //复位当前运算的Device
        (void) aclrtResetDevice(deviceId);
        return SUCCESS;
    }
    

    有关ACL更多的接口说明,请参见《应用软件开发指南》中的“ACL API参考”

工程运行

  1. 准备数据文件。

    数据准备中准备的测试数据二进制文件拷贝到工程目录的/tbe/testcases/acl_op/run/out/test_data/data路径下。

    您也可以直接使用此目录下的generate_date.py文件生成测试数据文件,当前此脚本中生成两个shape为(8, 16),数据类型为int32的数据文件,您可以修改此脚本自行生成所需测试数据文件,生成测试数据步骤如下:

    1. 右键单击generate_date.py文件,选择Open in Terminal,在Mind Studio界面最下方打开Terminal窗口,并默认进入generate_date.py文件所在目录。
    2. 执行python3.7.5 generate_data.py,即可在当前目录下生成测试数据文件。

  2. 在运行环境上配置相关组件的环境变量。

    • 针对Ascend EP,需要在硬件设备的Host侧配置安装组件路径的环境变量。
      以Host侧运行用户在~/.bashrc文件中配置acllib、driver组件的安装路径。
      1. 打开运行用户下的bashrc文件,默认为HwHiAiUser用户。

        vi ~/.bashrc

      2. 在文件最后添加如下信息。

        export ASCEND_DRIVER_PATH=/usr/local/Ascend/driver

        export ASCEND_ACLLIB_PATH=/home/xxx/Ascend/nnrt/latest/acllib

        若已存在如上所述环境变量,请确认为当前运行环境实际安装组件所在路径。

      3. 保存退出。

        :wq

      4. 使环境变量生效。

        source ~/.bashrc

    • 针对Atlas 200 DK,需要在板端环境上配置ACL Lib的相关环境变量。
      板端环境上以运行用户HwHiAiUser在~/.bashrc文件中配置ACL Lib组件的安装路径。
      1. 打开HwHiAiUser用户的bashrc文件。

        vi ~/.bashrc

      2. 在文件最后添加如下信息。

        export ASCEND_ACLLIB_PATH=/home/HwHiAiUser/Ascend/acllib

        若已存在如上所述环境变量,请确认为当前运行环境实际安装组件所在路径。

      3. 保存退出。

        :wq

      4. 使环境变量生效。

        source ~/.bashrc

  3. 右键单击“tbe/testcase/acl_op”文件夹,选择Run Tbe Operator‘All’ACL,执行ACL单算子验证程序。

    第一次运行时会弹出运行配置页面,请参考表1配置,然后单击Run运行。后续如需修改运行配置,请参考修改运行配置
    表1 ACL 算子验证配置参数说明

    配置参数

    参数说明

    Name

    运行配置名称,用户可自定义,例如acl_op。

    Test Type

    选择“acl_op”

    Target Host Ip

    下拉选择运行硬件设备的Host侧的IP地址,若未添加设备,请单击添加。

    添加设备的方法请参见增加设备

  4. 查看运行结果。

    运行成功后,日志打印如图2所示。

    图2 运行日志

    通过以上日志,可看出Output[0] = Input[0] + Input[1],算子运行结果正确。

    运行完成后,会在工程目录的/tbe/testcases/acl_op/run/out/目录下生成如下文件:

    • op_models路径下生成单算子模型文件,例如:

      0_Add_3_2_8_16_3_2_8_16_3_2_8_16.om,此文件的命名规范为命名规范为:序号+opType + 输入的描述(dateType_format_shape)+输出的描述。

    • result_files路径下生成算子的输出数据的二进制文件:output_0.bin。
    • 单算子验证的可执行文件:main。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问