Qwen3.6-35B-A3B 部署教程¶
1 引言¶
Qwen3.6-35B-A3B 是 Qwen3.6 系列中的稀疏 MoE 模型,总参数量为 35B,每个 token 激活约 3B 参数。它采用了 Qwen3.5 风格模型使用的混合注意力架构,适用于在昇腾硬件上进行长上下文在线服务。
本文档描述了该模型的主要验证步骤,包括支持特性、前提条件、安装、单节点在线部署、功能验证、精度与性能评估、性能调优以及常见问题解答。
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推理产品(64G x 16)节点、1个Atlas A2推理产品(64G x 8)节点或Atlas推理产品。下载模型权重。Qwen3.6-35B-A3B-w8a8(量化版本):需要1个Atlas A3推理产品(64G x 16)节点、1个Atlas A2推理产品(64G x 8)节点或Atlas推理产品。下载模型权重。
建议将模型权重下载到 /root/.cache/。
4 安装¶
4.1 Docker 镜像安装¶
根据您的机器类型选择镜像。例如,对于Atlas A2推理产品,使用quay.io/ascend/vllm-ascend:v0.22.1rc1;对于Atlas A3推理产品,使用quay.io/ascend/vllm-ascend:v0.22.1rc1-a3;对于Atlas推理产品,使用quay.io/ascend/vllm-ascend:v0.22.1rc1-310p。
请参考使用 Docker 获取完整的安装指南。
# Download the model weight to /root/.cache in advance.
export IMAGE=quay.io/ascend/vllm-ascend:v0.22.1rc1-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.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
标准容器¶
# Use the vllm-ascend image
export IMAGE=quay.io/ascend/vllm-ascend:v0.22.1rc1-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 是否可以导入:
4.2 源码安装¶
您也可以从源码构建并安装 vllm-ascend。请参考使用 Python 设置。
Note
对于Atlas推理产品,源码安装可能会引入triton和triton-ascend。在Atlas推理产品上运行vLLM-Ascend之前,请卸载它们:
5 在线服务部署¶
5.1 单节点在线部署¶
单节点部署将Prefill和Decode运行在同一节点上。Qwen3.6-35B-A3B-w8a8可以部署在1个Atlas A3推理产品(64G x 16)、1个Atlas A2推理产品(64G x 8)或Atlas推理产品上。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
# 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
关键参数:
--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数。较大的值可以提高预填充效率,但会消耗更多激活内存。--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"}'启用全解码ACLGraph重放以减少调度开销。--additional-config启用Ascend特定优化。enable_flashcomm1启用FlashComm1,multistream_overlap_shared_expert重叠共享专家计算,enable_cpu_binding启用Ascend原生CPU绑定。--async-scheduling启用异步调度,可以提高高并发吞吐量。
export VLLM_USE_MODELSCOPE=True
export ASCEND_RT_VISIBLE_DEVICES=0,1
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": {"fuse_norm_quant": 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 2maps the model across two Atlas inference devices. Adjust it together withASCEND_RT_VISIBLE_DEVICESaccording to the available devices and memory.--dtype float16is used for Atlas inference products to match the Atlas inference execution path.--max-num-seqs 16limits concurrent active requests to reduce KV cache and graph capture pressure on Atlas inference products.--gpu-memory-utilizationcontrols KV cache capacity. Reduce it if startup or runtime requests report OOM.--additional-config '{"ascend_compilation_config": {"fuse_norm_quant": false}}'disables norm-quant fusion for the Atlas inference products serving path.--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [1,2,4,8,16]}'enables decode ACLGraph replay and explicitly limits capture sizes for Atlas inference products.--no-enable-prefix-cachingis the default recommendation for this Atlas inference products example to reduce memory pressure.--quantization ascendenables Ascend quantization for the W8A8 model. Remove this option when deploying the BF16 model.- To enable MTP speculative decoding, use --speculative_config '{"method": "mtp", "num_speculative_tokens": 1}'. We recommend setting num_speculative_tokens to 1.
常见问题提示:如果服务启动失败、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 的精度结果。
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 基准测试¶
以 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.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数 | 前缀缓存 | 主要优化 |
|---|---|---|---|---|---|---|---|---|---|
| Long context | Single node | 2 or more | 2 | 1 | 128 | 262144 | 16384 | On | FullGraph, FlashComm1, shared expert overlap, CPU binding |
| High throughput | Single node | 8 or more | 2 | 4 or more | 32 per DP | 65536 | 8192 | On | FullGraph, FlashComm1, async scheduling, shared expert overlap |
| Low latency | Single node | 2 or more | 2 | 1 | Tune by concurrency | 32768 or 65536 | 1024 to 4096 | Workload dependent | FullGraph, CPU binding, speculative decoding disabled |
9.2 调优指南¶
通用调优方法请参考公开的性能调优文档,功能描述请参考特性矩阵。
推荐的调优顺序:
- 使用单节点部署。如果需要更高吞吐量,在同一节点内增加本地 DP 组。
- 使用
--max-model-len选择最大上下文长度。长上下文会增加 KV 缓存使用量,因此如果发生 OOM,请减少--max-num-seqs或--gpu-memory-utilization。 - 调整
--max-num-batched-tokens。较大的值通常会提高预填充吞吐量,但会增加激活内存。解码密集型工作负载通常需要较小的值。 - 根据服务并发数调整
--max-num-seqs。超过此值的请求将在队列中等待,等待时间计入 TTFT 和 TPOT。 - 调整
--gpu-memory-utilization。增加它以提供更多 KV 缓存,但需为运行时内存波动和专家不均衡预留空间。 - 调整 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?¶
现象: 服务在性能分析运行期间失败,或者成功启动但在真实流量到来时报告 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。