跳转至

Qwen3.6-35B-A3B

1 简介

Qwen3.6-35B-A3B 是 Qwen3.6 系列中的稀疏 MoE 模型,总参数为 35B,每个 token 激活约 3B 参数。它采用 Qwen3.5 风格模型使用的混合注意力架构,适用于 Ascend 硬件上的长上下文在线服务。

本文档描述该模型的主要验证步骤,包括支持的功能、前提条件、安装、单节点在线部署、功能验证、精度与性能评估、性能调优以及常见问题。

Qwen3.6-35B-A3B 模型首次在 vllm-ascend:v0.18.0rc1 中支持。使用该模型时请使用 v0.18.0rc1 或更高版本。以下示例使用文档构建系统配置的版本占位符。

2 支持的功能

参见 支持的功能 以获取模型支持的功能矩阵,包括 BF16、W8A8 量化、分块预填充、自动前缀缓存、异步调度、张量并行、专家并行以及 ACLGraph 支持。

参见 功能指南 以获取功能配置详情。

3 前提条件

3.1 模型权重

权重版本 硬件要求 下载链接
Qwen3.6-35B-A3B(BF16 版本) 1 个 Atlas A3 推理产品(64GB x 16)节点、1 个 Atlas A2 推理产品(64GB x 8)节点,或 Atlas 300I DUO ModelScope
Qwen3.6-35B-A3B-w8a8(量化版本) 1 个 Atlas A3 推理产品(64GB x 16)节点、1 个 Atlas A2 推理产品(64GB x 8)节点,或 Atlas 300I DUO ModelScope

建议将模型权重下载到 /root/.cache/。

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

4 安装

4.1 Docker 镜像安装

请根据机器类型选择镜像。例如,Atlas A2 推理产品使用 quay.io/ascend/vllm-ascend:v0.23.0,Atlas A3 推理产品使用 quay.io/ascend/vllm-ascend:v0.23.0-a3,Atlas 300I DUO 使用 quay.io/ascend/vllm-ascend:v0.23.0-310p。

参见 使用 Docker 以获取完整安装指南。

# Download the model weight to /root/.cache in advance.
export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0-a3
export NAME=vllm-ascend

docker run --rm \
  --name $NAME \
  --net=host \
  --shm-size=1g \
  --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 /root/.cache:/root/.cache \
  -it $IMAGE bash
# Download the model weight to /root/.cache in advance.
export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0
export NAME=vllm-ascend

docker run --rm \
  --name $NAME \
  --net=host \
  --shm-size=1g \
  --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 /root/.cache:/root/.cache \
  -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 8080:8080 \
-it $IMAGE bash

进入容器后,验证 vLLM 和 vLLM-Ascend 是否可以导入:

python -c "import vllm, vllm_ascend; print('vllm and vllm_ascend are ready')"

4.2 源代码安装

您也可以从源代码构建并安装 vllm-ascend。请参阅使用 Python 设置。

Note

对于 Atlas 300I DUO,源代码安装可能会引入 triton 和 triton-ascend。在 Atlas 300I DUO 上运行 vLLM-Ascend 之前,请卸载它们:

pip uninstall -y triton-ascend triton

5 在线服务部署

5.1 单节点在线部署

单节点部署在同一节点上同时运行 Prefill 和 Decode。Qwen3.6-35B-A3B-w8a8 可部署在 1 台 Atlas A3 推理产品(64G x 16)或 1 台 Atlas A2 推理产品(64G x 8)上,也可部署在 Atlas 300I DUO 上。W8A8 版本需要 --quantization ascend。

运行以下脚本,可在 1 台 Atlas A3 推理产品(64G x 16)上执行最长 262144 上下文长度的在线推理。

#!/bin/sh

# Load model from ModelScope to speed up download.
export VLLM_USE_MODELSCOPE=True
export HCCL_BUFFSIZE=1024
export HCCL_OP_EXPANSION_MODE="AIV"
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

# Reduce memory fragmentation and avoid out-of-memory errors.

echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
sysctl -w vm.swappiness=0
sysctl -w kernel.numa_balancing=0
sysctl kernel.sched_migration_cost_ns=50000

# Ensure the model path matches the directory recorded during download
vllm serve Eco-Tech/Qwen3.6-35B-A3B-w8a8 \
  --host 0.0.0.0 \
  --port 8000 \
  --data-parallel-size 1 \
  --tensor-parallel-size 2 \
  --enable-expert-parallel \
  --seed 1024 \
  --quantization ascend \
  --served-model-name qwen3.6 \
  --max-num-seqs 128 \
  --max-model-len 262144 \
  --max-num-batched-tokens 16384 \
  --trust-remote-code \
  --gpu-memory-utilization 0.90 \
  --enable-prefix-caching \
  --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
  --additional-config '{"enable_cpu_binding":true, "multistream_overlap_shared_expert": true}'

关键参数:

  • --data-parallel-size 1 和 --tensor-parallel-size 2 为默认单节点服务示例设置 DP 和 TP。
  • --enable-expert-parallel 为 MoE 层启用专家并行。不要在同一 MoE 层中混合 MoE 张量并行和专家并行。
  • --max-model-len 是单个请求的最大输入加输出长度。仅在可用 KV 缓存足够时增大该值。
  • --max-num-seqs 是每个 DP 组调度的最大活跃请求数。对于性能测试,请将 --max-num-seqs * --data-parallel-size 设置为大于或等于测试并发数。
  • --max-num-batched-tokens 是单个调度器步骤中处理的最大 token 数。更大的值可以提高 prefill 效率,但会消耗更多激活内存。
  • --gpu-memory-utilization 控制 vLLM 可用于计算 KV 缓存容量的 HBM 数量。更高的值会增加 KV 缓存大小,但如果运行时内存高于 profile 运行,则可能触发 OOM。
  • --enable-prefix-caching 启用前缀缓存。对于长上下文服务,请监控内存使用情况,因为前缀缓存可能会增加 KV 缓存压力。
  • --quantization ascend 为 W8A8 模型启用 Ascend 量化。部署 BF16 模型时请移除此选项。
  • --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' 启用完整 decode ACLGraph 重放,以减少调度开销。
export VLLM_USE_MODELSCOPE=True
export ASCEND_RT_VISIBLE_DEVICES=0,1

# Ensure the model path matches the directory recorded during download
vllm serve Eco-Tech/Qwen3.6-35B-A3B-w8a8 \
  --host 127.0.0.1 \
  --port 8080 \
  --tensor-parallel-size 2 \
  --gpu-memory-utilization 0.90 \
  --max-num-seqs 16 \
  --served-model-name qwen3.6 \
  --dtype float16 \
  --additional-config '{"ascend_compilation_config": {"enable_npugraph_ex":false}}' \
  --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,8]}' \
  --quantization ascend \
  --max-model-len 20480 \
  --no-enable-prefix-caching

关键参数:

  • --tensor-parallel-size 2 将模型映射到两个 Atlas 推理设备上。请根据可用设备和内存,与 ASCEND_RT_VISIBLE_DEVICES 一起调整。
  • --dtype float16 用于 Atlas 300I DUO,以匹配 Atlas 推理执行路径。
  • --max-num-seqs 16 限制并发活跃请求,以降低 Atlas 300I DUO 上的 KV 缓存和图捕获压力。
  • --gpu-memory-utilization 控制 KV 缓存容量。如果启动或运行时请求报告 OOM,请降低该值。
  • 带有 "ascend_compilation_config": {"enable_npugraph_ex": false} 的 --additional-config 是必需的,因为 Atlas 300I DUO 不支持 enable_npugraph_ex。
  • --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。如果您的使用场景涉及少于两个并发请求,建议启用 MTP。否则,建议不启用 MTP。

常见问题提示:如果服务启动失败、HBM 不足或请求未按预期调度,请先参考公共常见问题,然后查看第 10 节中的模型特定常见问题。

6 功能验证

服务器启动后,发送一个请求以验证模型的基本功能。

curl http://<server_ip>:<port>/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.6",
    "prompt": "The future of AI is",
    "max_tokens": 50,
    "temperature": 0
  }'

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

7 精度评估

以下是两种精度评估方法。

7.1 使用 AISBench

有关详细信息,请参阅使用 AISBench。执行后,您可以获得 Qwen3.6-35B-A3B-w8a8 的精度结果。

数据集 版本 指标 模式 vllm-api-general-chat
mmmu - accuracy gen 83.3
gpqa - accuracy gen 83.3

7.2 使用语言模型评估框架

有关安装和使用详情,请参阅使用 lm_eval。使用在线服务时,将 base_url 设置为第 5 节中启动的端点。

lm_eval \
  --model local-completions \
  --model_args model=qwen3.6,base_url=http://127.0.0.1:8000/v1/completions,tokenized_requests=False,trust_remote_code=True \
  --tasks gsm8k \
  --output_path ./

8 性能评估

8.1 使用 AISBench

有关详细信息,请参阅使用 AISBench 进行性能评估。

8.2 使用 vLLM 基准测试

以 Qwen3.6-35B-A3B-w8a8 为例运行性能评估。有关更多详情,请参阅vLLM 基准测试。

vllm bench 有三个子命令:

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

以 serve 为例:

export VLLM_USE_MODELSCOPE=True

vllm bench serve \
  --model Eco-Tech/Qwen3.6-35B-A3B-w8a8 \
  --served-model-name qwen3.6 \
  --dataset-name random \
  --random-input 200 \
  --num-prompts 200 \
  --request-rate 1 \
  --save-result \
  --result-dir ./

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

9 性能调优

以下配置已在特定测试环境中验证,仅供参考。最佳配置取决于硬件类型、最大输入/输出长度、请求并发数、前缀缓存命中率以及量化方式。请根据实际工作负载调整第 9.2 节中的参数。

场景 部署模式 NPU 总数 权重版本 关键考虑因素
长上下文 单节点在线服务 2 个或更多 NPU W8A8 使用更大的 --max-model-len 并预留足够的 KV 缓存。如果发生 OOM,请降低 --max-num-seqs。
高吞吐量 单节点在线服务 8 个或更多 NPU W8A8 增加单个节点内的本地 DP 组,并调整 --max-num-batched-tokens。
低延迟 单节点在线服务 2 个或更多 NPU W8A8 使用更小的 --max-num-batched-tokens、完整解码 ACLGraph,并默认禁用推测解码。
场景 节点角色 NPU TP DP 最大序列数 最大模型长度 最大批处理令牌数 前缀缓存 主要优化
长上下文 单节点 2 个或更多 2 1 128 262144 16384 开启 FullGraph、序列并行、共享专家重叠、CPU 绑定
高吞吐量 单节点 8 个或更多 2 4 个或更多 每个 DP 32 65536 8192 开启 FullGraph、序列并行、异步调度、共享专家重叠
低延迟 单节点 2 个或更多 2 1 根据并发调整 32768 或 65536 1024 到 4096 取决于工作负载 FullGraph、CPU 绑定、禁用推测解码

9.2 调优指南

有关通用调优方法,请参阅公共性能调优文档;有关功能说明,请参阅功能矩阵。

推荐调优顺序:

  1. 使用单节点部署。如果需要更高吞吐量,请增加同一节点内的本地 DP 组。
  2. 使用 --max-model-len 选择最大上下文长度。长上下文会增加 KV 缓存使用量,因此如果发生 OOM,请降低 --max-num-seqs 或 --gpu-memory-utilization。
  3. 调整 --max-num-batched-tokens。较大的值通常可提高预填充吞吐量,但会增加激活内存。以解码为主的工作负载通常需要较小的值。
  4. 根据服务并发数调整 --max-num-seqs。超过该值的请求将在队列中等待,等待时间会计入 TTFT 和 TPOT。
  5. 调整 --gpu-memory-utilization。增加该值可提供更多 KV 缓存,但需为运行时内存波动和专家不均衡预留余量。
  6. 调整 ACLGraph 捕获。解码推荐 FULL_DECODE_ONLY。如果手动设置 cudagraph_capture_sizes,请包含常见的解码批大小。使用序列并行时,捕获大小应为 TP 大小的倍数。

9.3 模型特定优化

优化 启用方式 收益 说明
混合注意力支持 由模型实现启用 支持 Qwen3.6 长上下文推理。 根据 KV 缓存容量调整上下文长度。
完整解码 ACLGraph --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' 降低算子调度开销并稳定解码性能。 推荐用于以解码为主的服务。
优化 启用方式 收益 备注
共享专家重叠 --additional-config '{"multistream_overlap_shared_expert": true}' 在 MoE 工作负载中重叠共享专家计算。 推荐用于吞吐量场景。
前缀缓存 --enable-prefix-caching 改善重复前缀工作负载。 监控长上下文工作负载的 HBM 使用情况。
Qwen3.6 MTP 投机解码 --speculative-config '{"method": "qwen3_5_mtp", "num_speculative_tokens": 3, "enforce_eager": true}' 当稳定且被接受的 token 数量较高时,可提升解码吞吐量。 针对您的工作负载验证稳定性、TTFT、TPOT 和吞吐量。

10 常见问题

对于常见的环境、安装和通用参数问题,请参阅 公共常见问题。本节仅涵盖 Qwen3.6-35B-A3B 的模型特定问题。

Q1:为什么服务在启动期间或接受请求后不久报告 OOM?

现象: 服务在 profile run 期间失败,或者启动成功但在真实流量到达时报告 OOM。

原因: Qwen3.6 长上下文服务会消耗大量 KV 缓存。较大的 --max-model-len、较大的 --max-num-seqs、较大的 --max-num-batched-tokens 或较高的 --gpu-memory-utilization 可能导致 HBM 余量不足。

解决方案: 尽可能使用 W8A8 模型并配合 --quantization ascend,降低 --max-model-len、降低 --max-num-seqs、降低 --max-num-batched-tokens,或降低 --gpu-memory-utilization。保持 PYTORCH_NPU_ALLOC_CONF=expandable_segments:True。

Q2:为什么启用前缀缓存后性能没有提升?

现象: 已启用前缀缓存,但吞吐量或延迟没有改善。

原因: 前缀缓存仅在请求共享可复用前缀时有帮助。对于随机提示词或低缓存命中率,它可能增加内存压力而没有明显收益。

解决方案: 对重复前缀工作负载启用前缀缓存。对于随机基准数据集或内存受限的长上下文工作负载,请与 --no-enable-prefix-caching 进行对比。

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