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
hbDNNQuantiType
张量量化类型枚举:
- NONE:非量化类型
- SCALE:线性 缩放量化(scale + zero_point)
示例
from hbm_runtime import hbDNNQuantiType
print(hbDNNQuantiType.SCALE) # 输出: hbDNNQuantiType.SCALE
类说明
HB_HBMRuntime
模型运行时类,加载一个或多个 HBM 模型文件,并提供推理执行接口。
构造函数
-
函数签名
HB_HBMRuntime(model_file: str)
HB_HBMRuntime(model_files: List[str]) -
参数说明
参数名 类型 说明 model_file str HBM 模型文件路径 model_files List[str] 多个 HBM 模型文件路径(用于多模型) -
返回值
类对象
-
示例
from hbm_runtime import HB_HBMRuntime
model = HB_HBMRuntime("model.hbm")
# 或加载多个模型:
model = HB_HBMRuntime(["model1.hbm", "model2.hbm"])
属性说明
以下所有属性均为只读。
-
version: str
- 功能说明:
- 获取库版本号。
- 结构说明:
- str:版本号字符串。
- 示例: print("版本:", HB_HBMRuntime.version)
- 功能说明:
-
model_names: List[str]
- 功能说明:
- 加载的模型名称列表。
- 结构说明:
- List[str]: 模型名称列表
- 示例:
print(model.model_names)
# 输出:['model_1', 'model_2']
- 功能说明:
-
model_count: int
- 功能说明:
- 加载的模型数量。
- 结构说明:
- int :加载的模型数量。
- 示例:
print(model.model_count)
# 输出:2
- 功能说明:
-
model_descs: Dict[str, str]
- 功能说明:
- 每个模型的描述信息(来自模型内嵌的备注)。
- 结构说明:
- Dict[str, str]: 键为模型名称,值为模型的整体描述信息,通常来自编译器。
- 示例:
#打印所有模型的描述信息
print(model.model_descs)
# 输出:{'yolov5x_672x672_nv12': 'Image classification model based on ResNet-18.'}
- 功能说明:
-
hbm_descs: Dict[str, str]
- 功能说明:
- 每个 HBM 文件中的备注信息。
- 结构说明:
- Dict[str, int]:键为.hbm 文件名(例如 "resnet18"),值为HBM 文件中的注释或元信息字符串。
- 示例:
#打印所有模型文件的描述信息
print(model.hbm_descs)
# 输出:{'/opt/hobot/model/s100/basic/yolov5x_672x672_nv12.hbm': 'xxx'}
- 功能说明:
-
input_counts: Dict[str, int]
- 功能说明:
- 每个模型输入张量数量。
- 结构说明:
- Dict[str, int]:键为模型名称,值为该模型的输入张量个数。
- 示例:
#打印所有模型文件的描述信息
print(model.input_counts)
# 输出:{'yolov5x_672x672_nv12': 2}
- 功能说明:
-
input_names: Dict[str, List[str]]
- 功能说明:
- 每个模型的输入张量名称列表。
- 结构说明:
- 外层 Dict[str, ...]:键为模型名称。
- 内层 List[str]:为该模型所有输入张量的名称列表。
- 示例:
print(model.input_names)
# 输出:{'yolov5x_672x672_nv12': ['data_y', 'data_uv']}
- 功能说明:
-
input_descs: Dict[str, Dict[str, str]]
- 功能说明:
- 每个输入张量的描述
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层 Dict[str, str]:键为输入张量名称,值为描述信息。
- 示例:
#打印所有模型文件的描述信息
print(model.input_descs)
# 输出:{'yolov5x_672x672_nv12': {'data_uv': 'xxx', 'data_y': 'xxx'}}
- 功能说明:
-
input_shapes: Dict[str, Dict[str, List[int]]]
- 功能说明:
- 每个输入张量的 shape
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层 Dict[str, List[int]]:键为输入名,值为输入张量的维度(形状)。
- 示例:
model.input_shapes
# 输出:{'yolov5x_672x672_nv12': {'data_uv': [1, 336, 336, 2], 'data_y': [1, 672, 672, 1]}}
- 功能说明:
-
input_dtypes: Dict[str, Dict[str, hbDNNDataType]]
- 功能说明:
- 每个输入张量的数据类型
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层 Dict[str, hbDNNDataType]:键为输入张量名,值为数据类型( 例如 F32、U8)。
- 示例:
print(model.input_dtypes)
# 输出:{'yolov5x_672x672_nv12': {'data_uv': <hbDNNDataType.U8: 3>, 'data_y': <hbDNNDataType.U8: 3>}}
- 功能说明:
-
input_quants: Dict[str, Dict[str, QuantParams]]
- 功能说明:
- 提供每个模型所有输入张量的量化参数信息。用于支持量化模型的前处理计算,或者了解张量的量化方式。
- 结构说明:
- 外层 Dict[str, ...]:键是模型名称(model name),例如 "resnet50";
- 内层 Dict[str, QuantParams]:键是输入张量名,值为 QuantParams 实例;
- QuantParams 类属性:
- scale: np.ndarray — 量化比例因子,通常为浮点数数组;
- zero_point: np.ndarray — 零点,用于对称/非对称量化偏移;
- quant_type: hbDNNQuantiType — 量化类型枚举值(如 SCALE、NONE);
- axis: int — 如果是通道量化,则该字段表示在哪个轴上量化。
- 示例:
quanti_info = model.input_quants
for model, inputs in quanti_info.items():
print(f"{model}:")
for name, info in inputs.items():
print(f" {name}:")
print(f" quant_type: {info.quant_type.name}")
print(f" quantize_axis: {info.axis}")
print(f" scale_data: {info.scale.tolist()}")
print(f" zero_point_data: {info.zero_point.tolist()}")
- 功能说明:
-
input_strides: Dict[str, Dict[str, List[int]]]
- 功能说明:
- 每个输入张量的 stride 步长信息
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层Dict[str, List[int]]:键为输入名,值为输入张量的stride信息。
- 示例:
注意:stride的详细含义可参考OE文档中libdnn库中的描述;
print(model.input_strides)
# 输出:{'yolov5x_672x672_nv12': {'data_uv': [-1, -1, 2, 1], 'data_y': [-1, -1, 1, 1]}}
- 功能说明:
-
output_counts: Dict[str, int]
- 功能说明:
- 每个模型输出张量数量。
- 结构说明:
- Dict[str, int]:键为模型名称,值为该模型的输出张量个数。
- 示例:
print(model.output_counts)
# 输出:{'yolov5x_672x672_nv12': 3}
- 功能说明:
-
output_names: Dict[str, List[str]]
- 功能说明:
- 每个模型的输出张量名称列表。
- 结构说明:
- 外层 Dict[str, ...]:键为模型名称。
- 内层 List[str]:为该模型所有输出张量的名称列表。
- 示例:
print(model.output_names)
# 输出:{'yolov5x_672x672_nv12': ['output', '1310', '1312']}
- 功能说明:
-
output_descs: Dict[str, Dict[str, str]]
- 功能说明:
- 每个输出张量的描述。
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层 Dict[str, str]:键为输出张量名称,值为描述信息。
- 示例:
print(model.output_descs)
# 输出:{'yolov5x_672x672_nv12': {'1310': 'xxx', '1312': 'xxx', 'output': 'xxx'}}
- 功能说明:
-
output_shapes: Dict[str, Dict[str, List[int]]]
- 功能说明:
- 每个输出张量的 shape。
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层 Dict[str, List[int]]:键为输出名,值为输出张量的维度(形状)。
- 示例:
print(model.output_shapes)
# 输出:{'yolov5x_672x672_nv12': {'1310': [1, 42, 42, 255], '1312': [1, 21, 21, 255], 'output': [1, 84, 84, 255]}}
- 功能说明:
-
output_dtypes: Dict[str, Dict[str, List[int]]]
- 功能说明:
- 每个输出张量的数据类型。
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层 Dict[str, hbDNNDataType]:键为输出张量名,值为数据类型(例如 F32、U8)。
- 示例:
print(model.output_dtypes)
# 输出:{'yolov5x_672x672_nv12': {'1310': <hbDNNDataType.S32: 8>, '1312': <hbDNNDataType.S32: 8>, 'output': <hbDNNDataType.S32: 8>}}
- 功能说明:
-
output_quants: Dict[str, Dict[str, QuantParams]]
- 功能说明:
- 提供每个模型所有输出张量的量化参数信息。用于支持量化模型的后处理计算(如将 int8 数据还原为 float32),或者了解张量的量化方式(scale-based 等)。
- 结构说明:
- 外层 Dict[str, ...]:键是模型名称(model name),例如 "resnet50";
- 内层 Dict[str, QuantParams]:键是输出张量名,值为 QuantParams 实例;
- QuantParams 类属性:
- scale: np.ndarray — 量化比例因子,通常为浮点数数组;
- zero_point: np.ndarray — 零点,用于对称/非对称量化偏移;
- quant_type: hbDNNQuantiType — 量化类型枚举值(如 SCALE、NONE);
- axis: int — 如果是通道量化,则该字段表示在哪个轴上量化。
- 示例:
output_quanti = model.output_quants
for model, outputs in output_quanti.items():
print(f"{model}:")
for name, info in outputs.items():
print(f" {name}:")
print(f" quant_type: {info.quant_type.name}")
print(f" quantize_axis: {info.axis}")
print(f" scale_data: {info.scale}")
print(f" zero_point_data: {info.zero_point}")
- 功能说明:
-
output_strides: Dict[str, Dict[str, List[int]]]
- 功能说明:
- 每个输出张量的 stride 步长信息
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层Dict[str, List[int]]:键为输出名,值为输出张量的stride信息。
- 示例:
print(model.output_strides)
# 输出:{'yolov5x_672x672_nv12': {'1310': [1806336, 43008, 1024, 4], '1312': [451584, 21504, 1024, 4], 'output': [7225344, 86016, 1024, 4]}}
注意:stride的详细含义可参考OE文档中libdnn库中的描述;
- 功能说明:
-
sched_params: Dict[str, SchedParam]
- 功能说明:
sched_params是用于获取当前所有模型的调度参数(Scheduling Parameters),包括每个模型的:
- 优先级(priority)
- 自定义 ID(customId)
- 分配的 BPU 核心(bpu_cores)
- 所属设备 ID(deviceId) 这些调度参数用于影响模型在硬件上运行的方式,尤其在多模型部署或多核设备上尤为重要。
- 结构说明:
- 外层 Dict[str, ...]:模型名称。
- 内层SchedParam :为SchedParam 类的实例,包含该模型的调度参数priority、customId、bpu_cores和deviceId;
{
"
- 功能说明:
sched_params是用于获取当前所有模型的调度参数(Scheduling Parameters),包括每个模型的: