6.3.5. 模型推理接口说明
模型
6.3.5.1. 模型推理库版本信息获取 API
hbDNNGetVersion()
【函数
const char *hbDNNGetVersion()
【功能
获取 DNN 预测
【参数】
无
【返回
返回
6.3.5.2. 模型加载/释放 API
hbDNNInitializeFromFiles()
【函数
int32_t hbDNNInitializeFromFiles(hbPackedDNNHandle_t *packedDNNHandle, const char **modelFileNames, int32_t modelFileCount)
【功能
从文件packedDNNHandle 的packedDNNHandle。
【参数】
[out]
packedDNNHandleHorizon DNN句柄,指向多个 模型。 [in]
modelFileNames模型文件 的 路径。 [in]
modelFileCount模型文件 的 个数。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNInitializeFromDDR()
【函数
int32_t hbDNNInitializeFromDDR(hbPackedDNNHandle_t *packedDNNHandle, const void **modelData, int32_t *modelDataLengths, int32_t modelDataCount)
【功能
从文件packedDNNHandle 的packedDNNHandle。
【参数】
[out]
packedDNNHandleHorizon DNN句柄,指向多个 模型。 [in]
modelData模型文件 的 指针。 [in]
modelDataLengths模型数据 的 长度。 [in]
modelDataCount模型数据 的 个数。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNRelease()
【函数
int32_t hbDNNRelease(hbPackedDNNHandle_t packedDNNHandle)
【功能
将 packedDNNHandle 所
【参数】
[in]
packedDNNHandleHorizon DNN句柄,指向多个 模型。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
6.3.5.3. 模型信息获取 API
hbDNNGetModelNameList()
【函数
int32_t hbDNNGetModelNameList(const char ***modelNameList, int32_t *modelNameCount, hbPackedDNNHandle_t packedDNNHandle)
【功能
获取 packedDNNHandle 所
【参数】
[out]
modelNameList模型名称 列表。 [out]
modelNameCount模型名称 个数。 [in]
packedDNNHandleHorizon DNN句柄,指向多个 模型。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetModelHandle()
【函数
int32_t hbDNNGetModelHandle(hbDNNHandle_t *dnnHandle, hbPackedDNNHandle_t packedDNNHandle, const char *modelName)
【功能
从 packedDNNHandle 所dnnHandle。
【参数】
[out]
dnnHandleDNN句柄,指向一个 模型。 [in]
packedDNNHandleDNN句柄,指向多个 模型。 [in]
modelName模型名称。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetInputCount()
【函数
int32_t hbDNNGetInputCount(int32_t *inputCount, hbDNNHandle_t dnnHandle)
【功能
获取 dnnHandle 所
【参数】
[out]
inputCount模型输入 张量 的 个数。 [in]
dnnHandleDNN句柄,指向一个 模型。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetInputName()
【函数
int32_t hbDNNGetInputName(const char **name, hbDNNHandle_t dnnHandle, int32_t inputIndex)
【功能
获取 dnnHandle 所
【参数】
[out]
name模型输入 张量 的 名称。 [in]
dnnHandleDNN句柄,指向一个 模型。 [in]
inputIndex模型输入 张量 的 编号。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetInputTensorProperties()
【函数
int32_t hbDNNGetInputTensorProperties(hbDNNTensorProperties *properties, hbDNNHandle_t dnnHandle, int32_t inputIndex)
【功能
获取 dnnHandle 所
【参数】
[out]
properties输入张量 的 信息。 [in]
dnnHandleDNN句柄,指向一个 模型。 [in]
inputIndex模型输入 张量 的 编号。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetOutputCount()
【函数
int32_t hbDNNGetOutputCount(int32_t *outputCount, hbDNNHandle_t dnnHandle)
【功能
获取 dnnHandle 所
【参数】
[out]
outputCount模型输出 张量 的 个数。 [in]
dnnHandleDNN句柄,指向一个 模型。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetOutputName()
【函数
int32_t hbDNNGetOutputName(const char **name, hbDNNHandle_t dnnHandle, int32_t outputIndex)
【功能
获取 dnnHandle 所
【参数】
[out]
name模型输出 张量 的 名称。 [in]
dnnHandleDNN句柄,指向一个 模型。 [in]
outputIndex模型输出 张量 的 编号。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbDNNGetOutputTensorProperties()
【函数
int32_t hbDNNGetOutputTensorProperties(hbDNNTensorProperties *properties, hbDNNHandle_t dnnHandle, int32_t outputIndex)
【功能
获取 dnnHandle 所
【参数】
[out]
properties输出张量 的 信息。 [in]
dnnHandleDNN句柄,指向一个 模型。 [in]
outputIndex模型输出 张量 的 编号。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
6.3.5.4. 模型推理 API
hbDNNInfer()
【函数
int32_t hbDNNInfer(hbDNNTaskHandle_t *taskHandle, hbDNNTensor **output, const hbDNNTensor *input, hbDNNHandle_t dnnHandle, hbDNNInferCtrlParam *inferCtrlParam)
【功能
根据taskHandle。
【参数】
[out]
taskHandle任务句柄 指针。 [in/out]
output推理任务 的 输出。 [in]
input推理任务 的 输入。 [in]
dnnHandleDNN句柄指针。 [in]
inferCtrlParam控制推理 任务 的 参数。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
备注:
使用taskHandle 置nullptr,除非taskHandle 追加inferCtrlParam::more 功能)。
最
对于batch模型,允许input 的
hbDNNRoiInfer()
【函数
int32_t hbDNNRoiInfer(hbDNNTaskHandle_t *taskHandle, hbDNNTensor **output, const hbDNNTensor *input, hbDNNRoi *rois, int32_t roiCount, hbDNNHandle_t dnnHandle, hbDNNInferCtrlParam *inferCtrlParam)
【功能
根据taskHandle。
【参数】
[out]
taskHandle任务句柄 指针。 [in/out]
output推理任务 的 输出。 [in]
input推理任务 的 输入。 [in]
roisRoi框信息。 [in]
roiCountRoi框数量。 [in]
dnnHandlednn句柄指针。 [in]
inferCtrlParam控制推理 任务 的 参数。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
备注:
若
input_count: 模型输入 分支 数量 output_count: 模型输出 分支 数量 resizer_count: 模型输入 源为 resizer 的 分支 数量(≤input_count),模型 处理 一批 数据 时,一个 resizer 输入 源 分支 处理 一个 roi roiCount: roi 总数,其数值 为 batch * resizer_countdata_batch: 模型需要 推理 的 数据 批数,其 数值 为 roiCount / resizer_countmodel_batch: 模型内部 的 batch 数量。即 模型 实际 推理 时,输入 给 模型 的 batch_size。X5算法 工具链 支持 将 模型 编译 为 batch model
输入/输出
以batch=2 编译,模型
input_count= 3output_count= 1resizer_count= 2roiCount= 6data_batch= 3model_batch= 2
所以input_count * data_batch = 9。
另
模型
输入(model_info): tensor_0_resizer: [2, 3, 128, 128]
tensor_1_resizer: [2, 3, 256, 256]
tensor_2_ddr: [2, 80, 1, 100]
模型
输出(model_info): tensor_out:[2, 100, 1, 56]
那么
模型
输入(input_tensors): [1x3x128x128, 1x3x256x256, 1x80x1x100, 1x3x128x128, 1x3x256x256, 1x80x1x100, 1x3x128x128, 1x3x256x256, 1x80x1x100]
模型
输出(output_tensors): [4x100x1x56]
其中,因为 model_batch = 2,所以data_batch = 3,所以 output_tensor 最高ceil[(data_batch) / model_batch] * model_batch,可见model_batch 的
接口
关于
batch数量限制:其 范围 应该 在[1, 255]。 使用
该 接口 提交 任务 时应 提前 将 taskHandle置为 nullptr,除非是 给 指定 taskHandle追加任务(即 使用 inferCtrlParam::more功能)。roi大小要求 是 :math: 2 <= width <= 4096, :math:2 <= height <= 4096。原图
尺寸 要求 是 :math: 1 <= W <= 4096, :math:16 <= stride <= 131072,stride必须是16的 倍数。 输出
尺寸 要求 是 :math: 2 <= Wout, :math:2 <= Hout。roi缩放
倍数 限制 :math: 0 <= step <= 262143,step计算公式 :math:step = ((src\_len - 1)*65536 + (dst\_len - 1)/2)/(dst\_len - 1),其中src_len为roi的W或H,dst_len为模型 要求 的W或H。 最
多 支持 同时 存在32个 模型 任务。
hbDNNWaitTaskDone()
【函数
int32_t hbDNNWaitTaskDone(hbDNNTaskHandle_t taskHandle, int32_t timeout)
【功能
等待
【参数】
[in]
taskHandle任务句柄 指针。 [in]
timeout超时配置(单位:毫秒)。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
备注:
timeout > 0表示等待时间; timeout <= 0表示一直 等待,直到 任务 完成。
hbDNNReleaseTask()
【函数
int32_t hbDNNReleaseTask(hbDNNTaskHandle_t taskHandle)
【功能
释放
【参数】
[in]
taskHandle任务句柄 指针。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
6.3.5.5. 模型内存操作 API
hbSysAllocMem()
【函数
int32_t hbSysAllocMem(hbSysMem *mem, uint32_t size)
【功能
申请BPU内存。
【参数】
[in]
size申请内存 的 大小。 [out]
mem内存指针。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysAllocCachedMem()
【函数
int32_t hbSysAllocCachedMem(hbSysMem *mem, uint32_t size)
【功能
申请
【参数】
[in]
size申请内存 的 大小。 [out]
mem内存指针。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysFlushMem()
【函数
int32_t hbSysFlushMem(hbSysMem *mem, int32_t flag)
【功能
对
【参数】
[in]
mem内存指针。 [in]
flag刷新标志符。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysFreeMem()
【函数
int32_t hbSysFreeMem(hbSysMem *mem)
【功能
释放BPU内存。
【参数】
[in]
mem内存指针。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysWriteMem()
【函数
int32_t hbSysWriteMem(hbSysMem *dest, char *src, uint32_t size)
【功能
写入BPU内存。
【参数】
[out]
dest内存指针。 [in]
src数据指针。 [in]
size数据大小。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysReadMem()
【函数
int32_t hbSysReadMem(char *dest, hbSysMem *src, uint32_t size)
【功能
读取BPU内存。
【参数】
[out]
dest数据指针。 [in]
src内存指针。 [in]
size数据大小。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysRegisterMem()
【函数
int32_t hbSysRegisterMem(hbSysMem *mem)
【功能
将
【参数】
[in/out]
mem内存指针。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
hbSysUnregisterMem()
【函数
int32_t hbSysUnregisterMem(hbSysMem *mem)
【功能
注销hbSysRegisterMem 注册
【参数】
[in]
mem内存指针。
【返回
返回
0则表示API成功 执行,否则 执行 失败。
6.3.5.6. 数据类型和数据结构
版本信息类
HB_DNN_VERSION_MAJOR
##define HB_DNN_VERSION_MAJOR 1U
DNN主
HB_DNN_VERSION_MINOR
##define HB_DNN_VERSION_MINOR 1U
DNN次
HB_DNN_VERSION_PATCH
##define HB_DNN_VERSION_PATCH 0U
DNN补丁
备注:
注意,本
模型类
HB_DNN_TENSOR_MAX_DIMENSIONS
##define HB_DNN_TENSOR_MAX_DIMENSIONS 8
张量8。
HB_DNN_INITIALIZE_INFER_CTRL_PARAM
##define HB_DNN_INITIALIZE_INFER_CTRL_PARAM(param) \
{ \
(param)->bpuCoreId = HB_BPU_CORE_ANY; \
(param)->dspCoreId = HB_DSP_CORE_ANY; \
(param)->priority = HB_DNN_PRIORITY_LOWEST; \
(param)->more = false; \
(param)->customId = 0; \
(param)->reserved1 = 0; \
(param)->reserved2 = 0; \
}
初始化
hbPackedDNNHandle_t
typedef void *hbPackedDNNHandle_t;
DNN句柄,指向
hbDNNHandle_t
typedef void *hbDNNHandle_t;
DNN句柄,指向
hbDNNTaskHandle_t
typedef void *hbDNNTaskHandle_t;
任务
hbDNNTensorLayout
typedef enum {
HB_DNN_LAYOUT_NHWC = 0,
HB_DNN_LAYOUT_NCHW = 2,
HB_DNN_LAYOUT_NONE = 255,
} hbDNNTensorLayout;
张量NHWC 分别
成员
| 成员 |
描述 |
|---|---|
HB_DNN_LAYOUT_NONE |
没有 |
HB_DNN_LAYOUT_NHWC |
排布NHWC。 |
HB_DNN_LAYOUT_NCHW |
排布NCHW。 |
hbDNNDataType
typedef enum {
HB_DNN_IMG_TYPE_Y,
HB_DNN_IMG_TYPE_NV12,
HB_DNN_IMG_TYPE_NV12_SEPARATE,
HB_DNN_IMG_TYPE_YUV444,
HB_DNN_IMG_TYPE_RGB,
HB_DNN_IMG_TYPE_BGR,
HB_DNN_TENSOR_TYPE_S4,
HB_DNN_TENSOR_TYPE_U4,
HB_DNN_TENSOR_TYPE_S8,
HB_DNN_TENSOR_TYPE_U8,
HB_DNN_TENSOR_TYPE_F16,
HB_DNN_TENSOR_TYPE_S16,
HB_DNN_TENSOR_TYPE_U16,
HB_DNN_TENSOR_TYPE_F32,
HB_DNN_TENSOR_TYPE_S32,
HB_DNN_TENSOR_TYPE_U32,
HB_DNN_TENSOR_TYPE_F64,
HB_DNN_TENSOR_TYPE_S64,
HB_DNN_TENSOR_TYPE_U64,
HB_DNN_TENSOR_TYPE_MAX
} hbDNNDataType;
张量S 代表U 代表F 代表
HB_DNN_IMG_TYPE_NV12 与 HB_DNN_IMG_TYPE_NV12_SEPARATE 都
推理NV12输入tensorType 属性HB_DNN_IMG_TYPE_NV12 或 HB_DNN_IMG_TYPE_NV12_SEPARATE。
成员
| 成员 |
描述 |
|---|---|
HB_DNN_IMG_TYPE_Y |
张量 |
HB_DNN_IMG_TYPE_NV12 |
张量 |
HB_DNN_IMG_TYPE_NV12_SEPARATE |
张量 |
HB_DNN_IMG_TYPE_YUV444 |
张量 |
HB_DNN_IMG_TYPE_RGB |
张量 |
HB_DNN_IMG_TYPE_BGR |
张量 |
HB_DNN_TENSOR_TYPE_S4 |
张量 |
HB_DNN_TENSOR_TYPE_U4 |
张量 |
HB_DNN_TENSOR_TYPE_S8 |
张量 |
HB_DNN_TENSOR_TYPE_U8 |
张量 |
HB_DNN_TENSOR_TYPE_F16 |
张量 |
HB_DNN_TENSOR_TYPE_S16 |
张量 |
HB_DNN_TENSOR_TYPE_U16 |
张量 |
HB_DNN_TENSOR_TYPE_F32 |
张量 |
HB_DNN_TENSOR_TYPE_S32 |
张量 |
HB_DNN_TENSOR_TYPE_U32 |
张量 |
HB_DNN_TENSOR_TYPE_F64 |
张量 |
HB_DNN_TENSOR_TYPE_S64 |
张量 |
HB_DNN_TENSOR_TYPE_U64 |
张量 |
HB_DNN_TENSOR_TYPE_MAX |
代表 |
hbDNNTensorShape
typedef struct {
int32_t dimensionSize[HB_DNN_TENSOR_MAX_DIMENSIONS];
int32_t numDimensions;
} hbDNNTensorShape;
张量numDimensions=4,若dimensionSize 数组Number=1、 Height=224、 Width=224、 Channel=3。
成员
| 成员 |
描述 |
|---|---|
dimensionSize |
张量 |
numDimensions |
张量 |
hbDNNQuantiShift
typedef struct {
int32_t shiftLen;
uint8_t *shiftData;
} hbDNNQuantiShift;
量化/反
对于data[i], 对应shift[i], 则data[i] * (1 << shift[i]) 取整;
对于data[i], 对应shift[i], 则data[i] / (1 << shift[i])。
注意:
其中 shiftLen 由data 按照 per-axis 或 per-tensor (反)量化data 按 per-tensor (反)量化shiftLen 等于 1,此时quantizeAxis 数值;否则data 的quantizeAxis 维度
成员
| 成员 |
描述 |
|---|---|
shiftLen |
移位 |
shiftData |
移位 |
hbDNNQuantiScale
typedef struct {
int32_t scaleLen;
float *scaleData;
int32_t zeroPointLen;
int8_t *zeroPointData;
} hbDNNQuantiScale;
量化/反
对于data[i], 对应scale[i], 零点zeroPoint[i],则g((data[i] / scale[i]) + zeroPoint[i]) , 其中: :math:g(x) = clip(nearbyint(x)), 使用fesetround(FE_TONEAREST)舍入g(x)∈[0, 255], S8: :math:g(x)∈[-128, 127];
对于data[i], 对应scale[i], 零点zeroPoint[i],则(data[i] - zeroPoint[i])* scale[i]。
注意:
其中 scaleLen 由data 按照 per-axis 或 per-tensor (反)量化data 按 per-tensor (反)量化scaleLen 等于 1,此时quantizeAxis 数值;
否则data 第 quantizeAxis 维度zeroPointLen 与 scaleLen 保持一致。
成员
| 成员 |
描述 |
|---|---|
scaleLen |
缩放 |
scaleData |
缩放 |
zeropointLen |
零点 |
zeropointData |
零点 |
hbDNNQuantiType
typedef enum {
NONE,
SHIFT,
SCALE,
} hbDNNQuantiType;
定点NONE 代表SHIFT 类型hbDNNQuantiShift 结构SCALE 对应hbDNNQuantiScale 结构
成员
| 成员 |
描述 |
|---|---|
NONE |
没有 |
SHIFT |
量化SHIFT。 |
SCALE |
量化SCALE。 |
hbDNNTensorProperties
typedef struct {
hbDNNTensorShape validShape;
hbDNNTensorShape alignedShape;
int32_t tensorLayout;
int32_t tensorType;
hbDNNQuantiShift shift;
hbDNNQuantiScale scale;
hbDNNQuantiType quantiType;
int32_t quantizeAxis;
int32_t alignedByteSize;
int32_t stride[HB_DNN_TENSOR_MAX_DIMENSIONS];
} hbDNNTensorProperties;
张量
其中 alignedShape 从alignedShape 需要
成员
| 成员 |
描述 |
|---|---|
validShape |
张量 |
alignedShape |
张量 |
tensorLayout |
张量 |
tensorType |
张量 |
shift |
量化 |
scale |
量化 |
quantiType |
量化 |
quantizeAxis |
量化 |
alignedByteSize |
张量 |
stride |
张量 |
备注:
通过alignedShape 和 tensorType 的
alignedShape:
若
您 根据 alignedShape准备输入,则 无需 更改 alignedShape。若
您 根据 validShape准备输入,则 需 更改 alignedShape为validShape,推理库 内部 会 对 数据 进行padding操作。
tensorType:
推理NV12输入tensorType 属性HB_DNN_IMG_TYPE_NV12 或 HB_DNN_IMG_TYPE_NV12_SEPARATE 。
hbDNNTaskPriority
typedef enum {
HB_DNN_PRIORITY_LOWEST = 0,
HB_DNN_PRIORITY_HIGHEST = 255,
HB_DNN_PRIORITY_PREEMP = HB_DNN_PRIORITY_HIGHEST,
} hbDNNTaskPriority;
Task优先级
hbDNNTensor
typedef struct {
hbSysMem sysMem[4];
hbDNNTensorProperties properties;
} hbDNNTensor;
张量。用于NV12_SEPARATE 类型hbSysMem,其余
成员
|成员sysMem | 存放properties | 张量
hbDNNRoi
typedef struct {
int32_t left;
int32_t top;
int32_t right;
int32_t bottom;
} hbDNNRoi;
矩形W∈[left, right], H∈[top, bottom]。
成员
| 成员 |
描述 |
|---|---|
left |
感兴趣 |
top |
感兴趣 |
right |
感兴趣 |
bottom |
感兴趣 |
hbDNNInferCtrlParam
typedef struct {
int32_t bpuCoreId;
int32_t dspCoreId;
int32_t priority;
int32_t more;
int64_t customId;
int32_t reserved1;
int32_t reserved2;
} hbDNNInferCtrlParam;
模型bpuCoreId 与 dspCoreId 用于dspCoreId 仅more 参数more 为 0 外,
之前more 都1,最customId 参数
成员
| 成员 |
描述 |
|---|---|
bpuCoreId |
BPU核ID。 |
dspCoreId |
DSP核ID。 |
priority |
任务 |
more |
该 |
customId |
自定义 |
reserved1 |
保留字 |
Reserved2 |
保留字 |
系统类
hbBPUCore
typedef enum {
HB_BPU_CORE_ANY = 0,
HB_BPU_CORE_0 = (1 << 0),
HB_BPU_CORE_1 = (1 << 1)
} hbBPUCore;
BPU核
成员
| 成员 |
描述 |
|---|---|
HB_BPU_CORE_ANY |
任意 |
HB_BPU_CORE_0 |
BPU核0。 |
HB_BPU_CORE_1 |
BPU核1。 |
hbDSPCore
typedef enum {
HB_DSP_CORE_ANY = 0,
HB_DSP_CORE_0 = (1 << 0),
HB_DSP_CORE_1 = (1 << 1)
} hbDSPCore;
DSP核
成员
| 成员 |
描述 |
|---|---|
HB_DSP_CORE_ANY |
任意 |
HB_DSP_CORE_0 |
DSP核0。 |
HB_DSP_CORE_1 |
DSP核1。 |
hbSysMem
typedef struct {
uint64_t phyAddr;
void *virAddr;
uint32_t memSize;
} hbSysMem;
系统
成员
| 成员 |
描述 |
|---|---|
phyAddr |
物理地址。 |
virAddr |
虚拟地址。 |
memSize |
内存大小。 |
hbSysMemFlushFlag
typedef enum {
HB_SYS_MEM_CACHE_INVALIDATE = 1,
HB_SYS_MEM_CACHE_CLEAN = 2
} hbSysMemFlushFlag;
系统

成员
| 成员 |
描述 |
|---|---|
HB_SYS_MEM_CACHE_INVALIDATE |
将 |
HB_SYS_MEM_CACHE_CLEAN |
将 |
前处理类
HB_DNN_INITIALIZE_RESIZE_CTRL_PARAM
##define HB_DNN_INITIALIZE_RESIZE_CTRL_PARAM(param) \
{ \
(param)->bpuCoreId = HB_BPU_CORE_ANY; \
(param)->resizeType = HB_DNN_RESIZE_TYPE_BILINEAR; \
(param)->priority = HB_DNN_PRIORITY_LOWEST; \
(param)->reserved1 = 0; \
(param)->reserved2 = 0; \
(param)->reserved3 = 0; \
(param)->reserved4 = 0; \
}
初始化
hbDNNResizeType
typedef enum {
HB_DNN_RESIZE_TYPE_BILINEAR = 0,
} hbDNNResizeType;
Resize 类型。
成员
| 成员 |
描述 |
|---|---|
HB_DNN_RESIZE_TYPE_BILINEAR |
Resize类型 |
hbDNNResizeCtrlParam
typedef struct {
int32_t bpuCoreId;
int32_t priority;
hbDNNResizeType resizeType;
int32_t reserved1;
int32_t reserved2;
int32_t reserved3;
int32_t reserved4;
} hbDNNResizeCtrlParam;
Resize 的
成员
| 成员 |
描述 |
|---|---|
bpuCoreId |
BPU核ID。 |
priority |
任务 |
resizeType |
Resize类型。 |
reserved1 |
保留字 |
Reserved2 |
保留字 |
Reserved3 |
保留字 |
Reserved4 |
保留字 |
6.3.5.7. 数据排布及对齐规则
数据排布
硬件
神经网络
输入输出
备注:
需要
此处NHWC_NATIVE 和 NCHW_NATIVE ,以 NHWC_NATIVE 为例,其
| N0H0W0C0 | N0H0W0C1 | …… |
| N0H0W1C0 | N0H0W1C1 | …… |
| …… | …… | …… |
| N0H1W0C0 | N0H1W0C1 | …… |
| …… | …… | …… |
| N1H0W0C0 | N1H0W0C1 | …… |
| …… | …… | …… |
一个NHW*C大小
for (int32_t n = 0; n < N; n++) {
for (int32_t h = 0; h < H; h++) {
for (int32_t w = 0; w < W; w++) {
for (int32_t c = 0; c < C; c++) {
int32_t native_offset = n*H*W*C + h*W*C + w*C + c;
}
}
}
}
其中 NCHW_NATIVE 和 NHWC_NATIVE 相比,只是
caution
下文
BPU对齐限制规则
本
模型输入要求
BPU不
对齐和有效数据
BPU对hbDNNTensorProperties 中validShape , alignedShape 和 stride 表示。
validShape是有效 的shape; alignedShape是满足 对齐 要求 的shape, 由于 硬件 特性, alignedShape均由 四维 数据表示; stride表示validShape各维度 的 步长,其中,NV12输入 的 模型 比较 特殊,其 stride均为0,因为NV12输入 的 模型 只 要求W 16对齐。
目前validShape 和 alignedShape 获取validShape 和 stride 获取
NV12介绍
YUV格式
YUV格式
NV12排布
NV12图像格式
排列

6.3.5.8. 模型推理DEBUG方法
错误码
HB_DNN_SUCCESS = 0 // 执行成功
HB_DNN_INVALID_ARGUMENT = -6000001 // 非法参数
HB_DNN_INVALID_MODEL = -6000002 // 非法模型
HB_DNN_MODEL_NUMBER_EXCEED_LIMIT = -6000003 // 模型个数超过限制
HB_DNN_INVALID_PACKED_DNN_HANDLE = -6000004 // 非法packed handle
HB_DNN_INVALID_DNN_HANDLE = -6000005 // 非法handle
HB_DNN_CAN_NOT_OPEN_FILE = -6000006 // 文件不存在
HB_DNN_OUT_OF_MEMORY = -6000007 // 没有足够的内存
HB_DNN_TIMEOUT = -6000008 // 超时
HB_DNN_TASK_NUM_EXCEED_LIMIT = -6000009 // 任务数量超限制
HB_DNN_TASK_BATCH_SIZE_EXCEED_LIMIT = -6000010 // 多任务处理数量超限制
HB_DNN_INVALID_TASK_HANDLE = -6000011 // 非法task handle
HB_DNN_RUN_TASK_FAILED = -6000012 // 任务执行失败
HB_DNN_MODEL_IS_RUNNING = -6000013 // 任务执行中
HB_DNN_INCOMPATIBLE_MODEL = -6000014 // 不兼容的模型
HB_DNN_API_USE_ERROR = -6000015 // 接口使用错误
HB_DNN_MULTI_PROGRESS_USE_ERROR = -6000016 // 多进程使用错误
HB_SYS_SUCCESS = 0 // 执行成功
HB_SYS_INVALID_ARGUMENT = -6000129 // 非法参数
HB_SYS_OUT_OF_MEMORY = -6000130 // 没有足够的内存
HB_SYS_REGISTER_MEM_FAILED = -6000131 // 注册内存失败
配置信息
日志
等级。 dnn中的 日志 主要 分为4个 等级,: HB_DNN_LOG_NONE = 0,不输出 日志; HB_DNN_LOG_WARNING = 3,该等级 主要 用来 输出 代码 中 的 告警信息; HB_DNN_LOG_ERROR = 4,该等级 主要 用来 输出 代码 中 的 报错 信息; HB_DNN_LOG_FATAL = 5,该等级 主要 用来 输出 代码 中 的 导致 退出 的 错误信息。
日志
等级 设置 规则: 若
发生 的LOG等级 >= 设置 的 等级,则 该LOG可以 被 打印,反之 被 屏蔽;设置 的LOG等级 越小,打印信息 越 多(等级0除外,0不 输出 日志)。 例如:设置LOG等级 为3,即 为 WARNING级别,则3,4,5等级的LOG均 可以 被 打印; 预测 库 默认LOG等级 为 HB_DNN_LOG_WARNING,则以下LOG级别 的 信息 可以 被 打印: WARNING、ERROR、FATAL。日志
等级 设置 方式: 可 通过 环境变量 HB_DNN_LOG_LEVEL设置日志 等级。 比如: export HB_DNN_LOG_LEVEL=3,则输出 WARNING级以上 级别 的 日志。 常用
环境变量 HB_DNN_LOG_LEVEL // 设置日志等级。 HB_DNN_PLUGIN_PATH // 自定义CPU算子动态链接库所在目录。 HB_DNN_PROFILER_LOG_PATH // 模型运行各阶段耗时统计信息dump路径。 HB_DNN_SIM_PLATFORM // x86模拟器模拟平台设置,可设置为BERNOULLI、BERNOULLI2、BAYES、BAYESE。 HB_DNN_SIM_BPU_MEM_SIZE // x86模拟器设置BPU内存大小,单位MB。
开发机模拟器使用注意事项
开发
机 模拟器 在 使用 时,可以 通过 设置 环境变量 HB_DNN_SIM_PLATFORM来指定 需要 模拟 的 处理器 架构,可 执行 如下 命令: export HB_DNN_SIM_PLATFORM=BAYESE,表示模拟 x5平台;
如果
不 设置 HB_DNN_SIM_PLATFORM环境变量,会根据 第一次 加载 的 模型 架构 来 设置 模拟器 平台,例如:第一次 加载 的 模型 是 BAYESE架构,则程序 默认设置 的 平台 为 x5。在
开发 机 模拟器 中 执行 resize相关操作 之前,需要 通过 HB_DNN_SIM_PLATFORM环境变量指定 平台。