07.RK3588部署Qwen3-VL - 板端部署

本节我们的工作目录切换至:rknn-llm/examples/multimodal_model_demo/deploy

这个目录的作用是编译出测试Qwen3-VL大模型用的demo、so库等

1.安装交叉编译工具链

参考《03【正点原子】ATK-DLRK3588_AI例程测试手册V1.1.pdf》安装交叉编译工具链

2.修改编译脚本

根据自己的交叉编译工具链位置,修改 build-linux.sh

比如我的交叉编译工具链位置为:

ls /opt/atk-dlrk3588-toolchain/
aarch64-buildroot-linux-gnu  bin  environment-setup  etc  include  lib  lib64  libexec  man  mkspecs  sbin  share  usr

build-linux.sh改为如下内容:

set -e
rm -rf build
mkdir build && cd build

GCC_COMPILER=/opt/atk-dlrk3588-toolchain
cmake .. -DCMAKE_CXX_COMPILER=${GCC_COMPILER}/bin/aarch64-buildroot-linux-gnu-g++  \
        -DCMAKE_C_COMPILER=${GCC_COMPILER}/bin/aarch64-buildroot-linux-gnu-gcc \
        -DOpenMP_C_FLAGS="-fopenmp" \
        -DOpenMP_CXX_FLAGS="-fopenmp" \
        -DOpenMP_C_LIB_NAMES=gomp \
        -DOpenMP_CXX_LIB_NAMES=gomp \
        -DOpenMP_gomp_LIBRARY=/usr/lib/gcc-cross/aarch64-linux-gnu/13/libgomp.so \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_SYSTEM_NAME=Linux \
        -DCMAKE_SYSTEM_PROCESSOR=aarch64 \

make -j8
make install

3.执行编译

在工作目录中直接执行./build-linux.sh即可执行编译,如果提示没有执行权限可以执行chmod +x build-linux.sh赋予权限后再执行编译。

如果看到如下输出说明编译完成。

-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Detecting C compiler ABI info
......
[100%] Linking CXX executable demo
[100%] Built target imgenc
[100%] Built target demo
Consolidate compiler generated dependencies of target imgenc
[ 50%] Built target imgenc
Consolidate compiler generated dependencies of target demo
[100%] Built target demo
Install the project...
-- Install configuration: "Release"
-- Installing:  /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/./imgenc
-- Set runtime path of " /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/./imgenc" to ""
-- Installing:  /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/./demo
-- Set runtime path of " /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/./demo" to ""
-- Up-to-date:  /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/lib/librknnrt.so
-- Up-to-date:  /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/lib/librkllmrt.so
-- Up-to-date:  /mnt/data/rknn/rknn-llm/examples/multimodal_model_demo/deploy/install/demo_Linux_aarch64/./demo.jpg

编译成功后会在当前目录中生成install文件夹,其中包含编译好的demo_Linux_aarch64文件夹。

tree install/
install/
└── demo_Linux_aarch64
    ├── demo
    ├── demo.jpg
    ├── imgenc
    └── lib
        ├── librkllmrt.so
        └── librknnrt.so

4.把编译好的文件上传板子

在Demo编译成功后,将install目录下的文件拷贝到RK3588文件系统中,可以使用adb(如果有)拷贝到板端,如:

adb push install/demo_Linux_aarch64/ /userdata/aidemo/qwen3-vl/

分别找到qwen3-vl_vision_rk3588.rknn和qwen3-vl-2b-instruct_w8a8_rk3588.rkllm所在的目录,我是:

(rknn-toolkit2) wssheng[00:15:07]~/rk3588/rknn-llm/examples/multimodal_model_demo$ ls
README.md  cu_seqlens.npy  data  deploy  export  infer.py  onnx  rkllm  rknn  rotary_pos_emb.npy
(rknn-toolkit2) wssheng[00:15:09]~/rk3588/rknn-llm/examples/multimodal_model_demo$ ls rknn/
qwen3-vl_vision_rk3588.rknn
(rknn-toolkit2) wssheng[00:15:14]~/rk3588/rknn-llm/examples/multimodal_model_demo$ ls rkllm/
qwen3-vl-2b-instruct_w8a8_rk3588.rkllm
(rknn-toolkit2) wssheng[00:16:01]~/rk3588/rknn-llm/examples/multimodal_model_demo$

把.rknn文件和.rkllm文件推到板子上

adb push qwen3-vl_vision_rk3588.rknn /userdata/aidemo/qwen3-vl/models
adb push qwen3-vl-2b-instruct_w8a8_rk3588.rkllm /userdata/aidemo/qwen3-vl/models

5.板端测试

以下指令在RK3588上执行

板端文件结构

root@ATK-DLRK3588:/userdata/aidemo/qwen3-vl# tree
.
├── demo_Linux_aarch64
│   ├── demo
│   ├── demo.jpg
│   ├── imgenc
│   └── lib
│       ├── libgomp.so.1
│       ├── librkllmrt.so
│       └── librknnrt.so
└── models
    ├── qwen3-vl-2b-instruct_w8a8_rk3588.rkllm
    └── qwen3-vl_vision_rk3588.rknn

3 directories, 8 files
root@ATK-DLRK3588:/userdata/aidemo/qwen3-vl

5.1 指定运行时库查找路径

export LD_LIBRARY_PATH=/userdata/aidemo/qwen3-vl/demo_Linux_aarch64/lib

5.2 测试本地大模型

进入 demo_Linux_aarch64 目录,执行

./demo demo.jpg ../models/qwen3-vl_vision_rk3588.rknn ../models/qwen3-vl-2b-instruct_w8a8_rk3588.rkllm 2048 4096 3  "<|vision_start|>" "<|vision_end|>" "<|image_pad|>"

这个会把demo.jpg作为参数喂给大模型

root@ATK-DLRK3588:/userdata/aidemo/qwen3-vl/demo_Linux_aarch64# ./demo demo.jpg ../models/qwen3-vl_vision_rk3588.rknn ../models/qwen3-vl-2b-instruct_w8a8_rk3588.rkllm 2048 4096 3  "<|vision_start|>" "<|vision_end|>" "<|image_pad|>"
I rkllm: rkllm-runtime version: 1.2.3, rknpu driver version: 0.9.8, platform: RK3588
I rkllm: loading rkllm model from ../models/qwen3-vl-2b-instruct_w8a8_rk3588.rkllm
I rkllm: rkllm-toolkit version: 1.2.3, max_context_limit: 4096, npu_core_num: 3, target_platform: RK3588, model_dtype: W8A8
[ 8806.742842] RKNPU: switch iommu domain from 0 to 1
I rkllm: Enabled cpus: [4, 5, 6, 7]
I rkllm: Enabled cpus num: 4
I rkllm: Using mrope
[ 8808.512871] RKNPU: switch iommu domain from 1 to 0
rkllm init success
main: LLM Model loaded in  2367.50 ms
===the core num is 3===
model input num: 1, output num: 4
input tensors:
  index=0, name=pixel, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=301056, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
output tensors:
  index=0, name=4820, n_dims=2, dims=[49, 2048, 0, 0], n_elems=100352, size=200704, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
  index=1, name=1669, n_dims=2, dims=[49, 2048, 0, 0], n_elems=100352, size=200704, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
  index=2, name=2720, n_dims=2, dims=[49, 2048, 0, 0], n_elems=100352, size=200704, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
  index=3, name=3771, n_dims=2, dims=[49, 2048, 0, 0], n_elems=100352, size=200704, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
model input height=224, width=224, channel=3
main: ImgEnc Model loaded in   776.71 ms
main: ImgEnc Model inference took   596.11 ms

**********************可输入以下问题对应序号获取回答/或自定义输入********************

[0] <image>What is in the image?
[1] <image>这张图片中有什么?

*************************************************************************


user: 1
<image>这张图片中有什么?
[ 9166.123220] RKNPU: switch iommu domain from 0 to 1
robot: 好的,我们来分析一下这张图片。

根据您提供的图片,我们可以看到以下内容:

- **主体人物**:一位宇航员。他穿着白色的太空服,头盔是金色的。
- **环境**:场景位于月球表面,可以看到布满陨石坑和尘土的灰色月面。
- **背景**:在遥远的宇宙中,地球清晰可见,呈现出蓝色、绿色和白色的大气层以及陆地轮廓。天空是深邃的黑色,点缀着星星。
- **物品**:
  - 宇航员手中拿着一个绿色的瓶子(看起来像一瓶啤酒)。
  - 在他旁边还有一个绿色的物体,可能是他的太空服的一部分或某种设备。

综合来看,这张图片描绘了一个宇航员在月球上休息的场景。他手持一瓶饮料,背景是地球和星空,营造出一种孤独而宁静的氛围。这是一张充满科幻感和诗意的画面。

---

**总结:**

这张图片中包含:

- 一位穿着白色太空服、头盔为金色的宇航员。
- 月球表面,有陨石坑和尘土。
- 背景是地球在太空中,可以看到其蓝色的大气层和陆地轮廓。
- 宇航员手中拿着一个绿色的瓶子(类似啤酒)。
- 另外还有一个绿色的物体,可能是太空服的一部分或设备。

这是一幅描绘宇航员在月球上休息、手持饮料的科幻场景。

user:

6.报错修改

6.1报libgomp.so.1找不到

6.1.1 解决办法1

安装这个库,注意要指定arm64架构,不然安装的就是虚拟机主机上的x86_64架构的,板子上用不了

sudo apt install libgomp1:arm64

find /usr/ -name libgomp.so.1 找到这个库

把这个库推送到板子上,在ubuntu20.04上执行:

adb push /usr/lib/gcc-cross/aarch64-linux-gnu/13/libgomp.so.1 /userdata/aidemo/qwen3-vl/demo_Linux_aarch64/lib

6.1.2 解决办法2

如果板子上可以联网,也可以直接在板子上执行安装指令

sudo apt install libgomp1 -y

6.2 wifi列表为空

6.2.1 日志提示

8733bu: version magic  should be '5.10.209-g16b8cb7e2392-dirty SMP mod_unload aarch64'

uname -a查看,内核版本是5.10.209-g16b8cb7e2392-dirty,wifi RTL8733BU 驱动版本是5.10.209-g16b8cb7e2392导致驱动加载失败

6.2.2 解决办法

kernel版本是由脚本kernel/scripts/setlocalversion决定。

按照下图把关于dirty的内容注释掉,再次生成的内核版本就正常了。

posted @ 2026-08-11 11:23  wssheng  阅读(1)  评论(0)    收藏  举报