Ascend-SACT/Qwen3.5-27B_vllm-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Qwen3.5-27B-w8a8模型在vllm-ascend框架下性能调优案例指导

1. 模型概述及场景

Qwen3.5 具备以下增强特性: 统一的视觉-语言基础:在多模态 token 上进行早期融合训练,在推理、编码、智能体和视觉理解等基准测试中,跨代际地达到与 Qwen3 相当的水平,并超越 Qwen3-VL 模型。 高效混合架构:门控 Delta 网络结合稀疏混合专家(Mixture-of-Experts)机制,实现高吞吐推理,同时保持极低的延迟和成本开销。 可扩展的强化学习泛化能力:在百万级智能体环境中进行强化学习训练,任务分布逐步复杂化,从而确保在现实世界中具备强大的适应能力。 全球语言覆盖:支持扩展至 201 种语言和方言,实现包容性的全球部署,并具备对不同文化和区域背景的细致理解。 下一代训练基础设施:相比纯文本训练,多模态训练效率接近 100%,并配备异步强化学习框架,支持大规模智能体脚手架和环境编排。

魔塔下载链接:

bf16 https://www.modelscope.cn/models/Qwen/Qwen3.5-27B

w8a8 https://www.modelscope.cn/models/Eco-Tech/Qwen3.5-27B-w8a8-mtp

镜像:0.18.0.rc1

2. 准备运行环境

2.1 硬件版本

组件 版本 硬件环境 910C(4卡)

2.2 软件版本

组件 版本 vllm-ascend 0.18.0.rc1 HDK Ascend HDK 25.2.1 CANN 8.3.RC1 模型 Qwen3.5-27B-w8a8

3. 运行指导

3.1 创建容器

docker run -itd --privileged  --name=v0.18.0rc1-a3-test --net=host \
--shm-size 500g \
--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/hisi_hdc \
--device /dev/devmm_svm \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /home:/home \
-v /disk1:/disk1 \
-v /disk2:/disk2 \
-v /disk3:/disk3 \
-v /opt:/opt \
-v /home:/home \
--entrypoint /bin/bash quay.io/ascend/vllm-ascend:v0.18.0rc1-a3

3.2 单算子模式

由于0.11.0版本默认走图模式,若要在profiling内打印出每个算子执行shape,需要在启动命令里加入--enforce-eager,可以使能单算子模式,但性能较差,便于性能分析。

pkill -9 python
pkill -9 VLLM
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export VLLM_USE_V1=1
export VLLM_VERSION=0.11.0
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -m vllm.entrypoints.openai.api_server  \
      --model=XXX/Qwen3.5-27B-w8a8 \
      --served-model-name Qwen3.5-27B-w8a8 \
      --trust-remote-code \
      --max-model-len 32768 \
      --max-num-batched-tokens 122880 \
      -tp 8 \
      --port 9998 \
      --block-size 128 \
      --no-enable-prefix-caching \
      --enforce-eager \
      --gpu-memory-utilization 0.95 

3.2 ACL Graph图模式【开箱性能】

由于单算子模式需要频繁的算子下发,会带来Host瓶颈,为了缓解这一问题,使用ACL Graph图模式,做到一次捕获,多次重放,从而做到减少CPU和框架调度,提升吞吐。

pkill -9 python
pkill -9 VLLM
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export VLLM_USE_V1=1
export VLLM_VERSION=0.11.0
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

python -m vllm.entrypoints.openai.api_server  \
      --model=XXX/Qwen3.5-27B-w8a8 \
      --served-model-name Qwen3.5-27B-w8a8 \
      --trust-remote-code \
      --max-model-len 32768 \
      --max-num-batched-tokens 122880 \
      -tp 8 \
      --port 9998 \
      --block-size 128 \
      --no-enable-prefix-caching \
      --gpu-memory-utilization 0.95 

从日志中可以看出默认图捕获大小为:[512, 448, 384, 312, 248, 184, 112, 48, 1],默认图模式为PIECEWISE【分段图模式】,针对以上两点可以做相应优化:

3.2.1 调整图模式批次大小

通过调整--compilation-config内的cudagraph_capture_sizes参数,来修改图的捕获范围,确保能够覆盖业务中关键的形状或模型结构。通过合理调整这一参,从而提升性能需要将吞吐打上去,以本次调优案例为例,需要将并发16加入到cudagraph_capture_sizes数组内,经实测分析,较默认图模式捕获而已,吞吐提升8%。

pkill -9 python
pkill -9 VLLM
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export VLLM_USE_V1=1
export VLLM_VERSION=0.11.0
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

python -m vllm.entrypoints.openai.api_server  \
    --model=XXX/Qwen3.5-27B-w8a8 \
    --served-model-name Qwen3.5-27B-w8a8 \
    --trust-remote-code \
    --max-model-len 32768 \
    --max-num-batched-tokens 122880 \
    -tp 8 \
    --port 9998 \
    --block-size 128 \
    --no-enable-prefix-caching \
    --compilation-config '{"cudagraph_capture_sizes":[1,2,4,8,16,24,48]}' \
    --gpu-memory-utilization 0.95 

3.2.2 FULL_DECODE_ONLY

默认图模式PIECEWISE图模式,由于Full Graph 模式在 v0.11.0 版本支持FULL_DECODE_ONLY 模式,通过设置-compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes":[1,2,4,8,16,24,48]}',可以使用FULL_DECODE_ONLY图模式,进一步提升推理性能,实测较PIECEWISE图模式,吞吐提升25%。

从日志中可以看出,已使能FULL_DECODE_ONLY图模式。

3.3 异步调度

异步调度特性【--async-scheduling】可以减少推理过程中的token与token之间的空泡等待,提升整体推理性能,异步推理使能方法:启动推理服务时加上–async-scheduling启动选项。 异步调度前(主decode间耗时22.5ms): 实测端到端TPOT提升1.94ms 异步推理使能方法:启动推理服务时加上–async-scheduling启动选项。 对应PR:https://github.com/vllm-project/vllm-ascend/pull/4893/files

pkill -9 python
pkill -9 VLLM
source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh
export VLLM_USE_V1=1
export VLLM_VERSION=0.11.0
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

python -m vllm.entrypoints.openai.api_server  \
       --model=XXX/Qwen3.5-27B-w8a8 \
       --served-model-name Qwen3.5-27B-w8a8 \
       --trust-remote-code \
       --max-model-len 32768 \
       --max-num-batched-tokens 122880 \
       -tp 8 \
       --port 9998 \
       --block-size 128 \
       --no-enable-prefix-caching \
       --async-scheduling \
       --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes":[1,2,4,8,16,24,48]}' \
       --gpu-memory-utilization 0.95 

性能提升效果:使能异步调度特性后,TOPT较为使能前减少0.7ms。

3.4 流水优化

通过此环境变量可配置task_queue算子下发队列是否开启和优化等级。 • 配置为“0”时:关闭task_queue算子下发队列优化,算子下发任务:

• 配置为“1”或未配置时:开启task_queue算子下发队列Level 1优化。 Level 1优化:使能task_queue算子下发队列优化,将算子下发任务分为两段,一部分任务(主要是aclnn算子的调用)放在新增的二级流水上,一、二级流水通过算子队列传递任务,相互并行,通过部分掩盖减少整体的下发耗时,提升端到端性能。

• 配置为“2”时:开启task_queue算子下发队列Level 2优化。 Level 2优化:包含Level 1的优化并进一步平衡了一、二级流水的任务负载,主要是将workspace相关任务迁移至二级流水,掩盖效果更好,性能收益更大。该配置仅在二进制场景生效,建议配置值为Level 2优化。

详细介绍:https://www.hiascend.com/document/detail/zh/Pytorch/600/apiref/Envvariables/Envir_019.html 使能方法: export TASK_QUEUE_ENABLE=1

3.5 高性能内存分配器

jemalloc是一款内存分配器,与传统内存分配器(例如,glibc)相比,其最大优势在于减少内存碎片和提升多线程高并发场景下内存的分配效率,进而充分发挥多核多并发的优势 在内存分配过程中,锁会造成线程等待,对性能影响很大。jemalloc采用如下措施避免线程竞争锁的发生:使用线程变量,每个线程有对应的内存管理器,内存分配在该线程内完成,无需和其它线程竞争锁。 详细参考: https://www.hiascend.com/document/detail/zh/canncommercial/83RC1/softwareinst/instg/instg_0099.html?Mode=PmIns&InstallType=local&OS=openEuler&Software=cannToolKit 使能方法: export LD_PRELOAD=/usr/local/Ascend/ascend-toolkit/latest/lib64/libjemalloc.so

3.6 通信算法 - "AIV"

开启HCCL AIV模式,代表通信算法的编排展开位置在Device侧的Vector Core,执行也在Vector Core。 详细可参考: https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/850alpha001/maintenref/envvar/envref_07_0096.html 性能提升效果:使能AIV模式后,TOPT较为使能前减少8ms,吞吐提升36%。 使能方法: export HCCL_OP_EXPANSION_MODE="AIV"

3.7 稠密模型优化

开启方法:export VLLM_ASCEND_ENABLE_DENSE_OPTIMIZE=1

3.8 MLP权重预取

权重预取通过在需要权重之前将权重预加载到缓存来优化内存使用,从而最大限度地减少模型执行期间内存访问导致的延迟。 注意:由于使用向量计算来隐藏权重预取管道,所以预取缓冲区大小的设置至关重要,如果缓冲区过小,将无法充分发挥优化的优势,而较大的缓冲区可能会导致资源争用,导致性能下降。 为了适应不同的场景,需要配置两个环境变量: VLLM_ASCEND_MLP_GATE_UP_PREFETCH_SIZE和VLLM_ASCEND_MLP_DOWN_PREFETCH_SIZE,以便根据具体的工作负载灵活配置缓冲区大小。 此优化需要将环境变量VLLM_ASCEND_ENABLE_PREFETCH_MLP = 1和VLLM_ASCEND_ENABLE_DENSE_OPTIMIZE = 1设置为启用。 参考配置:

export VLLM_ASCEND_ENABLE_DENSE_OPTIMIZE=1
export VLLM_ASCEND_ENABLE_FLASHCOMM=1
# Prefech
export VLLM_ASCEND_ENABLE_PREFETCH_MLP=1
export VLLM_ASCEND_MLP_GATE_UP_PREFETCH_SIZE=4874368
# Set buffer size for down proj prefetch
export VLLM_ASCEND_MLP_DOWN_PREFETCH_SIZE=4874368

3.9 FlashComm特性

FlashComm_v1通过将传统的allreduce集体通信分解为reduce-scatter和all-gather,提升模型推理性能。 此优化需要将环境变量VLLM_ASCEND_ENABLE_FLASHCOMM1 = 1设置为启用。 注意:该特性需要开启TP并行,对大并发场景下会具有性能收益。

3.10 整体启动命令

 export PATH="/usr/local/python3.11.14/bin:${PATH}"
  export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
  export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"
  export HCCL_IF_IP="xxx"
  export HCCL_OP_EXPANSION_MODE="AIV"
  export HCCL_BUFFSIZE=1024
  export OMP_NUM_THREADS=1
  export LD_PRELOAD="/usr/local/Ascend/cann-8.5.1/aarch64-linux/lib64/libjemalloc.so${LD_PRELOAD:+:${LD_PRELOAD}}"
  export TASK_QUEUE_ENABLE=1
  export PYTHONPATH="/vllm-workspace/vllm:/vllm-workspace/vllm-ascend${PYTHONPATH:+:${PYTHONPATH}}"

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

  nohup /usr/local/python3.11.14/bin/vllm serve /xxx/Qwen3.5-27B-w8a8 \
      --served-model-name "qwen3.5" \
      --host 0.0.0.0 \
      --port 8010 \
      --data-parallel-size 2 \
      --tensor-parallel-size 4 \
      --max-model-len 8192 \
      --max-num-batched-tokens 8192 \
      --max-num-seqs 16 \
      --gpu-memory-utilization 0.95 \
      --compilation-config '{"cudagraph_capture_sizes":[1,4,8,12,16,24,32,48,56,64], "cudagraph_mode":"FULL_DECODE_ONLY"}' \
      --speculative-config '{"method": "qwen3_5_mtp", "num_speculative_tokens": 3, "enforce_eager": true}' \
      --trust-remote-code \
      --async-scheduling \
      --allowed-local-media-path / \
      --quantization ascend \
      --skip-mm-profiling \
      --mm-processor-cache-gb 0 \
      --profiler-config '{"profiler": "torch", "torch_profiler_dir": "/data2/lcb/qwen3.5/profiling","torch_profiler_with_stack": false}' \
      --additional-config '{"enable_cpu_binding":true, "multistream_overlap_shared_expert": true}' \
      >> /data1/lcb/qwen3.5/log.log 2>&1 &

3.11 压测结果

image.png (仅供参考)