• 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);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 创建输入

      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对象当中
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 执行模型

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

      rknn_outputs_release(ctx, 1, outputs);
      rknn_destroy(ctx);
      free(model);
      
      
      • 1
      • 2
      • 3
      • 4

    在这里插入图片描述

    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);
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 创建输入

      // 调用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]);
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 执行模型

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

      rknn_destroy_mem(ctx, input_mems[0]);
      rknn_destroy(ctx);
      free(model);
      
      
      • 1
      • 2
      • 3
      • 4

    在这里插入图片描述

    速度对比

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

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

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

  • 相关阅读:
    Generalization
    java计算机毕业设计ssm在线教学管理系统
    Leetcode101. 对称二叉树
    历时7天,四名学生将《水浒传》搬到线上!
    uni-app入门:HBuilderX安装与项目创建
    树结构重组 根据code与parentCode拼装树结构
    计算机毕业设计Java教学视频平台系统(源码+系统+mysql数据库+lw文档)
    155. 最小栈【73】
    Ubuntu下jax安装与使用
    MegLab 新能力“老番动漫超画质”上线,支持渣画质一键焕新
  • 原文地址:https://blog.csdn.net/qq_42178122/article/details/132722582