4.6 模型推理

C接口详细介绍请阅读《NNToolChain用户开发手册》中的BMRuntime使用章节

​Python接口详细介绍请阅读《SAIL用户开发手册》

​BMRuntime用于读取BMCompiler的编译输出(.bmodel),驱动其在Sophon TPU芯片中执行。BMRuntime向用户提供了丰富的接口,便于用户移植算法,其软件架构如下:

BMRuntime实现了C/C++接口,SAIL模块基于对BMRuntime和BMLib的封装实现了Python接口。本章主要介绍C和Python常用接口,主要内容如下:

  • BMLib 接口:负责设备Handle的管理、内存管理、数据搬运、API的发送和同步、A53使能、设置TPU工作频率等

  • BMRuntime的C语言接口

  • BMLib和BMRuntime的Python接口介绍

4.6.1 BMLib模块C接口介绍

BMLIB接口

  • 用于设备管理,不属于BMRuntime,但需要配合使用,所以先介绍

    BMLIB接口是C语言接口,对应的头文件是bmlib_runtime.h,对应的lib库为libbmlib.so,

    BMLIB接口用于设备管理,包括设备内存的管理。

    BMLIB的接口很多,这里介绍应用程序通常需要用到的接口。

  • bm_dev_request

    用于请求一个设备,得到设备句柄handle。其他设备接口,都需要指定这个设备句柄。

    其中devid表示设备号,在PCIE模式下,存在多个设备时可以用于选择对应的设备;在SoC模式下,请指定为0。

  • bm_dev_free

    用于释放一个设备。通常应用程序开始需要请求一个设备,退出前释放这个设备。

4.6.2 BMRuntime模块C接口介绍

对应的头文件为bmruntime_interface.h,对应的lib库为libbmrt.so。

用户程序使用C接口时建议使用该接口,该接口支持多种shape的静态编译网络,支持动态编译网络。

  • bmrt_create

  • bmrt_destroy

  • bmrt_load_bmodel

    加载bmodel文件,加载后bmruntime中就会存在若干网络的数据,后续可以对网络进行推理。

  • bmrt_load_bmodel_data

    加载bmodel,不同于bmrt_load_bmodel,它的bmodel数据存在内存中

  • bmrt_get_network_info

    bmrt_get_network_info根据网络名,得到某个网络的信息

bm_net_info_t表示一个网络的全部信息,bm_stage_info_t表示该网络支持的不同的shape情况。

示例代码:

  • bmrt_shape_count

    接口声明如下:

可以得到shape的元素个数。

比如num_dims为4,则得到的个数为dims[0]*dims[1]*dims[2]*dims[3]

bm_shape_t 结构介绍:

bm_shape_t表示tensor的shape,目前最大支持8维的tensor。其中num_dims为tensor的实际维度数,dims为各维度值,dims的各维度值从[0]开始,比如(n, c, h, w)四维分别对应(dims[0], dims[1], dims[2], dims[3])。

如果是常量shape,初始化参考如下:

  • bm_image_from_mat

示例代码请参考bmmnsdk2开发包中examples/SSD_object/cpp_cv_bmcv_bmrt

  • bm_image_from_frame

示例代码请参考bmmnsdk2开发包中examples/SSD_object/cpp_ffmpeg_bmcv_bmrt/main.cpp

  • bm_inference

示例代码请参考bmmnsdk2开发包中examples/SSD_object/cpp_cv_bmcv_bmrt/main.cpp

4.6.3 Python接口

本章节只介绍了用例${BMNNSDK}/examples/SSD_object/py_ffmpeg_bmcv_sail下的例子中所用的接口函数。

更多接口定义请查阅《SAIL用户开发手册》

  • Engine

  • load

  • set_io_mode

  • get_graph_names

  • get_input_names

  • get_output_names

  • sail.IOMode

  • set_io_mode

  • sail.Tensor

  • get_input_dtype

  • get_output_dtype

  • process

  • get_input_scale

最后更新于