跳转至

Qwen3-Coder-30B-A3B

1 简介

Qwen3-Coder-30B-A3B 是 Qwen3 Coder 系列中的一款混合专家(Mixture-of-Experts,MoE)模型,与 Qwen3-30B-A3B 共享相同架构,总参数量为 30.5B,每个 Token 激活 3.3B 参数。基于 Qwen3 基础架构构建,它在智能体编码(Agentic Coding)、最高 1M Token 的扩展上下文支持以及多功能函数调用能力方面实现了显著优化。

本文档将演示 Qwen3-Coder-30B-A3B 在 vLLM-Ascend 环境中的主要验证步骤,包括支持的特性、环境准备、单节点部署,以及精度和性能评估。

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

2 支持特性

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

特性配置信息请参考特性指南。

3 前提条件

3.1 模型权重

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

模型 硬件要求 下载
Qwen3-Coder-30B-A3B-Instruct (BF16) Atlas 800I A3 (64G, 1\~2 卡)
Atlas 800I A2 (64G, 2\~4 卡)
ModelScope
Qwen3-Coder-30B-A3B-Instruct-W8A8 Atlas 800I A3 (64G, 1\~2 卡)
Atlas 800I A2 (64G, 2\~4 卡)
ModelScope
Eagle3 草稿模型 NA Hugging Face

以上为推荐的卡数,可根据实际情况进行调整。

如果无法直接下载 W8A8 量化权重,可以使用 msmodelslim 对 BF16 模型进行量化来获取。详细信息请参阅量化指南。本文档中的所有模型路径均应根据您的实际本地路径进行调整。

Note

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

  • Embedding 层:BF16(不量化)
  • Q/K 归一化(q_norm、k_norm):BF16(权重和偏置)
  • 注意力投影(q/k/v/o_proj):静态 W8A8,使用预计算的逐张量缩放因子;偏置保持 BF16
  • MoE 路由门控(mlp.gate):BF16
  • MoE 专家投影(gate/up/down_proj):动态 W8A8,推理期间实时计算输入缩放因子

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

4 安装

4.1 Docker 镜像安装

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

Docker 运行:

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

docker run \
    --name vllm-ascend-env \
    --ipc host \
    --net host \
    --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/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /usr/local/sbin:/usr/local/sbin \
    -it -d $IMAGE bash

Note

A3 具有 8 个 NPU,采用双 Die 设计(共 16 个芯片:/dev/davinci[0-15])。如果您使用的是共享机器,只需映射您需要的芯片(例如,NPU 0-3 映射 /dev/davinci[0-7])。

Docker 运行:

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

docker run \
    --name vllm-ascend-env \
    --ipc host \
    --net host \
    --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/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /usr/local/sbin:/usr/local/sbin \
    -it -d $IMAGE bash

Tip

以上挂载是访问 NPU 驱动所需的最少挂载项。请根据您的环境需要添加额外的 -v 挂载(例如模型权重路径、数据集)。

默认工作目录为 /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

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

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

5 在线服务部署

5.1 单节点在线部署

单节点部署在同一节点内完成 Prefill 和 Decode,适用于开发、测试以及中小规模的推理场景。对于 Qwen3-Coder-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-coder \
    --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"}' \
    --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}'

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 的格式和选项

服务验证:

服务启动后,通过发送提示词来验证服务是否正常运行。使用示例请参阅第 6 节。

6 功能验证

服务启动后,可通过发送提示词来调用模型。

Chat Completions API:

curl http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen3-coder",
        "messages": [
            {"role": "user", "content": "Give me a short introduction to large language models."}
        ],
        "temperature": 0.6,
        "top_p": 0.95,
        "top_k": 20,
        "max_completion_tokens": 4096
    }'

Note

请根据您的部署情况调整以下字段:

  • URL(http://localhost:8000):将 localhost 和 8000 替换为您的服务器 IP 以及 vllm serve 命令中的 --port 值。
  • model:必须与 vllm serve 命令中的 --served-model-name 值一致(例如 qwen3-coder)。

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

7 精度评估

7.1 使用 AISBench

有关安装、数据集下载和配置等设置详情,请参阅使用 AISBench。

以下是以 GSM8K 数据集为例的精度评估配置文件示例:

# Example configuration: benchmarks/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py
from ais_bench.benchmark.models import VLLMCustomAPIChat

models = [
    dict(
        attr="service",
        type=VLLMCustomAPIChat,
        abbr='vllm-api-general-chat',
        path="your_model_path",
        model="qwen3-coder",
        request_rate=0,
        retry=2,
        host_ip="localhost",
        host_port=8000,
        max_out_len=32768,
        batch_size=32,
        trust_remote_code=True,
        generation_kwargs=dict(
            temperature=0.6,
            top_k=20,
            top_p=0.95,
        ),
    )
]

以 gsm8k 数据集为例运行精度评估:

ais_bench --models vllm_api_general_chat --datasets gsm8k_gen_4_shot_cot_str --mode all --dump-eval-details --debug

下表列出了每个评估数据集的 --datasets 参数:

数据集 --datasets 参数
GSM8K gsm8k_gen_4_shot_cot_str
GPQA-Diamond gpqa_gen_0_shot_cot_chat_prompt
AIME 2024 aime2024_gen_0_shot_str
LiveCodeBench livecodebench_0_shot_chat_v4_v5_v6

--models 参数值与配置文件名称对应(例如,vllm_api_general_chat.py 对应 vllm_api_general_chat)。请根据实际场景调整 max_out_len、batch_size 和数据集任务。

有关数据集准备,请参阅 AISBench 数据集指南。

Note

vLLM-Ascend 还支持以下评估工具:

准确率结果(Atlas 800I A3,vLLM-Ascend v0.22.1rc,W8A8):

数据集 指标 分数
GSM8K 准确率(4-shot CoT) 90.14%
GPQA-Diamond 准确率(0-shot CoT) 53.54%
LiveCodeBench pass@1(0-shot) 38.60%
AIME 2024 准确率(0-shot) 33.33%

8 性能评估

8.1 使用 AISBench

有关设置详情,请参阅 使用 AISBench 进行性能评估。

首先,配置用于流式性能测试的模型(ais_bench/benchmark/configs/models/vllm_api/vllm_api_stream_chat.py):

from ais_bench.benchmark.models import VLLMCustomAPIChat
from ais_bench.benchmark.utils.postprocess.model_postprocessors import extract_non_reasoning_content

models = [
    dict(
        attr="service",
        type=VLLMCustomAPIChat,
        abbr='vllm-api-stream-chat',
        path="your_model_path",
        model="qwen3-coder",
        stream=True,
        request_rate=0,
        retry=2,
        host_ip="localhost",
        host_port=8000,
        max_out_len=1500,
        batch_size=32,
        trust_remote_code=True,
        generation_kwargs=dict(
            temperature=0.01,
            ignore_eos=True,
        ),
        pred_postprocessor=dict(type=extract_non_reasoning_content),
    )
]

与准确率配置的关键区别:stream=True、ignore_eos=True(确保输出达到 max_out_len,以便一致地测量 TPOT),以及 batch_size 控制并发。

然后,配置合成数据集分布(ais_bench/datasets/synthetic/synthetic_config.py)。请根据实际场景调整配置。请注意,随机合成数据不适用于启用前缀缓存的基准测试场景,因为随机输入会导致缓存命中率为零。

synthetic_config = {
    "Type": "string",
    "RequestCount": 200,
    "StringConfig": {
        "Input": {
            "Method": "uniform",
            "Params": {"MinValue": 3500, "MaxValue": 3500}
        },
        "Output": {
            "Method": "uniform",
            "Params": {"MinValue": 1500, "MaxValue": 1500}
        }
    }
}

然后运行性能评估:

ais_bench --models vllm_api_stream_chat --datasets synthetic_gen --mode perf --debug

--models 的值应与模型配置文件中的 abbr 匹配。使用 --num-prompts 限制测试请求的数量。

8.2 使用 vLLM Benchmark

更多详细信息请参阅 vLLM benchmark。

以 serve 子命令为例。--random-output-len 参数控制每个请求的输出 token 数量;请根据目标场景进行调整(例如,短输出使用 2048,长输出使用 32768)。

vllm bench serve \
    --model your_model_path \
    --served-model-name qwen3-coder \
    --port 8000 \
    --dataset-name random \
    --random-input 200 \
    --random-output-len 2048 \
    --num-prompts 200 \
    --request-rate 1 \
    --save-result \
    --result-dir ./

9 性能调优

关键参数说明请参阅 vLLM Serve、vLLM Features 和 vLLM Ascend Feature Matrix。

注意:以下配置已在特定测试环境中验证,仅供参考。最佳配置取决于最大输入/输出长度、前缀缓存命中率、精度要求以及部署机器比例等因素。建议根据实际条件参考第 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:详细节点配置

| 场景 | NPUs | 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 关闭 开启 -

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

低延迟配置:

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-coder \
    --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-coder \
    --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-coder \
    --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 \
    --speculative-config '{"method": "eagle3","model": "your_eagle3_model_path", "num_speculative_tokens": 3}'

Tip

此配置的 AISBench 示例设置:

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

9.2 调优指南

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

10 常见问题

对于常见的环境、安装和通用参数问题,请参阅公共常见问题。本章仅涵盖特定模型的问题。

问:如何启用长上下文(超过 256k)?

Qwen3-Coder-30B-A3B 原生支持 256k Token 上下文长度。对于超过 256k 的上下文,需要使用 YaRN rope 缩放将其扩展至 1M。通过 --hf-overrides 启用 YaRN:

--hf-overrides '{"rope_parameters": {"rope_type":"yarn","factor":4,"original_max_position_embeddings":262144}}'

对于原生 256k 范围内的上下文,无需额外配置。只需将 --max-model-len 设置为您所需的长度。

问:Qwen3-Coder 与 Qwen3-30B-A3B 有何不同?

Qwen3-Coder-30B-A3B 与基础模型 Qwen3-30B-A3B 共享相同的 MoE 架构(30.5B/3.3B),但专门针对编码任务进行了微调,并对智能体编码、函数调用以及最多 1M Token 的扩展上下文支持进行了优化。

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