1. RKNN简介

RKNN是Rockchip推出的一款深度学习框架,用于在Rockchip平台上进行深度学习模型的部署和推理。RKNN支持多种深度学习框架,包括TensorFlow、PyTorch、ONNX等。

1.1 RKNN工具链介绍

1.1.1 RKNN软件栈整体介绍

RKNN软件栈可以帮助用户快速的将AI模型部署到Rockchip芯片。整体的框架如下:

为了使用 RKNPU,用户需要首先在计算机上运行RKNN-Toolkit2工具,将训练好的模型转换为RKNN格式模型,之后使用 RKNN C APIPython API在开发板上进行部署。

1.1.2 RKNN-Toolkit2功能介绍

RKNN-Toolkit2是为用户提供在计算机上进行模型转换、推理和性能评估的开发套件,RKNN-Toolkit2的主要框图如下:

通过该工具提供的Python接口可以便捷地完成以下功能:

  1. 模型转换:支持将PyTorch、ONNX、TensorFlow、TensorFlow Lite、Caffe、DarkNet等模型转为RKNN模型。

  2. 量化功能:支持将浮点模型量化为定点模型,并支持混合量化。

  3. 模型推理:将RKNN模型分发到指定的NPU设备上进行推理并获取推理结果;或在计算机上仿真NPU运行RKNN模型并获取推理

  4. 性能和内存评估:将RKNN模型分发到指定NPU设备上运行,以评估模型在实际设备上运行时的性能和内存占用情况。

  5. 量化精度分析:该功能将给出模型量化后每一层推理结果与浮点模型推理结果的余弦距离和欧氏距离,以便于分析量化误差是如何出现的,为提高量 化模型的精度提供思路。

  6. 模型加密功能:使用指定的加密等级将RKNN模型整体加密。

1.1.3 RKNN Runtime功能介绍

RKNN Runtime负责加载RKNN模型,并调用NPU驱动实现在NPU上推理RKNN模型。推理RKNN模型时,包括原始数据输入预处理、NPU运行模型、输出后处理三项流程。根据不同模型输入格式和量化方式,RKNN Runtime提供通用API和零拷贝API两种处理流程。

  • 通用API推理

    提供一套简洁、无门槛的推理API,易于使用。如下图所示,其中对数据的归一化、量化、数据排布格式转换、反量化等均在CPU上运行,模型本身的推理在NPU上运行。

  • 零拷贝API推理

    优化了通用API的数据处理流程,归一化、量化和模型推理都会在NPU上运行,NPU输出的数据排布格式和反量化过程在CPU或者NPU上运行。零拷贝API对于输入数据流程的处理效率会比通用API高,支持数据在不同的IP核之间流动,没有数据拷贝,减少CPU及DDR带宽消耗。比如通过camera或者解码出来的数据,支持零拷贝导入到NPU中使用。

:::info 提示 当用户输入数据只有虚拟地址时,只能使用通用API接口;当用户输入数据有物理地址或fd时,两组接口都可以使用。 :::

1.2 RKNN开发流程介绍

用户可参考如下流程图了解RKNN的整体开发步骤,流程主要分为3个部分:模型转换、模型评估和板端部署运行。

  1. 模型转换

    • 在这一阶段,原始的深度学习模型会被转化为RKNN格式,以便在RKNPU平台上进行高效的推理。这一阶段包括以下5个步骤:

      • 获取原始模型:获取或训练深度学习模型,建议使用主流框架,如ONNX、PyTorch或TensorFlow。

      • 模型配置:在RKNN-Toolkit2中进行必要的配置,如归一化参数、量化参数和目标平台等。

      • 模型加载:使用适当的加载接口将模型导入RKNN-Toolkit2,根据模型框架选择正确的加载接口。

      • 模型构建:通过rknn.build()接口构建RKNN模型,可选择是否进行量化,提高模型在硬件上推理的性能。

      • 模型导出:通过rknn.export_rknn()接口将RKNN模型导出成一个文件(.rknn格式),用于后续部署。

    具体内容请见3.1和4.2.1章节内容

  2. 模型评估

    • 该阶段的主要目标是评估模型推理结果的准确性、推理性能和内存占用等关键指标。评估的主要步骤如下:

      • 模型连板调试:使用Python连接RKNPU平台对模型进行推理并验证结果准确性。这个阶段涵盖了输入数据的前处理和输出结果的后处理,以确保模型在板上运行正确。

      • 精度评估:通过rknn.accuracy_analysis()接口,比较量化模型与浮点模型推理结果之间的差异,以分析量化误差的来源。

      • 性能评估:通过rknn.eval_perf()接口,分析模型在RKNPU平台上的推理性能,帮助用户进一步优化模型结构,加快推理性能。

      • 内存评估:通过rknn.eval_memory()接口,了解模型在RKNPU平台上的内存使用情况,帮助用户进一步优化模型结构,最小化内存用。

    具体内容请参考3.2、3.3、4.2.2和4.2.3章节内容。

  3. 板端部署运行

    • 这个阶段涵盖了模型的实际部署和运行。它通常包括以下步骤:

      • 模型初始化:加载RKNN模型到RKNPU平台,准备进行前处理。

      • 模型前处理:加载待推理数据到RKNPU平台,准备进行推理。

      • 模型推理:执行推理操作,将输入数据传递给模型并获取推理结果。

      • 模型后处理:获取推理结果进行后处理,后处理结果传给应用端。

      • 模型释放:在完成推理流程后,释放模型资源,以便其他任务使用RKNN模型。

    具体内容请参考3.4和4.2章节内容。

这三个步骤构成了完整的RKNN开发流程,确保人工智能模型能够成功转换、调试、评估和最终在RKNPU上高效部署。

1.3 适用的硬件平台

本文档适用如下硬件平台: RK2118、RK3562、RK3566系列、RK3568系列、RK3576、RK3588系列、RV1103、RV1103B、RV1106、RV1106B :::info 提示 文档部分地方使用RK3566_RK3568来统一表示RK3566/RK3568系列,使用RK3588来统一表示RK3588/RK3588S系列。 :::

1.4 关键字说明

  • RKNN模型:指运行在RKNPU上的模型文件,后缀名为.rknn。

  • 连板推理:指通过USB口连接PC和开发板,调用RKNN-Toolkit2的接口运行模型。模型实际运行在开发板的NPU上。

  • DRM:英文全名Direct Rendering Manager,是一个主流的图形显示框架。

  • NATIVE_LAYOUT:指对于NPU运行时而言,通常性能表现最佳的计算机内存排列格式。

  • tensor:张量,在深度学习中,用它表示高阶数组的数据。

  • fd:文件描述符,被用来标识一块内存空间。

  • i8模型:量化的RKNN模型,即以8位有符号整型数据运行的模型。

  • fp16模型:非量化的RKNN模型,即以16位半精度浮点型数据运行的模型。