当前位置: 首页 > news >正文

RKNPU2通用API和零拷贝API

RKNPU2通用API

通用API接口按照异构编程规范,需要将数据拷贝到NPU运行时的内存空间。

通用API部署流程

  • 初始化上下文,需要先创建上下文对象和读取模型文件

    rknn_context ctx;
    model = load_model(model_path, &model_len);
    ret = rknn_init(&ctx, model, model_len, 0, NULL);
    \\使用opencv读取需要处理的图片,一定要将图片从BGR转换为RGB格式cv::Mat img = imread(img_path, cv::IMREAD_COLOR);  // 读取图片数据,并保存在img
    cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
    
  • 创建输入

    rknn_input inputs[1];
    inputs[0].index = 0;
    inputs[0].type = RKNN_TENSOR_UINT8;
    inputs[0].size = img.cols*img.rows*img.channels();
    inputs[0].fmt = RKNN_TENSOR_NHWC;
    inputs[0].buf = img.data;			// 把img拷贝到inputs[0].buf
    ``
    - 设置输入
    ```c
    ret = rknn_inputs_set(ctx, io_num.n_input, inputs);  // 把inputs数据拷贝到ctx对象当中
    
  • 执行模型

    ret = rknn_run(ctx, nullptr);
  • 释放资源

    rknn_outputs_release(ctx, 1, outputs);
    rknn_destroy(ctx);
    free(model);

在这里插入图片描述

RKNPU2零拷贝API

通用API需要利用rknn_inputs_set设置输入,零拷贝API则直接将数据拷贝到之前申请好的内存即可。

零拷贝API部署流程

  • 初始化上下文,需要先创建上下文对象和读取模型文件

    rknn_context ctx;
    model = load_model(model_path, &model_len);
    ret = rknn_init(&ctx, model, model_len, 0, NULL);
    \\使用opencv读取需要处理的图片,一定要将图片从BGR转换为RGB格式cv::Mat img = imread(img_path, cv::IMREAD_COLOR);  // 读取图片数据,并保存在img
    cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
  • 创建输入

    // 调用rknn_create_mem接口申请内存
    input_mems[0]   = rknn_create_mem(ctx, input_attrs[0].size_with_stride);
    ...
    // 调用rknn_set_io_mem接口让NPU使用已经申请的内存
    rknn_set_io_mem(ctx, input_mems[0], &input_attrs[0]);
    
  • 执行模型

    ret = rknn_run(ctx, nullptr);
  • 释放资源

    rknn_destroy_mem(ctx, input_mems[0]);
    rknn_destroy(ctx);
    free(model);

在这里插入图片描述

速度对比

warmup轮数50,循环推理1000次,计算平均耗时,包括预处理和后处理的总时间。npu只用了一个核心。

型号速度
通用API30-32ms
零拷贝API30-31ms

来源于https://blog.csdn.net/weixin_43337573/article/details/131817935

http://www.lryc.cn/news/156683.html

相关文章:

  • LeetCode 1123. 最深叶节点的最近公共祖先:DFS
  • 多线程应用——线程池
  • OPENCV+QT环境配置
  • Kafka3.0.0版本——文件清理策略
  • SRT参数说明
  • vue响应式原理
  • elk安装篇之 Kibana安装
  • MySQL 用户授权管理及白名单
  • pc-签字画板vue-esign的使用
  • javaScript:节点操作
  • git 忽略已经提交的文件或文件夹 (修改.gitignore文件无效)
  • 学习左耳听风栏目90天——第十二天 12/90(学习左耳朵耗子的工匠精神,对技术的热爱)【时间管理:同扭曲时间的事儿抗争】
  • 前端如何将后台数组进行等分切割
  • 如何有效防止服务器被攻击?
  • layui表格高度
  • 一文1800字从0到1使用Python Flask实战构建Web应用
  • 【LeetCode-中等题】210. 课程表 II
  • vue修饰符的用法
  • 汽车3D HMI图形引擎选择
  • stable diffusion实践操作-webUI教程-不是基础-是特例妙用
  • 【Java】网络编程
  • van-cascader 异步加载
  • Golang单元测试举例
  • 汽车以太网协议栈
  • 数学建模--二次规划型的求解的Python实现
  • Ansible-palybook学习
  • 服务注册与服务发现
  • RabbitMQ从入门到精通之安装、通讯方式详解
  • 植物大战僵尸植物表(二)
  • UML基础