跳转至

Qwen3-Omni-30B-A3B-Thinking

1 简介

Qwen3-Omni 是一个原生端到端多语言全模态基础模型。它可处理文本、图像、音频和视频,并以文本和自然语音形式提供实时流式响应。我们引入了多项架构升级,以提升性能和效率。Qwen3-Omni-30B-A3B 的 Thinking 模型包含 thinker 组件,具备思维链推理能力,支持音频、视频和文本输入,并输出文本。

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

Qwen3-Omni-30B-A3B 模型首次支持于 v0.12.0rc1。本文档基于 vLLM-Ascend v0.22.1rc 进行验证和编写。所有 v0.22.1rc 及更高版本均可稳定运行。如需使用最新功能,建议使用最新的候选版本或正式版本。

2 支持的功能

请参阅 支持的功能列表 以获取模型支持的功能矩阵。

请参阅 功能指南 以获取功能的配置。

3 前提条件

3.1 模型权重

以下模型变体可用。建议将模型权重下载到所有节点均可访问的共享目录。

模型 硬件要求 下载
Qwen3-Omni-30B-A3B (BF16) Atlas 800I A3 (64G, 1\~2 卡)
Atlas 800I A2 (64G, 2\~4 卡)
ModelScope | Hugging Face
Qwen3-Omni-30B-A3B-W8A8 Atlas 800I A3 (64G, 1\~2 卡)
Atlas 800I A2 (64G, 2\~4 卡)
不适用

W8A8 量化权重无法直接下载,您可以使用 msmodelslim 对 BF16 模型进行量化来获得它们。详情请参阅 量化指南。本文档中的所有模型路径都应调整为您实际的本地路径。

这些是推荐的卡数,可根据实际情况进行调整。

Note

Qwen3-Omni-30B-A3B-W8A8 采用混合量化策略(按模型结构排序):

  • 嵌入层:BF16(无量化)
  • Q/K 归一化 (q_norm, k_norm):BF16
  • 注意力投影 (q/k/v/o_proj):静态 W8A8,使用预计算的逐张量缩放
  • MoE 路由门控 (mlp.gate):BF16
  • MoE 专家投影 (gate/up/down_proj):动态 W8A8,输入缩放在推理期间即时计算

建议将模型权重下载到跨多个节点的共享目录。

路径说明:将模型权重下载到您选择的目录并记录下来。确保后续部署命令中的模型路径与该目录一致。

4 安装

4.1 Docker 镜像安装

您可以使用 Qwen3-Omni MoE 模型的官方一体化 Docker 镜像。

Docker 拉取:

docker pull quay.io/ascend/vllm-ascend:v0.23.0

Docker 运行:

export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0

docker run \
    --name vllm-ascend-env \
    --shm-size=128g \
    --net=host \
    --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/davinci8 \
    --device /dev/davinci9 \
    --device /dev/davinci10 \
    --device /dev/davinci11 \
    --device /dev/davinci12 \
    --device /dev/davinci13 \
    --device /dev/davinci14 \
    --device /dev/davinci15 \
    --device /dev/davinci_manager \
    --device /dev/devmm_svm \
    --device /dev/hisi_hdc \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
    -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 /etc/hccn.conf:/etc/hccn.conf \
    -it -d $IMAGE bash

Note

A3 具有 8 个 NPU,采用双 die 设计(共 16 个芯片:/dev/davinci[0-15])。 如果您在共享机器上,请仅映射您需要的芯片(例如,NPU 0-3 对应 /dev/davinci[0-7])。

export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0

docker run \
    --name vllm-ascend-env \
    --shm-size=128g \
    --net=host \
    --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/devmm_svm \
    --device /dev/hisi_hdc \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
    -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 /etc/hccn.conf:/etc/hccn.conf \
    -it -d $IMAGE bash

默认工作目录为 /workspace。vLLM 和 vLLM-Ascend 作为 Python 包安装在 site-packages 中。

安装验证:

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

docker ps | grep vllm-ascend-env

预期结果:容器以 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 .

安装验证:

pip show vllm vllm-ascend

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

Note

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

请安装系统依赖。

pip install qwen_omni_utils modelscope
# Used for audio processing.
apt-get update && apt-get install -y ffmpeg
# Check the installation.
ffmpeg -version

需要设置,以避免默认 FFTS+ 模式因流和形状限制导致的 HcclAllreduce 失败。

export HCCL_OP_EXPANSION_MODE="AIV"

5 在线服务部署

由于模型参数量较少,不涉及 PD 分离场景。

5.1 单节点在线部署

单节点部署在同一节点内同时完成 Prefill 和 Decode,适用于开发、测试以及中小规模推理场景。对于 Qwen3-Omni-30B-A3B MoE 模型,需要专家并行(EP)将专家分布到多个 NPU 上。

以下命令为示例配置。请根据实际场景调整参数。

Atlas 800I A2/A3:

export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"  # not needed on A2
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

# Ensure the model path matches the directory recorded during download
vllm serve your_model_path \
    --served-model-name qwen3-omni \
    --trust-remote-code \
    --max-num-seqs 100 \
    --max-model-len 40960 \
    --max-num-batched-tokens 16384 \
    --tensor-parallel-size 4 \
    --enable-expert-parallel \
    --quantization ascend \
    --distributed_executor_backend "mp" \
    --no-enable-prefix-caching \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --gpu-memory-utilization 0.95 \
    --additional-config '{"weight_nz_mode": 2}' \
    --port 8000

Note

  • ASCEND_RT_VISIBLE_DEVICES:必须设置为您环境中分配的 NPU 芯片 ID(例如 4 个芯片为 0,1,2,3)。
  • --port:请调整以避免与同一机器上运行的其他服务冲突。
  • --no-enable-prefix-caching:默认禁用,因为该模型在 Ascend NPU 上的前缀缓存效果尚未完全明确。您可以尝试启用它,以评估工作负载的缓存命中率。
  • --quantization ascend:W8A8 量化模型必需。使用 BF16 权重时请移除此参数。

Tip

参数详情请参见:

  • vLLM CLI 文档 — 标准 serve 参数(--host、--port、--max-model-len 等)
  • 环境变量 — Ascend 特定环境变量(HCCL_* 等)
  • 附加配置 — --additional-config 格式和选项

服务验证:

如果服务成功启动,将显示以下启动日志:

(APIServer pid=<pid>) INFO:     Started server process [<pid>]
(APIServer pid=<pid>) INFO:     Waiting for application startup.
(APIServer pid=<pid>) INFO:     Application startup complete.

6 功能验证

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

curl http://localhost:8000/v1/chat/completions \
-X POST \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-omni",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-Omni/demo/cars.jpg"
                    }
                },
                {
                    "type": "audio_url",
                    "audio_url": {
                        "url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-Omni/demo/cough.wav"
                    }
                },
                {
                    "type": "video_url",
                    "video_url": {
                        "url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-Omni/demo/draw.mp4"
                    }

                },
                {
                    "type": "text",
                    "text":  "Analyze this audio, image, and video together."
                }
            ]
        }
    ]
}'

输出应类似于以下内容。

{
  "id": "chatcmpl-8f3a1c2e4b5d4f7a9c0e1d2b3a4f5e6d",
  "object": "chat.completion",
  "created": 1782714240,
  "model": "Qwen/Qwen3-Omni-30B-A3B-Thinking",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "reasoning_content": "Let me examine each modality. The image shows several cars parked in a row — looks like a street or lot, daytime. The audio is short and sharp, sounds like a human cough (a single dry cough). The video appears to show someone drawing/sketching on paper, a hand moving a pen. Now I need to connect them: there isn't a single obvious narrative linking cars + cough + drawing, so I should describe each and then note any plausible shared context (e.g., a person sketching cars while having a cold). I'll keep the synthesis honest rather than forcing a connection.",
        "content": "Here's an analysis of the three inputs together:\n\n**Image** — A row of parked cars photographed outdoors in daylight, likely on a street or in a parking area. The vehicles are of varying colors and models, shot at a slight angle so several are visible in perspective.\n\n**Audio** — A brief, dry human cough: a single forceful exhalation lasting under a second, with no speech or background music. It sounds like an isolated cough rather than a sustained coughing fit.\n\n**Video** — A close-up of a hand drawing/sketching with a pen on paper, the strokes building up a simple illustration over a few seconds.\n\n**Combined interpretation** — The three clips don't share an explicit storyline; they're distinct samples of vision, sound, and motion. If a connecting context is assumed, one plausible scene is a person sketching cars (the drawing in the video, the cars in the image) while momentarily coughing (the audio) — e.g., an artist working outdoors who has a cold. But strictly, each input stands on its own: a static photo of cars, a one-off cough sound, and a short hand-drawing clip.",
        "tool_calls": []
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 8423,
    "total_tokens": 8712,
    "completion_tokens": 289,
    "prompt_tokens_details": null
  },
  "prompt_logprobs": null
}

预期结果:HTTP 200,JSON 响应中包含带有生成文本的 choices 字段。

7 准确性评估

7.1 使用 EvalScope

以 gsm8k、omni_bench、bbh 数据集作为测试数据集,在线模式下运行 Qwen3-Omni-30B-A3B-Thinking 的准确性评估。

  1. 关于 evalscope 的安装,请参考 使用 evalscope。
  2. 运行 evalscope 执行准确性评估。

    evalscope eval \
        --model /root/.cache/modelscope/hub/models/Qwen/Qwen3-Omni-30B-A3B-Thinking \
        --api-url http://localhost:8000/v1 \
        --api-key EMPTY \
        --eval-type server \
        --datasets omni_bench, gsm8k, bbh \
        --dataset-args '{"omni_bench": { "extra_params": { "use_image": true, "use_audio": false}}}' \
        --eval-batch-size 1 \
        --generation-config '{"max_completion_tokens": 10000, "temperature": 0.6}' \
        --limit 100
    
  3. 执行完成后,可获取结果。以下是 Qwen3-Omni-30B-A3B-Thinking 在 vllm-ascend:0.13.0rc1 中的结果,仅供参考。

    +-----------------------------+------------+----------+----------+-------+---------+---------+
    | Model                       | Dataset    | Metric   | Subset   |   Num |   Score | Cat.0   |
    +=============================+============+==========+==========+=======+=========+=========+
    | Qwen3-Omni-30B-A3B-Thinking | omni_bench | mean_acc | default  |   100 |    0.44 | default |
    +-----------------------------+------------+----------+----------+-------+---------+---------+
    | Qwen3-Omni-30B-A3B-Thinking | gsm8k      | mean_acc | main     |   100 |    0.98 | default |
    +-----------------------------+-----------+----------+----------+-------+---------+---------+
    | Qwen3-Omni-30B-A3B-Thinking | bbh        | mean_acc | OVERALL  |   270 |  0.9148 |         |
    +-----------------------------+------------+----------+----------+-------+---------+---------+
    

8 性能评估

8.1 使用 vLLM Benchmark

以运行 Qwen3-Omni-30B-A3B-Thinking 的性能评估为例。 更多详情,请参考 vLLM Benchmark。

vllm bench 有三个子命令:

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

以 serve 为例,运行以下代码。

export MODEL=Qwen/Qwen3-Omni-30B-A3B-Thinking
export VLLM_USE_MODELSCOPE=True
python3 -m vllm.entrypoints.openai.api_server --model $MODEL --tensor-parallel-size 2 --swap-space 16 --disable-log-stats --disable-log-request --load-format dummy

pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
pip install -r vllm-ascend/benchmarks/requirements-bench.txt

vllm bench serve --model $MODEL --dataset-name random --random-input 200 --num-prompts 200 --request-rate 1 --save-result --result-dir ./

执行完成后,可获取结果。以下是 Qwen3-Omni-30B-A3B-Thinking 在 vllm-ascend:0.13.0rc1 中的结果,仅供参考。

============ Serving Benchmark Result ============
Successful requests:                     200
Failed requests:                         0
Request rate configured (RPS):           1.00
Benchmark duration (s):                  211.90
Total input tokens:                      40000
Total generated tokens:                  25600
Request throughput (req/s):              0.94
Output token throughput (tok/s):         120.81
Peak output token throughput (tok/s):    216.00
Peak concurrent requests:                24.00
Total token throughput (tok/s):          309.58
---------------Time to First Token----------------
Mean TTFT (ms):                          215.50
Median TTFT (ms):                        211.51
P99 TTFT (ms):                           317.18
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          98.96
Median TPOT (ms):                        99.19
P99 TPOT (ms):                           101.52
---------------Inter-token Latency----------------
Mean ITL (ms):                           99.02
Median ITL (ms):                         96.10
P99 ITL (ms):                            176.02
==================================================

9 性能调优

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

表 1:场景概览

场景 部署模式 *NPU 总数 权重版本 关键考量
高吞吐 单节点 (TP1) 1 (A3)
2 (A2)
W8A8 单卡部署可最大化并发请求处理
低延迟 单节点 (TP4) 2 (A3)
4 (A2)
W8A8 多卡 TP 结合专家并行可降低单 Token 延迟
长上下文 单节点 (TP4) 2 (A3)
4 (A2)
W8A8 降低并发序列数以适配更长的 max-model-len

*Total NPUs 表示所有节点使用的 NPU 总数。在 Atlas 800I A3 上,每个 NPU 包含两个 die(芯片),因此 TP4 需要 4 个芯片 = 2 个 NPU。

表 2:详细节点配置

场景 NPU 数量 TP max-model-len max-num-seqs FUSED_MC2 EP hf-overrides
场景 NPUs TP max-model-len max-num-seqs FUSED_MC2 EP hf-overrides
高吞吐 1 (A3) 1 37364 100 关闭 关闭 -
低延迟 2 (A3) 4 37364 100 关闭 开启 -
长上下文 2 (A3) 4 131072 14 关闭 开启 YaRN

有关详细参数说明,请参阅第 5 节中的部署示例。

低延迟配置:

export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

vllm serve your_model_path \
    --served-model-name qwen3-omni \
    --trust-remote-code \
    --max-num-seqs 100 \
    --max-model-len 37364 \
    --max-num-batched-tokens 16384 \
    --tensor-parallel-size 4 \
    --enable-expert-parallel \
    --distributed_executor_backend "mp" \
    --no-enable-prefix-caching \
    --quantization ascend \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --additional-config '{"weight_nz_mode": 2}' \
    --gpu-memory-utilization 0.95 \
    --port 8000 \
    --speculative-config '{"method": "eagle3","model": "your_eagle3_model_path", "num_speculative_tokens": 3}'

Tip

此配置的 AISBench 示例设置:

  • request_rate: 0
  • batch_size: 32
  • 输入/输出长度:2048/2048 或 3500/1500

高吞吐配置:

export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

vllm serve your_model_path \
    --served-model-name qwen3-omni \
    --trust-remote-code \
    --max-num-seqs 100 \
    --max-model-len 37364 \
    --max-num-batched-tokens 16384 \
    --tensor-parallel-size 1 \
    --distributed_executor_backend "mp" \
    --no-enable-prefix-caching \
    --quantization ascend \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --additional-config '{"weight_nz_mode": 2}' \
    --gpu-memory-utilization 0.95 \
    --port 8000 \
    --speculative-config '{"method": "eagle3","model": "your_eagle3_model_path", "num_speculative_tokens": 3}'

Tip

此配置的 AISBench 示例设置:

  • request_rate: 0
  • batch_size: 32
  • 输入/输出长度:2048/2048 或 3500/1500

长上下文配置:

export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

vllm serve your_model_path \
    --served-model-name qwen3-omni \
    --trust-remote-code \
    --max-num-seqs 14 \
    --max-model-len 131072 \
    --max-num-batched-tokens 16384 \
    --tensor-parallel-size 4 \
    --enable-expert-parallel \
    --distributed_executor_backend "mp" \
    --no-enable-prefix-caching \
    --quantization ascend \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --additional-config '{"weight_nz_mode": 2}' \
    --gpu-memory-utilization 0.95 \
    --port 8000 \
    --hf-overrides '{"rope_parameters": {"rope_type":"yarn","factor":4,"original_max_position_embeddings":32768}}'

Tip

此配置的 AISBench 示例设置:

  • request_rate: 0
  • batch_size: 32
  • 输入/输出长度:65536/1024 或 131072/1024

9.2 调优指南

9.2.1 通用调优参考

有关调优方法,请参阅公开性能调优文档。 有关详细功能说明,请参阅功能矩阵。

10 常见问题

有关常见环境、安装和通用参数问题,请参阅公开常见问题。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend