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的内容注释掉,再次生成的内核版本就正常了。

浙公网安备 33010602011771号