跳转至

Qwen-VL-Dense(Qwen3-VL-8B/32B)

1 简介

阿里云推出的Qwen-VL(视觉-语言)系列包含一系列强大的大型视觉语言模型(LVLM),专为全面的多模态理解而设计。它们接受图像、文本和边界框作为输入,并输出文本和检测框,从而实现图像检测、多模态对话和多图像推理等高级功能。

本文档将展示该模型的主要验证步骤,包括支持的特性、特性配置、环境准备、NPU部署、精度和性能评估。

本教程使用 vLLM-Ascend v0.11.0rc3-a3 版本进行演示,以 Qwen3-VL-8B-Instruct 模型为例,展示单NPU和多NPU部署。

Note

对于Atlas推理产品,Qwen3-VL Dense需要vLLM-Ascend v0.18.0或更高版本(对于Ascend950DT,该模型从vllm-ascend:v0.23.0rc1开始支持)。请勿在此硬件上使用上述演示版本。

2 支持的特性

请参考支持的特性列表获取模型支持的特性矩阵。

请参考特性指南获取特性的配置。

3 前提条件

3.1 模型权重

在 Atlas 800I A2(64GB × 8)、Atlas 800 A3(64GB × 16)或 Atlas 300I DUO 上需要 1 张卡:

在 Ascend950DT 系列(96GB × 8)节点上需要 1 张卡。

在 Atlas 800I A2(64GB × 8)、Atlas 800 A3(64GB × 16)或 Atlas 推理产品上需要 2 张卡:

在 Ascend950DT 系列(96GB × 8)节点上需要 1 张卡。

建议将模型权重下载到多节点的共享目录,例如 /root/.cache/

4 安装

4.1 Docker镜像安装

根据您的机器类型选择镜像,并在您的节点上启动 docker 镜像,请参阅使用 docker

在每个节点上启动docker镜像。

export IMAGE=quay.io/ascend/vllm-ascend:|vllm_ascend_version|-#TODO
export NAME=vllm-ascend

docker run --rm \
--name $NAME \
--net=host \
--shm-size=1g \
--privileged=true \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci_manager \
--device /dev/hisi_hdc \
--device /dev/ummu \
--device /dev/uburma \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/hccl_rootinfo.json:/etc/hccl_rootinfo.json \
-v /etc/hixlep/:/etc/hixlep/ \
-v /root/.cache:/root/.cache \
-v /usr/local/sbin:/usr/local/sbin \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/bin/urma_admin:/usr/bin/urma_admin \
-v /lib/route.conf:/lib/route.conf \
-v /usr/lib64:/usr/lib64 \
-itd $IMAGE bash
# Update the vllm-ascend image
# A2: quay.io/ascend/vllm-ascend:v0.23.0
# A3: quay.io/ascend/vllm-ascend:v0.23.0-a3
export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0

docker run --rm \
--name vllm-ascend \
--shm-size=1g \
--device /dev/davinci0 \
--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 /root/.cache:/root/.cache \
-p 8000:8000 \
-it $IMAGE bash
# Use the vllm-ascend image
export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0-310p

docker run --rm \
--name vllm-ascend \
--shm-size=10g \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--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 /root/.cache:/root/.cache \
-p 8000:8000 \
-it $IMAGE bash

安装验证:

启动容器后,运行以下命令验证安装:

docker ps | grep vllm-ascend

预期结果:容器被列出,状态为 Up。您还可以在容器内验证 vllm-ascend 版本:

pip show vllm-ascend

预期结果:显示版本信息,与拉取的镜像版本匹配。

4.2 源码安装

如果您不想使用Docker镜像,可以从源码构建。首先从源码安装vLLM:

  1. 克隆并安装vLLM:
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .
  1. 克隆并安装vLLM-Ascend仓库:
git clone https://github.com/vllm-project/vllm-ascend.git
cd vllm-ascend
pip install -e .

Note

Atlas 300I DUO 不支持 tritontriton-ascend。源码安装可能会自动引入它们;运行前请手动卸载:

pip uninstall -y triton-ascend triton

安装验证:

pip show vllm vllm-ascend

预期结果:显示两个包的版本信息,确认安装成功。

Note

如果部署多节点环境,请在每个节点上设置环境。

更多详情,请参阅安装指南

5 在线服务部署

5.1 单节点在线部署

运行docker容器以在单NPU上启动vLLM服务:

export HCCL_OP_EXPANSION_MODE="AIV"
export ASCEND_RT_VISIBLE_DEVICES=$1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

vllm serve Qwen/Qwen3-VL-8B-Instruct \
  --host 0.0.0.0 \
  --port $2 \
  --quantization ascend \
  --served-model-name qwen3vl \
  --no-enable-prefix-caching \
  --data-parallel-size $3 \
  --tensor-parallel-size $4 \
  --trust-remote-code \
  --max-num-seqs 128 \
  --max-model-len 32768 \
  --max-num-batched-tokens 16384 \
  --gpu-memory-utilization 0.91 \
  --async-scheduling \
  --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,2,4,8,16,32]}' \
  --mm-processor-cache-gb 0
export HCCL_OP_EXPANSION_MODE="AIV"
export ASCEND_RT_VISIBLE_DEVICES=$1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

vllm serve Qwen/Qwen3-VL-8B-Instruct \
--host 0.0.0.0 \
--port $2 \
--dtype bfloat16 \
--served-model-name qwen3vl \
--no-enable-prefix-caching \
--data-parallel-size $3 \
--tensor-parallel-size $4 \
--trust-remote-code \
--max-num-seqs 128 \
--max-model-len 32768 \
--max-num-batched-tokens 16384 \
--gpu-memory-utilization 0.91 \
--async-scheduling \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,2,4,8,16,32]}' \
--mm-processor-cache-gb 0
export HCCL_OP_EXPANSION_MODE="AIV"
export ASCEND_RT_VISIBLE_DEVICES=$1
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

vllm serve Qwen/Qwen3-VL-8B-Instruct \
--dtype float16 \
--max_model_len 16384 \
--host 0.0.0.0 \
--port $2 \
--dtype bfloat16 \
--served-model-name qwen3vl \
--no-enable-prefix-caching \
--data-parallel-size $3 \
--tensor-parallel-size $4 \
--trust-remote-code \
--max-num-seqs 128 \
--max-model-len 32768 \
--max-num-batched-tokens 16384 \
--gpu-memory-utilization 0.91 \
--async-scheduling \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,2,4,8,16,32]}' \
--additional-config '{"ascend_compilation_config": {"enable_npugraph_ex":false}}' \
--mm-processor-cache-gb 0

Note

在 Atlas 300I DUO 上:

  • 仅支持 float16 数据类型。
  • 图编译(--compilation-config)需要 CANN 版本 >= 9.0.0。如果您的 CANN 版本较低,请将 --compilation-config 替换为 --enforce-eager
  • 必须使用 --additional-config 并设置 "ascend_compilation_config": {"enable_npugraph_ex": false},因为 Atlas 300I DUO 不支持 enable_npugraph_ex

关键参数说明:

  • 添加 --max_model_len 选项,以避免当 Qwen3-VL-8B-Instruct 模型的最大序列长度(256000)超过 KV 缓存可存储的最大 token 数时出现的 ValueError。该值因不同 NPU 系列的片上内存大小而异,请根据您的 NPU 系列调整为一个合适的值。

如果您的服务启动成功,您可以看到如下信息:

INFO:     Started server process [2736]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

6 功能验证

服务器启动后,您可以使用输入提示查询模型:

curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
    "model": "Qwen/Qwen3-VL-8B-Instruct",
    "messages": [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": [
        {"type": "image_url", "image_url": {"url": "https://modelscope.oss-cn-beijing.aliyuncs.com/resource/qwen.png"}},
        {"type": "text", "text": "What is the text in the illustration?"}
    ]}
    ]
    }'

预期结果:

服务返回HTTP 200 OK。

{"id":"chatcmpl-d3270d4a16cb4b98936f71ee3016451f","object":"chat.completion","created":1764924127,"model":"Qwen/Qwen3-VL-8B-Instruct","choices":[{"index":0,"message":{"role":"assistant","content":"The text in the illustration is: **TONGYI Qwen**","refusal":null,"annotations":null,"audio":null,"function_call":null,"tool_calls":[],"reasoning_content":null},"logprobs":null,"finish_reason":"stop","stop_reason":null,"token_ids":null}],"service_tier":null,"system_fingerprint":null,"usage":{"prompt_tokens":107,"total_tokens":123,"completion_tokens":16,"prompt_tokens_details":null},"prompt_logprobs":null,"prompt_token_ids":null,"kv_transfer_params":null}

7 精度评估

部分模型的精度已在我们的CI监控范围内,包括:

  • Qwen3-VL-8B-Instruct

使用 Language Model Evaluation Harness

mmmu_val 数据集作为测试数据集为例,在离线模式下运行 Qwen3-VL-8B-Instruct 的精度评估。

  1. 请参考使用lm_eval了解 lm_eval 安装的更多详情。

    pip install lm_eval
    
  2. 运行 lm_eval 执行精度评估。

    lm_eval \
        --model vllm-vlm \
        --model_args pretrained=Qwen/Qwen3-VL-8B-Instruct,max_model_len=8192,gpu_memory_utilization=0.7 \
        --tasks mmmu_val \
        --batch_size 32 \
        --apply_chat_template \
        --trust_remote_code \
        --output_path ./results
    
  3. 执行后,您将获得结果,以下是 Qwen3-VL-8B-Instructvllm-ascend:0.11.0rc3 中的结果,仅供参考。

任务 标准误差
mmmu_val 0.5389 0.0159

使用 AISBench

text_vqa 数据集为例,运行 Qwen3-VL-8B-Instruct 的精度评估。

  1. 参考 使用 AISBench 了解安装、数据集下载和配置详情。

  2. 运行 ais_bench 执行精度评估。

    ais_bench --models vllm_api_general_chat --datasets textvqa_gen_base64 --mode all --debug
    
  3. 执行后,您可以获取结果,以下为 vllm-ascend:0.23.0rc1Qwen3-VL-8B-Instruct 的结果,仅供参考。

数据集 指标 模式 vllm-api-general-chat
text_vqa accuracy gen 80.57

8 性能评估

使用vLLM基准测试

更多详情请参考vLLM基准测试

有三个 vllm bench 子命令:

  • latency:基准测试单批次请求的延迟。
  • serve:基准测试在线服务吞吐量。
  • throughput:基准测试离线推理吞吐量。

性能评估必须以在线模式进行。以 serve 为例,运行代码如下。

vllm bench serve --model Qwen/Qwen3-VL-8B-Instruct  --dataset-name random --random-input 200 --num-prompts 200 --request-rate 1 --save-result --result-dir ./

几分钟后,您将获得性能评估结果。

9 性能调优

9.1 推荐配置

注意:以下配置在特定测试环境中验证,仅供参考。最佳配置取决于最大输入/输出长度、前缀缓存命中率、精度要求和部署机器比例等因素。建议参考第9.2节根据实际情况进行调优。

表1:场景概览

场景 部署模式 *NPU总数 权重版本 关键考量
高吞吐量
(16k 上下文)
单节点混合 1 (A3) Qwen3-VL-8B-Instruct 对高分辨率文本输入使用 tp2
长上下文
(128k,无前缀缓存)
单节点混合 1 (A3) Qwen3-VL-8B-Instruct 对高分辨率文本输入使用 tp2
长上下文
(128k,带前缀缓存)
单节点混合 1 (A3) Qwen3-VL-8B-Instruct 对高分辨率文本输入使用 tp2
多模态
(1080p)
单节点混合 1 (A3) Qwen3-VL-8B-Instruct 对高分辨率视觉输入使用 tp2

*NPU总数 表示所有节点上使用的 NPU 总数。1 个节点 = 1 台 Atlas 800 A3 服务器(64GB × 16 个 NPU)。

表2:详细节点配置

场景 配置 NPU数 TP DP 最大模型长度 MTP推测数 权重版本
High Throughput / Low Latency (16k) Server / Single Machine 1 1 1 ~16k 3 Qwen3-VL-8B-Instruct
Long Context (128k, no cache) Server / Single Machine 1 1 1 128k 3 Qwen3-VL-8B-Instruct
Long Context (128k, with cache) Server / Single Machine 1 1 1 128k 3 Qwen3-VL-8B-Instruct
Multimodal (1080p) Server / Single Machine 1 1 1 ~16k 3 Qwen3-VL-8B-Instruct

完整的启动命令和参数说明请参考第5章中的部署示例。

注意: max-model-lenmax-num-seqs 需要根据实际使用场景设置。其他设置请参考 部署 章节。

9.2 调优指南

9.2.1 通用调优参考

调优方法请参考优化与调优

请参阅特性矩阵了解详细的功能描述。

10 常见问题解答

对于常见的环境、安装和一般参数问题,请参阅公共FAQ