Python 接口手册
简介(Overview)
hbm_runtime是基于pybind11的Python绑定接口,用于访问和操作libhbucp/libdnn C++ 库,提供高性能的神经网络模型加载和推理功能。
该接口封装了底层模型运行时细节,使 Python 用户能够方便地加载单个或多个神经网络模型,管理模型的输入输出信息,并灵活执行推理操作。接口支持多种输入数据格式,且通过智能转换保证输入数据连续存储,提升运行效率。
适用场景
- 在 Python 环境中快速集成和调用 hbm_runtime运行时功能。
- 机器人视觉、智能边缘计算等对推理效率和灵活性有较高要求的应用。
- 需要同时加载和管理多个模型,动态配置推理优先 级及硬件资源分配的场景。
关键特性
- 多模型支持
- 支持加载单个模型或多个模型组成的模型组,每个模型均可独立获取输入输出元信息并进行推理。
- 灵活输入格式
- 支持单输入(numpy.ndarray);
- 支持模型名映射的输入字典(Dict[str, np.ndarray]);
- 支持多模型多输入结构(Dict[str, Dict[str, np.ndarray]]);所有输入均自动检查是否为 C 连续内存格式,必要时进行拷贝,保证底层高效正确访问。
- 指定推理优先级(priority)
- 可通过 priority: Dict[str, int] 参数显式指定模型任务的调度优先级,支持调度器在有限硬件资源下合理调度推理任务。
- 指定推理 BPU 核心(bpu_cores)
- 支持通过 bpu_cores: Dict[str, List[int]] 显式指定模型推理时使用的 BPU 计算核心,实现异构核资源绑定等策略。
- 多模型并行推理
- 对于多模型输入场景,底层自动采用多线程机制并行执行每个模型的推理任务(multi-threaded launch),在多核 BPU 系统上可获得更高吞吐(单核BPU底层还是串行执行)。
- 元信息访问接口
- 输入输出数量、名称、数据类型(hbDNNDataType 枚举);
- 输入输出张量形状、内存 stride、量化参数(包括 scale、zero point、量化类型);
- 模型描述信息、HBM文件描述信息等。
- 完整绑定的类型系统
- 支持量化参数结构 QuantParams,数据类型枚举 hbDNNDataType,模型调度参数对象SchedParam 和量化类型枚举 hbDNNQuantiType,提供类型安全的属性访问。
安装说明(Installation)
本模块 hbm_runtime 是基于 C++ 实现的高性能推理运行时 Python 接口,依赖 pybind11 和地平线提供的底层推理库(如 libdnn, libhbucp 等)。支持通过系统 DEB 包(.deb) 的方式进行安装,适用于 Python 3.10 及以上版本。
系统依赖
| 依赖项 | 最低版本 | 说明 |
|---|---|---|
| Python | ≥ 3.10 | 推荐使用 Python 3.10 |
| pip | ≥ 22.0 | 安装 wheel 包所需 |
| pybind11 | 任意 | 构建时使用,安装包时不需要依赖 |
| scikit-build-core | ≥ 0.7 | 构建 wheel 包时使用(仅源码构建) |
| 地平线基础库 | 根据平台 | 如 libdnn.so、libucp.so 等,通常由 BSP 提供 |
构建wheel包
构建wheel包的方式有三种下面分别介绍。
安装deb时构建
在hobot-dnn包的安装过程中添加了hbm_runtime的wheel构建,deb包安装完成后就会生成hbm-runtime的whl包 。
#通过源安装
sudo apt-get install hobot-dnn
#通过本地deb包安装(注意不同时间编译的包名称,以实际情况为准)
dpkg -i hobot-dnn_4.0.4-20250909195426_arm64.deb
#安装完成后可在板端的/tmp目录下找到wheel包
ls /tmp
#注意不同版本号whl包名称不同,xxx代表版本
#hbm_runtime-x.x.x-cp310-cp310-manylinux_2_34_aarch64.whl
编译系统软件时构建
在系统软件的镜像编译时会安装hobot-dnn的deb,安装的过程中会构建hbm-runtime的whl包,并转存到out/product/deb_packages目录
sudo ./pack_image.sh
ls out/product/deb_packages
#注意不同版本号whl包名称不同,xxx代表版本
#hbm_runtime-x.x.x-cp310-cp310-manylinux_2_34_aarch64.whl
在端侧构建
#进入hbm_runtime的源码库
cd /usr/hobot/lib/hbm_runtime
#运行构建命令
./build.sh
#查看构建好的wheel包
ls dist/
#注意不同版本号whl包名称不同,xxx代表版本
#hbm_runtime-x.x.x-cp310-cp310-manylinux_2_34_aarch64.whl
安装方式
使用 wheel 包
使用wheel 安装的方式有两种,选其一即可
-
通过本地 wheel 包安装
- 找到通过“构建wheel包”小节中构建的whl文件。
#示例:使用 pip 安装本地whl包(注意不同版本号whl包名称不同,xxx代表版本)
pip install hbm_runtime-x.x.x-cp310-cp310-manylinux_2_34_aarch64.whl -
从pypi源安装
pip install hbm_runtime
使用 .deb 包安装
使用deb安装的方式有两种,选其一即可
-
通过本地 DEB 包安装
# 示例:安装 DEB 包(注意不同时间编译的包名称,以实际情况为准)
sudo dpkg -i hobot-dnn_4.0.2-20250714201215_arm64.deb -
通过apt源安装
sudo apt-get install hobot-dnn -
常见问题
- 如果 .deb 安装后文件未生效,检查是否有其他依赖阻止其覆盖(如已有老版本 hobot-spdev)。
- 可使用 dpkg -L hobot-dnn 查看文件是否成功部署。
卸载说明
-
卸载 pip 安装的包:
pip uninstall hbmruntime -
卸载 .deb 安装的包:
sudo apt remove hobot-dnn
快速开始(Quick Start)
本节介绍如何使用hbm_runtime进行模型加载和推理。只需几行代码,即可运行模型并获取输出结果。
环境准备
请确保已正确安装 HBMRuntime(详见安装说明),并已具备模型文件 hbm 模型。
示例
单模型单输入推理
适用于模型只有一个输入张量的情况。
import numpy as np
from hbm_runtime import HB_HBMRuntime
# 加载模型
model = HB_HBMRuntime("/opt/hobot/model/s100/basic/lanenet256x512.hbm")
# 获取模型名与输入名
model_name = model.model_names[0]
input_name = model.input_names[model_name][0] # 假设模型只有一个输入
# 获取该输入对应的 shape
input_shape = model.input_shapes[model_name][input_name]
# 构造 numpy 输入
input_tensor = np.ones(input_shape, dtype=np.float32)
# 执行推理
outputs = model.run(input_tensor)
# 获取输出结果
output_array = outputs[model_name]
print("Output:", output_array)
单模型多输入推理
适用于模型有多个输入张量的情况。
import numpy as np
from hbm_runtime import HB_HBMRuntime
hb_dtype_map = {
"U8": np.uint8,
"S8": np.int8,
"F32": np.float32,
"F16": np.float16,
"U16": np.uint16,
"S16": np.int16,
"S32": np.int32,
"U32": np.uint32,
"BOOL8": np.bool_,
}
# 加载模型
model = HB_HBMRuntime("/opt/hobot/model/s100/basic/yolov5x_672x672_nv12.hbm")
# 获取模型名(假设只加载了一个模型)
model_name = model.model_names[0]
# 准备输入名和 shape
input_names = model.input_names[model_name]
input_shapes = model.input_shapes[model_name]
input_dtypes = model.input_dtypes[model_name]
# 构造输入字典
input_tensors = {}
for name in input_names:
shape = input_shapes[name]
np_dtype = hb_dtype_map.get(input_dtypes[name].name, np.float32) # fallback
input_tensors[name] = np.ones(shape, dtype=np_dtype)
# 可选:指定推理优先级和 BPU 设备
priority = {model_name: 5}
bpu_cores = {model_name: [0]}
model.set_scheduling_params(
priority=priority,
bpu_cores=bpu_cores
)
# 执行推理,可选指定优先级和 BPU 核
results = model.run(input_tensors)
# 输出结果
for output_name, output_data in results[model_name].items():
print(f"Output: {output_name}, shape={output_data.shape}")
常见问题
| 问题 | 说明 |
|---|---|
| 模型名称如何获取? | 可通过 model.model_names 查看加载的模型名列表。 |
| 输入维度/类型如何确认? | 使用 model.input_shapes、model.input_dtypes。 |
| 如何确认 BPU 核心分配? | 使用 bpu_cores 参数指定 [0, 1, 2, 3],具体需看硬件的支持情况。 |
如需更复杂用法(多输入模型、量化参数读取等),请参考API部分。
模块/类/函数说明(API Reference)
Python 模块 hbm_runtime 是通过 PyBind11 封装的地平线 HBM 模型推理接口,基于底层 libdnn 和 libhbucp 实现。提供统一封装的模型加载、输入输出信息查询、推理执行等功能,支持多模型加载、多输入推理、指定推理模型,BPU Core、推理任务优先级等。
枚举类型
hbDNNDataType
张量数据类型枚举:
- S4:4-bit signed
- U4:4-bit unsigned
- S8:8-bit signed
- U8:8-bit unsigned
- F16:16-bit float
- S16:16-bit signed
- U16:16-bit unsigned
- F32:32-bit float
- S32:32-bit signed
- U32:32-bit unsigned
- F64:64-bit float
- S64:64-bit signed
- U64:64-bit unsigned
- BOOL8:8-bit bool 类型
- MAX:最大值(保留字段)
示例
from hbm_runtime import hbDNNDataType
print(hbDNNDataType.F32) # 输出: hbDNNDataType.F32