5.星空加速卡X3教程--RbRuntime的基本使用(linux)



  • 1 简介

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

    RbRuntime主要包含下表所示的模块。

    表 1‑1 RbRuntime模块列表

    企业微信截图_16034417371799.png

    2 环境准备

    RbRuntime的安装依赖如下表。

    表 2‑1 安装依赖列表
    依赖项 版本要求
    Protobuf == 3.0.0
    glog -
    gtest -

    3 基本流程

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

    1、指定模型文件,创建Runner对象

    • RbRuntime提供两种模型文件, 浮点数据模型*.sg和8bit量化模型*_8bit.sg。

    • RbRuntime目前支持的运行设备为CAISA,GPU,CPU。

    • 浮点数据模型可运行在CPU或GPU设备上,对应为Sim模式,用于检验模型的准确性。

    • 8bit量化模型运行在星空加速卡上,对应为硬件模式,用于模型的加速,也可运行在CPU或GPU设备上。

    • 创建Runner的时候可以指定多个工作线程,实现模型中节点的并行运行。

    2、准备输入数据

    • 可通过直接将数据设置到DataMap对象里,再调用Run/RunAsync,也可以提供一个没有数据的DataMap,再在预处理函数中填数据。

    3、运行计算图

    • 运行模型有两种模型,同步和异步,同步将阻塞当前线程直到计算图运行结束并返回结果;异步将得到一个future<DataMap>对象,不阻塞当前线程,后面需要用到结果时再用future.get()等待计算完成并返回结果。
    • 注意:此处需要判断future.valid(),当值为false时,说明输入任务队列已经满了,RunAsync不处理当前输入,需要等待前面的任务计算完成重新调用,或者在创建时RunnerConfig.num_tasks给一个更大的值。

    4、获取并处理结果

    • 可通过处理返回的DataMap对象来得到输出结果,并处理成最终的数据,也可以在后处理回调函数中对DataMap中的数据进行提取并处理。

    4 最简示例程序

    以下为RbRuntime的最小运行示例,该示例展示了一个完成的示例创建、调用和运行流程。

    void  run_model(std::string sgfile) {
      RunnerConfig cfg;
      cfg.num_parallel = 1;
      cfg.device_priority.clear();
      cfg.device_priority.push_back(DeviceType::GPU);
    
      Runner* runner = BuildRunner(sgfile, cfg);
      
      std::vector<int64_t> shape;
    
      auto nodedefs = runner->GetInputNodeDef();
            const auto& nodedef = nodedefs[0];
      CHECK(nodedef.i_list("shape", &shape));
      CHECK(nodedef.num_outputs() == 1);
    
      int input_size = 1;
      shape[0] = 1;
      for(auto d:shape)input_size *= d;
    
      Tensor input_tensor{shape, nodedef.type(), DeviceType::CPU, nodedef.output(0)};
      fill_random(input_tensor.data<float>(), input_size);
    
      DataMap input_datamap;
      input_datamap.Set(nodedef.output(0), input_tensor);
      input_datamap.SetName("myinput");
    
      auto Output = runner->Run(input_datamap);
    
      delete runner;
    }
    

    其他更加详细的使用可以参考鲲云星空加速卡X3用户手册.pdf


登录后回复