Qwen3-VL是迄今为止 Qwen 系列中最强大的视觉-语言模型,这一代在各个方面都进行了全面升级:更优秀的文本理解和生成、更深入的视觉感知和推理、更长的上下文长度、增强的空间和视频动态理解能力,以及更强的代理交互能力。
主要增强功能:
详细模型介绍可参考开源社区内容 https://modelscope.cn/models/Qwen/Qwen3-VL-8B-Instruct
| 设备型号 | NPU配置 |
|---|---|
| Atlas 800 3000(300I Duo卡) | 8B模型单卡 32B模型双卡 |
docker pull quay.io/ascend/vllm-ascend:v0.11.0rc0-310p-openeulerdocker run -p 36025:8000 -m 80g --shm-size=10g \
--name vllm-qwen3-vl \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /opt/data/models:/models \
-v /opt/workspace:/workspace \
-itd quay.io/ascend/vllm-ascend:v0.11.0rc0-310p-openeuler替换镜像中如下三个路径的文件,针对300I Duo卡部署Qwen3-VL模型进行了适配
由于300I Duo卡不支持模型bf16格式,需要修改模型配置文件config.json,将dtype由bfloat16修改为float16
export VLLM_ASCEND_ENABLE_NZ=0vllm服务启动,双卡部署--tensor-parallel-size设置为2,其中必须添加--enforce-eager参数
vllm serve /models/Qwen3-VL-8B-Instruct \
--served-model-name Qwen3-VL-8B-Instruct \
--gpu-memory-utilization 0.75 \
--max-model-len 8192 \
--tensor-parallel-size 2 \
--enforce-eager300I Duo卡部署Qwen3-VL-8B/32B模型时遇到的问题及规避文件中主要的代码改动如下:
1、npu_rotary_mul算子在300I Duo卡计算有问题,经测试输入fp16时,输出变为fp32,导致图片推理请求报错,这里将结果转为fp16规避。

2、300I Duo卡上仅支持head维度为16的倍数,Qwen3-VL的维度为72,不满足条件导致报错,在300I Duo卡上跑需要进行padding,修改如下代码在forward阶段进行padding。

3、多模态推理请求时出现精度问题,解析图片发生错乱。

定位精度问题是源于ViT部分的unpadfa的计算错误,目前通过替换为分块+pfa算子进行规避,当前规避方案在单图场景性能和源方案近似,但在多图场景会存在显著的prefill阶段性能劣化。

4、并发压测时,推理服务会挂掉,报错“RuntimeError: The size of tensor a (10560) must match the size of tensor b (3520) at non-singleton dimension 0”,日志打印发现这里qkv切分错误,cu_seqlens的值为[0, 3520, 3520, 3520]

如下代码修复后问题解决,cu_seqlens恢复为正常值[0, 3520, 7040, 10560]
