动态分块流水线并行#
备注
设计细节和数学模型请参见设计文档。部署教程请参见动态分块流水线并行教程。
概述#
动态分块流水线并行(CPP)是一种基于性能分析的动态分块策略,用于优化流水线并行(PP)场景中长序列的预填充性能。
使用场景#
变长序列服务:PP对短序列不会引入性能退化,并通过长序列的动态分块获得收益。
超长序列推理:对于超出单机内存容量的序列(如1M tokens),动态分块可显著减少流水线空闲时间。
支持场景#
目前CPP主要专注于预填充阶段的优化,建议在PD分离场景中使用。支持的功能如下:
Eager |
Graph |
前缀 |
分块 |
|
|---|---|---|---|---|
CPP |
✅ |
✅ |
✅ |
✅ |
启用方法#
在线服务#
vllm serve <model_path> \
--pipeline-parallel-size 2 \
--enable-chunked-prefill \
--additional-config '{"profiling_chunk_config": {"enabled": true}}'
离线推理#
from vllm import LLM
llm = LLM(
model="<model_path>",
pipeline_parallel_size=2,
additional_config={"profiling_chunk_config": {"enabled": True}},
)
配置参数#
参数 |
类型 |
默认值 |
描述 |
|---|---|---|---|
|
bool |
False |
启用/禁用动态分块流水线并行 |
|
float |
1.0 |
平滑因子(0 < x ≤ 1.0),值越大越信任动态预测 |
|
int |
4096 |
动态计算的最小分块大小 |
|
bool |
True |
启用/禁用在线校准 |
参数调优#
smooth_factor:控制对动态预测的信任程度1.0:严格遵循模型预测0.6~0.85:平衡动态调整与调度开销0.0:无动态调整(退化为固定分块)
min_chunk:通常无需调整,应小于max-num-batched-tokens
推荐设置#
max-num-batched-tokens#
值得注意的是,CPP的TTFT对max-num-batched-tokens(视为动态求解的初始分块大小)非常敏感。 因为如果设置过大,会引入显著的计算空洞;如果设置过小,则会导致算子效率下降。为给动态调整留出足够空间,建议处理的序列越长,max-num-batched-tokens设置越大。推荐值:
序列长度 |
|
|---|---|
64k |
20480 |
128k |
32768 |
在线校准#
为获得最佳性能,建议在生产前使用真实数据进行在线校准:
可使用aisbench生成固定长度的随机数据集,详情请参见使用AISBench进行性能评估。
修改
<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}
}
},
}
运行在线校准:
ais_bench --models vllm_api_stream_chat --datasets synthetic_gen --mode perf --debug
配置在线校准数据长度以匹配max-model-len。使用batch_size=1,并确保数据不同以避免启用前缀缓存时的缓存命中。
性能#
详情请参见使用AISBench进行性能评估。
为评估动态分块流水线并行在长序列LLM推理场景中的效果,我们使用DeepSeek-V3.1-W8A8和Qwen3-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输入,均值=32k,标准差=32k
前缀命中率=99%CPP2TP8
输入吞吐量:22424 tps/卡
DP2TP8
输入吞吐量:16150 tps/卡
PCP2TP8
输入吞吐量:18197 tps/卡
TP16
输入吞吐量:18875 tps/卡
约束条件#
需要流水线并行:
--pipeline-parallel-size > 1需要分块预填充:
--enable-chunked-prefill与均衡调度不兼容:无法启用
VLLM_ASCEND_BALANCE_SCHEDULING启动开销:性能分析增加约64次前向传播(数十秒)