作者:昇腾实战派
知识地图:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003

背景概述

在 vLLM-Ascend 推理框架中,正确配置启动参数与环境变量是充分发挥昇腾算力、保障推理稳定性的关键。本文以 DeepSeek-V4 系列模型为例,汇总单机混部、多机混部、PD 分离等常见部署形态下的关键参数与配置含义,为外部开发者在昇腾上部署 vLLM 服务提供参考。

单机混部(DeepSeekV4-Flash)

export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10  
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export VLLM_USE_V1=1
export VLLM_VERSION=0.18.0
export USE_MULTI_BLOCK_POOL=1
export USE_MULTI_GROUPS_KV_CACHE=1
export HCCL_BUFFSIZE=1024
export VLLM_ASCEND_ENABLE_FUSED_MC2=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1
export DYNAMIC_EPLB="true"
export VLLM_ENGINE_READY_TIMEOUT_S=1200


vllm serve /mnt/share/weights/v4_w8a8 \
    --port 8008 \
    --host 0.0.0.0 \
    --max_model_len 10240 \
    --max-num-batched-tokens 10240 \
    --served-model-name dsv4 \
    --gpu-memory-utilization 0.9 \
    --max-num-seqs 64 \
    --data-parallel-size 2 \
    --tensor-parallel-size 8 \
    --enable-expert-parallel \
    --tokenizer-mode deepseek_v4 \
    --tool-call-parser deepseek_v4 \
    --enable-auto-tool-choice \
    --reasoning-parser deepseek_v4 \
    --safetensors-load-strategy 'prefetch' \
    --quantization ascend \
    --speculative-config '{"num_speculative_tokens": 1,"method": "deepseek_mtp"}' \
    --block-size 128 \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}'\
    --async-scheduling \
    --additional-config '
    {"ascend_compilation_config":{
        "enable_npugraph_ex":true,
        "enable_static_kernel":false
        },
    "enable_cpu_binding": "true",
    "multistream_overlap_shared_expert":false,
    "multistream_dsa_preprocess":false}' \
    2>&1 | tee single.log
  • --host 表示主机名/IP 地址。
  • --port 表示 vllm 服务对外暴露的端口号。
  • --max-model-len 定义单个请求的最大处理长度(输入 prompt + 生成内容的 token 总数),确保不超过硬件显存容量。
  • --max-num-batched-tokens 表示模型单步能处理的最大 token 数量。目前,vLLM v1 调度默认启用了 ChunkPrefill/SplitFuse,这意味着:
    • (1)如果请求的输入长度大于 --max-num-batched-tokens,将按照 --max-num-batched-tokens 拆分为多轮计算;
    • (2)解码请求优先调度,仅在有剩余容量时才调度预填充请求。
    • 通常,--max-num-batched-tokens 设置得越大,整体延迟越低,但对 GPU 内存(激活值占用)的压力越大。
  • --max-num-seqs 表示每个 DP 组允许处理的最大请求数。如果发送到服务的请求数超过此限制,超出部分将处于等待状态而不会被调度。请注意,等待状态所花费的时间也会计入 TTFT 和 TPOT 等指标中。因此,在测试性能时,通常建议 --max-num-seqs * --data-parallel-size >= 实际总并发数。
  • --gpu-memory-utilization 表示 vLLM 将用于实际推理的 HBM 占比。其核心作用是计算可用的 kv_cache 大小。在预热阶段(vLLM 中称为 profile run),vLLM 会记录输入大小为 --max-num-batched-tokens 的推理过程中的峰值 GPU 内存使用量。然后按如下方式计算可用 kv_cache 大小:--gpu-memory-utilization * HBM 大小 - 峰值 GPU 内存使用量。因此,--gpu-memory-utilization 的值越大,可用的 kv_cache 就越多。然而,由于预热阶段的 GPU 内存使用量可能与实际推理时不同(例如由于 EP 负载不均),将 --gpu-memory-utilization 设置过高可能会导致实际推理时出现 OOM(内存不足)问题。默认值为 0.9
  • --compilation-config 包含与 aclgraph 图模式相关的配置。最重要的配置是 “cudagraph_mode” 和 “cudagraph_capture_sizes”,其含义如下:
    • "cudagraph_mode":表示具体的图模式。目前支持 “PIECEWISE” 和 “FULL_DECODE_ONLY”。图模式主要用于降低算子下发开销。目前推荐使用 “FULL_DECODE_ONLY”。"cudagraph_mode":"FULL_DECODE_ONLY",表示只对 decode 阶段建图,不对 prefill 建图。原因:prefill 长度变化大,建图收益低。
    • "cudagraph_capture_sizes" 参数控制推理过程中图捕获的粒度。调整该值决定了一次捕获多少计算图,这会对性能和内存使用产生重大影响。如果未手动指定此列表,它将填充一系列均匀分布的值,这通常能确保良好的性能。然而,如果您想进一步微调,手动指定值将产生更好的结果。这是因为如果批次大小落在两个值之间,框架会自动将 token 数量填充到较大的值。这通常会导致实际性能偏离预期甚至下降。因此,与上述实际场景一样,在调整基准测试请求并发数时,我们始终确保并发数实际包含在 cudagraph_capture_sizes 列表中。这样,在解码阶段,基本上可以避免填充操作,确保实验数据的可靠性。需要注意的是,如果启用了 FlashComm_v1,此列表中的值必须是 TP 大小的整数倍。任何不满足此条件的值将被自动过滤掉。
  • --quantization "ascend" 表示使用 Ascend 专用量化后端。要禁用量化,请移除该选项。
  • --served-model-name 表示 API 中使用的模型名称。如果提供了多个名称,服务器将响应提供的任何名称。
  • --api-server-count 表示运行的 API 服务器进程数量。
  • --data-parallel-size 表示数据并行组数量。
  • --tensor-parallel-size 表示张量并行组数量。
  • --enable-expert-parallel 表示对 MoE 层使用专家并行而不是张量并行。
  • --no-enable-prefix-caching 表示不启用前缀缓存。
  • --block-size 定义了操作系统内存分页机制中每个数据块(Block)所能容纳的 Token 数量。
  • --tokenizer-mode deepseek_v4:启用 dsv4 专用 tokenizer。
  • --tool-call-parser deepseek_v4:启用 dsv4 专用的工具调用(Function Calling)解析器,以便让 dsv4 模型在 Agent 系统中顺利工作。
  • --reasoning-parser deepseek_v4:启用 dsv4 专用的思考模式解析器。
  • --enable-auto-tool-choice:允许模型自动决定是否调用工具。
  • --safetensors-load-strategy 'prefetch':开启权重预取,即边读边加载,可使模型启动更快。
  • --async-scheduling:开启异步调度,可以实现调度和模型执行过程并行。
  • --speculative-config '{"num_speculative_tokens": 1,"method": "deepseek_mtp"}':使用 DeepSeek 的 MTP(Multi-Token Prediction)机制进行投机解码。每次尝试提前预测 1 个 token。若预测正确,可减少主模型计算,从而降低延迟。
  • --additional-config 是 vllm 的附加配置,一般用于性能优化。
    • "enable_cpu_binding": "true",从 vllm-ascend v0.18.0rc1 开始,CPU 绑定在基于 ARM 的昇腾服务器上默认启用。CPU 绑定改进了配备昇腾 NPU 的多插槽 ARM 服务器的主机侧调度。它旨在解决三个常见的主机侧推理性能问题:
      • 降低跨 NUMA 流量。 Worker 进程更靠近为其活跃 NPU 选择的 CPU 和内存资源,从而减少远程 NUMA 访问。
      • 降低线程抢占导致的上下文切换开销。 关键运行时线程在稳定的 CPU 范围内运行,减少调度器移动和繁忙主机上的 CPU 争用。
      • 更好的延迟稳定性和多 Worker 隔离。 独立的 Worker 避免共享相同的 CPU/NUMA 资源,这有助于减少尾延迟抖动,并使多 NPU 服务期间的吞吐量更可预测。
      • 此功能是主机侧的性能优化。它不会改变模型执行逻辑或数值输出。 当内存迁移支持不可用时,CPU 亲和性仍然有效,但内存局部性可能会变差,延迟或吞吐量可能会下降。
    • "ascend_compilation_config"
      • "enable_npugraph_ex":Npugraph_ex 是一个编译时 FX 图优化层,与 ACLGraph 协同工作。它在 ACLGraph 于运行时捕获模型 FX 图之前对其进行优化。其性能优势主要来自于将多个算子融合为单个内核(例如,add + rms_norm → npu_add_rms_norm),以减少内核启动开销。
      • "enable_static_kernel":静态内核编译。静态内核编译是一个可选功能,它在编译时预编译具有固定形状的算子二进制文件,从而减少静态或接近静态形状网络的运行时开销。它默认禁用,需要显式启用。
    • "multistream_overlap_shared_expert":是否启用多流共享专家。此选项仅对包含共享专家的 MoE 模型生效。默认值为 false。

多机混部(DeepSeekV4-Pro)

主节点

unset ftp_proxy
unset https_proxy
unset http_proxy

nic_name="bond0"  # 对应节点有环境IP的网口名
local_ip=xxx.xxx.xxx.xxx  # 主节点ip

export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name

export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_BUFFSIZE=1024

export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export TASK_QUEUE_ENABLE=1
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

export HCCL_CONNECT_TIMEOUT=7200
export ASCEND_CONNECT_TIMEOUT=10000
export ASCEND_TRANSFER_TIMEOUT=10000
export VLLM_RPC_TIMEOUT=1800000 # 毫秒,约 30 分钟
export VLLM_ASCEND_APPLY_DSV4_PATCH=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1

# 参数--data-parallel-address的IP为主节点IP
vllm serve /mnt/share/weights/DeepSeek-V4-Pro-w4a8-fixmtp \
  --port 8900 \
  --host 0.0.0.0 \
  --safetensors-load-strategy 'prefetch' \
  --model-loader-extra-config='{"enable_multithread_load": "true", "num_threads": 128}' \
  --max_model_len 135000  \
  --max-num-batched-tokens 4096 \
  --served-model-name dsv4 \
  --gpu-memory-utilization 0.9 \
  --max-num-seqs 16 \
  --data-parallel-size 2 \
  --data-parallel-size-local 1 \
  --data-parallel-start-rank 0 \
  --data-parallel-address xxx.xxx.xxx.xxx \
  --data-parallel-rpc-port 13399 \
  --tensor-parallel-size 16 \
  --enable-expert-parallel \
  --quantization ascend \
  --block-size 128 \
  --async-scheduling \
  --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
  --tokenizer-mode deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice \
  --reasoning-parser deepseek_v4 \
  --speculative-config '{"num_speculative_tokens": 1,"method": "mtp","enforce_eager": true}' \
  --api-server-count 1 \
  --additional-config '
    {"ascend_compilation_config":{
        "enable_npugraph_ex":true,
        "enable_static_kernel":false
        },
    "enable_cpu_binding": "true",
    "multistream_overlap_shared_expert":true}'

从节点

unset ftp_proxy
unset https_proxy
unset http_proxy

nic_name="bond0"  # 对应节点有环境IP的网口名
local_ip=xxx.xxx.xxx.xxx  # 从节点ip

export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name

export HCCL_OP_EXPANSION_MODE="AIV"
export HCCL_BUFFSIZE=1024

export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export TASK_QUEUE_ENABLE=1
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

export HCCL_CONNECT_TIMEOUT=7200
export ASCEND_CONNECT_TIMEOUT=10000
export ASCEND_TRANSFER_TIMEOUT=10000
export VLLM_RPC_TIMEOUT=1800000   # 毫秒,约 30 分钟
export VLLM_ASCEND_APPLY_DSV4_PATCH=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1

# 参数--data-parallel-address的IP为主节点IP
vllm serve /mnt/share/weights/DeepSeek-V4-Pro-w4a8-fixmtp \
  --port 8900 \
  --host 0.0.0.0 \
  --safetensors-load-strategy 'prefetch' \
  --model-loader-extra-config='{"enable_multithread_load": "true", "num_threads": 128}' \
  --max_model_len 135000  \
  --max-num-batched-tokens 4096 \
  --served-model-name dsv4 \
  --gpu-memory-utilization 0.9 \
  --max-num-seqs 16 \
  --data-parallel-size 2 \
  --data-parallel-size-local 1 \
  --data-parallel-start-rank 1 \
  --data-parallel-address xxx.xxx.xxx.xxx \
  --headless \
  --data-parallel-rpc-port 13399 \
  --tensor-parallel-size 16 \
  --enable-expert-parallel \
  --quantization ascend \
  --block-size 128 \
  --async-scheduling \
  --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}' \
  --tokenizer-mode deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice \
  --reasoning-parser deepseek_v4 \
  --speculative-config '{"num_speculative_tokens": 1,"method": "mtp","enforce_eager": true}' \
  --additional-config '
    {"ascend_compilation_config":{
        "enable_npugraph_ex":true,
        "enable_static_kernel":false
        },
    "enable_cpu_binding": "true",
    "multistream_overlap_shared_expert":true}'

双机混部与单机混部大致一样,主要注意以下几点多机配置:

  1. HCCL_IF_IP 需要设置为本机 ip,xxxx_SOCKET_IFNAME 需要设置为对应网卡。
  2. 当前多机建议使用 dp。拉起多机 dp 时:
    • --data-parallel-size 表示总 dp 大小。
    • --data-parallel-size-local 表示单机 dp 大小,一般可以设置为 --data-parallel-size // node_size
    • --data-parallel-start-rank 表示当前机器上 dp 组编号的起始值。一般主节点设置为 0、从节点依次按 --data-parallel-size-local 递增即可。
    • --data-parallel-address--data-parallel-rpc-port 表示 dp 主节点的 ip 地址及用于数据并行 RPC 通信的端口。注意此处端口不能和 vllm 服务端口(–port)冲突。
    • 从节点需要加 --headless,而主节点不能加该参数。

PD 分离(DeepSeekV4-Pro,3×2P+1×2D)

P 节点

unset https_proxy
unset http_proxy
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

nic_name="enp48s3u1u2"
local_ip=xxx.xxx.xxx.xxx

jemalloc_path=$(find /usr/lib /usr/lib64 -maxdepth 2 -type f -name "libjemalloc.so.2" 2>/dev/null | head -n 1)

if [[ -n "$jemalloc_path" ]]; then
    export LD_PRELOAD="${jemalloc_path}:${LD_PRELOAD}"
    echo "jemalloc found at: $jemalloc_path"
    echo "LD_PRELOAD is set successfully."
else
    echo "Warning: libjemalloc.so.2 not found under /usr"
    echo "Please make sure jemalloc is installed."
fi

export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name

export VLLM_RPC_TIMEOUT=3600000
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export HCCL_EXEC_TIMEOUT=204
export HCCL_CONNECT_TIMEOUT=6000

export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export HCCL_BUFFSIZE=1024
export TASK_QUEUE_ENABLE=1

export HCCL_OP_EXPANSION_MODE="AIV"
export VLLM_ASCEND_ENABLE_FUSED_MC2=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1
export VLLM_ASCEND_APPLY_DSV4_PATCH=1

export ASCEND_RT_VISIBLE_DEVICES=$1


vllm serve /mnt/share/weights/DeepSeek-V4-Pro-w4a8-fixmtp \
  --host 0.0.0.0 \
  --port $2 \
  --data-parallel-size $3 \
  --data-parallel-rank $4 \
  --data-parallel-address $5 \
  --data-parallel-rpc-port $6 \
  --tensor-parallel-size $7 \
  --enable-expert-parallel \
  --seed 1024 \
  --served-model-name auto \
  --max-model-len 131072 \
  --max-num-batched-tokens 4096 \
  --max-num-seqs 16 \
  --no-disable-hybrid-kv-cache-manager \
  --tokenizer-mode deepseek_v4 \
  --tool-call-parser deepseek_v4 \
  --enable-auto-tool-choice \
  --reasoning-parser deepseek_v4 \
  --safetensors-load-strategy 'prefetch' \
  --model-loader-extra-config='{"enable_multithread_load": "true", "num_threads": 128}' \
  --trust-remote-code \
  --gpu-memory-utilization 0.92 \
  --quantization ascend \
  --block-size 128 \
  --enforce-eager \
  --speculative-config '{"num_speculative_tokens": 1, "method":"mtp", "enforce_eager": true}' \
  --additional-config '{"enable_cpu_binding": "True", "enable_dsa_cp": true}' \
  --kv-transfer-config \
  '{"kv_connector": "MooncakeHybridConnector",
  "kv_role": "kv_producer",
  "kv_port": "30000",
  "engine_id": "0",
  "kv_connector_extra_config": {
              "prefill": {
                      "dp_size": 2,
                      "tp_size": 16
              },
              "decode": {
                      "dp_size": 16,
                      "tp_size": 2
              }
      }
  }'

D 节点

unset ftp_proxy
unset https_proxy
unset http_proxy
rm -rf ~/ascend/log
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

nic_name="enp48s3u1u2"
local_ip=xxx.xxx.xxx.xxx

jemalloc_path=$(find /usr/lib /usr/lib64 -maxdepth 2 -type f -name "libjemalloc.so.2" 2>/dev/null | head -n 1)

if [[ -n "$jemalloc_path" ]]; then
    export LD_PRELOAD="${jemalloc_path}:${LD_PRELOAD}"
    echo "jemalloc found at: $jemalloc_path"
    echo "LD_PRELOAD is set successfully."
else
    echo "Warning: libjemalloc.so.2 not found under /usr"
    echo "Please make sure jemalloc is installed."
fi

export HCCL_IF_IP=$local_ip
export GLOO_SOCKET_IFNAME=$nic_name
export TP_SOCKET_IFNAME=$nic_name
export HCCL_SOCKET_IFNAME=$nic_name

# # AIV
export HCCL_OP_EXPANSION_MODE="AIV"
export TASK_QUEUE_ENABLE=1

export VLLM_RPC_TIMEOUT=3600000
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export HCCL_EXEC_TIMEOUT=204
export HCCL_CONNECT_TIMEOUT=1200


export OMP_PROC_BIND=false
export OMP_NUM_THREADS=10
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export HCCL_BUFFSIZE=1024
export ASCEND_RT_VISIBLE_DEVICES=$1
export VLLM_ASCEND_APPLY_DSV4_PATCH=1

vllm serve /mnt/share/weights/DeepSeek-V4-Pro-w4a8-fixmtp \
    --host 0.0.0.0 \
    --port $2 \
    --data-parallel-size $3 \
    --data-parallel-rank $4 \
    --data-parallel-address $5 \
    --data-parallel-rpc-port $6 \
    --tensor-parallel-size $7 \
    --enable-expert-parallel \
    --seed 1024 \
    --served-model-name auto \
    --max-model-len 131072 \
    --max-num-batched-tokens 120 \
    --max-num-seqs 60 \
    --async-scheduling \
    --block-size 128 \
    --no-enable-prefix-caching \
    --tokenizer-mode deepseek_v4 \
    --tool-call-parser deepseek_v4 \
    --enable-auto-tool-choice \
    --reasoning-parser deepseek_v4 \
    --no-disable-hybrid-kv-cache-manager \
    --safetensors-load-strategy 'prefetch' \
    --model-loader-extra-config='{"enable_multithread_load": "true", "num_threads": 128}' \
    --trust-remote-code \
    --gpu-memory-utilization 0.9 \
    --quantization ascend \
    --speculative-config '{"num_speculative_tokens": 1, "method":"mtp", "enforce_eager": true}' \
    --compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
    --kv-transfer-config \
    '{"kv_connector": "MooncakeHybridConnector",
    "kv_role": "kv_consumer",
    "kv_port": "30300",
    "engine_id": "3",
    "kv_connector_extra_config": {
                "prefill": {
                        "dp_size": 2,
                        "tp_size": 16
                },
                "decode": {
                        "dp_size": 16,
                        "tp_size": 2
                }
        }
    }' \
    --additional-config '{
        "ascend_compilation_config":{
              "enable_npugraph_ex":true,
              "enable_static_kernel":false
        },
       "enable_cpu_binding":true,
       "multistream_overlap_shared_expert":false,
       "recompute_scheduler_enable":true
    }'

相较于混部,PD 分离部署时需要注意以下配置:

  1. 当前 vLLM-Ascend pd 分离建议使用 Mooncake。
  2. p 节点一般输入 token 数较多,不需要使用图模式,因此可以开启 --enforce-eager
  3. --enforce-eager 标志用于强制模型以 “eager 模式” 运行。具体含义如下:
    • eager 模式:在 eager 模式下,模型的每一层操作会立即执行,而不是按计算图进行延迟执行。这种模式通常用于调试或开发阶段,因为它允许更直观地观察每一层的输出和中间状态。
    • 默认行为:vLLM 默认可能使用图执行模式(如 PyTorch 的 torch.compile 或类似的优化),以提高推理效率。这种模式下,多个操作会被优化并组合成一个计算图,从而减少开销。
  4. --kv-transfer-config 代表 pd 分离相关设置:
    "kv_role" 用于指定 p 节点(kv_producer)或者 d 节点(kv_consumer)。
    "kv_port" 用于指定 kv cache 传输端口。该端口号同样不能和其他端口号冲突。
    "engine_id" 用于区分 pd 不同实例。例如,3×2P+1×2D 时可以将 3 个 p 设置为 0、1、2;1 个 d 设置为 3。(同一个 P 实例中 kv_port 和 engine_id 保持一致,不同 P 实例的区分
    "kv_connector_extra_config" 中,"prefill""decode" 需要分别同 p、d 并行方式相对应。
  5. p 实例、d 实例本质上相互独立存在,可由各自的 host/port 来接收请求。pd proxy 则将 p、d 联系起来。

图模式在 Ascend 上的工作原理

Ascend 上的默认图路径涉及两个阶段:编译时优化运行时捕获/重放。ACLGraph 处理运行时捕获/重放。编译时阶段因 cudagraph_mode 而异:

  • FULL_AND_PIECEWISE:默认模式,与上游 vLLM 策略相同。编译时路径遵循 PIECEWISE 编译,而运行时对于均匀解码批次仍可能使用全图行为。
  • FULL / FULL_DECODE_ONLY:Npugraph_ex 通过 npugraph_ex (force_eager=True,仅编译时,无捕获) 优化 FX 图。然后,优化后的可调用对象在运行时由 ACLGraph 捕获和重放。
  • PIECEWISE:Npugraph_ex 被禁用。编译时仅应用基本的 FX 融合过程。ACLGraph 在运行时捕获并重放生成的可调用对象。
  • NONE:无编译或图捕获。模型以即时执行模式运行。
cudagraph_mode编译时运行时Npugraph_ex
FULL_AND_PIECEWISE分段编译路径混合:混合批次使用 PIECEWISE,均匀解码批次支持 FULL禁用
FULL / FULL_DECODE_ONLYNpugraph_ex FX 优化ACLGraph 捕获/重放启用
PIECEWISE仅融合过程ACLGraph 捕获/重放禁用
NONE即时执行禁用

环境变量

变量含义
OMP_PROC_BIND=false关闭 OpenMP 线程与 CPU 核的强绑定。避免线程被固定在少量核心上,有时对多进程推理更灵活。
OMP_NUM_THREADS=10设置 OpenMP 线程数为 10。影响 CPU 侧算子、预处理、调度等线程并行度。
PYTORCH_NPU_ALLOC_CONF=expandable_segments:TrueAscend NPU 内存分配器使用可扩展内存段,减少内存碎片,提高长时间运行稳定性。
LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD预加载 jemalloc 内存分配器,通常能降低内存碎片、提高多线程性能。
VLLM_USE_V1=1启用 vLLM 新版(V1)引擎路径。
VLLM_VERSION=0.18.0只是一个环境标记,便于脚本或日志识别版本,本身不一定被 vLLM 读取。
USE_MULTI_BLOCK_POOL=1启用多 Block Pool 内存管理(Ascend/vLLM 优化),提升 KV Cache 分配效率。
USE_MULTI_GROUPS_KV_CACHE=1启用多组 KV Cache 管理,适合大模型、多并发场景。
HCCL_BUFFSIZE=1024设置 HCCL(Ascend 集体通信库)缓冲区大小,影响多卡通信性能。
VLLM_ASCEND_ENABLE_FUSED_MC2=1启用 Ascend 的 MC2 融合优化,启用 dispatch_gmm_combine_decode 和 dispatch_ffn_combine 算子,减少预填充和解码阶段 MoE 的时间消耗。
VLLM_ASCEND_ENABLE_FLASHCOMM1=1FlashComm_v1 通过将传统的 allreduce 集合通信分解为 reduce-scatter 和 all-gather,显著提高了大批次场景下的性能。这种分解有助于减少 RMSNorm token 维度的计算,从而实现更高效的处理。在量化场景中,FlashComm_v1 还通过减少位级数据传输来降低通信开销,从而进一步最小化预填充阶段的端到端延迟。需要注意的是,将 allreduce 通信分解为 reduce-scatter 和 all-gather 操作仅在高并发场景下有益。
DYNAMIC_EPLB=“true”启用动态 Expert Load Balance(专家负载均衡),用于 MoE 模型。
VLLM_ENGINE_READY_TIMEOUT_S=1200引擎初始化超时时间 1200 秒(20 分钟)。大模型加载、编译较慢时避免启动失败。
VLLM_ASCEND_BALANCE_SCHEDULING=1可启用均衡调度。这有助于提高 v1 调度器的输出吞吐量并降低 TPOT。但在某些场景下 TTFT 可能会下降。此外,不建议在 PD 分离场景下启用此特性。
HCCL_OP_EXPANSION_MODE=“AIV”代表通信算子在 Vector Core 展开,一般用于推理场景。训练场景一般推荐保持默认值 “AI_CPU”,代表通信算子在 AI CPU 展开。

参考文档

https://docs.vllm.ai/projects/ascend/zh-cn/main/user_guide/configuration/env_vars.html

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐