面向 NVIDIA B300 与华为 Ascend 950 Supernode,回答三个问题:几个 P 对几个 D?P/D 各用多少 GPU/NPU?内部并行怎么配?
本文不仅给结论,更完整展示每个关键数字是怎么算出来的——读者可以跟着推导链自己验证。
先说结论,再讲为什么
PD 分离部署的核心逻辑只有三层:
| 层 | 问题 | 一句话回答 |
|---|---|---|
| 1 | 几个 P 对几个 D | 不是先拍一个固定比例,而是先定义最小部署单元 P-unit / D-unit,再由业务流量(请求到达率、上下文长度、输出长度、cache 命中率)推导需要几个 |
| 2 | 每个 unit 多大 | 取决于单会话速度 SLA;B300 P-unit = 64 GPU,D-unit = 128/192/384 GPU |
| 3 | TP/EP/PP/DP 怎么配 | EP 是主轴,TP 尽量小,PP 默认 1,DP 就是副本数 |
NVIDIA B300 基准配置(λ=5.86 req/s, O=512, h=0.56):
| 上下文 | 30 tok/s | 100 tok/s | 400 tok/s |
|---|---|---|---|
| 4K–256K | P1:D1 = 192 GPU | P1:D1 = 256 GPU | P1:D1 = 448 GPU |
| 1M | P6:D1 = 512 GPU | P6:D1 = 576 GPU | P6:D1 = 768 GPU |
华为 950 Supernode(纯 950DT 保守估算;推荐用 950PR 做 P):
| 上下文 | 30 tok/s | 100/400 tok/s |
|---|---|---|
| 4K–128K | P1:D1 = 320 NPU | P1:D1 = 512 NPU |
| 256K | P3:D1 = 576 NPU | P3:D1 = 768 NPU |
| 1M | P13:D1 ≈ 2048 NPU (容量下界) | P16:D1 ≈ 2432 NPU (生产建议) |
接下来,我们从头算起。
一、V4-Pro 的结构参数:一切计算的起点
在开始算之前,需要先钉死 V4-Pro 的关键参数。这些数字是后面所有推导的地基。
V4-Pro 是一个 1.6T 总参数、49B 激活参数的 MoE(Mixture of Experts)模型。MoE 的核心思想是:模型很大,但每次推理只用其中一小部分。对 V4-Pro 来说:
- 总参数 1.6T,但每 token 只激活 49B——激活率约 3%,这就是 MoE 的效率来源
- 每层有 1 个 shared expert + 384 个 routed experts
- 每 token 激活 6 个 routed experts(top-6 路由)
- Expert intermediate dimension = 3072
- MTP depth = 1(Multi-Token Prediction,预测下一个 token 的同时尝试多预测一个,用于加速 decode)
- 支持 1M context
这几个数字为什么重要?因为它们直接决定了:
- 每 token 的计算量(FLOPs)→ 决定需要多少算力
- 每 token 的 KV cache 大小 → 决定需要多少显存
- Expert 的分片方式 → 决定 EP(Expert Parallelism)怎么配
二、先定义 workload,再谈配置
2.1 一个常见的误区
很多人拿到一个模型,第一反应是"这个模型需要多少张卡"。但正确的问题不是"模型需要多少卡",而是"我的业务需要多少卡"。
同样一个 V4-Pro 模型:
- 如果你的业务是 4K 短对话、30 tok/s 标准速度 → 可能 192 张 B300 就够
- 如果你的业务是 1M 长文档分析、100 tok/s → 至少 576 张 B300
- 差距是 3 倍,全是 workload 差的
所以我们必须先定义 workload。
2.2 四个关键业务参数
决定部署配置的业务参数只有四个:
- λ(请求到达率):每秒多少新请求
- O(平均输出长度):每个会话平均输出多少 token
- L(平均输入上下文长度):每个会话的 prompt 有多长
- h(prefix cache 命中率):P 层有多少前缀可以跳过计算
有了这四个参数,P 和 D 的负载就完全确定了:
D 端总输出吞吐:Q_D = λ × O(每秒要输出多少 token)
P 端总输入吞吐:Q_P = λ × L × (1 − h)(每秒要处理多少新输入 token,扣掉 cache 命中的部分)
注意 P 端有个 (1−h) 因子——如果 cache 命中了,P 端就不需要重新计算那部分 prompt。
2.3 我们用什么基准来算
本文通篇使用这个基准:
O = 512,h = 0.56,λ = 5.86 req/s
λ = 5.86 不是拍脑袋的数字。它等价于一个具体场景:
想象你有 100 个用户同时在用模型,每个用户的生成速度是 30 tok/s,平均每个会话输出 512 token。 一个会话从开始到结束需要 512 / 30 ≈ 17 秒。 在这 17 秒内,100 个用户轮流产生新请求: λ = 100 × 30 / 512 = 5.86 req/s
同一 λ 下,不同单会话速度对应的活跃会话数完全不同:
| 单会话速度 | TPOT(每 token 延迟) | 活跃 decode 会话数 | 怎么算的 |
|---|---|---|---|
| 30 tok/s | 33.3 ms | 100 | 5.86 × 512 / 30 = 100 |
| 100 tok/s | 10 ms | 30 | 5.86 × 512 / 100 = 30 |
| 400 tok/s | 2.5 ms | 7.5 | 5.86 × 512 / 400 = 7.5 |
这个表揭示了一个反直觉的事实:同样的业务流量(同样的 req/s),单会话速度越快,同时活跃的 decode 会话越少。 400 tok/s 时只有 7.5 个活跃会话。
活跃会话少听起来是好事,但对 MoE 模型来说是个大麻烦——我们后面会展开讲。
三、每 token 需要多少计算量(FLOPs)
现在来算 V4-Pro 每处理一个 token 到底需要多少计算。
3.1 基础 FLOPs:为什么是 0.098 TFLOP/token
V4-Pro 每 token 激活 49B 参数。对于 transformer 的线性层,一次前向传播的计算量约等于 2 × 参数量(一次矩阵乘法的 FLOPs 约为 2mn,这里 n 是输入维度、m 是输出维度,权重矩阵有 mn 个参数)。
所以:
基础 FLOPs = 2 × 49B = 98B FLOP = 0.098 TFLOP / token
这是不管 prefill 还是 decode 都要付的"基础计算税"。
3.2 Attention 的额外开销随上下文增长
但上面只算了 feed-forward / MoE 部分的计算量。Attention 部分的计算量跟上下文长度 L 有关:
- Prefill:attention 要处理从位置 0 到 L-1 的所有 KV,计算量约为 attention 参数 × L × 平均位置(从 0 到 L 累积,平均约 L/2)
- Decode:每个新 token 的 attention 要读取所有已有位置(长度 L)的 KV,计算量约为 attention 参数 × L
所以 attention 部分的 FLOPs 可以近似为:
F_decode(L) = 0.098 + 0.202 × L_M TFLOP/output token
F_prefill(L) = 0.098 + 0.101 × L_M TFLOP/input token
其中 L_M = L / 10⁶(以百万 token 为单位)。
Decode 的 attention 项(0.202)是 prefill 的 2 倍,因为 prefill 从 0 累积到 L,平均只需要处理一半的长度;而 decode 每一步都要扫全部 L 个位置。
让我们代入几个具体数字验证一下直觉:
| 上下文 L | L_M | Decode FLOPs/token | Prefill FLOPs/token | 直觉检查 |
|---|---|---|---|---|
| 4K | 0.004 | 0.099 | 0.099 | 几乎纯基础计算,attention 可忽略 |
| 128K | 0.128 | 0.124 | 0.111 | attention 开始有感觉了 |
| 1M | 1.0 | 0.300 | 0.199 | 1M decode 的 attention 计算量已经接近基础计算的 3 倍 |
这意味着:1M 场景下,decode 每 token 的计算量是 4K 场景的 3 倍;prefill 每 token 的计算量是 4K 的 2 倍。 上下文长度对计算量的影响不容忽视。
四、KV cache:每个会话占多少显存
MoE 模型的 KV cache 跟 dense 模型不同。V4-Pro 使用了异构 KV 结构:CSA/HCA compressed KV、SWA(Sliding Window Attention)KV、state cache 分开管理。我们主要关注 compressed CSA/HCA 部分:
K(L) ≈ 5.3 × L_M GB/sequence
具体数字:
| 上下文 | KV/sequence | 怎么算的 |
|---|---|---|
| 4K | 0.022 GB | 5.3 × 0.004 |
| 32K | 0.174 GB | 5.3 × 0.032 |
| 128K | 0.695 GB | 5.3 × 0.128 |
| 256K | 1.389 GB | 5.3 × 0.256 |
| 1M | 5.300 GB | 5.3 × 1.0 |
一个重要细节:SWA KV 约为 compressed CSA/HCA KV 的 8 倍。也就是说,如果系统把 SWA 也全量缓存,1M 场景每个会话的 KV 就是 5.3 × 8 = 42.4 GB——一张 B300 GPU 的显存都放不了几个会话。所以 C 层(Cache 层)不能默认全量缓存 SWA,必须做 selective caching。
五、P-unit 和 D-unit:为什么先定义单元,再算比例
5.1 为什么不直接说"P:D = 1:1"
很多文章会直接给一个 P:D 比例,比如"P:D = 1:2"。但这个比例没有意义,除非你知道"P 是多大、D 是多大"。
打个比方:说"厨房和人一样多"没有意义,除非你知道这个厨房能出多少菜、这个人能吃多少。一个能同时做 20 道菜的厨房配 20 个吃得不多的人,和一个只能做 5 道菜的厨房配 5 个大胃王,P:D 都是 1:1,但含义完全不同。
所以正确做法是:
- 先定义 P-unit(一个最小可独立运行 prefill 的部署单元)和 D-unit(一个最小可独立运行 decode 的部署单元)
- 算出每个 unit 的 goodput(实际有效吞吐)
- 然后根据业务流量推算需要几个 P-unit 和几个 D-unit
- P:D 比例是算出来的,不是拍出来的
5.2 P-unit / D-unit 的 goodput 怎么算
Goodput ≠ 裸 FLOPS 峰值。 实际有效吞吐需要考虑:
- 硬件峰值算力 C_node
- 模型在特定 workload 下的硬件利用率 η
- SLA 约束(TTFT 对 P 端、TPOT 对 D 端)
- 通信开销(EP 的 all-to-all 通信)
我们用这个公式:
G_P = reserve × C_node × η_P × 1000 / F_P(L) tok/s
G_D = reserve × C_node × η_D × 1000 / F_D(L) tok/s
其中 reserve 是 SLA 保留余量(P 端留 30% 给突发,D 端留 40% 给 TPOT p90),η 是模型在该硬件上的 FLOPS 利用率。
两个平台的参数:
| 硬件 | 单节点算力 C_node | P 端利用率 η_P | D 端利用率 η_D |
|---|---|---|---|
| B300 8-GPU | 36 PFLOPS dense FP8 | 0.45 | 0.14 |
| 950DT 8-NPU | 8 PFLOPS FP8 | 0.45 | 0.12 |
为什么 D 端利用率比 P 端低这么多? P 端 prefill 是 compute-bound(大批量处理整个 prompt),硬件利用率高;D 端 decode 是 memory-bound(每步只生成 1 个 token,大量时间花在读取权重和 KV cache 上),硬件利用率天然低。D 端的 0.14/0.12 是 MoE decode 的典型值,不是异常。
这些效率参数来自 DeepSeek V3/R1 在 H800 上的生产数据校准(EP32 prefill + EP144 decode),不是 V4-Pro 实测——这一点后面会反复提醒。
5.3 从 goodput 到 P-unit / D-unit 尺寸
P-unit 和 D-unit 的尺寸不是由平均流量决定的,而是由单会话速度 SLA 和 TPOT(Time Per Output Token)约束决定的。
D-unit 的逻辑最直观:
你的 SLA 是 100 tok/s,等价于 TPOT ≤ 10ms。在 MoE 模型中,每一步 decode 都需要做一次 expert all-to-all 通信。EP 越大(每个 GPU 负责的 expert 越少),每步计算越快,TPOT 越低。
所以 D-unit 尺寸主要由"我要达到多少 tok/s"决定:
| 目标速度 | TPOT 要求 | B300 D-unit | 950DT D-unit | 为什么是这个大小 |
|---|---|---|---|---|
| 30 tok/s | 33.3 ms | 128 GPU (EP128) | 192 NPU (EP192) | 标准档,TPOT 余量充裕 |
| 100 tok/s | 10 ms | 192 GPU (EP192) | 384 NPU (EP384) | 更大 EP,更低 TPOT |
| 400 tok/s | 2.5 ms | 384 GPU (EP384) | 384 NPU+ (EP384+) | 必须每 GPU ≤ 1 expert |
EP 跟 GPU 数的关系是什么? V4-Pro 有 384 个 routed experts。EP128 意味着 384 个 experts 分到 128 个 GPU 上,每个 GPU 放 384/128 = 3 个 expert。同理:
| EP | experts/GPU | 每个GPU要放多少权重 | 放得下吗? |
|---|---|---|---|
| EP64 | 6 | 6 个 expert 的完整权重 | 需要较大 HBM |
| EP128 | 3 | 3 个 expert 的权重 | 合理 |
| EP192 | 2 | 2 个 expert 的权重 | 宽裕 |
| EP384 | 1 | 1 个 expert 的权重 | 很宽裕,但通信开销大 |
P-unit 尺寸的逻辑类似,但 prefill 是 compute-bound,不需要极低 TPOT,所以 P-unit 可以相对小一些。B300 用 EP64(64 GPU,每个 GPU 6 个 expert),950DT 用 EP128(128 NPU,每个 NPU 3 个 expert)。
六、完整推导:从 workload 到 P:D 比例
6.1 通用公式
有了 P-unit 和 D-unit 的 goodput,N_P 和 N_D 的计算就水到渠成:
N_P = ⌈Q_P / G_{P,unit}(L)⌉ = ⌈λ × L × (1−h) / G_{P,unit}(L)⌉
N_D = max(⌈Q_D / G_{D,unit}(L)⌉, N_D^SLA)
其中 N_D^SLA 是满足 TPOT SLA 所需的最少 D-unit 数。
注意 N_D 取 max:即使流量很小,D 端也至少需要 1 个 D-unit 才能保证 TPOT。
6.2 实战推导:B300,128K,100 tok/s
让我们一步步推导一个具体场景:B300 平台,128K 上下文,100 tok/s,基准业务流量。
Step 1:P 端需要处理多少 token/s?
Q_P = λ × L × (1−h) = 5.86 × 128000 × (1−0.56) = 5.86 × 128000 × 0.44
先算 5.86 × 0.44 = 2.578
再算 2.578 × 128000 = 330,000 token/s ≈ 330K token/s
Step 2:一个 P-unit(64 GPU)能处理多少?
F_prefill(128K) = 0.098 + 0.101 × 0.128 = 0.098 + 0.013 = 0.111 TFLOP/token
一个 B300 节点(8 GPU)的 raw 吞吐:
S_P = 36 PFLOPS × 0.45 × 1000 / 0.111 = 145,946 token/s ≈ 146K token/s
8 节点 = 64 GPU 的 P-unit:
G_{P,unit} = 0.7 × 146K × 8 = 817K token/s
Step 3:需要几个 P-unit?
N_P = ⌈330K / 817K⌉ = ⌈0.40⌉ = 1
Step 4:D 端需要处理多少 token/s?
Q_D = λ × O = 5.86 × 512 = 3,000 token/s(约 3000 tok/s)
Step 5:D-unit 至少需要几个?
100 tok/s 对应 D100-unit = 192 GPU (EP192),每个 D-unit 的 goodput:
F_decode(128K) = 0.098 + 0.202 × 0.128 = 0.098 + 0.026 = 0.124 TFLOP/token
单节点 raw decode 吞吐:
S_D = 36 PFLOPS × 0.14 × 1000 / 0.124 = 40,645 token/s ≈ 40.6K token/s
24 节点 = 192 GPU 的 D-unit:
G_{D,unit} = 0.6 × 40.6K × 24 = 585K token/s
Step 6:
N_D = max(⌈3000 / 585K⌉, 1) = max(⌈0.005⌉, 1) = 1
结果:P1:D1 = 64 + 192 = 256 GPU ✓
你可能注意到,D-unit 的 goodput(585K tok/s)远超业务需求(3K tok/s)。这就是为什么 P:D = 1:1 不是因为 P 和 D 吞吐恰好相等,而是因为 D-unit 的最小可部署粒度已经远超容量下界——你不可能用少于 192 GPU 来做一个满足 100 tok/s SLA 的 D-unit。
6.3 为什么 1M 需要 P6:D1——完整推导
1M 场景是 P 层的噩梦。让我们算清楚为什么。
Step 1:P 端 token/s
Q_P = 5.86 × 1,000,000 × 0.44 = 2,578,000 token/s ≈ 2.58M token/s
对比 128K 的 330K token/s——1M 的 P 端负载是 128K 的 7.8 倍。
Step 2:P-unit goodput 在 1M 下是多少?
F_prefill(1M) = 0.098 + 0.101 × 1.0 = 0.199 TFLOP/token
单节点 raw prefill 吞吐:
S_P = 36 × 0.45 × 1000 / 0.199 = 81,407 token/s ≈ 81.4K token/s
P-unit (8 节点 = 64 GPU) goodput:
G_{P,unit} = 0.7 × 81.4K × 8 = 455.8K token/s
Step 3:
N_P = ⌈2578K / 455.8K⌉ = ⌈5.66⌉ = 6
6 个 P-unit = 384 GPU。
所以 P6:D1 = 384P + 192D = 576 GPU(100 tok/s 场景)。
这 6 个 P-unit 可以独立运行,也可以合并成一个 384-GPU 的 P-supergroup,用 CP8(Context Parallelism 8 路并行)把一个 1M prefill 拆到 8 组 GPU 上并行计算,降低 TTFT。
为什么不直接用更大的 P-unit? 因为 EP 过大会增加 all-to-all 通信开销。P6 独立运行时每个 P-unit 仍然保持 EP64(每个 GPU 6 个 expert),通信开销可控。合并为 CP8 supergroup 时,每组内部仍是 EP64,跨组只传 KV 而不是 expert weights。
6.4 华为 950 Supernode:为什么 1M 要到 P13:D1 甚至 P16:D1
同样的推导逻辑,但 950DT 的单节点算力更低(8 PFLOPS vs B300 的 36 PFLOPS)。
P-unit goodput(128 NPU):
F_prefill(1M) = 0.199 TFLOP/token
单节点 raw: 8 × 0.45 × 1000 / 0.199 = 18,091 token/s ≈ 18.1K token/s
P-unit (16 节点 = 128 NPU) goodput: 0.7 × 18.1K × 16 = 202.5K token/s
N_P = ⌈2578K / 202.5K⌉ = ⌈12.7⌉ = 13
P13:D1 = 13 × 128P + 192D = 1664 + 192 = 1856 NPU(取整到 2048 NPU 考虑余量)。
但 P13 不利于规整的 CP 分组——13 不能被整除为合理的 CP × EP 组合。生产建议 P16:D1 = 2048P + 384D = 2432 NPU,用 EP128 × CP16 或 EP256 × CP8。
这就是为什么我们反复说:华为 1M 场景不应该用纯 950DT,应该用 950PR 做 P。 950PR 专门面向 prefill 设计,如果它的 prefill goodput 是 950DT 的 2 倍(合理预期),P 层 NPU 数就能砍掉一半。
七、400 tok/s:为什么这个速度特别难
现在回到前面那张表里 400 tok/s 时只有 7.5 个活跃会话的问题。
7.1 Expert microbatch 的灾难
V4-Pro 每 token 激活 6 个 routed experts。如果有 384 个 routed experts,那每个 expert 被激活的概率是 6/384 = 1/64。
假设当前有 B 个并发 token 在做 forward pass,那单个 expert 收到的 microbatch size 是:
B_expert = B × 6 / 384 = B / 64
代入不同速度下的活跃会话数:
| 速度 | active sessions | expert microbatch | 问题 |
|---|---|---|---|
| 30 tok/s | 100 | 100/64 ≈ 1.56 | 勉强够做 GEMM |
| 100 tok/s | 30 | 30/64 ≈ 0.47 | 不够 1 个,利用率差 |
| 400 tok/s | 7.5 | 7.5/64 ≈ 0.12 | 远不够 1 个 |
expert microbatch = 0.12 意味着:在一个 forward pass 中,平均每个 expert 只收到 0.12 个 token——甚至不到 1 个。GPU 的 GEMM 单元完全吃不饱。
这就是 MoE decode 的根本矛盾:你想要更快的单会话速度,就需要更少的并发流来满足 TPOT;但更少的并发流意味着 MoE expert 的 batch 更小,GEMM 利用率更差。
7.2 怎么缓解
400 tok/s 不是完全不可能,但需要多种技术组合:
- EP384 或 EP512:每个 GPU 只负责 1 个 expert(甚至不到 1 个),减少 all-to-all 通信量和路由跳数
- MTP / Speculative Decoding:每步不只预测 1 个 token,而是用 draft model 猜 2-4 个 token,让 expert microbatch × 2-4
- Hot expert replica:对高频 expert 做多副本,降低单 expert 的负载不均衡
- D-unit 独立 speed tier:400 tok/s 用户独享 D-unit,不和 30 tok/s 用户混跑
- 最关键的一点:V4-Pro 实测 TPOT p90
CloudMatrix-Infer 在 DeepSeek-R1 上的实测数据已经表明:TPOT SLO 越严格,batch size 越小,decode throughput 越低。这是 fundamental trade-off,不是调参能解决的。
建议:30 tok/s 作为标准 SLA,100 tok/s 作为高端 SLA,400 tok/s 只能作为 premium/experimental SLA——在没有 V4-Pro 实测数据之前,不要向客户承诺 400 tok/s。
八、EP/TP/PP/DP 的具体取舍
8.1 EP 是主轴
整个并行策略的核心是 EP(Expert Parallelism)。原因很简单:V4-Pro 有 384 个 routed experts,天然适合按 expert 切分到多个 GPU 上。
EP 的 trade-off 很清晰:
- EP 越大 → 每 GPU 负责 expert 越少 → 每 step 计算越快 → TPOT 越低
- EP 越大 → all-to-all 通信量越大 → 通信延迟越高
在 decode 场景中,计算很快(memory-bound),通信延迟占比大。所以 EP 不是越大越好,而是要找到 TPOT 的 sweet spot:
| 阶段 | 推荐 EP | 为什么 |
|---|---|---|
| P / prefill | EP64/128 | prefill batch 大,compute-bound,通信占比低 |
| D / 30 tok/s | EP128/192 | 标准档,TPOT 33ms 余量充裕 |
| D / 100 tok/s | EP192/384 | TPOT 10ms,需要更大 EP |
| D / 400 tok/s | EP384/512 | TPOT 2.5ms,必须 1 expert/GPU 或更少 |
8.2 TP 尽量小
TP(Tensor Parallelism)把一个 expert 的权重切到多个 GPU 上。对 MoE 模型来说,TP 会带来两个问题:
- 增加通信:每步 forward 都需要 all-reduce
- KV duplication:如果 attention 层也做 TP,KV cache 会在多个 GPU 上重复存储
所以推荐 TP1 起步。只有在 HBM 放不下、或者 1M 场景 KV cache 太大时,才考虑 TP2 + DCP(Decode Context Parallelism)来降低 KV duplication。
8.3 PP 默认 1
PP(Pipeline Parallelism)把模型的不同层放到不同 GPU 上。推理尤其是 decode 默认 PP1——因为 PP 会引入 pipeline bubble(气泡),直接增加 per-token 延迟。
只在一种场景考虑 PP:单 execution group 的 HBM 放不下整个模型。但 V4-Pro 的 MoE 部分通过 EP 已经分散了 expert 权重,dense/shared 部分相对小,PP 的需求不大。
8.4 DP 就是 P/D 副本数
PD 分离中 DP 的最实际含义:
DP_P = N_P(几个 P-unit) DP_D = N_D(几个 D-unit)
扩流量时优先加 DP(加 unit 数量),不要随意改变单个 unit 的 TP/EP/PP。 单 unit 的并行配置是经过 SLA 验证的,改了可能打破 TPOT 约束。
8.5 CP/DCP:1M 场景的关键
CP(Context Parallelism,用于 prefill)和 DCP(Decode Context Parallelism)虽然在"TP/EP/PP/DP"这个标准四件套里没有列出,但 128K+ 尤其是 1M 必须加入设计:
- P 端 CP:把一个长 prefill 的 attention 计算拆到多组 GPU 上并行,降低 TTFT
- D 端 DCP:把 KV cache shard 到多个 GPU 上,降低单 GPU 的 KV 存储压力
1M 场景下一个会话的 KV cache 约 5.3 GB。如果 D 端一个 GPU 同时服务 20 个会话,光是 KV 就是 106 GB——B300 单 GPU 262.5 GB HBM 的一大半。DCP 可以把 KV 分散到多个 GPU,但代价是每次 attention 都需要跨 GPU 读取 KV,增加通信。
九、B300 全场景配置速查
综合以上分析,B300 的全场景配置:
P-unit / D-unit 定义
| Unit | GPU 数 | 内部并行 |
|---|---|---|
| P-unit | 64 | TP1 / EP64 / PP1 / CP1;128K+ 可合并多个 P-unit 做 CP |
| D30-unit | 128 | TP1 / EP128 / PP1 |
| D100-unit | 192 | TP1 / EP192 / PP1 |
| D400-unit | 384 | TP1 / EP384 / PP1 + MTP/speculative |
全场景 P:D 配置
基准:λ = 5.86, O = 512, h = 0.56
| 上下文 | 速度 | P:D | P GPU | D GPU | 总 GPU |
|---|---|---|---|---|---|
| 4K | 30 | P1:D1 | 64 | 128 | 192 |
| 4K | 100 | P1:D1 | 64 | 192 | 256 |
| 4K | 400 | P1:D1 | 64 | 384 | 448 |
| 32K | 30 | P1:D1 | 64 | 128 | 192 |
| 32K | 100 | P1:D1 | 64 | 192 | 256 |
| 32K | 400 | P1:D1 | 64 | 384 | 448 |
| 128K | 30 | P1:D1 | 64 | 128 | 192 |
| 128K | 100 | P1:D1 | 64 | 192 | 256 |
| 128K | 400 | P1:D1 | 64 | 384 | 448 |
| 256K | 30 | P1:D1 | 64 | 128 | 192 |
| 256K | 100 | P1:D1 | 64 | 192 | 256 |
| 256K | 400 | P1:D1 | 64 | 384 | 448 |
| 1M | 30 | P6:D1 | 384 | 128 | 512 |
| 1M | 100 | P6:D1 | 384 | 192 | 576 |
| 1M | 400 | P6:D1 | 384 | 384 | 768 |
解读:
- 4K–256K 的 P1:D1:不是因为 P/D 吞吐恰好 1:1,而是因为最小部署单元已经超过了容量下界。P-unit 64 GPU 和 D-unit 128/192/384 GPU 都远超实际流量需要。
- 1M 的 P6:D1:P 层的 1M prefill 是绝对瓶颈。TTFT 随上下文长度线性增长,1M 的 prefill 计算量是 4K 的 200 倍。384 GPU 的 P-supergroup 用 CP8 才能在一个合理时间内完成 1M prefill。
十、华为 950 Supernode 全场景配置
10.1 推荐架构
华为方案不建议纯 950DT 平铺,正确架构是:
P 层:950PR(面向 prefill 优化)
D 层:950DT(面向 decode 优化)
C 层:Atlas 950 SuperPoD / UnifiedBus / Kunpeng / EMS / NVMe cache
下面的数字先按纯 950DT 做保守估算。950PR 的实测 prefill goodput 出来后,P 层数量预期会明显降低。
10.2 全场景 P:D 配置(纯 950DT)
基准:λ = 5.86, O = 512, h = 0.56
| 上下文 | 速度 | P:D | P NPU | D NPU | 总 NPU |
|---|---|---|---|---|---|
| 4K–128K | 30 | P1:D1 | 128 | 192 | 320 |
| 4K–128K | 100/400 | P1:D1 | 128 | 384 | 512 |
| 256K | 30 | P3:D1 | 384 | 192 | 576 |
| 256K | 100/400 | P3:D1 | 384 | 384 | 768 |
| 1M | 30 | P13:D1 | 1664 | 192 | 1856→2048 |
| 1M | 100/400 | P13:D1 | 1664 | 384 | 2048→2432 |
更规整的 Supernode 生产切片:
| 上下文 | 生产建议 |
|---|---|
| 256K | P4:D1 = 512P + 384D = 896 NPU(TTFT 更稳) |
| 1M | P16:D1 = 2048P + 384D = 2432 NPU(EP128×CP16 或 EP256×CP8) |
10.3 内部并行推荐
| 上下文 | P 层 | D 层 30 tok/s | D 层 100/400 tok/s |
|---|---|---|---|
| 4K | TP1 / EP128 / PP1 / CP1 | TP1 / EP192 / PP1 | TP1 / EP384 / PP1 |
| 128K | EP128 / CP1;TTFT 严格用 CP2 | EP192 | EP384 |
| 256K | EP128 × CP3;生产建议 CP4 | EP192 | EP384 |
| 1M | EP128 × CP16 或 EP256 × CP8 | EP192 / DCP | EP384 / DCP + MTP |
十一、成本:每百万 token 多少钱
最后来算成本。这个推导链很直接:
$/MTok = GPU 总数 × 每 GPU 每小时成本 ÷ 每小时输出的百万 token 数
每小时输出 token 数 = λ × O × 3600
$/MTok = N_gpu × $/GPU-hour / (λ × O × 3600 / 1,000,000)
成本假设:
- B300:$5/GPU-hour(规划值,非官方定价)
- 950DT:$2/NPU-hour(规划值)
11.1 完整推导一个数字:B300 128K / 100 tok/s
N_gpu = 256 (P1:D1 = 64P + 192D)
每小时输出 = 5.86 × 512 × 3600 = 10,786,432 token ≈ 10.79M token
每小时成本 = 256 × $5 = $1,280
$/MTok = $1,280 / 10.79 = $119/MTok
11.2 完整推导:B300 1M / 100 tok/s
N_gpu = 576 (P6:D1 = 384P + 192D)
每小时输出 = 10.79M token(同一 λ)
每小时成本 = 576 × $5 = $2,880
$/MTok = $2,880 / 10.79 = $267/MTok
11.3 B300 全场景成本
| 上下文 | 30 tok/s | 100 tok/s | 400 tok/s |
|---|---|---|---|
| 4K–256K | $89/MTok | $119/MTok | $207/MTok |
| 1M | $237/MTok | $267/MTok | $356/MTok |
11.4 950DT 全场景成本
| 上下文 | 30 tok/s | 100 tok/s | 400 tok/s |
|---|---|---|---|
| 4K–128K | $59/MTok | $95/MTok | $95/MTok |
| 256K | $107/MTok | $142/MTok | $142/MTok |
| 1M | $344/MTok | $379/MTok | $379/MTok |
11.5 成本解读
几个值得注意的数字:
- 4K–128K:950DT 名义成本低($59 vs $89),但这个优势完全建立在 NPU-hour = $2 的假设上。如果实际 NPU-hour 更贵,优势消失。
- 1M:B300 反而更便宜($267 vs $379)。原因是 950DT 的 1M 配置在 P 层膨胀到 2048 NPU——单节点算力低导致 P 层需要更多 NPU,而更多 NPU 意味着更高成本。
- 950DT 要在 1M 打平 B300,NPU-hour 需降到大约 $1.1 以下——比当前假设再砍一半。
十二、C 层:P 和 D 之间的 cache 和带宽
12.1 P→D 需要多大带宽
Prefill 完成后,P 层需要把 KV cache 传给 D 层。每个会话的 KV 大小是 K(L),每秒有 λ 个新会话,所以:
B_{P→D} = λ × K(L)
代入基准 λ = 5.86:
| 上下文 | KV/seq | P→D 下界 | 如果缓存 full SWA(8×) |
|---|---|---|---|
| 4K | 0.022 GB | 0.13 GB/s | 1.0 GB/s |
| 32K | 0.174 GB | 1.02 GB/s | 8.1 GB/s |
| 128K | 0.695 GB | 4.07 GB/s | 32.6 GB/s |
| 256K | 1.389 GB | 8.14 GB/s | 65.1 GB/s |
| 1M | 5.300 GB | 31.05 GB/s | 248.4 GB/s |
31 GB/s 只是 P→D KV 传输的下界。实际 C 层流量还包括 lookup、D→C write-back、evict、replay 等多路叠加。1M 场景的实际 C 层带宽需求可能在 100-200 GB/s 级别。
这个量级意味着:
- 4K–32K:标准 Ethernet/RoCE 就够
- 128K–256K:需要 RDMA 或 NVLink-domain
- 1M:需要 RDMA + UB(UnifiedBus)+ NVLink-domain KV transfer
12.2 1M 场景的 C 层必须做的事
1M 场景的 cache 策略不是优化项,是生存项:
- prefix hash:相同前缀只存一份 compressed KV
- compressed CSA/HCA KV 优先缓存:SWA 不默认全量缓存
- SWA periodic checkpointing:SWA 做周期性快照,不实时全量保存
- cache-aware routing:请求路由优先打到有 cache 命中的 D-unit
- SSD endurance 管理:on-disk KV cache 的 SSD 写入量巨大,要监控写入寿命
- cache hit 率作为调度目标:不是把请求平均分配,而是优先利用已有 cache
十三、P/D/C 调度:不要静态绑定
13.1 三个独立资源池
生产上不要把 P1 永久绑定 D1。应该用三个独立资源池:
P Pool | D Pool | C Cache Pool
请求流程:
- Router 做 prefix hash
- 查 C 层是否命中 compressed KV
- 命中 → 减少 P 负载,只做 tail recompute
- 未命中 → 分配 P-unit 做 full prefill
- P 完成 → 按 D 端负载和 cache locality 分配 D-unit
- D decode 过程中持续 append KV,可复用部分写回 C 层
13.2 P 层调度看什么
P 层调度不能只看请求数。同样一个请求,4K prompt 和 1M prompt 的 prefill 负载差 250 倍。 长上下文 prefill 应按 token budget 调度——"这个 P-unit 还有 500K token 的 prefill 预算",而不是"这个 P-unit 还能接 5 个请求"。
13.3 D 层调度看什么
D 层调度要同时看:
- active streams(当前活跃会话数)
- KV length(每个会话的 KV 有多长)
- expert load(expert 负载是否均衡)
- per user speed tier(30/100/400 tok/s 混跑时不能放在同一个 D-unit)
- TPOT p90(实时监控,超出 SLA 要减流)
十四、高利用率场景:打满 D-unit 需要多少 P
§6–10 的配置是 SLA-safe 配置——保证 TPOT 和 TTFT,但 D 端利用率很低(D-unit goodput 远超实际流量)。如果目标是把 D-unit 打满(吞吐最优),P:D 会完全不同。
P / D ≈ (L/O) × (1−h) × G_D / G_P
直觉上:上下文越长(L 大)、输出越短(O 小)、cache 命中率越低(h 小),P 层相对 D 层就越大。
B300(P-unit = 64 GPU)
| 上下文 | 打满 D30-unit (128 GPU) | 打满 D100-unit (192 GPU) | 打满 D400-unit (384 GPU) |
|---|---|---|---|
| 4K | 2 P-unit | 3 P-unit | 6 P-unit |
| 32K | 15 | 22 | 44 |
| 128K | 54 | 81 | 162 |
| 256K | 100 | 149 | 298 |
| 1M | 305 | 457 | 913 |
结论:1M、短输出(O=512)、半冷前缀(h=0.56)时,不应该追求 D 满载——否则 P 层会膨胀到无法接受的程度。正确做法是:利用 cache 提高 h,长输出任务分流,或者用更大 EP 做 D-unit 来提高 D 的 goodput。
十五、最终推荐
B300
| 场景 | 配置 | 总 GPU |
|---|---|---|
| 4K–256K / 30 tok/s | P1:D1 | 192 |
| 4K–256K / 100 tok/s | P1:D1 | 256 |
| 4K–256K / 400 tok/s | P1:D1 | 448 |
| 1M / 30 tok/s | P6:D1 | 512 |
| 1M / 100 tok/s | P6:D1 | 576 |
| 1M / 400 tok/s | P6:D1 | 768 |
P 层:TP1 / EP64 / PP1,1M 加 CP8 D 层:EP192/384,400 tok/s 必须加 MTP
华为 950 Supernode
首选架构:950PR 做 P、950DT 做 D、SuperPoD 做 C/cache
| 场景 | 配置(纯 950DT 保守估算) | 总 NPU |
|---|---|---|
| 4K–128K / 30 tok/s | P1:D1 | 320 |
| 4K–128K / 100 tok/s | P1:D1 | 512 |
| 256K | P4:D1(生产建议) | 896 |
| 1M | P16:D1(生产建议) | 2432 |
十六、不确定性与验证节点
最后必须说清楚哪些是确定的、哪些是推测的:
| 类别 | 内容 |
|---|---|
| 已验证 | V4-Pro 模型结构参数(1.6T/49B/384 experts/top-6)、B300 硬件规格、FLOPs 计算公式 |
| 校准但非 V4-Pro 实测 | 硬件利用率 η_P=0.45 / η_D=0.14,校准自 DeepSeek V3/R1 H800 生产系统 |
| 推测 | B300 在 V4-Pro 上的实际 decode 利用率、950DT 在 V4-Pro 上的表现、950PR prefill goodput |
| 规划值 | B300 $5/GPU-hour、950DT $2/NPU-hour |
| 过时风险 | 950DT 计划 2026 Q4 可用,规格和可用性可能变化;B300 定价尚未公布 |
下一个验证节点:
- V4-Pro 在 B300 上的实测 decode goodput 和 TPOT p90
- 950DT 在 V4-Pro 上的实测 prefill/decode 效率
- 950PR 的 prefill goodput
- B300 和 950DT 的实际商用定价
- V4-Pro 的 SWA KV 策略和实际 cache 开销
在拿到实测数据之前,本文的所有配置应视为容量规划的起点和框架,不是最终答案。但框架是对的——先定义 workload、再算 goodput、再推 P:D——拿到实测数据后只需要替换效率参数,不需要改方法论。
