跳转至

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 量化、chunked prefill、自动前缀缓存、异步调度、张量并行、专家并行以及 ACLGraph 支持。

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

3 前提条件

3.1 模型权重

  • Qwen3.6-35B-A3B (BF16 版本):需要 1 个 Atlas 800 A3 (64G x 16) 节点或 1 个 Atlas 800 A2 (64G x 8) 节点。下载模型权重
  • Qwen3.6-35B-A3B-w8a8 (量化版本):需要 1 个 Atlas 800 A3 (64G x 16) 节点或 1 个 Atlas 800 A2 (64G x 8) 节点。下载模型权重

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

4 安装

4.1 Docker 镜像安装

Select an image based on your machine type. For example, use quay.io/ascend/vllm-ascend:v0.22.1rc1 for Atlas 800 A2 and quay.io/ascend/vllm-ascend:v0.22.1rc1-a3 for Atlas 800 A3.

请参考使用 docker获取完整安装指南。

# Update --device according to your device.
# Atlas A2: /dev/davinci[0-7]
# Atlas A3: /dev/davinci[0-15]
# Download the model weight to /root/.cache in advance.
export IMAGE=quay.io/ascend/vllm-ascend:v0.22.1rc1
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

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

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

4.2 源码安装

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

5 在线服务部署

5.1 单节点在线部署

单节点部署将 Prefill 和 Decode 运行在同一个节点上。Qwen3.6-35B-A3B-w8a8 可以部署在 1 个 Atlas 800 A3 (64G x 16) 或 1 个 Atlas 800 A2 (64G x 8) 上。W8A8 版本需要 --quantization ascend

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

#!/bin/sh

# Load model from ModelScope to speed up download.
export VLLM_USE_MODELSCOPE=True

# Reduce memory fragmentation and avoid out-of-memory errors.
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_BUFFSIZE=1024
export OMP_NUM_THREADS=1
export TASK_QUEUE_ENABLE=1
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
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD

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, "enable_flashcomm1":true, "multistream_overlap_shared_expert": true}' \
  --async-scheduling

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

关键参数:

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

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 的精度结果。

7.2 使用 Language Model Evaluation Harness

安装和使用详情请参考使用 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 Benchmark

Qwen3.6-35B-A3B-w8a8 的性能评估为例。更多详情请参考 vLLM benchmark

有三个 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.1 推荐配置

以下配置在特定测试环境中验证,仅供参考。最佳配置取决于硬件类型、最大输入/输出长度、请求并发数、前缀缓存命中率和量化方式。请根据实际工作负载调整第 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 最大序列数 最大模型长度 最大批处理Token数 前缀缓存 主要优化
长上下文 单节点 2个及以上 2 1 128 262144 16384 开启 FullGraph、FlashComm1、共享专家重叠、CPU绑定
高吞吐 单节点 8个及以上 2 4个及以上 每个DP 32 65536 8192 开启 FullGraph、FlashComm1、异步调度、共享专家重叠
低延迟 单节点 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,需包含常见解码批大小。使用FlashComm1时,捕获大小应为TP大小的倍数。

9.3 模型特定优化

优化项 启用方式 收益 备注
混合注意力支持 由模型实现启用 支持Qwen3.6长上下文推理。 根据KV缓存容量调整上下文长度。
全解码ACLGraph --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' 减少算子调度开销,稳定解码性能。 推荐用于解码密集型服务。
FlashComm1 --additional-config '{"enable_flashcomm1": true}' 减少TP和高并发场景下的通信开销。 可能对低并发工作负载无帮助。
共享专家重叠 --additional-config '{"multistream_overlap_shared_expert": true}' 在MoE工作负载中重叠共享专家计算。 推荐用于吞吐场景。
异步调度 --async-scheduling 通过非阻塞调度提升高并发吞吐。 若工作负载对延迟敏感,请关闭并对比效果。
前缀缓存 --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运行期间失败,或启动成功但在真实流量到达时报告OOM。

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

**解决方案:**尽可能使用带--quantization ascend的W8A8模型,降低--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进行比较。

Q3:如何为Qwen3.6调整异步调度?

**现象:**在高并发场景下吞吐量提升,但某些延迟敏感型工作负载可能无法受益。

**原因:**异步调度减少了阻塞开销,但收益取决于并发度、提示/输出长度和图捕获形状。

**解决方案:**对高吞吐量服务使用--async-scheduling。对于低延迟服务,比较启用和禁用此选项时的TTFT和TPOT。