细粒度张量并行(Fine-grained TP)¶
概述¶
细粒度张量并行(Fine-grained TP)扩展了标准张量并行,支持为不同模型组件配置独立的张量并行大小。它不再对所有层应用单一的全局 tensor_parallel_size,而是允许用户通过 finegrained_tp_config 参数为关键模块(例如 embedding、LM head、注意力输出投影(o_proj)和 MLP 块)配置不同的 TP 大小。
该能力支持在单个模型内使用异构并行策略,从而对跨设备的权重分布、内存布局和通信模式提供更精细的控制。该功能兼容标准稠密 Transformer 架构,并可无缝集成到 vLLM 的服务流水线中。
细粒度 TP 的优势¶
细粒度张量并行通过有针对性的权重分片带来两个主要性能优势:
-
降低单设备内存占用:
细粒度 TP 将大型权重矩阵(例如 LM head、o_proj)分片到多个设备上,降低峰值内存使用,并支持更大的批处理或在内存受限硬件上部署——无需量化。 -
加速 GEMM 中的内存访问:
在解码密集型工作负载中,GEMM 性能通常受内存带宽限制。权重分片减少了单设备需要读取的权重数据量,降低 DRAM 流量并提高带宽效率——尤其适用于 LM head 和 o_proj 等对延迟敏感的层。
综合来看,这些效果使使用者能够更好地平衡内存、通信和计算——尤其是在高并发服务场景中——同时保持与标准稠密 Transformer 模型的兼容性。
支持场景¶
模型¶
细粒度 TP 是模型无关的,支持所有标准稠密 Transformer 架构,包括 Llama、Qwen、DeepSeek(base/dense 变体)等。
组件与执行模式支持¶
| TP 配置 | Eager | Graph | Hybrid | Prefill | Decode |
|---|---|---|---|---|---|
| embedding | ✅ | ✅ | ✅ | ✅ | ✅ |
| o_proj | ❌ | ✅ | ❌ | ❌ | ✅ |
| mlp | ✅ | ✅ | ✅ | ✅ | ✅ |
| LM head | ✅ | ✅ | ✅ | ✅ | ✅ |
⚠️ 注意:
o_projTP 仅在 Decode 阶段的 Graph 模式下支持,因为 eager 模式中的 dummy_run 不会触发 o_proj。此外,它要求tensor_parallel_size == 1(在配置加载时强制检查);见下文 标准张量并行要求。mlpTP 支持稠密模型,或 MoE 模型中的稠密层。例如,DeepSeek-R1 的前三个稠密层。
配置限制¶
任何组件的细粒度 TP 大小必须:
- ≤ 数据并行(DP)大小,并且
- 能整除 DP 大小(即
dp_size % tp_size == 0),以确保有效的设备分配和通信分组。
⚠️ 违反这些约束将导致运行时错误或未定义行为。
标准张量并行要求¶
细粒度 TP 将配置的层沿数据并行(DP)维度进行分片,而不是标准张量并行(TP)维度。因此,它与标准 tensor_parallel_size 的交互因组件而异:
| 组件 | 在 tensor_parallel_size > 1 时的行为 |
|---|---|
o_proj |
不支持。 DSA 注意力输出使用 n_local_groups = n_groups // tp_size(标准 TP)进行重塑,而 wo_a/wo_b 权重由 OTP 组(DP 维度)分片。两个轴不再对齐,因此会抛出配置时错误,要求 tensor_parallel_size == 1。 |
embedding / LM head / mlp |
支持,但仅在 tensor_parallel_size == 1 下有效。 这三个组件都沿细粒度(DP 域)组进行分片,该进程组在固定 tp_idx 上沿 DP 轴构建——与标准 TP 轴正交。当 tensor_parallel_size > 1 时,标准 TP 分片和细粒度分片作用于 rank 网格的不同轴,无法再组合:细粒度组的所有 rank 共享同一个标准 TP 权重分片,因此细粒度 TP 无法提供额外分片。换言之,这些组件是为全 DP(tensor_parallel_size == 1)解码场景设计的;在 tensor_parallel_size > 1 下,标准 TP 维度接管,细粒度配置不生效。 |
如何使用细粒度 TP¶
配置格式¶
细粒度 TP 通过 --additional-config 内的 finegrained_tp_config 字段控制。
--additional-config '{
"finegrained_tp_config": {
"embedding_tensor_parallel_size": 8,
"lmhead_tensor_parallel_size": 8,
"oproj_tensor_parallel_size": 8,
"mlp_tensor_parallel_size": 8
}
}'
使用示例¶
vllm serve deepseek-ai/DeepSeek-R1 \
--data-parallel-size 16 \
--tensor-parallel-size 1 \
--enable-expert-parallel \
--additional-config '{
"finegrained_tp_config": {
"embedding_tensor_parallel_size": 8,
"lmhead_tensor_parallel_size": 8,
"mlp_tensor_parallel_size": 8
}
}'
实验结果¶
为评估细粒度 TP 在大规模服务场景中的有效性,我们使用模型 DeepSeek-R1-W8A8,在 32 张 Ascend Atlas A2 推理产品*64GB(A2)的环境中部署 PD 分离的解码实例,并行配置为 DP32+EP32,细粒度 TP 大小为 8;性能数据如下。
| 模块 | 内存节省 | TPOT 影响(batch=24) |
|---|---|---|
| o_proj TP = 8 | 5.8 GB | +1.5 ms(退化) |
| LM head TP = 8 | 1.51 GB | −1.2 ms(提升) |
| 模块 | 内存节省 | TPOT 影响(batch=24) |
|---|---|---|
| FFN TP = 8 | 0.9 GB | −1.0 ms(改善) |
| Embedding TP = 8 | 1.51 GB | −1.0 ms(改善) |
| 总计 | 9.72 GB | — |
- 我们在单卡高内存容量方面取得了显著收益,同时也获得了 TPOT 收益。
✅ 部署建议¶
细粒度 TP 在 PD 分离的 decode 实例 中最有效,其中模型通常以 all-DP 模式部署。在此配置下,对权重较大的层进行分片可减少冗余存储和内存压力。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend