目录

PNNA2 接口升级说明(pnna lite v1.15.0 → v2.1.6)

本仓库 pnna2 是基于 pnna lite v2.1.6 驱动,对原 pnna lite v1.15.0 接口封装的升级版本。
在保持原有部署流程(参考 yolov5s_demo.c)不变的前提下,对网络创建、Buffer 管理、多核调度及示例程序调用进行了系统性重构。


1. 核心功能变更

1.1 新增多核 NPU 调度支持

问题原因

v2.1.6 驱动支持多核 NPU 调度,旧接口未提供 core 选择能力,导致:

  • 多模型并发无法调度
  • RPC 推理场景无法绑定核心

修改内容

接口变更
// 原接口
int app(app_ctx_t *model, void **output, buffer_t *input);

// 新接口
int app(app_ctx_t *model, void **output, buffer_t *input, uint32_t core_index);
推理前设置 core
pnna_status_e ret = pnna_set_network(
    ctx->network,
    PNNA_NETWORK_PROP_SET_CORE_INDEX,
    core_index);

if (ret != PNNA_SUCCESS) {
    log_error("Set core index fail, index = %d
", core_index);
    return -1;
}

示例程序修改

  • yolov5s_demo.c
  • yolov4_tiny_demo.c
  • yolov8s_demo.c

统一增加:

uint32_t core_index = 0;   // 默认单核

并透传至 app()create_network()pnna_set_network()


1.2 网络创建流程重构

问题原因

v2.1.6 pnna_create_network() 改为结构体参数方式,旧接口不兼容。

修改内容

旧方式

pnna_create_network(nbg_addr, nbg_size,
                    PNNA_CREATE_NETWORK_FROM_MEMORY,
                    &ctx->network);
新方式
pnna_create_network_param_t net_param;
net_param.nbg.type = PNNA_NETWORK_FROM_MEMORY;
net_param.nbg.mem.addr = nbg_addr;
net_param.nbg.mem.size = nbg_size;

pnna_create_network(&net_param, sizeof(net_param), &ctx->network);

效果

  • 支持更多网络属性扩展
  • 与 v2.1.6 SDK 完全兼容

1.3 Buffer 管理优化

问题原因

驱动 v2.1.6 修改 Buffer 参数结构体与内存要求。

修改内容

结构体替换
pnna_buffer_create_params_t → pnna_buffer_param_t
新 Buffer 创建流程
isz = get_data_size(iqp->sizes,
                    iqp->num_of_dims,
                    iqp->data_format);

param.src.alloc_mem.size  = isz;
param.src.alloc_mem.align = 64;
param.device_index        = 0;
param.type                = PNNA_BUFFER_CREATE_ALLOC_MEM;

pnna_create_buffer(&param, sizeof(param), &ctx->input_buffers[i]);

效果

  • 显式内存对齐
  • 支持大尺寸 Tensor
  • 提高 DMA 访问效率

1.4 数据类型与命名规范统一

问题原因

新驱动统一使用标准整数类型,旧接口存在编译警告。

修改内容

  • int / unsigned int → uint32_t
  • zeroPoint → zero_point
  • sizes[6] → sizes[8]
  • 部分尺寸类型 uint32_t → unsigned long

效果

  • 消除 -Wformat / -Wconversion 编译警告
  • 支持更大张量维度

2. 示例程序同步修改

所有 Demo 程序已同步修改对以下文件的调用:

src/nn_api.c
src/preprocess.c
src/quantize.c

2.1 nn_api.c 调用更新

  • 新增 core_index 参数
  • 修改 create_network() 参数结构体
  • 修改 Buffer 创建流程

示例:

ret = app(&ctx, output, input, core_index);

2.2 quantize.c 调用更新

修改原因

新版 SDK 统一量化函数参数类型。

修改示例

// 原
int quantize_input(float *src, int size, int8_t *dst);

// 新
int quantize_input(float *src, uint32_t size, int8_t *dst);

Demo 修改:

quantize_input(input, (uint32_t)input_size, qbuf);

2.3 preprocess.c 调用更新

修改原因

图像尺寸与 tensor size 类型统一。

修改示例

// 原
int preprocess_image(uint8_t *img, int w, int h);

// 新
int preprocess_image(uint8_t *img, uint32_t w, uint32_t h);

3. 错误处理与资源管理改进

修改内容

  • pnna_close() 检查 pnna_destroy() 返回值
  • Buffer flush 日志增加 index
  • 创建 Buffer 前增加 size 校验

示例:

if (isz < 0) {
    log_error("get input %d tensor data size failed", i);
    return -1;
}

4. 影响文件列表

examples/yolov5s_demo.c
examples/yolov4_tiny_demo.c
examples/yolov8s_demo.c
src/nn_api.c
src/preprocess.c
src/quantize.c

5. 用户迁移指南

从 v1.15.0 迁移至 pnna2 需要:

  1. 修改 app() 增加 core_index
  2. 使用 pnna_create_network_param_t
  3. 使用 pnna_buffer_param_t
  4. 更新 quantize / preprocess 参数类型
  5. 重新编译并检查日志

作者 {{xunyingya}}

关于

基于pnna驱动v2.1.6版本的API及其应用示例

148.6 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号 京公网安备 11010802032778号