Qwen3-Next 混合注意力模型在 CANN 昇腾 NPU 上的 SGLang 推理优化与部署实践
【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer
导读
Qwen3-Next 是 2025 年 9 月发布的混合注意力开源大语言模型,通过 GatedAttention 与 GatedDeltaNet 的组合实现超长上下文建模。本文基于 cann-recipes-infer 仓库中的 Qwen3-Next SGLang 集成样例,完整介绍该模型在 Atlas A3 系列昇腾 NPU 上的推理优化实践:从 Docker 环境构建、patch 加载、模型权重转换,到 PD 混部/PD 分离部署、MTP 投机推理、AscendC 融合算子与 W8A8C8 量化的使能方法,并给出测试验证与性能采集的完整操作指南。读者读完本文后,可以独立完成 Qwen3-Next 在昇腾 NPU 上的端到端部署与调优。
该样例的详细优化设计与原理可进一步阅读 Qwen3-Next 推理优化实践设计文档,样例工程位于 integration/sglang/qwen3-next。
一、优化特性总览
本样例针对 Qwen3-Next 模型,基于 SGLang 开源框架完成了 NPU 推理部署的适配与优化,主要包含以下特性:
- 支持 MTP1 部署:Multi-Token Prediction 投机推理,一次主模型推理同时产出多个 token;
- 支持 AscendC 大融合算子:
recurrent_gated_delta_rule融合算子与mambav2_rmsnormgated融合算子; - 支持 PyPTO 融合算子:基于自研 PyPTO 框架实现 ChunkGDN 融合 Kernel;
- 支持序列并行(Sequence Parallel):针对线性 Attention/GatedAttention 的 SP 并行部署策略;
- 支持 W8A8C8 量化:权重静态 Per-Channel Int8、激活动态 Per-Token Int8、KVCache 动态 Per-Tensor Int8 量化。
优化设计文档中概括的核心亮点包括:整体部署采用"大 EP 并行 + GatedAttention TP 部署 + 长序列亲和的 CP 并行"策略,兼顾时延与吞吐;使用 AscendC 实现 NPU RecurrentGDN 融合 Kernel 提升 decode 阶段 linear attention 性能;基于 PyPTO 实现 ChunkGDN 融合 Kernel 提升编程易用性;支持 W8A8C8 量化与 MTP1 投机推理。
二、并行策略设计
2.1 整体部署:PD 分离与分层异构并行
Atlas A3 推荐部署策略为:Prefill 使用 M 个节点部署,Decode 使用 N 个节点部署,每个节点包含 8 卡。在 BF16 场景下,推荐根据资源数量、SLA 等约束选择部署规模;启用 CP 并行时推荐 M=1、N=1 部署。
2.2 Prefill 并行:CP + TP 混合并行
Qwen3-Next 引入的 Gated Attention 结构显著增强了长序列上下文捕捉能力,但 Prefill 阶段随序列长度平方级增长的激活值内存占用会带来 OOM 风险,同时如何在超长 Context 下维持低 TTFT 是部署的关键挑战。若使用纯 TP 策略,超长序列下 TP 通信组内会产生巨大的 All-Reduce 开销;且 Qwen3-Next 的 Attention Head 数为 16,限制了纯 TP 下最大 16TP 的部署规模;单纯依赖 TP 切分 Head 维度也无法从根本解决 Sequence 维度的 OOM 风险。
因此,Prefill 阶段针对两种模块的计算特性差异采取分层异构并行策略:
- Gated Attention 层采用 CP + TP 混合并行:Gated Attention 模块计算复杂度接近 O(S²),引入 Context Parallel(CP)配合 Tensor Parallel(TP),CP 将 Sequence 维度切分到不同 Rank,显著降低单卡激活值内存占用;
- GDN 层采用纯 TP 并行:GDN 模块涉及沿 Sequence 的卷积操作,不适合对 Sequence 轴切分,且 num_head 足够 TP 切分,因此使用纯 TP 并行。
以 mCP × nTP(如 m=4、n=2)与 64K 输入推理为例:每个 CP rank 处理 64K/cp_size=16K 个 token,每个 CP rank 内的 qkv_proj 基于 TP2 计算;计算完 kv 后对所有 CP 域的 kv token 进行 AllGather,得到完整 kv 结果;每个 rank 拿到 64K/cp_size 的 q token 和完整 kv token 进行后续 Attention 计算;Attention 计算完成后将输出在 TP 组内进行 Reduce-Scatter,得到 MoE 输入所需的 Scattered 排布数据。
2.3 ZigZag 负载均衡
Attention 计算需遵循因果注意力,若 CP 简单按 rank 顺序切片会面临计算负载不均问题:第一个 rank 关注到的历史 kv token 很少、计算量小,最后一个 rank 关注到的历史 kv token 多、计算量大。为降低负载不均影响,将 Sequence 切分成 cp_size×2 个 block:在 prepare_attn 阶段通过 All-to-All 通信将因果顺序排布的 blocks 转换为 ZigZag 排布,每个 rank 负责计算头尾对称的两个切片;每层 Gated Attention 计算前通过 Token 重排将 kv 还原回因果顺序;Gated Attention 计算结束后,在 prepare_mlp 阶段再次通过 All-to-All 通信将 ZigZag 排布的 blocks 转换为因果顺序排布。
2.4 Decode 并行:TP + EP
Decode 阶段使用 SGLang 框架原生并行能力:Gated Attention 和 GDN 使用 TP 并行,MoE 使用 EP 并行。其中 prepare_attn 阶段通过 All-Gather 将上一层 MoE 输出的 Scattered 排布数据拼接为完整 hidden state;prepare_mlp 阶段对 Gated Attention/GDN 输出的 hidden state 进行 Reduce-Scatter,得到 MoE 输入所需的 Scattered 排布数据。
三、融合算子与 MTP 投机推理
3.1 recurrent_gated_delta_rule 融合算子
使能recurrent_gated_delta_rule融合算子可替换 decode 阶段的 GDN 模块计算,融合了 Sigmoid、L2Norm、注意力分数计算以及 ssm_state 的计算与更新操作。该算子源码位于 ops/gated_delta_net/recurrent_gated_delta_rule,包含算子宿主侧实现recurrent_gated_delta_rule.cpp与 kernel 侧实现op_kernel/recurrent_gated_delta_rule.h。
3.2 mambav2_rmsnormgated 融合算子
使能mambav2_rmsnormgated融合算子将 RMSNorm + Silu + Mul 融合计算,实现源码位于 ops/gated_delta_net/rmsnormgated。
3.3 MTP 机制
MTP(Multi-Token Prediction)机制允许在一次主模型推理过程中同时推理多个 token,在相似的数据搬运量下进行更多计算,充分利用芯片算力,提升模型等效时延与吞吐。需注意:主模型 target_verify 推理后,需要根据接收情况更新 linear attention 结构中的mamba_cache,为下一轮计算提供正确的状态矩阵conv_state与ssm_state。
四、量化策略:W8A8C8
相对于 BF16 推理,Int8 量化可有效降低端到端时延、提升系统吞吐。本实践支持 W8A8C8 量化,各模块量化范围如下:
- Gated DeltaNet:除 conv 外采用 W8A8 量化;
- Gated Attention:采用 W8A8 量化,KVCache 使用 C8 量化;
- MoE:路由专家使用 W8A8 量化;
- LM_Head:暂不量化。
其中术语含义:W8A8指权重使用静态 Per-Channel Int8 量化(W8),激活使用动态 Per-Token Int8 量化(A8);KVCache C8指 KVCache 使用动态 Per-Tensor Int8 量化。
设计文档给出了量化模型的精度表现(设计文档实测数据):
| 模型 | MMLU | GPQA | DROP | MGSM |
|---|---|---|---|---|
| BF16 | 89.9 | 73.6 | 88.9 | 92.4 |
| W8A8C8 | 89.8 | 74 | 88.4 | 92 |
五、环境搭建:基于 Docker 构建
5.1 硬件与软件要求
| 项目 | 要求 |
|---|---|
| 产品型号 | Atlas A3 系列 |
| 操作系统 | Linux ARM |
| 镜像版本 | sglang:main-cann8.3.rc2-a3 |
| 驱动版本 | Ascend HDK 25.2.0 |
可通过npu-smi info检查 Ascend NPU 固件和驱动是否正确安装,并确认版本是否为 25.2.0。若未安装或版本不符,请先下载固件和驱动包并自行安装。
5.2 创建容器
# 镜像下载 docker pull quay.io/ascend/sglang:main-cann8.3.rc2-a3 # 执行以下脚本创建容器,请传入容器名称,如 your_docker_name docker run -u root -itd --name your_docker_name --ulimit nproc=65535:65535 --ipc=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 /etc/localtime:/etc/localtime -v /home/:/home/ -v /data/:/data/ \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info -v /var/log/npu:/usr/slog \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/dcmi:/usr/local/dcmi -v /etc/hccn.conf:/etc/hccn.conf \ -v /root/.pip/pip.conf:/root/.pip/pip.conf -v /etc/hosts:/etc/hosts \ --net=host --shm-size=128g --privileged \ quay.io/ascend/sglang:main-cann8.3.rc2-a3 /bin/bash # 执行docker exec命令进入容器 docker exec -it -u root your_docker_name bash5.3 安装 CANN 与 torch_npu
为使能 GDN 融合算子,需要先将镜像中的 CANN 版本更新到 8.5.0:
# 清理旧版 CANN cd /usr/local/Ascend rm -rf 8.5.0/ ascend-toolkit/ latest/ nnal/然后从昇腾社区 CANN 下载页面下载如下软件包并参考官方 CANN 安装文档安装(软件包文件名中${version}表示 CANN 包版本号,${arch}表示 CPU 架构,如 aarch64、x86_64):
- 开发套件包:
Ascend-cann-toolkit_${version}_linux-${arch}.run - 二进制算子包:
Ascend-cann-A3-ops_${version}_linux-${arch}.run - NNAL 加速包:
Ascend-cann-nnal_${version}_linux-${arch}.run
请参考官方版本兼容性说明确认 HDK 版本,为兼容 PD 分离特性,推荐版本为 25.2.x。
安装完成后创建 latest 软连接:
ln -s /usr/local/Ascend/cann /usr/local/Ascend/latest本样例支持的Ascend Extension for PyTorch(torch_npu)版本为 7.3.0,PyTorch 版本为 2.6.0,请参考官方 Ascend Extension for PyTorch 安装文档安装相应版本的 torch_npu 插件。
5.4 下载项目源码并安装依赖
# 下载项目源码,以 master 分支为例 git clone https://gitcode.com/cann/cann-recipes-infer.git5.5 下载 SGLang 源码并加载 patch
为了让使用者和开发者直观了解基于开源代码的修改,本样例只包含 patch 代码,框架代码需要自行拉取。返回 cann-recipes-infer 项目代码的上级目录(即执行 git clone 时所在目录),并执行如下命令(需确保环境能够正常连通网络):
# 返回cann-recipes-infer项目代码上级目录 # 下载sglang源码(官方开源仓库,v0.5.6 分支) git clone <sglang官方仓库> -b v0.5.6patches 目录下按 stage 分组对应不同特性更改,对应关系如下:
| Stage | 内容 |
|---|---|
| stage1 | 基础功能适配和 MoE 多流优化 |
| stage2 | W8A8C8 动态量化 |
| stage3 | GDN 和 MTP 适配 |
| stage4 | CP 并行 |
| stage5 | rmsnormgated、GDN 大融合算子适配以及问题修复 |
| stage6 | CP support for GDN |
按顺序加载 patches 目录下的各 patch 组(apply_patches.sh 脚本会依次执行git am加载 stage1~stage6 全部 patch):
cd sglang bash ../cann-recipes-infer/integration/sglang/qwen3-next/apply_patches.sh安装 sglang:
pip install -e python --no-deps --no-build-isolation5.6 编译安装 sgl-kernel-npu
# 下载sgl-kernel-npu源码(官方开源仓库,2026.03.01 分支) git clone <sgl-kernel-npu官方仓库> -b 2026.03.01在 sgl_kernel_npu 目录下加载sgl_kernel_npu_support_gdn_cp.patch:
git apply ../cann-recipes-infer/integration/sglang/qwen3-next/patches/sgl_kernel_npu_support_gdn_cp.patch然后参考 sgl-kernel-npu 官方安装文档编译安装 sgl-kernel-npu。
5.7 安装 Triton-Ascend 与其他依赖
Triton-Ascend 是 CANN 生态对 Triton 的支持库,安装最新版本:
pip install triton-ascend --force-reinstall安装其他依赖:
pip install torchvision==0.21.0 pip install torchao==0.9.05.8 编译安装自定义算子
# 进入算子编译目录 cd ../cann-recipes-infer/integration/sglang/qwen3-next/ops/npu_ops_transformer_ext参考 npu_ops_transformer_ext 编译文档 编译安装自定义算子(工程包含setup.py、CMakeLists.txt与requirements.txt)。
六、模型权重准备
本样例使用的 Qwen3-Next 模型权重准备方法如下:
# 从魔搭社区下载Qwen3-Next完整BF16权重至指定目录,例如 your_bf16_weights pip install modelscope modelscope download --model Qwen/Qwen3-Next-80B-A3B-Instruct --local_dir your_bf16_weights # 将BF16权重转换为W8A8权重(可选) python python/sglang/srt/utils/convert_model_qwen3_next.py \ --input_bf16_hf_path your_bf16_weights \ --output_hf_path your_w8a8_weights # 将BF16权重转换为W8A8C8权重(可选) # 下载quant_param到指定路径,比如 your_param_path wget --no-check-certificate -P your_param_path <cann-quantization/attn_c8_scale.zip 下载地址> # 解压quant_param到指定路径,比如 your_param_path apt update apt install unzip unzip -o your_param_path/attn_c8_scale.zip -d your_param_path # 转换权重 python python/sglang/srt/utils/convert_model_qwen3_next.py \ --input_bf16_hf_path your_bf16_weights \ --output_hf_path your_w8a8c8_weights \ --c8 --quant_param_path your_param_path/attn_c8_scale七、推理执行
7.1 前置环境配置
修改 set_env.sh 中的推理执行相关配置:
| 修改点 | 修改描述 |
|---|---|
SOCKET_IFNAME | 各部署节点网卡 |
MODEL_PATH | 模型权重存储路径 |
PYTHONPATH | PYTHONPATH 中增加打完 patch 后的 sglang 路径 |
IP_NODE_P0 | Prefill 主节点 ip |
IP_NODE_D0 | Decode 主节点 ip |
set_env.sh中还包含一系列特性开关与调优项,例如:SGLANG_ENABLE_OVERLAP_PLAN_STREAM/SGLANG_ENABLE_SPEC_V2(MTP 相关)、ENABLE_ASCENDC_FUSION_GDN="true"(GDN 融合算子)、USE_CUSTOM_NORM_KERNEL="true"(rmsnormgated 融合算子)、ENABLE_NPU_DEEPEP_MOE_MULTI_STREAM=1(MoE 多流)、SGLANG_DEEPEP_BF16_DISPATCH=1/DEEP_NORMAL_MODE_USE_INT8_QUANT=1(deepep 下 BF16/int8 权重分发)、ASCEND_USE_C8=1(C8 量化)、PYTORCH_NPU_ALLOC_CONF=expandable_segments:True(内存碎片优化)等。
7.2 PD 混部命令
使用 infer.sh 启动 SGLang 服务(PD 混部场景),主要服务拉起参数说明如下:
| 配置项 | 说明 |
|---|---|
--tp 16 | TP 并行数(若开启 DP,实际 TP 并行数为此配置参数/DP 配置参数) |
--enable-dp-attention --dp-size 8 | DP 并行数配置,若需禁用 DP 请删除这两项配置 |
--moe-a2a-backend deepep --deepep-mode auto | 启用 deepep,若需禁用 deepep 请删除这两项配置 |
--cuda-graph-bs 16 | 计算图 batch size,使用单算子模式请替换为--disable-cuda-graph |
infer.sh中还包含--attention-backend ascend、--mamba-ssm-dtype bfloat16、--context-length 262144、--chunked-prefill-size 71680、--max-prefill-tokens 262144、--skip-server-warmup、--disable-radix-cache等参数,可直接参考仓库脚本按需调整。
7.3 PD 分离命令
PD 分离部署需要分别启动 Prefill、Decode、Router 节点:
- 修改各个节点
set_env.sh中的参数:
# 修改prefill节点和decode节点的主节点ip IP_NODE_P0=x.x.x.x # 修改为prefill主节点ip IP_NODE_D0=y.y.y.y # 修改为decode主节点ip # prefill节点和decode节点分别设置各自的nnodes和node_rank, 比如 2prefill + 2decode # p0 export nnodes=2 export node_rank=0 # p1 export nnodes=2 export node_rank=1 # d0 export nnodes=2 export node_rank=0 # d1 export nnodes=2 export node_rank=1- 在 Prefill 节点运行 infer_prefill.sh(包含
--disaggregation-mode prefill --disaggregation-transfer-backend ascend --dist-init-addr ${p0}:10000等配置); - 在 Decode 节点运行 infer_decode.sh(包含
--disaggregation-mode decode --dist-init-addr ${d0}:10000等配置); - 在 Prefill 节点启动 Router:
source set_env.sh python3 -m sglang_router.launch_router --decode http://${d0}:30001 --prefill http://${p0}:30001 --pd-disaggregation --mini-lb --host 0.0.0.0 --port 300027.4 新增特性使能
| 特性 | 使能方式说明 |
|---|---|
| ACLGraph | 服务拉起参数中配置--cuda-graph-bs |
| MoE 多流 | set_env.sh中增加环境变量:export ENABLE_NPU_DEEPEP_MOE_MULTI_STREAM=1 |
| GDN(Gated Delta Net)融合算子 | set_env.sh中增加环境变量:export ENABLE_ASCENDC_FUSION_GDN="true" |
| rmsnormgated 融合算子 | 1.set_env.sh中增加环境变量:export USE_CUSTOM_NORM_KERNEL="true";2. 指定核心数(默认 1,建议默认):export RMSNORMGATED_BLOCK_DIMS=2 |
| MTP(多Token预测) | 1.set_env.sh中增加环境变量:export SGLANG_ENABLE_OVERLAP_PLAN_STREAM=1、export SGLANG_ENABLE_SPEC_V2=1;2. 增加服务拉起配置项--speculative-algorithm NEXTN --speculative-num-steps 1 --speculative-eagle-topk 1 --speculative-num-draft-tokens 2;3. 确保set_env.sh中使能 GDN 融合算子export ENABLE_ASCENDC_FUSION_GDN="true" |
| A8W8 量化 | 1.set_env.sh中将export SGLANG_DEEPEP_BF16_DISPATCH=1替换为export DEEP_NORMAL_MODE_USE_INT8_QUANT=1;2. 增加服务拉起配置项--quantization w8a8_int8;3.set_env.sh中配置 A8W8 权重路径 |
| A8W8C8 量化 | 1.set_env.sh中将export SGLANG_DEEPEP_BF16_DISPATCH=1替换为export DEEP_NORMAL_MODE_USE_INT8_QUANT=1;2.set_env.sh中增加环境变量export ASCEND_USE_C8=1;3. 增加服务拉起配置项--quantization w8a8_int8;4.set_env.sh中配置 A8W8C8 权重路径 |
| 序列并行 | 1. 本样例支持 PD 分离场景下 Prefill 节点 Gated Attention 的 CP 和 TP 混合并行与 CP 负载均衡,启用方式:在infer_prefill.sh中将 DP 配置--enable-dp-attention --dp-size 8替换为--cp-size 8;2.set_env.sh中增加环境变量开启 CP 负载均衡:export CP_USE_ZIGZAG=1(面向长序列单 batch 场景);3. 在set_env.sh中增加环境变量使能 GatedDeltaNet attention 的 CP/TP 混合并行:export ENABLE_CONTEXT_PARALLEL_GDN=1 |
7.5 规格约束说明
- PD 分离场景 P 和 D 部署策略需相同(SGLang 框架暂未支持 MHA 不同策略部署);
- MTP 暂不支持和图模式同时开启;
- MTP 暂不支持和 C8 同时开启;
- 暂不支持 PD 分离下开启 MTP;
- CP 仅支持 PD 分离场景开启,启用时 P 和 D 部署策略可不同(P 可增加 cp_size 配置),需满足 cp_size < tp_size,且 PD 卡数需相同(SGLang 框架 kv 传输逻辑限制);CP 不支持与 DP 同时开启(CP 复用了 DP 通信域);
- 请确保 chunk prefill size ≤ 71680(triton 算子的规格约束);
- GDN 切分头数存在限制,tp_size 需不大于 32;
- 当前框架存在精度问题:当内部索引
mamba_cache_indices=0时会产生错误结果,该索引会在 Mamba cache 容量范围内循环使用;max-mamba-cache-size用于控制 Mamba cache 容量,默认值较小(通常为 2),索引循环时频繁回到 0 会导致精度下降。将max-mamba-cache-size调大(可设置为 512,有效平衡精度与性能)可显著降低该问题触发概率,但会带来一定性能开销。
八、测试与验证
8.1 单请求精度验证
普通长度序列可通过curl直接发送验证:
curl --location 'http://127.0.0.1:30002/generate' -H 'Content-Type: application/json' --data '{"text": ["1 + 1 = ?"], "sampling_params": { "temperature": 0, "max_new_tokens": 15}}'- 若服务拉起配置了
--skip-server-warmup,请在验证精度前发送 dp_size 个请求,保证每个 dp_rank 都预热到; - 长序列可通过 send_long_text.py 构造发送,脚本内置
TXT_PATH(待发送文本路径)、MODEL_PATH、URL、PROMPT_LENGTH等配置项,使用 tokenizer 将长文本截断到指定 token 长度后通过/generate接口发送。
8.2 基于数据集的精度验证
通过以下命令执行 few_shot_gsm8k 精度验证,结果大于 0.9 即为精度正常:
cd python/sglang/test python3 few_shot_gsm8k.py --parallel 16 --num-questions 100 --num-shots 5 --port 30002 --temperature 08.3 指定 B/S 的随机请求验证
通过 bench_serving.sh 指定 B/S 发送请求。脚本中可配置BatchSize、SeqLen、OutputLen、NumPrompts与DatasetJsonPath(可先下载 ShareGPT_Vicuna_unfiltered 数据集,并在脚本里指定 DatasetJsonPath 为对应 json 文件路径):
# 手动配置测试的B、S和输出长度 BatchSize=16 SeqLen=4096 OutputLen=10 NumPrompts=16 DatasetJsonPath=ShareGPT_V3_unfiltered_cleaned_split.json python3 -m sglang.bench_serving --base-url http://127.0.0.1:30002 \ --dataset-path $DatasetJsonPath \ --dataset-name=random \ --random-range-ratio 1 \ --random-input $SeqLen \ --random-output $OutputLen \ --max-concurrency $BatchSize \ --num-prompts $NumPrompts8.4 Benchmark 数据
基于 Atlas A3,本实践使用下述部署方式,使能优化点 ACLGraph、A8W8C8 量化、MoE 多流、GDN 融合算子,对 Qwen3-Next 进行性能 Benchmark 测试:
| 基础模型 | 机器型号 | graph_bs | dp_size | tp_size | ep_size | max_prompt_length | num_prompts | 纯模型decode时延(ms) |
|---|---|---|---|---|---|---|---|---|
| Qwen3-Next-80B-A3B-Instruct-A8W8C8 | Atlas A3 16die | 16 | 8 | 2 | 16 | 256k | 16 | 20.6 |
九、性能采集(Profiling)
9.1 加载 patch
在 sglang 目录下加载 PROFILE.patch:
git apply ../cann-recipes-infer/integration/sglang/qwen3-next/patches/PROFILE.patch9.2 profiler 配置
- 通过设置环境变量
PROFILER_MODE为[all, decode, prefill]中的指定值选择 profiler 范围,以 decode 为例:
export PROFILER_MODE='decode'- 配置
SGLANG_TORCH_PROFILER_DIR指定 profiler 保存路径:
export SGLANG_TORCH_PROFILER_DIR='/home/sglang/prof/'- 修改
python/sglang/srt/model_executor/model_runner.py中的 schedule 控制采集范围。torch_npu.profiler的接口与 torch 原生 profiler 类似,默认配置下采集 step4~step14 的 profiling 数据。
9.3 运行采集
- 使用要采集的配置拉起服务;若需精准控制采集的 step,请确保配置了
--skip-server-warmup参数跳过服务启动时的 warmup; - 可使用上文"指定 B/S 的随机请求验证"发送指定请求;若需精准控制采集的 step,在使用 bench_serving 时添加
--warmup-requests 0跳过 warmup 请求; - 采集结束后,profiling 数据保存在
SGLANG_TORCH_PROFILER_DIR指定的目录下。
9.4 查看 Trace 图
可以通过ASCEND_PROFILER_OUTPUT目录下的trace_view.json文件查看算子运行的 trace 图。推荐使用昇腾官方可视化工具 MindStudio Insight 查看 trace 图。
十、总结与展望
本文完整介绍了 Qwen3-Next 混合注意力模型在 CANN 昇腾 NPU 上基于 SGLang 的推理优化样例:通过 CP+TP 混合并行与 ZigZag 负载均衡解决长序列 Prefill 的 OOM 与负载不均问题,通过 AscendC/PyPTO 融合算子(recurrent_gated_delta_rule、mambav2_rmsnormgated、ChunkGDN)与 MTP1 投机推理提升 decode 阶段性能,并通过 W8A8C8 量化在保持精度的同时降低端到端时延。
设计文档还给出了后续优化方向:conv1d_update融合算子的 AscendC 支持;通过 PyPTO 实现更大范围的 MegaKernel,完成多核 MPMD 并行调度;以及在 256K~1M 超长序列 Prefill 场景下支持线性 Attention 层的序列并行以进一步降低 TTFT。相关工程文件(patch、脚本、算子源码)均位于 integration/sglang/qwen3-next,读者可结合本文与仓库源码进一步深入实践。
【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考