Ascend-SACT/QwQ-32B
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

QwQ-32B模型在vllm-ascend框架下性能调优案例指导

1. 模型概述及场景

QwQ-32B是通义千问团队开发的稠密(Dense)结构大语言模型,拥有320亿参数。该模型是Qwen3系列六款Dense架构模型中的核心产品,采用Transformer解码器架构,具备出色的语言理解与生成能力。 其核心技术创新在于引入了混合推理能力。模型可通过设置enable_thinking参数,灵活在“思考模式”与“非思考模式”间切换。开启思考模式后,模型会显式地处理复杂逻辑链条,显著提升在数学推理、代码调试、复杂问题分析等需要多步推导任务上的表现。 魔塔下载链接:https://www.modelscope.cn/models/Qwen/QwQ-32B

2. 准备运行环境

2.1 硬件版本

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

2.2 软件版本

组件 版本 vllm-ascend 0.11.0.rc2 HDK Ascend HDK 25.2.1 CANN 8.3.RC1 模型 QwQ-32B

3. 运行指导

3.1 创建容器

docker run -itd --privileged  --name=v0.11.0rc3-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.11.0rc3-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/QwQ-32B \
      --served-model-name QwQ-32B \
      --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/QwQ-32B \
      --served-model-name QwQ-32B \
      --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/QwQ-32B
--served-model-name QwQ-32B
--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.6 异步调度 异步调度特性【--async-scheduling】可以减少推理过程中的token与token之间的空泡等待,提升整体推理性能,异步推理使能方法:启动推理服务时加上–async-scheduling启动选项。 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/QwQ-32B
--served-model-name QwQ-32B
--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.7 流水优化

通过此环境变量可配置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.8 高性能内存分配器

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.9 通信算法 - "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.10 稠密模型优化

开启方法:export VLLM_ASCEND_ENABLE_DENSE_OPTIMIZE=1

3.10.1 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.10.2 FlashComm特性

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

3.11 整体优化结果

image.png 注意:性能数据以实测为准,仅供参考。