Qwen3-30B-A3B¶
1 简介¶
Qwen3-30B-A3B 是 Qwen3 系列中的混合专家(MoE)模型,总参数为 30.5B,每个 token 激活 3.3B。稀疏 MoE 架构支持高效的训练和推理,在推理、指令遵循和智能体能力方面表现出色,同时与具有类似能力的稠密模型相比,计算成本更低。
本文档将演示在 vLLM-Ascend 环境中对 Qwen3-30B-A3B 的主要验证步骤,包括支持的功能、环境准备、单节点部署,以及精度和性能评估。
Qwen3-30B-A3B 模型首次支持于 v0.8.4rc2。本文档基于 vLLM-Ascend v0.22.1rc 进行验证和编写。v0.22.1rc 及更高版本均可稳定运行。如需使用最新功能,建议使用最新的候选版本或正式版本。
2 支持的功能¶
有关模型支持矩阵,请参阅支持的功能列表。
有关功能配置信息,请参阅功能指南。
3 前提条件¶
3.1 模型权重¶
以下模型变体可用。建议将模型权重下载到所有节点均可访问的共享目录。
| 模型 | 硬件要求 | 下载 |
|---|---|---|
| Qwen3-30B-A3B (BF16) | Atlas 800I A3 (64GB, 1\~2 卡) Atlas 800I A2 (64GB, 2\~4 卡) |
ModelScope |
| Qwen3-30B-A3B-W8A8 | Atlas 800I A3 (64GB, 1\~2 卡) Atlas 800I A2 (64GB, 2\~4 卡) |
ModelScope |
| Eagle3 Draft Model | 不适用 | ModelScope |
路径说明:将模型权重下载到您选择的目录并记录该路径。确保后续部署命令中的模型路径与该目录一致。
Atlas 300I DUO 的量化版本:
| 模型 | 量化 | 硬件要求 | 下载 |
|---|---|---|---|
| Qwen3-30B-A3B-w8a8-QuaRot-310 | W8A8 | Atlas 300I DUO (TP2) | 下载 |
这些是推荐的卡数,可根据实际情况进行调整。
如果无法直接下载 W8A8 量化权重,您可以使用 msmodelslim 对 BF16 模型进行量化来获得它们。有关详细信息,请参阅量化指南。本文档中的所有模型路径都应调整为您实际的本地路径。
Note
Qwen3-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 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 个采用双 die 设计的 NPU(共 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
Docker 运行:
```bash
export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0-310p
docker run --rm \
--name vllm-ascend \
--shm-size=1g \
--net=host \
--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/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 /root/.cache:/root/.cache \
-it $IMAGE bash
```
Tip
上述挂载是访问 NPU 驱动所需的最小配置。请根据环境需要添加额外的 -v 挂载(例如模型权重路径、数据集)。
默认工作目录为 /workspace。vLLM 和 vLLM-Ascend 作为 Python 包安装在 site-packages 中。
安装验证:
启动容器后,运行以下命令以验证安装:
预期结果:容器以 Up 状态列出。你也可以在容器内验证 vllm-ascend 版本:
预期结果:显示版本信息,且与拉取的镜像版本一致。
4.2 源代码安装¶
如果你不想使用 Docker 镜像,可以从源代码构建。首先从源代码安装 vLLM:
- 克隆并安装 vLLM:
- 克隆并安装 vLLM-Ascend 仓库:
Note
对于 Atlas 300I DUO,源代码安装可能会引入 triton 和 triton-ascend。在 Atlas 300I DUO 上运行 vLLM-Ascend 之前,请卸载它们:
安装验证:
预期结果:显示两个包的版本信息,确认安装成功。
Note
如果部署多节点环境,请在每个节点上配置环境。
更多详细信息,请参阅安装指南。
5 在线服务部署¶
5.1 单节点在线部署¶
单节点部署在同一节点内完成 Prefill 和 Decode,适用于开发、测试以及中小规模推理场景。对于 Qwen3-30B-A3B MoE 模型,需要使用专家并行(EP)将专家分布到多个 NPU 上。
以下命令为示例配置。请根据实际场景调整参数。
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 \
--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}'
export VLLM_USE_MODELSCOPE=True
export ASCEND_RT_VISIBLE_DEVICES=0,1
# Ensure the model path matches the directory recorded during download
vllm serve your_model_path \
--host 127.0.0.1 \
--port 8000 \
--tensor-parallel-size 2 \
--max-num-seqs 32 \
--served_model_name qwen3 \
--dtype float16 \
--quantization ascend \
--max-model-len 16384 \
--additional-config '{"ascend_compilation_config": {"fuse_norm_quant": false,"enable_npu_graph_ex":false}}' \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,32]}' \
--no-enable-prefix-caching
关键参数:
--tensor-parallel-size 2将模型映射到两个 Atlas 推理设备上。请根据可用设备和内存,与ASCEND_RT_VISIBLE_DEVICES一起调整。--dtype float16用于 Atlas 300I DUO,以匹配 Atlas 推理执行路径。--max-model-len 16384是有意保守设置的。在 Atlas 300I DUO 上,较长的上下文会分配较大的注意力掩码,因此不要依赖自动检测 max-model-len。--max-num-seqs 16限制并发活动请求,以降低 Atlas 300I DUO 上 KV 缓存和图捕获的压力。--gpu-memory-utilization控制 KV 缓存容量。如果启动或运行时请求报告 OOM,请降低该值。--additional-config '{"ascend_compilation_config": {"fuse_norm_quant": false}}'为 Atlas 300I DUO 服务路径禁用 norm-quant 融合。--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,2,4,8,16]}'启用 decode ACLGraph 重放,并为 Atlas 300I DUO 显式限制捕获大小。--no-enable-prefix-caching是此 Atlas 300I DUO 示例的默认建议,用于降低内存压力。--quantization ascend为 W8A8 模型启用 Ascend 量化。部署 BF16 模型时请移除此选项。- 要启用 MTP 推测解码,请使用 --speculative_config '{"method": "mtp", "num_speculative_tokens": 1}'。建议将 num_speculative_tokens 设置为 1。
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格式和选项
服务验证:
服务启动后,通过发送 prompt 来验证其是否正在运行。有关使用示例,请参阅 第 6 节。
6 功能验证¶
服务启动后,可以通过发送 prompt 调用模型。
Chat Completions API:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3",
"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)。
预期结果: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",
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 数据集指南。
精度结果(Atlas 800I A3、vLLM-Ascend v0.22.1rc、W8A8):
| 数据集 | 指标 | 分数 |
|---|---|---|
| GSM8K | 准确率(4-shot CoT) | 92.87% |
| GPQA-Diamond | 准确率(0-shot CoT) | 60.10% |
| LiveCodeBench | pass@1(0-shot) | 60.05% |
| AIME 2024 | 准确率(0-shot) | 76.67% |
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",
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}
}
}
}
然后运行性能评估:
--models的值应与模型配置文件中abbr的值一致。使用--num-prompts限制测试请求数量。
8.2 使用 vLLM 基准测试¶
有关更多详细信息,请参阅 vLLM benchmark。
以 serve 子命令为例。--random-output-len 参数控制每个请求的输出 Token 数量;请根据目标场景进行调整(例如,短输出使用 2048,长输出使用 32768)。
vllm bench serve \
--model your_model_path \
--served-model-name qwen3 \
--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.1 推荐配置¶
注意:以下配置已在特定测试环境中验证,仅供参考。最优配置取决于最大输入/输出长度、前缀缓存命中率、精度要求以及部署机器比例等因素。建议参考第 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 |
|---|---|---|---|---|---|---|---|
| 高吞吐 | 1 (A3) | 1 | 37364 | 100 | Off | Off | - |
| 低延迟 | 2 (A3) | 4 | 37364 | 100 | Off | On | - |
| 长上下文 | 2 (A3) | 4 | 131072 | 14 | Off | On | YaRN |
有关详细参数说明,请参阅 第 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 \
--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: 0batch_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 \
--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: 0batch_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 \
--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}' \
--hf-overrides '{"rope_parameters": {"rope_type":"yarn","factor":4,"original_max_position_embeddings":32768}}'
Tip
此配置的 AISBench 示例设置:
request_rate: 0batch_size: 32- 输入/输出长度:65536/1024 或 131072/1024
9.2 调优指南¶
有关调优方法,请参阅公共性能调优文档。 有关详细功能说明,请参阅功能矩阵。
10 常见问题¶
有关常见环境、安装和通用参数问题,请参阅公共常见问题解答。本章仅涵盖特定模型的问题。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend