Qwen2.5-VL 是阿里巴巴推出的新一代多模态大语言模型(Multimodal Large Language Model, MLLM),属于通义千问(Qwen)系列的最新成员。支持图像、文本、视频等多种输入模态,具备跨模态理解、推理、生成能力。适用于图像描述、视觉问答(VQA)、文档分析、多模态交互等任务。相比前代模型(Qwen-VL),在推理速度、准确性、多语言支持等方面均有显著提升。Qwen2.5-VL仓库可见Qwen2.5-VL。
本例程对Qwen2.5-VL进行移植,使其可在Sophon BM1684X以及BM1688芯片上运行。PCIE模式下,该例程支持在V24.04.01(libsophon_0.5.1)及以上的SDK上运行。在1684X SoC设备(如SE7、SM7、Airbox等)以及16G版本的1688设备(例如SE9-16)上,支持在V24.04.01(libsophon_0.5.1)SDK上运行。在SoC上运行需要额外进行环境配置,请参照运行环境准备完成环境部署。
- 支持BM1684X和BM1688(x86 PCIe、SoC)
- 支持INT4模型编译和推理
- 支持基于SAIL推理的Python例程
- 支持连续对话
- 支持单一图片、视频输入
- 支持纯文本对话
- 支持图像Resize
- 支持视频抽帧
- 支持历史信息存储与清理
- 支持动态模型
在PCIe上无需修改内存,以下为soc模式相关: 对于1684X系列设备(如SE7/SM7),都可以通过这种方式完成环境准备,使其满足Qwen2.5-VL运行条件。首先,确保使用V24.04.01 SDK,可以通过bm_version命令检查SDK版本,如需要升级,可从sophgo.com获取v24.04.01版本SDK,刷机包位于sophon-img-xxx/sdcard.tgz中,参考对应的产品手册进行刷机。
确保SDK版本后,在1684x SoC环境上,参考如下命令修改设备内存。
cd /data/
mkdir memedit && cd memedit
wget -nd https://github.com/sophgo/sophon-tools/releases/download/v24.09.21/memory_edit_v2.10.tar.xz
tar xvf memory_edit_v2.10.tar.xz
cd memory_edit
./memory_edit.sh -p #这个命令会打印当前的内存布局信息
./memory_edit.sh -c -npu 7615 -vpu 2048 -vpp 2048 #如果是在1688平台上请修改为:./memory_edit.sh -c -npu 10240 -vpu 0 -vpp 3072
sudo cp /data/memedit/DeviceMemoryModificationKit/memory_edit/emmcboot.itb /boot/emmcboot.itb && sync
sudo reboot注意:
- tpu总内存为npu/vpu/vpp三者之和。
- 更多教程请参考SoC内存修改工具
该模型目前支持在1684X以及1688上运行,已提供编译好的bmodel。其中编译好的BModel上下文长度为2k,若需要自行编译其他上下文长度模型,需要参考4.2 自行编译BModel模型
本例程在scripts目录下提供了相关模型和数据的下载脚本
└── scripts
├── download_bm1684x_bmodel.sh # 通过该脚本下载BM1684X平台的Qwen2.5-VL的BModel
├── download_bm1688_bmodel.sh # 通过该脚本下载BM1688平台的Qwen2.5-VL的BModel
├── download_datasets.sh # 通过该脚本下载Qwen2.5-VL的测试数据注意:
- 下载BModel之前,应该保证存储空间大于7G (bmodel文件大小)
# 安装unzip,若已安装请跳过,非ubuntu系统视情况使用yum或其他方式安装
sudo apt install unzip
chmod -R +x scripts/
./scripts/download_bm1684x_bmodel.sh
./scripts/download_datasets.sh执行下载脚本后,目录结构如下:
├── models
| └── BM1684X
| └── qwen2.5-vl-3b-instruct-awq_w4bf16_seq2048_bm1684x_1dev_20250428_143625.bmodel # 使用TPU-MLIR编译,用于BM1684X的Qwen2.5-VL BModel,上下文长度为2k
└── datasets
├── images # 测试图片目录
└── videos # 测试视频目录此外我们也提供了编译好的7B模型以及3B动态模型,可以使用以下命令下载:
# 用于BM1684X的Qwen2.5-VL-7B的BModel,上下文长度为2k
python3 -m dfss --url=open@sophgo.com:ext_model_information/LLM/LLM-TPU/qwen2.5-vl-7b-instruct-awq_w4bf16_seq2048_bm1684x_1dev_20250428_150810.bmodel
# 用于BM1688的Qwen2.5-VL-7B的BModel,上下文长度为2k
python3 -m dfss --url=open@sophgo.com:ext_model_information/LLM/LLM-TPU/qwen2.5-vl-7b-instruct-awq_w4bf16_seq2048_bm1688_2core_20250428_152052.bmodel
# 用于BM1684的Qwen2.5-VL-3B的BModel,上下文长度为8K
python3 -m dfss --url=open@sophgo.com:/ext_model_information/LLM/LLM-TPU/qwen2.5-vl-3b-instruct-awq_w4bf16_seq8192_bm1684x_1dev_dyn_20250722_203019.bmodelQwen2.5-VL模型编译需要依赖transformers官方仓库和TPU-MLIR工具包,目前只支持在x86主机进行模型编译。
注意:
1.编译模型需要保证CPU运行内存至少15G以上,编译的bmodel模型需要存储空间30G以上,请确保有足够的内存和磁盘空间完成此操作。
2.由于transformers是在v4.49.0版本开始支持的Qwen2.5-VL,该版本需要Python版本大于等于3.10.0。使用TPU-MLIR工具链提供的docker环境可满足此要求。 3.推荐源模型使用Huggingface上的AWQ量化版本,编译成bmodel的过程基本没有精度损失。
-
模型编译前需要安装最新版本TPU-MLIR,具体可参考TPU-MLIR环境搭建创建并进入docker环境。
-
进入docker环境后需要安装TPU-MLIR。本例程需要的TPU-MLIR版本较新,这里提供一个whl包供下载安装:
python3 -m dfss --url=open@sophgo.com:sophon-demo/Qwen2_5_VL/tpu_mlir-1.18b0-py3-none-any.whl
pip3 install tpu_mlir-1.18b0-py3-none-any.whl --force-reinstall- 安装依赖
pip3 install qwen-vl-utils accelerate torch==2.6.0 transformers==4.49.0 -i https://pypi.tuna.tsinghua.edu.cn/simple- 从Huggingface下载源模型
Qwen2.5-VL-3B-Instruct-AWQ。源模型文件比较大,会花费较长时间,请耐心等待。
git lfs install
# 下载3B模型:
git clone https://huggingface.co/Qwen/Qwen2.5-VL-3B-Instruct-AWQ
# 下载7B模型:
git clone https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct-AWQ- 使用以下命令编译模型生成bmodel。您可以根据自己的需要来配置参数,参数详情可参考tpu-mlir/README。
llm_convert.py --model_path Qwen2.5-VL-3B-Instruct-AWQ --seq_length 2048 --quantize w4bf16 --chip bm1684x --num_device 1 --out_dir ./models --max_pixels 672,896其中,视觉部分的长度vision_length = max_pixels // 28 ** 2,应保证其不超过seq_length。编译完成后生成的bmodel模型在当前目录的models文件夹。如果要使用动态模型需添加参数--dynamic
输入datasets/images/test_frames测试图片集,原始图片尺寸为1920x1080,缩放到模型能够接受的最大尺寸进行测试,即max_side参数为-1,测试问题为:"请描述图片中的内容",测试命令如下
cd tools
python3 performance_test.py| 测试平台 | 测试模型 | preprocess + tokenize(s) | vision inference(s) | first token latency(s) | token per second(tokens/s) |
|---|---|---|---|---|---|
| SE7-32 | qwen2.5-vl-3b-instruct-awq_w4bf16_seq2048_bm1684x_1dev.bmodel | 0.205 | 1.153 | 3.699 | 16.978 |
| SE7-32 | qwen2.5-vl-7b-instruct-awq_w4bf16_seq2048_bm1684x_1dev.bmodel | 0.195 | 1.200 | 5.343 | 8.016 |
| SE9-16 | qwen2.5-vl-3b-instruct-awq_w4bf16_seq2048_bm1688_2core.bmodel | 0.266 | 3.298 | 11.254 | 7.412 |
| SE9-16 | qwen2.5-vl-7b-instruct-awq_w4bf16_seq2048_bm1688_2core.bmodel | 0.248 | 3.370 | 26.407 | 4.443 |
| SE7-32 | qwen2.5-vl-3b-instruct-awq_w4bf16_seq8192_bm1684x_1dev_dyn.bmodel | 0.198 | 1.332 | 2.393 | 11.007 |
测试说明:
- 性能测试结果具有一定的波动性,且与输入也有关,此处结果是对12张照片测试后取的平均值;
- SE7-32的主控处理器为8核 ARM A53 42320 DMIPS @2.3GHz,PCIe上的性能由于处理器的不同可能存在较大差异;
- 图片或者视频尺寸越大,一般精度越高,直到达到一定尺寸,较大输入需要上下文较长的模型;