当前位置: 首页 > news >正文

CANN Qwen3-next SGLang优化实践样例

Qwen3-next SGLang优化实践样例

【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer

概述

Qwen3-next模型是2025.9推出的混合注意力开源大语言模型,本样例针对Qwen3-next模型,基于SGLang开源框架,完成模型推理部署的优化适配。

本项目基于NPU主要完成了以下优化特性,具体内容介绍可参见基于SGLang&A3集群的Qwen3-next模型推理部署优化实践。

  • 支持MTP1部署
  • 支持AscendC recurrent_gated_delta_rule大融合算子、mambav2_rmsnormgated融合算子
  • 支持PTO 融合算子
  • 支持线性Attention/GatedAttention的SP(Sequence Parallel)序列并行部署策略
  • 支持W8A8C8量化

硬件要求

产品型号:Atlas A3 系列

基于Docker构建环境

  1. 创建SGLang镜像。

    # 镜像下载 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 bash
  2. 在容器中安装CANN软件包与Ascend Extension for PyTorch软件包。

    为使能GDN融合算子,需要先将镜像中的CANN版本更新到8.5.0。

    • 清理旧版CANN

      cd /usr/local/Ascend rm -rf 8.5.0/ ascend-toolkit/ latest/ nnal/
    • 安装CANN:8.5.0

      请从软件包下载地址下载如下软件包,并参考CANN安装文档进行安装。

      • 开发套件包:Ascend-cann-toolkit_${version}_linux-${arch}.run
      • 二进制算子包:Ascend-cann-A3-ops_${version}_linux-${arch}.run
      • NNAL加速包:Ascend-cann-nnal_${version}_linux-${arch}.run

      软件包文件名中${version}表示CANN包版本号,${arch}表示CPU架构(如aarch64、x86_64)。

      请参考版本兼容性说明确认HDK版本。为兼容pd分离特性,推荐版本为25.2.x。

    • 创建latest软连接

      ln -s /usr/local/Ascend/cann /usr/local/Ascend/latest
    • 安装Ascend Extension for PyTorch:7.3.0

      Ascend Extension for PyTorch(torch_npu)为支撑PyTorch框架运行在NPU上的适配插件,本样例支持的Ascend Extension for PyTorch版本为7.3.0,PyTorch版本为2.6.0

      请参考Ascend Extension for PyTorch安装文档安装相应版本的torch_npu插件。

  3. 下载项目源码并安装依赖的python库。

    # 下载项目源码,以master分支为例 git clone https://gitcode.com/cann/cann-recipes-infer.git
  4. 下载依赖的开源框架代码,加载patch。

    为了让使用者和开发者直观了解我们基于开源代码做的修改,本样例中只包含patch代码,其他框架代码需要拉取。

    返回cann-recipes-infer项目代码上级目录,即执行git clone命令时所在目录,并执行如下命令,需注意,请确保环境能够正常连通网络。

    # 返回cann-recipes-infer项目代码上级目录 # 下载sglang源码 git clone https://github.com/sgl-project/sglang.git -b v0.5.6

    patches目录下有五个对应不同特性更改的patch组,对应关系如下:

    • stage1:包含基础功能适配和MoE多流优化。
    • stage2:包含W8A8C8动态量化。
    • stage3:包含GDN和MTP适配。
    • stage4:包含CP并行。
    • stage5:rmsnormgated、GDN大融合算子适配以及问题修复。

    按顺序加载patches目录下的五个patch组:

    cd sglang bash ../cann-recipes-infer/models/qwen3-next/apply_patches.sh

    安装sglang:

    pip install -e python --no-deps --no-build-isolation
  5. 编译安装sgl-kernel-npu

    # 下载sgl-kernel-npu源码 git clone https://github.com/sgl-project/sgl-kernel-npu -b 2026.03.01

    请参考安装文档,编译安装sgl-kernel-npu。

  6. 安装最新Triton-Ascend

    Triton-Ascend是CANN生态对Triton的支持库,请参考Triton-Ascend安装指南安装最新Triton-Ascend:

    pip install triton-ascend --force-reinstall
  7. 安装其他依赖

    pip install torchvision==0.21.0 pip install torchao==0.9.0
  8. 编译安装自定义算子

    # 进入算子编译目录 cd ../cann-recipes-infer/models/qwen3-next/ops/npu_ops_transformer_ext

    请参考编译文档编译安装自定义算子。

模型权重准备

本样例使用的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 https://cann-ai.obs.cn-north-4.myhuaweicloud.com/cann-quantization/Qwen3-next/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 \

推理执行

在本样例代码根目录下启动Qwen3-next的推理执行。

前置环境配置

修改set_env.sh中推理执行需要相关配置。

修改点修改描述
SOCKET_IFNAME各部署节点网卡
MODEL_PATH模型权重存储路径
PYTHONPATHPYTHONPATH中增加打完patch后的sglang路径
IP_NODE_P0Prefill主节点ip
IP_NODE_D0Decode主节点ip

PD混部命令

使用infer.sh启动SGLang服务,以下是对相关服务拉起参数的说明:

配置项说明
--tp 16TP并行数(若开启DP,实际TP并行数为此配置参数/DP配置参数)
--enable-dp-attention --dp-size 8DP并行数配置,若需禁用DP请删除这两项配置
--moe-a2a-backend deepep --deepep-mode auto启用deepep,若需禁用deepep请删除这两项配置
--cuda-graph-bs 16计算图batch size,使用单算子模式请替换为--disable-cuda-graph

PD分离命令

PD分离部署需要分别启动Prefill+Decode+Router节点,

  1. 修改各个节点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
  1. 在Prefill节点运行infer_prefill.sh

  2. 在Decode节点运行infer_decode.sh

  3. 在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 30002

新增特性使能

特性使能方式说明
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=1export 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中修改deepep环境变量配置,将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中修改deepep环境变量配置,将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场景。

规格约束说明:

  1. PD分离场景P和D部署策略需相同(SGLang框架暂未支持MHA(Multi-Head Attention)PD不同策略部署);
  2. MTP暂不支持和图模式同时开启;
  3. MTP暂不支持和C8同时开启;
  4. 暂不支持PD分离下开启MTP;
  5. CP仅支持PD分离场景开启,启用时P和D部署策略可不同(P可增加cp_size配置),需cp_size<tp_size,需要PD卡数相同(SGLang框架kv传输逻辑限制),CP不支持与DP同时开启(CP复用了DP通信域);
  6. 请确保chunk prefill size <= 71680(triton算子的规格约束);
  7. GDN切分头数存在限制,tp_size需不大于32;
  8. 当前框架存在精度问题:当内部索引 mamba_cache_indices=0 时,会产生错误结果;该索引会在 Mamba cache 容量范围内循环使用。max-mamba-cache-size 用于控制 Mamba cache 容量,默认值较小(通常为2),索引循环时会频繁回到0,从而导致精度下降。将 max-mamba-cache-size调大(可设置为512,有效平衡精度与性能),可显著降低该问题触发概率,但会带来一定性能开销。

测试方法

单请求精度验证

  • 普通长度的序列可以通过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配置为要发送的文本。

基于数据集的精度验证

通过以下命令可以执行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 0

指定B/S的随机请求验证

通过bench_serving.sh脚本,可以通过bench_serving指定B/S发送请求。

  • 可先通过 https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json?download=true 下载数据集,并在脚本里指定DatasetJsonPath为对应json文件路径。

Benchmark

基于Atlas A3,本实践使用下述部署方式,使能优化点ACLGraph、A8W8C8量化、MoE多流、GDN融合算子,对Qwen3Next本进行了性能Benchmark测试。

基础模型机器型号graph_bsdp_sizetp_sizeep_sizemax_prompt_lengthnum_prompts纯模型decode时延(ms)
Qwen3-Next-80B-A3B-Instruct-A8W8C8Atlas A3 16die168216256k1620.6

性能采集

可通过以下方式,加载profiling相关的patch修改,使用torch_npu.profiler采集性能数据。

加载patch

在sglang目录下加载PROFILE.patch:

git apply ../cann-recipes-infer/models/qwen3-next/patches/PROFILE.patch

profiler配置

  1. 通过设置环境变量PROFILER_MODE[all, decode, prefill]中的指定值选择profiler的范围。

    以decode为例:

    export PROFILER_MODE='decode'
  2. 配置SGLANG_TORCH_PROFILER_DIR指定profiler的保存路径:

    export SGLANG_TORCH_PROFILER_DIR='/home/sglang/prof/'
  3. 修改python/sglang/srt/model_executor/model_runner.py中的schedule,控制采集范围。

    torch_npu.profiler的接口与torch原生profiler类似,具体使用方法可参考昇腾社区。 默认配置下,采集step4-step14的profiling数据。

运行采集

  1. 使用要采集的配置拉起服务,若需精准控制采集的step,请确保配置了--skip-server-warmup参数跳过服务启动时的warmup。
  2. 可使用指定B/S的随机请求验证发送指定请求,若需精准控制采集的step,在使用bench_serving时添加--warmup-requests 0可跳过warmup请求。
  3. 采集结束后,profiling数据保存在SGLANG_TORCH_PROFILER_DIR指定的目录下。

查看Trace图

可以通过ASCEND_PROFILER_OUTPUT目录下的trace_view.json文件查看算子运行的trace图。

推荐使用昇腾官方可视化工具MindStudio Insight查看trace图,具体下载和使用方式请参考MindStudio Insight工具。

【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/785301/

相关文章:

  • CANN/atvc SinhCustom算子样例
  • 51单片机入门避坑指南:从Keil5安装到LCD1602显示,新手最容易犯的5个错误
  • 清洁度检测精度低难题待解?国内高精度清洁度检测设备厂家大盘点 - 工业干货社
  • 企业生成式AI治理框架构建:从战略到落地的四大支柱与实践指南
  • 43 Nginx的location指令
  • 鑫桥包装:以匠心筑品质,打造高性价比贴标机定制服务标杆 - 品牌策略师
  • CANN/shmem RDMA性能测试示例
  • FWT 集合幂级数
  • 基于可穿戴设备与AI的体重变化预测:从血糖、活动、睡眠数据到个性化健康管理
  • 力扣2760 C++滑动窗口解法
  • 移动干扰源定位系统:原理、配置与实战技巧
  • Ubuntu 20.04换源踩坑实录:手把手教你修复‘held broken packages’报错(附清华源正确姿势)
  • RSSHub与Dify插件实战:构建智能信息流与自动化监控工作流
  • 用最便宜的STM32F103C8T6做个自平衡小车?先搞定MPU6050+DMP姿态角(附完整代码)
  • 龙芯2k0300 - 走马观碑组按键驱动移植
  • AI公平性实战指南:从算法偏见来源到缓解策略全解析
  • 市场报告对比:液冷清洁度检测设备怎么选?西恩士提全套解决方案 - 工业干货社
  • 别再手动清C盘了!分享一个我用了3年的Windows10垃圾清理.bat脚本(附详细注释)
  • UX设计师如何驾驭生成式AI:从工具使用者到AI策展人的实践指南
  • cann/sip:信号处理加速库CgemvBatchedOperation C++ Demo
  • taotoken平台openai兼容api的python调用基础教程
  • 《落海的人》的内容入口:低潮情绪如何被记住
  • Claude API用量监控桌面小组件开发实战:Python+SwiftBar实现成本可视化
  • 告别VSCode!在Ubuntu 22.04上用Vim+YouCompleteMe打造丝滑C++开发环境(保姆级避坑指南)
  • 42 Nginx的server_name匹配执行顺序
  • 从红蓝对抗到紫队协同:构建负责任AI安全治理新范式
  • GMod服务器开发:基于ClawCompany框架的模块化架构与工程实践
  • AI公平性实战:从偏见检测到模型优化的全流程指南
  • AI在癌症病理切片分析中的五大核心任务与临床转化挑战
  • ChatGPT在高等教育考核中的表现与影响:实证研究与应对策略