RV1126预编译模型:减少加载时间,提升推理速度的最佳实践

1 介绍

本文将以 MobileNetV2 模型为例,详细介绍如何在 RV1126 平台上完成预编译工作,帮助开发者高效地部署深度学习模型。通过这篇教程,您将了解如何在 RV1126 上进行环境配置、模型编译、以及如何将预编译后的模型进行推理操作。

2 RV1126预编译的技术优势

  • 减少加载时间:通过预编译,模型加载时间大幅缩短,提升应用响应速度。
  • 优化资源消耗:预编译后,模型更紧凑,占用内存更少,提升硬件利用率。
  • 提升推理效率:优化推理过程,减少推理延迟,提升整体性能。
  • 稳定性与可靠性:避免运行时编译带来的错误,保证系统的稳定性。

3 预编译步骤

3.1 环境准备

  • 物理机环境:Ubuntu 18.04 x86_64
  • RKNN版本
    • rknn-toolkit版本:1.7.5
    • rknpu驱动版本:1.7.3
  • 交叉编译环境:gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
    在这里插入图片描述

如果驱动版本不满足要求:则参考此篇文章【驱动版本升级】完成对开发板驱动版本的升级。

3.2 模型转换

1、切换到rv1126的环境:

conda activate rv1126

2、使用参考代码执行以下命令:

# python test.py [target] [device_id]
python test.py rv1126 905d17c82d2c9bd3

3、执行结束则终端成功打印:
在这里插入图片描述

3.3 模型预编译

1、执行预编译的python脚本:

python export_rknn_precompile_model.py /home/ros/Downloads/project/deployed/rk/rv1126/rknn-toolkit-1.7.5/examples/caffe/mobilenet_v2/mobilenet_v2.rknn /home/ros/Downloads/project/deployed/rk/rv1126/rknn-toolkit-1.7.5/examples/caffe/mobilenet_v2/mobilenet_v2.hw.rknn rv1126 905d17c82d2c9bd3

2、执行结束则终端成功打印:
在这里插入图片描述

3.4 预编译模型测试

1、使用rknn_model_zoo中的MobileNet代码,执行以下命令:

./build-linux.sh -t rv1126 -a armhf -d mobilenet

2、将编译生成的可执行文件推送至板端:

adb push install /userdata/rknn_model_zoo

3、执行推送的可执行文件:

export LD_LIBRARY_PATH=./lib
./rknn_mobilenet_demo ./model/mobilenet_v2.rknn model/bell.jpg

4、执行成功后,终端显示结果如下:

4 效率对比

4.1 测试方法

分别使用没有预编译的模型和使用预编译的模型测试10次,观察模型初始化的时间对比。

4.2 测试结果
在这里插入图片描述

5 报错集合

1、注意在模型预编译时,不能使用mini driver进行模型转换,否则会报错:MODEL INVALID!
在这里插入图片描述

2、在更新驱动后,如果使用没有预编译的模型,则会报错:
在这里插入图片描述

3、使用rknn-toolkit1.7.5模型预编译时,rknn.release报错:
源码:

def __del__(self):
    if self.rknn_log is not None and 'logging' in globals()['sys'].modules:
        print("self.rknn_log :{}".format(self.rknn_log))
        for log_handler in self.rknn_log.logger.handlers:
            if isinstance(log_handler, globals()['sys'].modules['logging'].FileHandler):
                log_handler.close()
                self.rknn_log.logger.removeHandler(log_handler)

更新后源码:

def __del__(self):
    if hasattr(self, 'rknn_log') and self.rknn_log is not None:
        logger = self.rknn_log.logger
        if logger is not None:
            print("Logger exists and has handlers")
            for log_handler in logger.handlers[:]:
                if isinstance(log_handler, logging.FileHandler):
                    try:
                        log_handler.close()
                        logger.removeHandler(log_handler)
                    except Exception as e:
                        print(f"Error while cleaning up log handler: {e}")
        else:
            print("Logger is None")

6 技术交流

6.1 QQ交流:

  • RKNN非官方交流:909472035
### 部署深度强化学习模型RV1126平台 #### RV1126硬件特性概述 RV1126是一款专为低功耗、高性能计算设计的嵌入式处理器,适用于边缘计算场景下的多种人工智能应用。该芯片集成了神经网络处理单元(NPU),能够高效支持卷积神经网络(CNN)和其他类型的机器学习模型推理。 #### 准备工作环境 为了顺利部署深度强化学习模型RV1126设备,在开发主机上需安装必要的软件包和配置相应的编译工具链。具体操作如下: - 安装交叉编译器GCC ARM Embedded Toolchain用于构建适合ARM架构的目标文件; - 下载并设置好RV1126 SDK,其中包含了针对特定硬件优化过的库函数以及示例程序; - 使用Python虚拟环境隔离项目依赖项,并通过pip命令安装额外所需的第三方模块如TensorFlow Lite等轻量化框架[^1]; ```bash # 创建并激活新的Python虚拟环境 python3 -m venv env_rv1126 source env_rv1126/bin/activate # 更新pip版本 pip install --upgrade pip setuptools wheel # 安装tensorflow-lite解释器以及其他辅助工具 pip install tflite-runtime numpy opencv-python matplotlib scikit-image ``` #### 转换训练好的模型 由于原始训练得到的是基于GPU服务器上的全精度浮点数表示形式(.h5,.pb),而RV1126内部NPU仅能识别整型或混合精度格式(TFLITE,ONNX).因此需要借助官方提供的转换脚本将源模型转化为适配目标平台的数据结构. 对于已经完成离线训练过程获得的最佳参数组合checkpoint file (.pth/.pt): ```python import torch from torchvision import models model = models.resnet18(pretrained=False) model.load_state_dict(torch.load('best_model.pth')) dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model,dummy_input,"resnet18.onnx",opset_version=11, do_constant_folding=True,input_names=['input'],output_names=['output']) ``` 接着利用`onnx-simplifier`, `tvm.relay.frontend.from_onnx()` 或者其他开源项目进一步简化Onnx graph定义,最终导出成TFlite FlatBuffer二进制流供后续加载解析: ```shell !pip install onnxsim==0.3.9 !python -m onnxsim resnet18.onnx simplified_resnet18.onnx ``` 最后一步则是调用`tflite_convert`接口实现从Simplified Onnx Model向Target Format TFlite File转变: ```shell tflite_convert \ --saved_model_dir=simplified_resnet18.onnx \ --output_file=resnet18.tflite \ --input_shapes=1,3,224,224 \ --inference_type=FLOAT \ --input_arrays=input \ --output_arrays=output ``` #### 编写C++代码集成TFLite Interpreter API 当准备好经过量化的Lite版Model之后就可以着手编写实际运行于裸机端的应用逻辑了。这里给出一段简单的模板作为参考说明如何初始化解释器实例、分配张量内存空间并将输入数据填充进去等待预测结果返回。 ```cpp #include <iostream> #include "tensorflow/lite/interpreter.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/model.h" int main() { // 加载已保存下来的Flatbuffer Buffer对象 std::unique_ptr<tflite::FlatBufferModel> model = tflite::FlatBufferModel::BuildFromFile("resnet18.tflite"); if (!model){ fprintf(stderr,"Failed to mmap model\n"); return EXIT_FAILURE; } // 构建默认Op Resolver来注册内置算子集合 tflite::ops::builtin::BuiltinOpResolver resolver; // 新建Interpreter Builder负责组装整个Graph拓扑关系图谱 std::unique_ptr<tflite::Interpreter> interpreter; auto builder_status=model->NewInterpreter(&resolver,&interpreter); if(!builder_status.ok()){ printf("Failed to construct interpreter:%s\n", builder_status.message().c_str()); return EXIT_FAILURE; } // 设置Input Tensor Shape Info & Allocate Memory Space Automatically TfLiteStatus allocate_tensors_status=interpreter->AllocateTensors(); if (allocate_tensors_status != kTfLiteOk){ printf("Failed to allocate tensors.\n"); return EXIT_FAILURE; } float* input_tensor_data= interpreter->typed_input_tensor<float>(0); /* 填充具体的像素值 */ for(int i=0;i<224 * 224 * 3;++i){ input_tensor_data[i]=/* ... */; } // 执行前馈传播运算获取Output Feature Maps interpreter->Invoke(); const float* output_tensor_data= interpreter->typed_output_tensor<float>(0); /* 处理输出层产生的分类得分 */ } ``` #### 测试验证效果 上传上述工程产物至板级资源管理器后执行编译链接流程生成可执行映像文件`.elf`。连接串口调试助手监视日志打印情况确认无误后再断开电源重启进入正式测试环节观察实时性能指标变化趋势是否满足预期要求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yao.Li

爱的魔力,一被卡布奇诺~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值