Ascend-SACT/Qwen3-VL-8B-300I-Duo-vllm-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

300I Duo卡部署Qwen3-VL-8B/32B模型(vLLM-Ascend)

一、模型概述

Qwen3-VL是迄今为止 Qwen 系列中最强大的视觉-语言模型,这一代在各个方面都进行了全面升级:更优秀的文本理解和生成、更深入的视觉感知和推理、更长的上下文长度、增强的空间和视频动态理解能力,以及更强的代理交互能力。

主要增强功能:

  • 视觉代理:操作 PC/移动 GUI——识别元素、理解功能、调用工具、完成任务
  • 视觉编码增强:从图像/视频生成 Draw.io/HTML/CSS/JS
  • 高级空间感知:判断物体位置、视角和遮挡;提供更强的 2D 接地,并支持 3D 接地,用于空间推理和具身 AI。
  • 长上下文与视频理解:原生 256K 上下文,可扩展至 1M;处理书籍和数小时长的视频,具有完整的回忆和秒级索引。
  • 增强多模态推理:在 STEM/数学方面表现出色——因果分析和基于逻辑、证据的答案。
  • 升级的视觉识别:更广泛、更高质量的预训练能够“识别一切”——名人、动漫、产品、地标、动植物等。
  • 扩展的 OCR:支持 32 种语言(从 19 种增加);在低光、模糊和倾斜条件下表现稳健;更好地处理罕见/古代字符和术语;改进了长文档结构解析。
  • 与纯 LLM 相当的文本理解:无缝的文本-视觉融合,实现无损、统一的理解

详细模型介绍可参考开源社区内容 https://modelscope.cn/models/Qwen/Qwen3-VL-8B-Instruct

二、环境准备

1、硬件型号

设备型号NPU配置
Atlas 800 3000(300I Duo卡)8B模型单卡
32B模型双卡

2、软件版本

  • CANN:8.2.RC1
  • vLLM-Ascend:0.11.0rc0
  • 镜像版本:quay.io/ascend/vllm-ascend:v0.11.0rc0-310p-openeuler

三、推理服务部署

1、镜像下载

docker pull quay.io/ascend/vllm-ascend:v0.11.0rc0-310p-openeuler

2、容器启动

docker 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

3、规避文件替换

替换镜像中如下三个路径的文件,针对300I Duo卡部署Qwen3-VL模型进行了适配

  • vllm_ascend/worker/model_runner_v1.py
  • vllm_ascend/models/qwen2_5_vl_without_padding.py
  • vllm_ascend/worker/worker_v1.py

4、修改配置文件

由于300I Duo卡不支持模型bf16格式,需要修改模型配置文件config.json,将dtype由bfloat16修改为float16

5、配置环境变量

export VLLM_ASCEND_ENABLE_NZ=0

6、vllm服务启动

vllm服务启动,双卡部署--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-eager

四、已规避问题概述

300I Duo卡部署Qwen3-VL-8B/32B模型时遇到的问题及规避文件中主要的代码改动如下:

1、npu_rotary_mul算子在300I Duo卡计算有问题,经测试输入fp16时,输出变为fp32,导致图片推理请求报错,这里将结果转为fp16规避。

npu_rotary_mul算子问题截图.png

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

padding代码截图.png

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]

并发切分错误日志截图.png

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

切分问题修复代码.png