动态分块流水线并行 (DeepSeek-V3.1)#

快速入门#

vLLM-Ascend 支持动态分块流水线并行 (CPP) 以优化流水线并行场景中的预填充性能。本指南演示在1台 Atlas 800T A3 服务器 (64G × 16) 上使用 DeepSeek-V3.1 进行部署。

配置详情请参阅特性指南。设计详情请参阅设计文档

环境准备#

模型权重#

  • DeepSeek-V3.1-w8a8 (量化版本):1个 Atlas 800T A3 (64G × 16) 节点

下载到共享目录,例如 /mnt/weight/

使用 Docker 运行#

export IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:v0.20.2rc1
export NAME=vllm-ascend

docker run --rm \
--name $NAME \
--net=host \
--shm-size=1g \
--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 /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /mnt/weight:/mnt/weight \
-it $IMAGE bash

部署#

启动脚本#

#!/bin/sh
unset https_proxy
unset http_proxy

export OMP_PROC_BIND=false
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"
export OMP_NUM_THREADS=1
export HCCL_BUFFSIZE=2048
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2:$LD_PRELOAD
export HCCL_OP_EXPANSION_MODE="AIV"
export VLLM_USE_V1=1
export TASK_QUEUE_ENABLE=1
export ASCEND_LAUNCH_BLOCKING=0
export VLLM_ALLOW_LONG_MAX_MODEL_LEN=1
export VLLM_ASCEND_ENABLE_FLASHCOMM1=1
export VLLM_ASCEND_ENABLE_FUSED_MC2=1
export VLLM_RPC_TIMEOUT=3600000
export VLLM_EXECUTE_MODEL_TIMEOUT_SECONDS=30000
export HCCL_EXEC_TIMEOUT=204
export HCCL_CONNECT_TIMEOUT=120

vllm serve /mnt/weight/DeepSeek-V3.1-w8a8 \
  --host 0.0.0.0 \
  --port 8003 \
  --served-model-name model \
  --data-parallel-size 1 \
  --tensor-parallel-size 8 \
  --pipeline-parallel-size 2 \
  --enable-expert-parallel \
  --max-num-seqs 32 \
  --max-model-len 131072 \
  --max-num-batched-tokens 32768 \
  --gpu-memory-utilization 0.9 \
  --enable-chunked-prefill \
  --no-enable-prefix-caching \
  --trust-remote-code \
  --quantization ascend \
  --additional-config '{
    "profiling_chunk_config":{"enabled":true, "smooth_factor":1.0, "min_chunk":4096}
  }'

关键参数#

  • --pipeline-parallel-size 2:启用流水线并行(必需)

  • --enable-chunked-prefill:启用分块预填充(必需)

  • --max-num-batched-tokens 32768:初始分块大小(推荐用于128K序列)

  • profiling_chunk_config.enabled:启用动态分块流水线并行

  • profiling_chunk_config.smooth_factor:平滑因子 (0 < x ≤ 1.0)。值越大越信任动态预测

  • profiling_chunk_config.min_chunk:动态计算的最小分块大小。应小于 max-num-batched-tokens

配置详情请参阅特性指南

在线校准#

为获得最佳性能,请在投产前使用真实数据进行在线校准:

您可以使用 aisbench 生成固定长度的随机数据集。详情请参阅使用 AISBench 进行性能评估

  1. 修改 <YOUR_AISBENCH_PATH>/benchmark/ais_bench/datasets/synthetic/synthetic_config.py

synthetic_config = {
    "Type": "string",
    "RequestCount": 5,
    "TrustRemoteCode": False,
    "StringConfig": {
        "Input": {
            "Method": "uniform",
            "Params": {"MinValue": 131072, "MaxValue": 131072}  # Your max sequence length, max-model-len
        },
        "Output": {
            "Method": "uniform",
            "Params": {"MinValue": 1, "MaxValue": 1}
        }
    },
}
  1. 运行在线校准:

ais_bench --models vllm_api_stream_chat --datasets synthetic_gen --mode perf --debug

配置在线校准数据长度以匹配您的 max-model-len。使用 batch_size=1 并确保数据不同,以避免启用前缀缓存时命中缓存。

精度评估#

详情请参阅使用 AISBench

数据集

精度

gsm8k

95.83

性能基准测试#

详情请参阅使用 AISBench 进行性能评估

为评估动态分块流水线并行在长序列 LLM 推理场景中的效果,我们使用 DeepSeek-V3.1-W8A8Qwen3-235B,在 Ascend Atlas A3 推理产品*64G (A3) 中部署 P 实例,配置和性能数据如下。

固定长度请求,并发数=1

  • DeepSeek-V3.1-W8A8:

    配置

    CPP
    (动态分块,
    分块大小=32k)

    PP
    (静态分块,
    分块大小=32k)

    输入长度 128k

    TTFT: 22.5s

    TTFT: 27.0s

  • Qwen3-235B:

    配置

    CPP
    (动态分块,
    分块大小=32k)

    PP
    (静态分块,
    分块大小=32k)

    输入长度 256k

    TTFT: 53.5s

    TTFT: 61.4s

变长请求,并发数=4

  • DeepSeek-V3.1-W8A8:

    配置

    4k~64k 输入, mean=32k, std=32k
    前缀命中率=99%

    CPP2TP8

    输入吞吐量: 22424 tps/卡

    DP2TP8

    输入吞吐量: 16150 tps/卡

    PCP2TP8

    输入吞吐量: 18197 tps/卡

    TP16

    输入吞吐量: 18875 tps/卡