Qwen2-VL-2B-Instruct 模型 RK3576 板端部署过程
需要先在电脑上运行 RKLLM-Toolkit 工具,将训练好的模型转换为 RKLLM 格式的模型,然后使用 RKLLM C API 在开发板上进行推理。
在安装前先查看板端的内存容量,和自己模型占用大小比较一下,别安装编译好了不能用。
这里我就是先尝试了Qwen2-VL-2B-Instruct,BF16,安装好了才发现自己板端只有3.6G的运行可用资源... 决定尝试Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4。
尝试完了,GPTQ int 这个数据格式不能更改,rknn仅支持float32,根本用不了,此贴就当Qwen2-VL-2B-Instruct 模型部署来看吧,测试可以正常使用。
一. 下载源码
GitHub - airockchip/rknn-llm
git clone https://github.com/airockchip/rknn-llm.git
二. 支持平台及模型
-
平台:
-
RK3588 系列
-
RK3576 系列
-
-
模型:
-
Qwen2-VL
-
MiniCPM-V
-
三. 本机部署过程
需求:
arm 系统 :libgomp.so.1、libgomp.so.1.0.0
-
(系统环境不兼容,一般本机为 Ubuntu X86 系统,板端为 arm 系统,使用时会出现报错。使用qemu-user-static 可以在 X86 机器模拟 arm 环境来进行编译)
rkllm-toolkit==1.1.4
rknn-toolkit2==2.2.1
python==3.8
1. 在本机创建一个 rknn-llm 虚拟环境,并安装依赖项
python3.8 -m venv rknn-llm
source rknn-llm/bin/activate
<!-- 安装时,版本可能会更改 -->
pip install rknn-toolkit2==2.2.1 -i https://mirrors.aliyun.com/pypi/simple
rkllm-toolkit==1.1.4: rknn-llm/rkllm-toolkit/packages at main · airockchip/rknn-llm · GitHub
2. 下载权重
https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct
pip install git+https://github.com/huggingface/transformers
两个都要下载
3. 测试 Demo
1、modify the modelpath in infer.py
2、python infer.py
3、expect results:
["The image depicts an astronaut in a white spacesuit, reclining on a green chair with his feet up. He is holding a green beer bottle in his right hand. The astronaut is on a moon-like surface, with the Earth visible in the background. The scene is set against a backdrop of stars and the moon's surface, creating a surreal and whimsical atmosphere."]
4. 导出为 ONNX 模型
由于当前 RKNN 仅支持 float32,如果加载权重时遇到问题,将config.json 中,"use_flash_attn"设置为 false。
如果遇到报错找不到某目标文件,修改执行路径,进入 export 中执行命令。
python export/export_vision.py
由于代码是直接支持 Qwen2-VL-2B-Instruct,而不是 Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4,GPTQ量化模型不允许直接转换为dtype,需要对代码进行修改处理。不用处理了,用不了。
5. 将 ONNX 模型转为 RKNN 模型
将 export_vision_rknn.py 中 rk3588 修改为 rk3576
python export/export_vision_rknn.py
6. 转为 RKLLM 模型并导出
将 export_rkllm.py 中 rk3588 修改为 rk3576
python data/make_input_embeds_for_quantize.py
python export/export_rkllm.py
7. 编译,并 push 到板端
cd deploy
# for linux
./build-linux.sh
# push install dir to device
adb push ./install/demo_Linux_aarch64 /data
# push model file to device
adb push qwen2_vl_2b_vision_rk3576.rknn /data/models
adb push Qwen2-VL-2B-Instruct.rkllm /data/models
# push demo image to device
adb push ../data/demo.jpg /data/demo_Linux_aarch64
另外需要将 arm 系统的 libgomp.so.1、libgomp.so.1.0.0 复制到板端 /data/demo_Linux_aarch64/lib 中。X86 系统的复制会不可用。
四. 板端部署过程
adb shell
cd /data/demo_Linux_aarch64
# export lib path
export LD_LIBRARY_PATH=./lib
# soft link models dir
ln -s /data/models .
# run imgenc
./imgenc models/qwen2_vl_2b_vision_rk3576.rknn demo.jpg
# run llm(Pure Text Example)
./llm models/Qwen2-VL-2B-Instruct.rkllm 128 512
# run demo(Multimodal Example)
./demo demo.jpg models/qwen2_vl_2b_vision_rk3576.rknn models/Qwen2-VL-2B-Instruct.rkllm 128 512
五. 运行 demo
adb shell
cd /data/demo_Linux_aarch64
# export lib path
export LD_LIBRARY_PATH=./lib
# soft link models dir
ln -s /data/models .
# run imgenc
./imgenc models/qwen2_vl_2b_vision_rk3576.rknn demo.jpg
# run llm(Pure Text Example)
./llm models/Qwen2-VL-2B-Instruct.rkllm 128 512
# run demo(Multimodal Example)
./demo demo.jpg models/qwen2_vl_2b_vision_rk3576.rknn models/Qwen2-VL-2B-Instruct.rkllm 128 512