VLM端侧运行

本章节将以Qwen3-VL-4B-Instruct模型为例,为您介绍该模型的端侧运行流程。 此流程适用于量化后模型直接上板运行的场景,请您先阅读 端侧运行准备 章节做好端侧运行准备并了解模型和示例的对应关系。

使用限制

vlm_demo当前仅支持读取单张图片,未来版本会支持多图输入。

示例文件说明

oellm_runtime目录中,VLM示例使用到的文件和文件夹如下所示:

. ├── configs # Tokenizer文件 │ ├── InternVL2_2B_config │ ├── Qwen2.5_VL_config │ └── Qwen3_VL_config ├── examples │ └── vlm_demo │ ├── build_vlm.sh # 交叉编译脚本 │ ├── vlm_demo.cc # 可执行文件源码 │ ├── CMakeLists.txt │ ├── image0.jpg # 图片测试用例 │ ├── image1.jpg │ ├── run_vlm.sh # 端侧运行脚本 │ ├── vlm # 可执行文件 │ ├── internvl2_2b_config.json # 端侧运行配置文件 │ ├── qwen2.5vl_3b_config.json │ ├── qwen2.5vl_7b_config.json │ ├── qwen3vl_2b_config.json │ ├── qwen3vl_4b_config.json │ └── qwen3vl_8b_config.json ├── include ├── lib └── model ├── Qwen3-VL-4B-Instruct │ ├── Qwen3-VL-4B-Instruct_vision_448x448_w8-4_nash-p_corenum_4.hbm │ ├── Qwen3-VL-4B-Instruct_language_chunk_512_cache_1024_w4_nash-p_corenum_4_4.hbm │ └── Qwen3-VL-4B-Instruct_embed_tokens_w4_fp16.bin └── resolve_model_nash-p.md ## 端侧模型下载方式

配置文件说明

端侧运行配置文件{model}_config.json用户可配置参数及其说明:

参数名称参数说明可选/必选
model_type参数描述:模型类型
参数类型string
取值范围Qwen2.5-VLQwen3-VLInternVL
必选
model_dir参数描述:板端模型存放的文件夹路径
参数类型string
必选
vit_model_file参数描述:vision模型文件名
参数类型string
必选
llm_model_file参数描述:language模型文件名
参数类型string
必选
embed_weight_file_path参数描述:嵌入权重文件名
参数类型string
必选
vit_bpu_core参数描述:vision模型使用的bpu核,
设定多个值时按照[0,1,2,3]填写
参数类型[int]
必选
prefill_bpu_core参数描述:language模型prefill阶段使用的bpu核,
设定多个值时按照[0,1,2,3]填写
参数类型[int]
必选
decode_bpu_core参数描述:language模型decode阶段使用的bpu核,
设定多个值时按照[0,1,2,3]填写
参数类型[int]
必选
vocabulary_path参数描述:Tokenizer配置文件路径
参数类型string
必选
注意

其余配置参数请勿自行修改,否则会导致模型推理异常。

qwen3vl_4b_config.json参考配置示例:

{ "model_type": "Qwen3-VL", "model_dir": "../../model/Qwen3-VL-4B-Instruct/", "vit_model_file": "Qwen3-VL-4B-Instruct_vision_448x448_w8-4_nash-p_corenum_4.hbm", "llm_model_file": "Qwen3-VL-4B-Instruct_language_chunk_512_cache_1024_w4_nash-p_corenum_4_4.hbm", "embed_weight_file_path": "Qwen3-VL-4B-Instruct_embed_tokens_w4_fp16.bin", "vit_bpu_core": [ 0,1,2,3 ], "prefill_bpu_core": [ 0,1,2,3 ], "decode_bpu_core": [ 0,1,2,3 ], "vocabulary_path" : "../../configs/Qwen3_VL_4B_config", "text_end_token" : "<|endoftext|>", "img_start_token": "<|vision_start|>", "img_end_token": "<|vision_end|>", "img_context_token": "<|image_pad|>", "mask_pad_value": -32768, "temporal_patch_size": 2, "patch_size": 16, "vocab_size": 151936, "embed_dim": 2560, "image_height": 448, "image_width": 448, "image_net_mean": [ 0.5, 0.5, 0.5 ], "image_net_std": [ 0.5, 0.5, 0.5 ] }

端侧运行说明

示例提供运行脚本run_vlm.sh,运行指令参考:

cd /userdata/oellm_runtime/examples/vlm_demo/ # 仅初始化模型 bash run_vlm.sh qwen3vl_4b_config.json # 初始化模型的同时,加载单张图片 bash run_vlm.sh qwen3vl_4b_config.json image0.jpg

该脚本内容如下:

#!/bin/sh export LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH # 指定动态库 export HB_DNN_USER_DEFINED_L2M_SIZES=6:6:6:6 # 为BPU分配L2M大小 config_file=$1 image_file=$2 if [ "$#" -ge 2 ]; then image_file=$2 ./vlm -c $config_file -i $image_file else ./vlm -c $config_file fi

可执行文件的参数信息:

Usage: ./vlm --config_path <config_path> [options] Options: -c, --config_path <config_path> Path to the vlm config file (required) -i, --image_path <image_path> Path to the local image file -h, --help Show this help message Examples: ./vlm --config_path ./qwen3vl_4b_config.json

会话控制指令说明:

指令说明
<prompt>输入文本,提供用户prompt信息
/image <image_path>加载本地图片,会替换先前已加载图片
regen重新生成本次对话结果
reset清除缓存,用于清除已加载图像信息
exit退出程序

多模态输入说明

图片输入

方式1. 初始化模型的同时加载图片,例如:

bash run_vlm.sh qwen3vl_4b_config.json image0.jpg

方式2.[User] <<<提示后,输入/image和本地图片路径,例如:

[User] <<< /image image1.jpg

文本输入

[User] <<<提示后,输入文本内容即可,例如:

[User] <<< 简单描述这张图片的内容

运行结果展示

xlm init success 您好,我是板端多模态大模型demo - 输入文本:<prompt> - 加载图片:/image <image_path> - 重新生成:regen - 清除缓存:reset - 退出程序:exit [User] <<< /image image1.jpg [Assistant] >>> <<< ===== performance ===== ===== vit cost: 34.988000 ms, vit infer cost: 34.988000 ms ===== [User] <<< 简单描述这张图片的内容 [Assistant] >>> 这张图片展示了一只小熊猫(Red Panda)正在攀爬或休息在木制结构上。它有着标志性的红棕色毛发、白色面部斑纹、黑色眼睛和鼻子。小熊猫正抬头看着镜头,表情看起来很警觉或好奇。背景是自然的树木和枝条,表明它可能在自然栖息地或动物园的户外环境中。它的姿势和表情都显示出它对环境的观察和适应能力。 <<< ===== prefill token num: 512 prefill cost: 153.039000 ms, prefill speed: 3345.552441 tokens/s ===== ===== decode token num: 94 cost per token: 19.266138 ms, decode speed: 51.904538 tokens/s ===== ===== end_to_end cost: 1965.197000 ms =====