5.星空加速卡X3教程--RbRuntime的基本使用(linux)
-
1 简介
RbRuntime作为RainBuilder的后端,配合RbCompiler使用,用于加载并运行RbCompiler生成的sg文件,得到对应的模型图SG。SG包含sg文件里描述的所有节点,根据节点创建对应的OP,加载模型参数和输入数据,并调度计算节点,按照拓扑顺序将节点部署在相应的设备上执行计算,返回模型的计算结果。
RbRuntime主要包含下表所示的模块。
表 1‑1 RbRuntime模块列表 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。
-