Qwen2-VL-3B模型NPU多模态部署指导与评测--基于米尔瑞芯微RK3576开发板(下)

2025年08月29日 17:54    发布者:swiftman


    ​
步骤 2:替换 NPU Driver 后编译 Ubuntu 并刷机    ​根据瑞芯微 GitHub rkllm 仓库对的《RKLLM SDK User Guide》要求,特别说明: RKLLM 版本是 1.2.1:    ​RKLLM 所需要的 NPU 内核版本较高,用户在板端使用 RKLLM Runtime 进行模型推理前,首先需要确认板端的 NPU 内核是否为 v0.9.8 版本。
[*]可以使用命令 cat /sys/kernel/debug/rknpu/version 查看 NPU Driver 版本。
    ​# cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.7

[*]BuildRoot 是默认系统,不太方便,所以刷了米尔提供的 Debian&Linux6.1.75 Distribution V1.1.0 里的 Ubuntu 镜像后(烧录部分遵循米尔提供的文档 MYD-LR3576J-GK Ubuntu 软件开发指南-V1.0 第 5 章:烧录镜像。发现 NPU Driver 版本是 0.9.7,不符合 RKLLM 用户文档的要求。
    ​此时,只能将版本为 0.9.8 的 NPU Driver 代码替换到米尔给的 Ubuntu 源码里,然后重新编译 Ubuntu 镜像并重新刷机。对于刷机过程,RKLLM 的文档提到:    ​若用户所使用的为非官方固件,需要对内核进行更新。其中,RKNPU 驱动包支持两个主要内核版本:kernel-5.10 和 kernel-6.1:    ​
[*]对于 kernel-5.10,建议使用具体版本号 5.10.209,内核地址为 GitHub-rockchip-linux/kernelatdevelop-5.10;
[*]对于 kernel-6.1,建议使用具体版本号 6.1.84;用户可在内核根目录下的 Makefile 中确认具体版本号。
    ​米尔提供的 Debian&Linux6.1.75 Distribution V1.1.0 对应的虽然不是最推荐的 kernel-6.1.84,但是也是 6.1。即下图:    ​米尔提供的 Debian&Linux6.1.75 Distribution V1.1.0 里 04-Sources 的源码包

[*]我们继续按照 RKLLM 的指导,进行内核的更新

[*]下载 RK Driver 压缩包 rknpu_driver_0.9.8_20241009.tar.bz2。
[*]解压该压缩包,将其中的 rknpu 驱动代码覆盖到当前内核代码目录。

[*]当前内核代码,由前面 Debian&Linux6.1.75 Distribution V1.1.0 的 04-Sources 目录下的 MYD-LR3576-Distribution-L6.1.75-V1.1.0.tar.gz 解压缩得到。
    ​解压后 Ubuntu 源码目录

[*]重新编译内核。根据米尔文档指导(MYD-LR3576J-GK Ubuntu 软件开发指南-V1.0.pdf),流程如下
    ​# 进入源码解压后得到的一个 MYD-LR3576 目录
# 第一次编译执行以下命令选择配置文件
./build.sh lunch

# Which would you like?
# 这里选择 7,rockchip_rk3576_myd_lr3576_defconfig

# 紧接着分别编译 u-boot、kernel 和 modules
./build.sh u-boot
./build.sh kernel
./build.sh module

# 编译成功再执行下面命令,编译 Ubuntu 文件系统,并打包最终 Ubuntu 系统镜像
./build.sh ubuntu
./build.sh updateimg

# RK3576 为了用户可以更便捷的烧录,单独创建了目录储存编译出来的镜像在 output/update/Image 下
    ​分别对 u-boot、kernel、module 三部分编译,最后编译成功如下图所示:Ubuntu 镜像编译成功

[*]烧录部分遵循米尔提供的文档(MYD-LR3576J-GK Ubuntu 软件开发指南-V1.0)第 5 章:烧录镜像。
    ​烧录结束后,连接笔记本,可以看到如下截图,进入系统。    ​刷机完后链接开发板,可以看到 MYIR 漂亮的字体 Logo
    ​使用命令下图中的命令查看 NPU Driver 版本,符合预期!    ​自己基于米尔提供的 Ubuntu 源码更改 NPU Driver 为 0.9.8 后的 NPU Driver版本,符合预期
    ​那么,下面我们就可以正式开始使用 RKLLM !    ​三、多模态案例:支持图像和文本交互    ​前面我们已经介绍了瑞芯微大模型 SDK RKLLM。本节将会演示实际操作流程,目标是对 Qwen2-VL-3B 多模态模型进行部署,其中视觉 + 投影组件通过 rknn-toolkit2 导出为 RKNN 模型,LLM 组件通过 rkllm-toolkit 导出为 RKLLM 模型。    ​在 Qwen2-VL 这类多模态模型(支持图像和文本交互)中,“视觉 + 投影”(Vision + Projector)是模型处理图像输入的核心组件,作用是将图像信息转换为模型可理解的特征:    ​
[*]视觉组件(Vision):主要负责处理图像输入,完成“图像解析”的功能。它会对输入的图像(如后续示例中的demo.jpg)进行特征提取,将像素级的图像信息(比如颜色、形状、物体轮廓等)转换为高维的“图像特征向量”(一种数值化的表示)。这一步类似人类“看”到图像并提取关键信息的过程。
[*]投影组件(Projector):多模态模型需要同时处理图像和文本,而图像特征与文本特征的原始格式(如维度、语义空间)可能不同,无法直接融合。投影组件的作用就是“桥梁”:它会将视觉组件输出的“图像特征向量”进行转换(投影),映射到与文本特征相同的语义空间中,让图像特征和文本特征能够被模型的后续模块(如语言模型 LLM)统一理解和处理。
    ​简单来说,“视觉 + 投影”组件的整体作用是:把图像“翻译”成模型能看懂的“语言”(特征),并确保这种“语言”能和文本的“语言”互通,为后续的多模态交互(如图文问答)打下基础。在部署时,这两个组件被打包成 RKNN 模型,适合在 Rockchip 的 NPU(神经网络处理器)上高效运行,专门处理图像相关的计算。    ​    ​下面,跟着 RKLLM SDK 里多模态模型例子,只给出必要的操作步骤。    ​步骤 1:环境准备    ​安装必要的 SDK 依赖库。    ​pip install rknn-toolkit2 -i https://mirrors.aliyun.com/pypi/simple
pip install torchvision==0.19.0
pip install transformers
pip install accelerate
    ​步骤 2:模型的获取、验证与格式转换    ​本步骤产物为 rknn 和 rkllm 格式的模型文件。
[*]qwen2_5_vl_3b_vision_rk3576.rknn
[*]qwen2.5-vl-3b-w4a16_level1_rk3576.rkllm
    ​操作如下,同官方指导。:    ​
[*]先从 huggingface 下载模型如Qwen2-VL-2B-Instruct。验证模型可用性。在执行 python infer.py 时会用到 GPU 进行推理。如果只想跑一下 RK3576 板子上模型性能,也可以跳过这个步骤,下载瑞芯微已经转换好的模型:。
[*]原始模型转换为 onnx 格式
[*]从 onnx 格式转换为 rknn、rkllm 格式
    ​注:我们这一步直接使用瑞芯微提供的 rkllm_model_zoo 里的模型。    ​步骤 3:修改代码并交叉编译可执行文件并上传到板子上    ​本步骤产物为如下目录和文件。rknn-llm-release-v1.2.1/examples/Qwen2-VL_Demo/deploy/install/demo_Linux_aarch64▶ tree
.
├── demo
├── demo.jpg
├── imgenc
├── lib
│   ├── librkllmrt.so
│   └── librknnrt.so
└── llm
1 directory, 6 files
    ​操作如下:    ​修改源码中的EMBED_SIZE:适配模型    ​注:我们用的模型是 Qwen2-VL-3B,需要在src/main.cpp和src/img_encoder.cpp中修改EMBED_SIZE为2048。    ​不同的 Qwen2-VL 模型(2B 和 7B)需要在src/main.cpp和src/img_encoder.cpp中指定IMAGE_HEIGHT、IMAGE_WIDTH及EMBED_SIZE,核心原因是这些参数与模型的固有结构设计和输入处理逻辑强绑定,直接影响特征提取的正确性和数据传递的一致性。    ​
[*]EMBED_SIZE(嵌入维度)是模型架构的固有参数,由模型的设计(如隐藏层维度)决定:
[*]Qwen2-VL-2B 和 7B 属于不同规模的模型(参数数量不同),其视觉编码器(Vision + Projector 组件)输出的图像特征向量维度不同(2B 为 1536,3B 为 2048,7B 为 3584)。
    ​代码中img_vec(图像特征向量)的尺寸依赖EMBED_SIZE计算(如IMAGE_TOKEN_NUM * EMBED_SIZE)。若EMBED_SIZE与模型实际输出维度不匹配,会因为特征向量内存分配错误(数组大小与实际特征维度不符)或者后续 LLM 组件无法正确解析图像特征,导致推理失败如 Segmentation Fault:    ​交叉编译    ​假设当前位于 rknn-llm/examples/Qwen2-VL_Demo/ 目录下,执行    ​cd deploy
./build-linux.sh
    ​编译成功,如下所示:    ​成功交叉编译多模态代码
    ​步骤 4:上传文件到开发板    ​将上一步编译后的install目录,以及前面转换模型得到的 rknn 和 rkllm 格式的模型文件通过 U 盘等方式上传到 RK3576 上。    ​性能测试 Tips    ​瑞芯微在 scripts 目录中提供了一些脚本和参数设置:    ​
[*]使用 fix_freq_rk3576.sh 锁定 CPU、GPU、NPU 等设备频率,让测试结果的性能更加稳定。
[*]在设备上执行 export RKLLM_LOG_LEVEL=1,以记录模型推理性能和内存使用情况。
[*]使用 eval_perf_watch_cpu.sh 可脚本测量 CPU 利用率。
[*]使用 eval_perf_watch_npu.sh 可脚本测量 NPU 利用率。
    ​fix_freq_rk3576.sh 脚本会对 NPU、CPU、GPU、DDR 进行锁频
    ​多模态效果演示    ​为后续验证多模态能力,先展示 RKLLM 的基础配置及纯文字交互测试场景,以下为配置参数与初始对话片段:    ​纯文字问答能力    ​因仅是纯文字对话没有图片,可以执行如下命令,    ​# run llm(Pure Text Example)
./llm ~/rkllm-model-zoo/Qwen2.5-VL-3B-Instruct/qwen2.5-vl-3b-w4a16_level1_rk3576.rkllm 128 512
    ​纯文字:自我介绍
    ​纯文字执行结果

    ​多模态问答能力    ​上述为图片问答的测试准备与初始提问,下文展示‘RK3576 多模态图片问答:    ​测评图片1:特征是可爱的二次元蓝头发女孩,手里拿着米尔 MYIR 开发板,下方文字写着:NeuralTalk 公众号
    ​# run demo(Multimodal Example)
# 使用方式:./demo image_path encoder_model_path llm_model_path max_new_tokens max_context_len rknn_core_num
./demo demo.jpg models/qwen2-vl-vision_rk3588.rknn models/qwen2-vl-llm_rk3588.rkllm 128 512 3
    ​./demo 最后一个参数是核数,用于推理时是否考虑多核推理,可选参数为:2(RKNN_NPU_CORE_0_1)、3(RKNN_NPU_CORE_0_1_2)、其他(RKNN_NPU_CORE_AUTO)。    ​测评图片1:执行结果
下面我们再换一张图片试试效果!
    ​测试图片3
    ​下图展示了测试图片3运行中的一些性能指标,包括模型初始化时间、不同阶段的总时间(Prefill和Generate阶段)、Token数量、Token生成速度,以及峰值内存使用量。    ​测试图片3:内存占用和耗时等
    ​总得来说,模型第一次加载 6 秒钟,首次出词语也有体感上的慢,但是这之后速度就很稳定,而且很快,纯文字的速度更快一些。    ​结论    ​本文围绕瑞芯微 RK3576 开发板 NPU 对多模态 LLM 的支撑能力与性能展开测评,全面呈现其在端侧 AI 领域的价值。    ​端侧SLM在延迟、隐私与离线可用性上的优势显著,而 RK3576 凭借 8nm 制程、6TOPS自研NPU及动态稀疏化加速引擎,填补了旗舰与主流方案的市场空白。它针对2B-3B参数级模型专项优化,轻量化视觉任务算力利用率提升 18%,NPU功耗降低 22%,30% 的成本优势使其在多场景快速量产,中高端市场占有率环比增长 47%。    ​技术落地方面,RKNN 与 RKLLM SDK形成互补生态,RKNN 保障模型兼容性,RKLLM 通过量化优化、多模态支持等降低模型内存占用与推理延迟。实测中,RK3576 运行 Qwen2-VL-3B 模型时,纯文字交互 Token 生成稳定,多模态问答能精准识别图像元素,峰值内存占用 4.58GB ,在移动终端和工业场景可靠运行。本文提供的环境准备、模型转换、代码适配等实操步骤,为开发者提供了可复现的部署方案。RK3576 在多场景展现良好兼容性与稳定性,能以低成本实现高准确率任务。    ​未来,RK3576“算力精准匹配场景”的设计理念或成中端AIoT核心方向,其在多维度的平衡,为端侧AI部署提供高性价比选择,助力边缘计算规模化应用。    ​    ​RK3576 工作状态
参考资料 MYD-LR3576-产品介绍-V1.1: https://dev.myir.cn/upload/files/product/20250211/17392600078427483.pdf rknn_model_zoo: 'https://github.com/airockchip/rknn_model_zoo' airockchip/rknn-llm: 'https://github.com/airockchip/rknn-llm' 米尔开发平台: 'https://dev.myir.cn/' Rockchip_RKLLM_SDK_CN_1.2.1.pdf: 'https://github.com/airockchip/rknn-llm/blob/main/doc/Rockchip_RKLLM_SDK_CN_1.2.1.pdf' rknpu-driver: 'https://github.com/airockchip/rknn-llm/tree/main/rknpu-driver' Qwen2-VL_Demo: 'https://github.com/airockchip/rknn-llm/tree/main/examples/Qwen2-VL_Demo' Qwen2-VL_Demo: 'https://github.com/airockchip/rknn-llm/tree/main/examples/Qwen2-VL_Demo' Qwen2-VL-2B-Instruct: 'https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct' rkllm_model_zoo: 'https://console.box.lenovo.com/l/l0tXb8' rkllm_model_zoo: 'https://console.box.lenovo.com/l/l0tXb8' Qwen2-VL-2B_Demo segfault RK3576 using 1.2.0 version: 'https://github.com/airockchip/rknn-llm/issues/336'