首页
商城
  • English
  • 简体中文
首页
商城
  • English
  • 简体中文
  • 产品系列

    • FPGA+ARM

      • GM-3568JHF

        • 一、简介

          • GM-3568JHF 简介
        • 二、快速开始

          • 00 前言
          • 01 环境搭建
          • 02 编译说明
          • 03 烧录指南
          • 04 调试工具
          • 05 软件更新
          • 06 查看信息
          • 07 测试命令
          • 08 应用编译
          • 09 源码获取
        • 三、外设与接口

          • 01 USB
          • 02 显示与触摸
          • 03 以太网
          • 04 WIFI
          • 05 蓝牙
          • 06 TF-Card
          • 07 音频
          • 08 串口
          • 09 CAN
          • 10 RTC
        • 四、应用开发

          • 01 UART读写案例
          • 02 按键检测案例
          • 03 LED灯闪烁案例
          • 04 MIPI屏幕检测案例
          • 05 读取 USB 设备信息案例
          • 06 FAN 检测案例
          • 07 FPGA FSPI 通信案例
          • 08 FPGA DMA 读写案例
          • 09 GPS调试案例
          • 10 以太网测试案例
          • 11 RS485读写案例
          • 12 FPGA IIC 读写案例
          • 13 PN532 NFC读卡案例
          • 14 TF卡读写案例
        • 五、QT开发

          • 01 ARM64交叉编译器环境搭建
          • 02 QT 程序加入开机自启服务
        • 六、RKNN_NPU开发

          • 01 RK3568 NPU 概述
          • 02 开发环境搭建
          • 运行官方 YOLOv5 示例
        • 七、FPGA开发

          • ARM与FPGA通讯
          • FPGA开发手册
        • 八、其他

          • 01 根目录文件系统的修改
          • 02 系统自启服务
        • 九、资料下载

          • 资料下载
    • ShimetaPi

      • M4-R1

        • 一、简介

          • M4-R1简介
        • 二、快速上手

          • 01 OpenHarmony概述
          • 02 镜像烧录
          • 03 应用开发快速上手
          • 04 设备开发快速上手
        • 三、应用开发

          • 01 ArkUI

            • 1 ArkTS语言简介
            • 2 UI 组件-Row 容器介绍
            • 3 UI 组件-Column 容器介绍
            • 4 UI 组件-Text 组件
            • 5 UI 组件-Toggle 组件
            • 6 UI 组件-Slider 组件
            • 7 UI 组件-Animation 组件&Transition 组件
          • 02 资料获取

            • 1 OpenHarmony 官方资料
          • 03 开发须知

            • 1 Full-SDK替换教程
            • 2 引入和使用三方库
            • 3 HDC调试
            • 4 命令行恢复出厂模式
            • 5 升级App为system权限
          • 04 构建第一个应用

            • 1 构建第一个ArkTs应用-HelloWorld
          • 05 案例

            • 01 串口调试助手应用案例
            • 02 手写板应用案例
            • 03 数字时钟应用案例
            • 04 WIFI 信息获取应用案例
        • 四、设备开发

          • 1 Ubuntu环境开发

            • 01 环境搭建
            • 02 下载源码
            • 03 编译源码
          • 2 使用DevEco Device Tool 工具

            • 01 工具简介
            • 02 开发环境的搭建
            • 03 导入SDK
            • 04 HUAWEI DevEco Tool 功能介绍
        • 五、内核外设与接口

          • 01 指南
          • 02 设备树介绍
          • 03 NAPI 入门
          • 04 ArkTS入门
          • 05 NAPI开发实战演示
          • 06 GPIO介绍
          • 07 I2C通讯
          • 08 SPI通信
          • 09 PWM 控制
          • 10 串口通讯
          • 11 TF卡
          • 12 屏幕
          • 13 触摸
          • 14 Ethernet(以太网)
          • 15 M.2 硬盘
          • 16 音频
          • 17 WIFI & BT
          • 18 摄像头
        • 六、资料下载

          • 资料下载
      • M4-R2

        • 一、产品简介

          • M4-R2 产品简介
        • 二、快速上手

          • 快速上手
        • 三、Android 系统

          • 1 快速上手

            • Android系统烧录与启动
            • 开发环境搭建
            • ADB调试与日志分析
            • SDK下载与编译环境搭建
            • Android系统基础操作
          • 2 SDK 编译

            • Android_SDK编译
            • Android构建系统与增量编译
          • 3 系统开发

            • Android系统定制
          • 4 应用开发

            • Android应用开发入门
            • Android JNI开发
          • 5 驱动与 HAL

            • Android HAL开发
          • 6 AI 与 NPU

            • Android NPU使用指南
        • 四、硬件参考

          • 核心板参数
          • 底板接口定义
          • 40PIN引脚定义
          • 电源管理
        • 五、常见问题与故障排除

          • 系统启动问题
          • 外设驱动问题
          • 网络连接问题
          • 显示问题
          • 常见编译错误
        • 六、应用方案参考

          • 智能显示终端方案
          • 边缘AI计算方案
          • 工业控制方案
          • NVR安防监控方案
          • 智能家居网关方案
        • 七、资料下载

          • 资料下载
      • M5-R2A

        • 一、产品简介

          • M5-R2A 产品简介
        • 二、快速上手

          • 系统烧录指南
          • 开发环境搭建
          • 快速上手
          • SDK下载与编译环境搭建
        • 四、Debian/Ubuntu 系统

          • 1 快速上手

            • 系统启动与基础操作
            • 网络配置与SSH
            • 软件包管理与更新
            • Debian 与 Ubuntu 镜像差异
          • 2 系统开发

            • Linux SDK编译
            • 内核配置与裁剪
            • 设备树详解与实践
            • 根文件系统构建
          • 3 外设驱动开发

            • GPIO驱动与控制
            • I2C驱动开发
            • SPI驱动开发
            • UART串口驱动
            • PWM驱动
            • ADC驱动
            • CAN/CAN-FD驱动
            • USB主机与设备驱动
            • SDMMC/eMMC驱动
            • 以太网GMAC驱动
            • 音频驱动
            • 摄像头Camera驱动
            • 触摸屏驱动
            • 显示DRM驱动
            • HDMI显示驱动
            • PCIe驱动
            • WiFi/蓝牙驱动
            • 看门狗WDT驱动
            • 热敏传感器THERMAL驱动
          • 4 应用开发

            • C/C++应用开发入门
            • Python应用开发
            • Qt嵌入式开发实战
            • GStreamer多媒体开发
            • 网络编程与应用
            • 文件系统与存储
          • 5 AI 与 NPU

            • NPU架构与性能概览
            • RKNN Toolkit2安装与使用
            • 模型转换与量化
            • 分类模型部署(LeNet/ResNet)
            • 目标检测部署(YOLOv5/v7/v8)
            • 语义分割部署
            • 人脸检测与识别
            • OCR文字识别
            • NPU性能调优与调试
          • 6 多媒体

            • 显示框架
            • 摄像头应用
            • 视频编解码(MPP)
            • 音频开发与ALSA
            • RGA图像处理
          • 7 性能优化与调试

            • 系统启动时间优化
            • CPU/GPU/NPU调优
            • 内存与存储优化
            • 功耗分析与优化
            • 调试工具使用指南
          • 8 高级主题

            • 安全启动与加密
            • OTA远程升级
            • Docker容器部署
            • ROS/ROS2机器人开发
            • RTOS与Linux协同
        • 五、Android 系统

          • 1 快速上手

            • Android系统烧录与启动
            • Android系统基础操作
            • ADB调试与日志分析
          • 2 SDK 编译

            • Android SDK编译
            • Android构建系统与增量编译
          • 3 系统开发

            • Android系统定制
          • 4 应用开发

            • Android应用开发入门
            • Android JNI开发
          • 5 驱动与 HAL

            • Android HAL开发
          • 6 AI 与 NPU

            • Android NPU使用指南
        • 六、硬件参考

          • 核心板参数
          • 底板接口定义
          • 40PIN引脚定义
          • 电源管理
        • 七、资料下载

          • 资料下载
      • Pico-G1

        • 一、产品概述

          • 01 产品介绍
          • 02 SDK版本基本信息
        • 二、快速入门

          • 01 开发环境搭建
          • 02 镜像编译
          • 03 镜像烧录
          • 04 系统登录
          • 05 网络配置
          • 06 文件传输
          • 07 SDK目录结构
          • 08 部署第一个应用程序
          • 09 部署第一个驱动程序
          • 10 SD卡挂载
        • 三、外设与接口

          • 01 GPIO控制
          • 02 UART串口通信
          • 03 I2C 通信
          • 04 SPI 通信
        • 四、MPP媒体开发

          • 01 MPP媒体处理软件
          • 02 图像处理链路
          • 03 视频输入
          • 04 图像编码
        • 五、NPU与AI

          • 01 NPU驱动与运行库架构
          • 02 .xmm 模型加载
          • 03 SVP视频处理
          • 04 AI降噪 (AI_NR)
        • 六、应用程序示例

          • 01 加解密接口应用
          • 02 ADC 采集应用
          • 03 低功耗应用
          • 04 音频处理应用
          • 05 视频编码应用
          • 06 视频输入应用
          • 07 视频图形子系统应用
          • 08 区域叠加应用
          • 09 智能视频引擎应用
          • 10 UVC 网络摄像头应用
          • 11 综合快速演示应用
          • 12 FPN 校正应用
          • 13 区域运动检测应用
          • 14 MTCNN 人脸检测应用
        • 七、扩展板外设功能例程

          • 00 - Pico 扩展板外设功能例程总览
          • 01 - OLED 显示应用
          • 02 - TFT 显示应用
          • 03 - MPU6050 陀螺仪应用
          • 04 - ADC 采集应用
          • 05 - 无源蜂鸣器应用
          • 06 - MQ 气体传感器应用
          • 07 - GPS 定位应用
          • 08 - SHT20 温湿度应用
          • 09 - 超声波测距应用
          • 10 - SPO2 血氧传感器应用
          • 11 - 电机控制应用
          • 12 - 舵机控制应用
    • 开源鸿蒙

      • SC-3568HA

        • 一、简介

          • SC-3568HA简介
        • 二、快速上手

          • OpenHarmony概述
          • 镜像烧录
          • 开发环境准备
          • Hello World应用以及部署
        • 三、应用开发

          • ArkUI

            • 第一章 ArkTS语言简介
            • 第二章 UI组件介绍和实际应用(上)
            • 第三章 UI组件介绍和实际应用(中)
            • 第四章 UI组件介绍和实际应用(下)
          • 拓展

            • 第一章 入门指引
            • 第二章 三方库的引用和使用
            • 第三章 应用编译以及部署
            • 第四章 命令行恢复出厂设置
            • 第五章 系统调试--HDC调试
            • 第六章 APP 稳定性测试
            • 第七章 应用测试
        • 四、设备开发

          • 第一章 环境搭建
          • 第二章 下载源码
          • 第三章 编译源码
        • 五、内核的外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
          • 树莓派拓展板
        • 六、资料下载

          • 资料下载
      • M-K1HSE

        • 一、简介

          • M-K1HSE 简介
        • 二、快速开始

          • 开发环境搭建
          • 源码获取
          • 编译说明
          • 烧录指南
        • 三、应用开发

          • 00 应用开发环境搭建
          • 01 第一个应用-Hello World
        • 四、外设与接口

          • 01 Audio
          • 02 RS485
          • 03 Display
        • 五、系统定制开发

          • 系统移植
          • 系统定制
          • 驱动开发
          • 系统调试
          • OTA升级
        • 六、资料下载

          • 资料下载
    • HVS视觉融合相机

      • 快速开始

        • 01 SDK 介绍
        • 02 资料下载
        • 03 设备固件烧录
        • 04 第一个 C++ 程序
        • 05 第一个 Python 程序
        • 06 Python 数据分析
        • 07 MultiVision Studio
        • 08 版本介绍
      • 二次开发

        • 01 编程指引

          • 01 打开相机
          • 02 读取事件
          • 03 录制与回放
          • 04 事件处理
          • 05 显示与可视化
          • 06 调参
          • 07 采集 APS 图像
          • 08 帧率切换
          • 09 时间戳同步
        • 02 Toolkit SDK

          • 01 Hybrid Vision Toolkit
          • 02 快速上手
          • 03 C++ API
          • 04 Python API
        • 03 Algo SDK

          • 01 Hybrid Vision Algo
          • 02 Algo API
          • 03 Windows Algo SDK
        • 04 USB数据协议
        • 05 示例程序总览
        • 06 应用场景
      • 基础知识

        • 01 事件相机基础原理
        • 02 HVS 融合视觉
        • 03 事件可视化
        • 04 数据格式参考
        • 05 术语表
        • 06 偏置与调参
        • 07 视频教程
      • HVS 相机

        • 01 HVS 相机快速上手
        • 02 网络化能力

          • 01 HVS 相机系统架构
          • 2 EVS Network Server
          • 3 EVS Time Sync
          • 4 Web Window
        • 03 HVS 相机兼容性矩阵
        • 04 常见问题解决指南
        • 05 产品

          • CF-NRS1(灵光一号视觉融合相机)
      • HVS 模块

        • 01 MIPI 模块快速上手
        • 02 载板适配

          • RDK X5 载板适配
          • RDK S100 载板适配
          • 树莓派载板适配
          • shimetapi 板载板适配
        • 03 MIPI 模块兼容性矩阵
        • 04 产品

          • EVS_003 传感器模块
    • AI硬件

      • 1684XB-32T

        • 一、简介

          • AIBOX-1684XB-32简介
        • 二、快速上手

          • 初次使用
          • 网络配置
          • 磁盘使用
          • 内存分配
          • 风扇策略
          • 固件升级
          • 交叉编译
          • 模型量化
        • 三、应用开发

          • 开发简介

            • Sophgo SDK开发
            • SOPHON-DEMO简介
          • 大语言模型

            • 部署Llama3示例
            • Sophon LLM_api_server开发
            • 部署MiniCPM-V-2_6
            • Qwen-2-5-VL图片视频识别DEMO
            • Qwen3-chat-DEMO
            • Qwen3-Qwen Agent-MCP开发
            • Qwen3-langchain-AI Agent
          • 深度学习

            • ResNet(图像分类)
            • LPRNet(车牌识别)
            • SAM(通用图像分割基础模型)
            • YOLOv5(目标检测)
            • OpenPose(人体关键点检测)
            • PP-OCR(光学字符识别)
        • 四、资料下载

          • 资料下载
      • 1684X-416T

        • 简介

          • AIBOX-1684X-416简介
        • Demo简单操作指引

          • shimeta智慧监控demo的简单使用说明
      • RDK-X5

        • 简介

          • RDK-X5 硬件简介
        • 快速开始

          • RDK-X5 快速开始
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-颜色识别检测
            • 实验03-手势识别体验
            • 实验04-YOLOv5物体检测
      • RDK-S100

        • 简介

          • RDK-S100 硬件简介
        • 快速开始

          • RDK-S100 硬件简介
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-图像处理基础
            • 实验03-目标检测
            • 实验04-图像分割
      • AIBOX-M88(RK1828)

        • 一、简介

          • AIBOX-M88(RK1828) - 产品介绍
          • AIBOX-M88(RK1828) 硬件规格
          • AIBOX-M88(RK1828) 使用与安全
        • 二、快速开始

          • AIBOX-M88(RK1828) 镜像烧录
          • RK182X 硬件安装与验证
          • RK182X 开发环境快速搭建
          • RK182X SDK 总览
          • RK182X 环境搭建详解
          • RK182X 快速开始
          • 原厂 SDK 资料抽取记录
        • 三、开发指南

          • ClawChips 架构与原理
          • SKILL 使用手册
          • RK182X系列LLM推理(RK1828型号)
          • RK182X系列CNN推理(RK1828型号)
          • 模型转换
          • RK182X AI Agent 应用开发指南
          • RK182X 工业异常检测应用
        • 四、SDK 参考

          • RKNN3-SDK 概述

            • RKNN3 SDK 概述
          • RKNN3-Toolkit

            • RKNN3 Toolkit 安装与使用
          • RKLLM

            • RKLLM 设备端 LLM 推理
          • RK182X系列 NPU 概述与架构(RK1828型号)
          • RK182X INT8 量化推理部署
          • RK182X MPP 多媒体处理框架
          • MPP 详解

            • RK182X 视频解码
            • RK182X 视频编码
          • NPU 详解

            • RKNN 模型转换
            • RK182X NPU INT8 量化推理
            • RK182X 多模型并行推理
          • RGA 详解

            • RK182X RGA 2D 图形加速
          • VPU 详解

            • RK182X VPU 编解码
        • 五、硬件参考

          • RK182X系列 硬件架构概述(RK1828型号)
          • RK182X 引脚定义与复用配置
          • RK182X 引脚定义
          • RK182X 电源管理
          • RK182X 时钟与 PLL 配置
          • RK182X 时钟与频率配置
        • 六、实战教程

          • Hello World
          • Hello RK1828 - 第一个程序
          • RTSP 推流
          • RTSP 推流 + AI 分析
          • 视美泰AI龙虾一键部署
          • PaddleOCR-VL 文字识别
          • Qwen3-1.7B LLM 文本对话
          • AI 巡检多视角(Qwen3-VL 包装)
          • YOLOv5 目标检测
        • 七、资料下载

          • 资料下载
        • 八、常见问题

          • 常见问题
    • 核心板

      • C-3568BQ

        • 简介

          • C-3568BQ 简介
      • C-3588LQ

        • 简介

          • C-3588LQ 简介
      • GC-3568JBAF

        • 简介

          • GC-3568JBAF 简介
      • C-K1BA

        • 简介

          • C-K1BA 简介
    • 软件平台

      • ShiMetaPi Workbench

        • 一、产品简介

          • 产品概述
          • 核心架构
          • 功能入口
          • 支持的硬件
          • 版本说明
        • 二、快速入门

          • 安装与登录
          • 连接设备
          • 配置环境
          • 接入 AIHub
          • 首次调用模型
        • 三、用户指南

          • 工作区总览
          • 设备管理
          • 模型广场
          • 一键部署
          • 视觉 - SVP
          • 视觉 - 自定义模型
          • shimeta-py IDE
          • 终端
          • Agent 调试助手
          • 设置与资源
        • 四、常见问题

          • 安装与登录
          • 设备连接
          • 模型与部署
          • 视觉与运行时
          • 设置与其他
      • ShimetaPi软件源

        • 简介

          • ShimetaPi 软件源
        • Pico G1 (GK7206)

          • 快速开始

            • 安装与首次推理
            • shimeta_infer — 图片推理
            • shimeta_camera — 摄像头实时推理
            • SVP 场景检测
            • 文件传输与内置模型参考
            • 常见问题
          • HTTP API & Python SDK

            • HTTP API 参考
      • 模型微调训练平台

        • 一、平台介绍

          • 模型训练平台
        • 二、快速上手

          • 注册与登录
          • 创建第一个模型(30 分钟快速体验)
        • 三、训练指南

          • 数据准备与标注
          • 训练参数配置
          • 启动与监控训练
          • 模型评估与测试
        • 四、模型部署

          • 导出模型
          • 部署到边缘设备

NPU 性能调优与调试

1. 概述

1.1 功能简介

RK3588 内置 6 TOPS 算力的 NPU(Neural Network Processing Unit,专门跑神经网络的加速器;TOPS 是每秒万亿次运算的算力单位),包含 3 个独立 NPU 核心,每个核心提供约 2 TOPS 算力。NPU 支持 INT8、FP16 等多种数据格式,可高效运行卷积神经网络、目标检测、图像分割等深度学习推理任务。

本文档介绍 NPU 性能评估方法、调优技巧、调试工具和常见性能问题的解决方案,帮你把 RK3588 NPU 的推理能力用满。

1.2 应用场景

场景说明
模型性能评估对比不同模型在 NPU 上的推理延迟和吞吐量
推理延迟优化减少单帧推理时间,满足实时性要求
吞吐量提升提高单位时间内处理的帧数
内存占用优化降低模型和推理过程的内存消耗
功耗控制在满足性能需求的前提下降低 NPU 功耗

1.3 工作原理

调优的整体思路是先找到瓶颈、再对症下药:

NPU 性能调优流程:
  1. 模型分析      → 识别性能瓶颈(CPU 预处理 / NPU 推理 / 数据搬运)
  2. 量化优化      → INT8 量化减小模型体积,FP16 平衡精度与速度
  3. 核心分配      → 利用 3 个 NPU 核心并行处理
  4. 内存优化      → 减少 CPU-NPU 之间的数据拷贝
  5. 性能验证      → Benchmark 测试确认优化效果

1.4 NPU 核心架构

RK3588 NPU 架构:
  ┌─────────────────────────────────────────┐
  │              6 TOPS NPU                 │
  │  ┌───────────┬───────────┬───────────┐  │
  │  │ NPU_CORE_0│ NPU_CORE_1│ NPU_CORE_2│  │
  │  │  ~2 TOPS  │  ~2 TOPS  │  ~2 TOPS  │  │
  │  └───────────┴───────────┴───────────┘  │
  │         共享内存 / DMA-BUF              │
  └─────────────────────────────────────────┘

  调度模式:
    单核模式:  NPU_CORE_0              → ~2 TOPS
    双核模式:  NPU_CORE_0_1            → ~4 TOPS
    三核模式:  NPU_CORE_0_1_2          → ~6 TOPS

2. 硬件准备

组件型号说明
核心板C-3588LQRK3588 主芯片,含 6 TOPS NPU
底板SHIMETAPI-M5-R2A外设接口扩展
数量1 套—

3. 软件准备

3.1 安装 RKNN 工具链

PC 端装 Toolkit2 做模型转换,设备端装 Lite2 做推理:

# 安装 RKNN Toolkit2(PC 端模型转换)
pip3 install rknn-toolkit2

# 安装 RKNN Lite2(设备端推理运行时)
sudo pip3 install --break-system-packages rknn-toolkit-lite2==2.3.2

3.2 安装辅助依赖

pip3 install numpy opencv-python psutil

3.3 验证安装

能打印出版本号就说明安装成功:

from rknnlite.api import RKNNLite

rknn = RKNNLite()
print('RKNN Lite2 版本:', rknn.get_sdk_version())
rknn.release()

4. 操作步骤

4.1 NPU 性能基准测试

先做基准测试,心里有数再谈优化。下面的脚本对单核、双核、三核三种模式各跑 100 次推理,输出平均、最小、最大延迟和 FPS:

from rknnlite.api import RKNNLite
import time
import numpy as np


def benchmark(model_path, input_shape, core_mask, num_runs=100):
    """
    NPU 性能基准测试

    参数:
        model_path  : RKNN 模型路径
        input_shape : 输入张量形状,如 (1, 224, 224, 3)
        core_mask   : NPU 核心掩码
        num_runs    : 推理次数
    返回:
        包含 avg_ms, min_ms, max_ms, fps 的字典
    """
    rknn = RKNNLite()
    ret = rknn.load_rknn(model_path)
    if ret != 0:
        raise RuntimeError(f'加载模型失败: {model_path}')

    ret = rknn.init_runtime(core_mask=core_mask)
    if ret != 0:
        raise RuntimeError(f'初始化运行时失败: core_mask={core_mask}')

    # 构造随机输入
    dummy = np.random.randint(0, 255, input_shape, dtype=np.uint8)

    # 预热:消除首次推理的冷启动开销
    print('  预热中...')
    for _ in range(10):
        rknn.inference(inputs=[dummy])

    # 正式测试
    times = []
    for i in range(num_runs):
        start = time.time()
        outputs = rknn.inference(inputs=[dummy])
        elapsed = time.time() - start
        times.append(elapsed)

    rknn.release()

    avg_ms = np.mean(times) * 1000
    min_ms = np.min(times) * 1000
    max_ms = np.max(times) * 1000
    fps = 1000.0 / avg_ms

    return {
        'avg_ms': avg_ms,
        'min_ms': min_ms,
        'max_ms': max_ms,
        'fps': fps,
    }


def run_benchmark_suite():
    """运行不同核心模式的 Benchmark 对比"""
    model = 'resnet50.rknn'
    shape = (1, 224, 224, 3)

    core_modes = {
        'NPU_CORE_0':     RKNNLite.NPU_CORE_0,
        'NPU_CORE_0_1':   RKNNLite.NPU_CORE_0_1,
        'NPU_CORE_0_1_2': RKNNLite.NPU_CORE_0_1_2,
    }

    print('=' * 60)
    print('RK3588 NPU 性能基准测试')
    print('=' * 60)

    results = {}
    for mode_name, core_mask in core_modes.items():
        print(f'\n测试模式: {mode_name}')
        r = benchmark(model, shape, core_mask, num_runs=100)
        results[mode_name] = r
        print(f'  平均延迟: {r["avg_ms"]:.2f} ms')
        print(f'  最小延迟: {r["min_ms"]:.2f} ms')
        print(f'  最大延迟: {r["max_ms"]:.2f} ms')
        print(f'  吞吐量:   {r["fps"]:.1f} FPS')

    # 汇总对比
    print('\n' + '=' * 60)
    print('汇总对比:')
    print(f'{"模式":<20} {"平均(ms)":<12} {"FPS":<10}')
    print('-' * 42)
    for mode_name, r in results.items():
        print(f'{mode_name:<20} {r["avg_ms"]:<12.2f} {r["fps"]:<10.1f}')

    return results


if __name__ == '__main__':
    run_benchmark_suite()

下面的输出取自实机(mobilenetv2 224×224,100 次平均,RK3588 @1GHz,NPU 驱动 0.9.8 / librknnrt 2.3.2):

============================================================
RK3588 NPU 性能基准测试 [mobilenetv2 fp16]
============================================================
测试模式: NPU_CORE_0
  平均延迟: 7.03 ms   最小: 3.46 ms   最大: 11.85 ms   吞吐量: 142.2 FPS
测试模式: NPU_CORE_0_1
  平均延迟: 5.33 ms   吞吐量: 187.7 FPS
测试模式: NPU_CORE_0_1_2
  平均延迟: 4.62 ms   吞吐量: 216.3 FPS

============================================================
RK3588 NPU 性能基准测试 [mobilenetv2 INT8]
============================================================
测试模式: NPU_CORE_0
  平均延迟: 3.00 ms   最小: 2.63 ms   最大: 3.94 ms   吞吐量: 333.5 FPS
测试模式: NPU_CORE_0_1
  平均延迟: 2.25 ms   吞吐量: 444.4 FPS
测试模式: NPU_CORE_0_1_2
  平均延迟: 1.91 ms   吞吐量: 522.8 FPS

汇总表输出:

模型/精度单核双核三核INT8 vs fp16
mobilenetv2 fp167.03 ms / 142 FPS5.33 ms / 188 FPS4.62 ms / 216 FPS—
mobilenetv2 INT83.00 ms / 334 FPS2.25 ms / 444 FPS1.91 ms / 523 FPS三核下 2.4x

结论:多核收益随核数递减(fp16 单→三核 1.52x,INT8 单→三核 1.57x);INT8 量化对吞吐提升显著(2.3~2.4x)。

4.2 NPU 频率监控与调整

NPU 频率直接影响性能。查看和调整都走 devfreq(Linux 内核的设备调频接口):

# ---- 查看 NPU 当前频率(devfreq,无需 root,可用)----
cat /sys/class/devfreq/fdab0000.npu/cur_freq
# 输出: 1000000000  (即 1 GHz)

# ---- 查看可用频率档位----
cat /sys/class/devfreq/fdab0000.npu/available_frequencies
# 输出: 300000000 400000000 500000000 600000000 700000000 800000000 900000000 1000000000

# ---- 查看当前调频策略----
cat /sys/class/devfreq/fdab0000.npu/governor
# 输出: rknpu_ondemand

# ---- 手动锁频(需 root;governor 切 userspace 后写 min/max_freq)----
echo 123456 | sudo -S sh -c 'echo userspace > /sys/class/devfreq/fdab0000.npu/governor; \
    echo 1000000000 > /sys/class/devfreq/fdab0000.npu/max_freq'

# ---- 查看 NPU 实时负载(debugfs,需 root,可用)----
cat /sys/kernel/debug/rknpu/load
# 输出(空闲时):
#   NPU load:  Core0:  0%, Core1:  0%, Core2:  0%,
# 输出(推理刚结束时): 三个核各显示实际占用百分比

# ---- 驱动版本(debugfs)----
cat /sys/kernel/debug/rknpu/version
# 输出: RKNPU driver: v0.9.8

# ---- debugfs 下其它可用节点(可用列表)----
ls /sys/kernel/debug/rknpu/
# 输出: load  power  reset  version  volt

# ---- 持续监控频率和负载 ----
watch -n 1 'cat /sys/class/devfreq/fdab0000.npu/cur_freq; \
             sudo cat /sys/kernel/debug/rknpu/load'

注意:老教程的 /sys/kernel/debug/clk/clk_npu/ 在本机不存在(debugfs 时钟树里 npu 相关时钟命名不同),频率操作一律走 devfreq 接口。

4.3 量化精度对比

对比不同量化策略对模型精度和大小的影响:

from rknn.api import RKNN
import os


def compare_quantization(onnx_path, dataset_path, output_dir='quant_results'):
    """
    对比不同量化策略的精度和模型大小

    参数:
        onnx_path    : ONNX 模型路径
        dataset_path : 校准数据集路径(txt 文件,每行一个图片路径)
        output_dir   : 输出目录
    """
    os.makedirs(output_dir, exist_ok=True)

    strategies = [
        {
            'name': 'INT8_symmetric',
            'dtype': 'symmetric_quantized-8',
            'algo': None,
        },
        {
            'name': 'INT8_asymmetric',
            'dtype': 'asymmetric_quantized-8',
            'algo': None,
        },
        {
            'name': 'INT8_MMSE',
            'dtype': 'asymmetric_quantized-8',
            'algo': 'mmse',
        },
        {
            'name': 'FP16',
            'dtype': 'float16',
            'algo': None,
        },
    ]

    # 先获取原始模型大小
    raw_size = os.path.getsize(onnx_path) / (1024 * 1024)
    print(f'原始 ONNX 模型大小: {raw_size:.2f} MB')
    print()

    for s in strategies:
        print(f'--- 策略: {s["name"]} ---')

        rknn = RKNN()
        # 注意: quantized_algorithm 是 config() 的参数,
        # 传给 build() 会报 TypeError: got an unexpected keyword argument
        rknn.config(
            mean_values=[[123.675, 116.28, 103.53]],
            std_values=[[58.395, 57.12, 57.375]],
            target_platform='rk3588',
            quantized_dtype=s['dtype'],
            quantized_algorithm=s['algo'],   # None 则省略此行
        )

        rknn.load_onnx(model=onnx_path)

        if s['dtype'] == 'float16':
            ret = rknn.build(do_quantization=False)   # fp16 不需要校准集
        else:
            ret = rknn.build(do_quantization=True, dataset=dataset_path)

        if ret != 0:
            print(f'  构建失败,跳过')
            rknn.release()
            continue

        rknn_path = os.path.join(output_dir, f'{s["name"]}.rknn')
        rknn.export_rknn(rknn_path)

        rknn_size = os.path.getsize(rknn_path) / (1024 * 1024)
        ratio = rknn_size / raw_size * 100

        print(f'  RKNN 大小:  {rknn_size:.2f} MB')
        print(f'  压缩比:     {ratio:.1f}% (相对 ONNX)')
        print()

        rknn.release()

    print('量化对比完成')


if __name__ == '__main__':
    compare_quantization('resnet50.onnx', 'imagenet_samples.txt')

下面是 mobilenetv2 的结果(32 张校准图,板上转换,原始 ONNX 13.31 MB):

策略RKNN 大小压缩比转换耗时3 核推理备注
FP167.31 MB55.0%4.8 s4.62 ms精度基准
INT8 asymmetric3.97 MB29.8%9.4 s1.91 ms速度最优
INT8 MMSE3.97 MB29.8%339.4 s3.99 ms逐层搜索耗时 36x,推理反而比 normal 慢(选了精度更优的量化粒度)

要点:

  1. quantized_algorithm='mmse' 必须写在 config() 里(文档老写法放 build() 会直接 TypeError)。
  2. MMSE 转换是 CPU 密集型逐层搜索,板上 339 秒(normal 9.4 秒);换来的精度收益需用真实数据集评估,吞吐敏感场景用 normal 即可。
  3. INT8 build 时日志会提示 input/output 默认 dtype 从 float32 改为 int8(性能优化),用 C/Python runtime 读输出时注意 want_float=1。

4.4 模型输入优化

输入尺寸对计算量的影响最直接,此外还可以从数据格式和内存拷贝两方面入手:

from rknn.api import RKNN


# ---- 方法 1: 减小输入尺寸 ----
# 原始输入 640x640 → 优化为 320x320
# 理论加速: 4x(计算量与像素数成正比)

rknn = RKNN()
rknn.config(
    mean_values=[[0, 0, 0]],
    std_values=[[255, 255, 255]],
    target_platform='rk3588',
    # 模型输入尺寸由 ONNX 模型本身决定
    # 如需动态尺寸,使用 quant_img_size 参数
)


# ---- 方法 2: 使用 NHWC 数据格式 (RK3588 推荐) ----
rknn.config(
    mean_values=[[123.675, 116.28, 103.53]],
    std_values=[[58.395, 57.12, 57.375]],
    target_platform='rk3588',
    inputs_nhwc=[True],  # 强制使用 NHWC 格式,减少格式转换开销
)


# ---- 方法 3: 避免不必要的数据拷贝 ----
# 使用预分配的输入缓冲区
import numpy as np

# 预分配缓冲区,避免重复分配内存
input_buffer = np.zeros((1, 640, 640, 3), dtype=np.uint8)

# 复用缓冲区进行多次推理
for frame in video_stream:
    # 直接写入预分配的缓冲区
    np.copyto(input_buffer[0], frame)
    outputs = rknn.inference(inputs=[input_buffer])
    # 处理 outputs ...

4.5 内存占用优化

想知道模型到底吃了多少内存,可以用 psutil 量一量。脚本会分别在加载模型、初始化运行时和推理后测量进程的 RSS(进程实际占用的物理内存),算出各阶段的增量:

import psutil
import os
from rknnlite.api import RKNNLite


def measure_memory_mb():
    """测量当前进程的 RSS 内存占用 (MB)"""
    process = psutil.Process(os.getpid())
    return process.memory_info().rss / (1024 * 1024)


def profile_model_memory(model_path, input_shape):
    """
    测量模型加载和推理的内存占用

    参数:
        model_path  : RKNN 模型路径
        input_shape : 输入张量形状
    """
    import numpy as np

    # 测量基准内存
    mem_base = measure_memory_mb()
    print(f'基准内存:       {mem_base:.1f} MB')

    # 加载模型
    rknn = RKNNLite()
    rknn.load_rknn(model_path)
    mem_after_load = measure_memory_mb()
    print(f'加载模型后:     {mem_after_load:.1f} MB')
    print(f'  模型内存开销: {mem_after_load - mem_base:.1f} MB')

    # 初始化运行时
    rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2)
    mem_after_init = measure_memory_mb()
    print(f'运行时初始化后: {mem_after_init:.1f} MB')
    print(f'  运行时开销:   {mem_after_init - mem_after_load:.1f} MB')

    # 推理
    dummy = np.random.randint(0, 255, input_shape, dtype=np.uint8)
    for _ in range(10):
        rknn.inference(inputs=[dummy])
    mem_after_infer = measure_memory_mb()
    print(f'推理后:         {mem_after_infer:.1f} MB')
    print(f'  推理开销:     {mem_after_infer - mem_after_init:.1f} MB')

    # 总计
    print(f'\n总内存增量:     {mem_after_infer - mem_base:.1f} MB')

    rknn.release()
    return mem_after_infer - mem_base


def optimize_memory_usage():
    """内存优化建议汇总"""
    tips = [
        '1. 使用轻量级模型: MobileNetV2 / EfficientNet-Lite 代替 ResNet-152',
        '2. INT8 量化: 模型体积减小约 4x,内存占用同步降低',
        '3. 复用输入/输出缓冲区: 避免每帧分配新内存',
        '4. 避免同时加载多个模型: 除非使用不同 NPU 核心',
        '5. 及时释放不再使用的 RKNN 实例',
        '6. 使用 DMA-BUF 零拷贝: 减少 CPU-NPU 数据搬运',
    ]
    for tip in tips:
        print(tip)


if __name__ == '__main__':
    profile_model_memory('resnet50.rknn', (1, 224, 224, 3))
    print()
    optimize_memory_usage()

4.6 多模型并发测试

把两个模型分别绑到不同的 NPU 核心并发跑,看看实际总吞吐能达到多少:

from rknnlite.api import RKNNLite
import numpy as np
import time
import threading


def concurrent_inference(model_a, model_b, shape, duration_sec=10):
    """
    多模型并发推理测试

    将两个模型分别绑定到不同的 NPU 核心,
    测量并发场景下的实际吞吐量。
    """
    results_a = {'fps': 0, 'count': 0}
    results_b = {'fps': 0, 'count': 0}

    def run_model(model_path, core_mask, result_dict, stop_event):
        rknn = RKNNLite()
        rknn.load_rknn(model_path)
        rknn.init_runtime(core_mask=core_mask)

        dummy = np.random.randint(0, 255, shape, dtype=np.uint8)

        # 预热
        for _ in range(5):
            rknn.inference(inputs=[dummy])

        count = 0
        start = time.time()
        while not stop_event.is_set():
            rknn.inference(inputs=[dummy])
            count += 1
        elapsed = time.time() - start

        result_dict['fps'] = count / elapsed
        result_dict['count'] = count
        rknn.release()

    stop_event = threading.Event()

    # 模型 A 绑定 CORE_0,模型 B 绑定 CORE_1
    t1 = threading.Thread(
        target=run_model,
        args=(model_a, RKNNLite.NPU_CORE_0, results_a, stop_event),
    )
    t2 = threading.Thread(
        target=run_model,
        args=(model_b, RKNNLite.NPU_CORE_1, results_b, stop_event),
    )

    print(f'并发测试开始 ({duration_sec}s)...')
    print(f'  模型 A -> NPU_CORE_0')
    print(f'  模型 B -> NPU_CORE_1')

    t1.start()
    t2.start()
    time.sleep(duration_sec)
    stop_event.set()

    t1.join()
    t2.join()

    print(f'\n并发测试结果:')
    print(f'  模型 A: {results_a["fps"]:.1f} FPS ({results_a["count"]} 次推理)')
    print(f'  模型 B: {results_b["fps"]:.1f} FPS ({results_b["count"]} 次推理)')
    print(f'  总吞吐: {results_a["fps"] + results_b["fps"]:.1f} FPS')


if __name__ == '__main__':
    concurrent_inference('model_a.rknn', 'model_b.rknn', (1, 224, 224, 3))

5. 代码详解

5.1 NPU 核心调度原理

RK3588 的 3 个 NPU 核心通过 core_mask 参数进行调度:

  RKNNLite.NPU_CORE_0      → 仅使用核心 0 (~2 TOPS)
  RKNNLite.NPU_CORE_1      → 仅使用核心 1 (~2 TOPS)
  RKNNLite.NPU_CORE_2      → 仅使用核心 2 (~2 TOPS)
  RKNNLite.NPU_CORE_0_1    → 使用核心 0 + 1 (~4 TOPS)
  RKNNLite.NPU_CORE_0_1_2  → 使用全部 3 核 (~6 TOPS)

调度策略选择:
  - 单模型高吞吐: 使用 NPU_CORE_0_1_2(三核全开)
  - 单模型低延迟: 使用 NPU_CORE_0(避免多核调度开销)
  - 多模型并发:   不同模型绑定不同核心,避免竞争

5.2 性能瓶颈分析

一次 NPU 推理的完整流水线,以及各环节常见的瓶颈和对应手段:

典型 NPU 推理流水线:
  [CPU 预处理] → [数据拷贝] → [NPU 推理] → [数据拷贝] → [CPU 后处理]

常见瓶颈及优化手段:
  ┌──────────────────┬─────────────────────────────────┐
  │ 瓶颈             │ 优化手段                         │
  ├──────────────────┼─────────────────────────────────┤
  │ CPU 预处理耗时   │ 使用 RGA 硬件加速缩放/裁剪       │
  │ 数据拷贝耗时     │ 使用 DMA-BUF 零拷贝              │
  │ NPU 频率低       │ 提升 NPU 时钟频率                 │
  │ 模型过大         │ INT8 量化 / 剪枝 / 知识蒸馏       │
  │ 内存带宽不足     │ 使用 NHWC 格式,减少格式转换       │
  │ 输出后处理慢     │ 将 NMS/Softmax 卸载到 NPU 执行    │
  └──────────────────┴─────────────────────────────────┘

5.3 Benchmark 结果解读

解读 Benchmark 输出的注意事项:

  1. 预热 (Warm-up)
     首次推理包含模型加载、缓存预热等开销,
     不应计入性能统计。Benchmark 中前 10 次推理为预热。

  2. 平均延迟 vs FPS
     FPS = 1000 / avg_ms
     当处理单帧时关注延迟 (ms);当流水线处理时关注 FPS。

  3. 最小/最大延迟
     max_ms - min_ms 过大说明存在抖动 (jitter),
     可能由系统调度、温控降频等原因导致。

  4. 核心模式对比
     三核模式理论上是单核的 3x 性能,
     但由于内存带宽和调度开销,实际加速比通常在 2.2x~2.8x。

5.4 RK3588 NPU 性能参考表

模型输入尺寸NPU_CORE_0NPU_CORE_0_1NPU_CORE_0_1_2
MobileNetV2224x224~2000 FPS~3500 FPS~5000 FPS
ResNet-50224x224~500 FPS~1000 FPS~2000 FPS
YOLOv5s640x640~50 FPS~100 FPS~150 FPS
YOLOv8n640x640~60 FPS~110 FPS~160 FPS
SCRFD640x640~80 FPS~150 FPS~220 FPS

注: 以上数据为参考值,实际性能受模型版本、量化策略、系统配置等因素影响。

6. 常见问题

6.1 NPU 利用率低

现象:CPU 使用率高,但 NPU 使用率很低。

可能原因及解决方案:

# 1. 检查 NPU 驱动是否正常加载
ls /sys/module/ | grep rknpu   # 不要用 lsmod(本机会挂死;驱动是内建的)
# 应看到 rknpu 模块

# 2. 检查 NPU 设备节点
ls -la /dev/dri/
# 应看到 renderD128 等设备

# 3. 查看 NPU 实时负载
cat /sys/kernel/debug/rknpu/load

# 4. 确认推理代码使用的是 rknn-toolkit-lite2(而非 CPU fallback)
# 检查 init_runtime 返回值是否为 0

常见原因:

  • 使用了 CPU 推理而非 NPU 推理(检查是否调用了 rknn-toolkit-lite2)
  • 模型中包含 NPU 不支持的算子,导致部分层回退到 CPU
  • 数据预处理在 CPU 上完成且耗时过长,掩盖了 NPU 的实际处理时间

6.2 推理结果异常

现象:NPU 推理结果与 CPU/PC 端推理结果不一致,输出偏差较大。

解决方案:

# 1. 对比 FP16 与 INT8 精度差异
# 如果 INT8 结果偏差大,先用 FP16 验证模型本身是否正确
rknn.config(
    target_platform='rk3588',
    quantized_dtype='float16',  # 先用 FP16 排除模型问题
)

# 2. 使用 MMSE 量化算法提升 INT8 精度
rknn.build(
    do_quantization=True,
    dataset='calibration_list.txt',
    quantized_algorithm='mmse',
)

# 3. 增加校准数据量(建议 100~500 张代表性图片)
# 校准数据应覆盖实际应用场景中的典型输入分布

# 4. 检查预处理是否与训练时一致
# mean_values / std_values 必须与模型训练时的归一化参数完全匹配

6.3 多模型并发性能差

现象:多个模型同时运行时,总吞吐量远低于各模型单独运行之和。

解决方案:

from rknnlite.api import RKNNLite

# 方案 1: 为每个模型分配独立的 NPU 核心
rknn_a = RKNNLite()
rknn_a.load_rknn('model_a.rknn')
rknn_a.init_runtime(core_mask=RKNNLite.NPU_CORE_0)

rknn_b = RKNNLite()
rknn_b.load_rknn('model_b.rknn')
rknn_b.init_runtime(core_mask=RKNNLite.NPU_CORE_1)

# 方案 2: 如果有 3 个模型,使用三核分别绑定
rknn_c = RKNNLite()
rknn_c.load_rknn('model_c.rknn')
rknn_c.init_runtime(core_mask=RKNNLite.NPU_CORE_2)

# 方案 3: 使用异步推理减少等待
# 注意: 多个模型共享同一核心时,调度开销会显著增加

6.4 模型转换失败

现象:rknn.build() 返回错误码,模型转换失败。

排查思路是从最低优化级别开始逐步排查:

from rknn.api import RKNN

rknn = RKNN()

# 1. 降低优化级别排查
rknn.config(
    target_platform='rk3588',
    optimization_level=0,  # 最低优化级别,兼容性最好
)

# 2. 检查输入数据类型
# 确保 ONNX 模型的输入为 float32 或 uint8

# 3. 检查算子兼容性
# 查看 RKNN Toolkit2 支持的算子列表
# 对不支持的算子考虑替换或自定义实现

# 4. 逐步提高优化级别
for level in [0, 1, 2, 3]:
    rknn.config(target_platform='rk3588', optimization_level=level)
    rknn.load_onnx(model='model.onnx')
    ret = rknn.build(do_quantization=True, dataset='dataset.txt')
    if ret == 0:
        print(f'优化级别 {level} 构建成功')
        break
    else:
        print(f'优化级别 {level} 构建失败,尝试下一级')
    rknn.release()

6.5 NPU 频率无法提升

现象:NPU 频率锁定在较低频率,无法达到最大性能。

解决方案:

# 1. 检查当前 CPU/系统调频策略
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 2. 设置 performance 模式(保持最高频率)
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor
echo performance > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor

# 3. 检查温度是否触发降频保护
cat /sys/class/thermal/thermal_zone*/temp
# 正常范围: < 80°C
# 超过 85°C 可能触发温控降频

# 4. 检查散热方案
# 确保核心板散热片/风扇正常工作
# 高负载测试时注意散热

6.6 DMA-BUF 零拷贝未生效

现象:数据拷贝耗时仍然较高,零拷贝未生效。

解决方案:

# 1. 检查 DMA-BUF 是否可用
ls /dev/dma_heap/
# 应看到 system 等节点

# 2. 检查 IOMMU 配置
cat /proc/device-tree/soc/npu/*/iommu-map

# 3. 确认 librga 版本
# RK3588 需要匹配版本的 RGA 库
dpkg -l | grep librga

7. 相关文档

文档说明
01_NPU架构与性能概览NPU 硬件架构介绍
02_RKNN Toolkit2安装与使用RKNN 开发环境搭建
03_模型转换与量化量化策略与精度优化
04_RGA图像加速硬件图像预处理加速
06_NPU多模型部署多模型并发部署方案
07_NPU模型剪枝与蒸馏模型轻量化方法
在 GitHub 上编辑此页
Prev
OCR文字识别