“世界第三”的 Kimi K3 开放权重后,我才看懂:8 张顶级 GPU 能跑,不等于真的能部署

📅 2026/7/30 16:20:46 👁️ 阅读次数 📝 编程学习
“世界第三”的 Kimi K3 开放权重后,我才看懂:8 张顶级 GPU 能跑,不等于真的能部署

2026 年 7 月 27 日,Kimi K3 正式开放完整模型权重。

这是近期大模型领域最值得关注的事件之一。

K3 拥有 2.8T 总参数、约 104B 激活参数、896 个路由专家,每个 Token 选择其中 16 个专家,同时支持最高 100 万 Token 上下文。按照官方公布的评测结果,它已经进入全球最强模型的第一梯队,也因此被很多人直接称为“世界第三的大模型”。

但比“世界第三”更有冲击力的,是另一件事:

这样一个第一梯队模型的完整权重,真的被放出来了。

很多开发者看到这里,第一反应是:

权重开放 = 可以下载 = 可以私有部署 = 终于不用调用闭源 API

然而,AMD 随后公布的 Day-0 部署方案,却给这种兴奋泼了一盆冷水。

K3 当前公开验证过的最低整机配置之一,是:

8 张 AMD Instinct MI355X 每张 288GiB HBM3E 总 HBM 超过 2TB TP8 张量并行

即便如此,AMD 也明确说明:

这次验证的目标不是追求峰值性能,而是确认模型权重为什么能装进去、如何在 8 张 GPU 之间分配,以及能否完成最小正确性测试。

换句话说,这套配置证明的是:

K3 能加载 K3 能生成 K3 能完成正确性验证

但它没有证明:

K3 的首字延迟是多少 每秒能够生成多少 Token 可以支持多少并发用户 长上下文性能如何 单位 Token 成本是多少 是否适合长期生产运行

AMD 没有在这次验证中公布这些生产指标。

这就产生了一个非常有意思的矛盾:

一个被认为进入世界前三、已经开放完整权重的模型,为什么绝大多数企业还是部署不了?

答案并不只是显卡太贵。

真正的问题是:

当模型大到必须跨越多张 GPU 时,部署就不再是一道显存加法题,而变成了一道分布式系统题。


一、K3 开放的是模型权重,不是一条廉价部署捷径

过去部署 7B、14B、32B 模型时,我们通常只需要回答一个问题:

模型需要多少显存?

如果模型能装进显存,推理框架又支持相应架构,那么部署大概率就能继续进行。

但 K3 已经完全不是这个尺度。

它的模型 Checkpoint 大约为 1.56TB。

即使使用 8 张每张拥有 288GiB HBM 的 MI355X,也需要通过 TP8,把模型权重分散到所有 GPU 上。

这意味着一个请求不再由一张 GPU 独立完成。

而是可能变成:

GPU 0 计算一部分 GPU 1 计算一部分 GPU 2 计算一部分 …… GPU 7 计算一部分 ↓ 所有 GPU 交换结果 ↓ 完成同步 ↓ 继续计算下一层

从这一刻开始,决定系统性能的就不只是 GPU 算力。

而是:

GPU 计算能力 × 并行策略 × GPU 通信带宽 × PCIe / 高速互联拓扑 × P2P 能力 × 请求调度 × 推理引擎优化

任何一项严重退化,整套系统都会被拖慢。

所以,K3 真正值得研究的地方,不只是它拥有 2.8T 参数。

而是它把一个事实暴露得非常彻底:

前沿大模型已经不再只是一份神经网络权重,而是一台由模型、GPU、互联、通信库和调度系统共同组成的分布式计算机器。


二、为什么会出现“GPU 没跑满”?

这是很多多卡用户最困惑的问题。

明明服务器里安装了四张 GPU:

  • 四张卡都被正确识别;
  • 显存也全部占用了;
  • 模型成功启动;
  • 没有出现 OOM。

但运行模型时,却发现:

GPU 利用率忽高忽低 有的 GPU 长期等待 Token 生成速度没有明显提升 从两张卡增加到四张卡,延迟反而升高

很多人会认为:

是不是显卡算力不够? 是不是 CUDA 没安装好? 是不是量化模型有问题?

但真实原因可能恰恰相反:

GPU 计算得太快,剩下的大量时间都暴露成了通信和等待。

假设一个 Transformer 层被切分到四张 GPU:

GPU 0:计算矩阵的一部分 GPU 1:计算矩阵的一部分 GPU 2:计算矩阵的一部分 GPU 3:计算矩阵的一部分 ↓ 等待所有 GPU 完成局部计算 ↓ All-Reduce / All-Gather ↓ 合并计算结果 ↓ 进入下一层

一张 GPU 即使已经完成自己的部分,也不能直接进入下一层。

因为下一层需要的是完整结果。

它必须等待其他 GPU 完成,并等待集合通信结束。

NCCL 的集合通信要求参与操作的各个 Rank 共同完成相应操作。All-Reduce 会聚合所有 Rank 的结果,并将结果返回给各个 Rank;All-Gather 则会收集各 Rank 的数据,并将完整结果分发给所有参与者。

假设某一次执行周期是:

有效计算:10ms 跨卡通信:15ms 同步等待:5ms

那么总时间为:

10 + 15 + 5 = 30ms

真正用于 GPU 有效计算的时间占比是:

有效计算利用率 = 10 ÷(10 + 15 + 5) = 33.3%

也就是说,剩下约三分之二的时间,GPU 并不是没有任务。

它是在等待。

整个执行过程可能不断重复:

计算 10ms 通信 15ms 等待 5ms 计算 10ms 通信 15ms 等待 5ms 计算 10ms 通信 15ms 等待 5ms

于是,你在nvidia-smi中看到的 GPU 利用率可能是:

100% → 20% → 0% → 100% → 15% → 0%

GPU 可能在等待:

  • 其他 GPU 完成局部计算;
  • NCCL 集合通信;
  • PCIe 数据传输;
  • CPU 内存中转;
  • 跨 NUMA 节点传输;
  • 上一个 Pipeline Stage;
  • 最繁忙的 MoE 专家;
  • 推理框架完成调度。

因此,GPU 利用率出现波动,不一定说明 GPU 算力不足。

更准确的判断是:

GPU 的计算阶段很短,通信和同步阶段太长。

多卡执行时间可以粗略理解为:

总执行时间 = 有效计算时间 + 数据传输时间 + 集合通信时间 + 同步等待时间 + 调度开销

当通信和等待时间超过计算时间时,继续增加 GPU 数量并不会自动提升速度。

因为 GPU 越多:

  • 通信参与者越多;
  • 同步点越多;
  • 通信路径越复杂;
  • 最慢 GPU 拖累全局的概率越高。

这就是多卡系统最反直觉的现象:

显卡越快,通信瓶颈反而可能越明显。


三、8 张 GPU 能运行,为什么不能证明 K3 能服务?

评价一次大模型部署,至少应该分成三个层次。

第一层:能加载

模型权重能够进入显存 不会发生 OOM

第二层:能生成

模型可以完成前向传播 能够正确输出 Token

第三层:能服务

TTFT 达标 TPOT 达标 吞吐量达标 并发能力达标 稳定性达标 单位成本达标

其中:

  • TTFT 是从请求发出到第一个 Token 出现的时间;
  • TPOT 是开始生成后,每个新 Token 所需的时间;
  • Throughput 是整个系统每秒能够为所有用户生成多少 Token;
  • Concurrency 是系统在延迟不失控的前提下,可以同时服务多少请求。

很多所谓的“最低配置”,只能证明前两层。

它证明模型能装进去,也能输出答案。

但如果没有公布:

TTFT TPOT 单请求 Tokens/s 总吞吐量 并发用户数 P95 / P99 延迟 长时间运行稳定性 单位百万 Token 成本

就不能直接得出“适合生产部署”的结论。

AMD 的 8 张 MI355X 方案,本质上是一次 Day-0 容量与正确性验证,而不是完整的生产性能报告。AMD 还特别说明,模型在 TP8 下每张 GPU 约占用 190.974GiB 权重;一条百万 Token 序列的已知额外运行状态,估算还会占用每张 GPU 约 14.427GiB,但这尚未包括通信缓冲区、Kernel Workspace、CUDA Graph、内存碎片和框架运行时开销。

所以,“8 卡能跑”的准确含义是:

8 张 MI355X 能够容纳 K3 并完成最小功能验证

它不等于:

8 张 MI355X 已经能以合理成本 高并发、低延迟地服务 K3

“能运行”和“能服务”之间,隔着一整套推理系统工程。


四、多卡性能不能只看显卡,还要看整台机器的拓扑

很多人购买 GPU 服务器时,只看四件事:

有几个 PCIe 插槽 可以安装几张显卡 总显存有多少 电源功率够不够

但这些信息只能说明:

显卡能不能物理安装进去。

它不能说明:

这些显卡能不能高效协同。

真正决定多卡训练和推理性能的,是:

GPU 型号 + PCIe 代际 + 每张 GPU 的实际通道数 + PCIe 交换芯片 + CPU 数量 + NUMA 结构 + GPU P2P 能力 + NCCL 实际通信路径

例如,主板上虽然有四个物理 x16 插槽,但实际运行状态可能是:

GPU 0:PCIe 4.0 x16 GPU 1:PCIe 4.0 x16 GPU 2:PCIe 4.0 x8 GPU 3:PCIe 4.0 x8

物理上是 x16 长度的插槽,不代表它真的获得了 16 条 PCIe Lane。

有些主板会因为 CPU 可用 PCIe Lane 数量有限,在安装多张 GPU 后自动降速。

所以,看到“4 个 PCIe x16 插槽”时,还要继续问:

四张卡同时安装后 每张卡实际运行在 x16 还是 x8?

双路 CPU 服务器还可能出现另一种结构:

CPU 0 ├── GPU 0 └── GPU 1 CPU 1 ├── GPU 2 └── GPU 3

GPU 0 和 GPU 1 通信时,路径可能是:

GPU 0 → PCIe Switch → GPU 1

但 GPU 0 和 GPU 2 通信时,路径可能变成:

GPU 0 → PCIe → CPU 0 → CPU 间互联 → CPU 1 → PCIe → GPU 2

这条路径跨越了两颗 CPU 和两个 NUMA 域。

通常意味着:

  • 传输路径更长;
  • 延迟更高;
  • 可用带宽更低;
  • CPU 间互联也会成为共享瓶颈;
  • NUMA 内存访问更复杂。

NVIDIA 的nvidia-smi topo -m会显示 GPU、CPU、NUMA 和网络设备之间的拓扑关系。其中,PIX 表示经过单个 PCIe Switch;PXB 表示经过多个 PCIe Switch;PHB 表示经过 CPU 的 PCIe Host Bridge;SYS 则表示路径还需要穿越 NUMA 节点之间的 CPU 互联。

因此,可以粗略理解为:

NV#:通常最好 PIX:路径较短 PXB:经过多个 PCIe Switch PHB:经过 CPU Host Bridge NODE:同一 NUMA 节点内跨 Host Bridge SYS:跨 NUMA 或 CPU 间互联

假设拓扑结果是:

GPU0 GPU1 GPU2 GPU3 GPU0 X PIX SYS SYS GPU1 PIX X SYS SYS GPU2 SYS SYS X PIX GPU3 SYS SYS PIX X

这说明:

GPU0 和 GPU1 路径较近 GPU2 和 GPU3 路径较近 两组 GPU 之间需要跨 NUMA 或 CPU 互联

那么更合理的 TP2 组合是:

GPU0 + GPU1:实例 A GPU2 + GPU3:实例 B

而不是:

GPU0 + GPU2 GPU1 + GPU3

必须记住:

GPU 编号相邻,不代表物理路径相邻。

多卡性能不是由显卡列表决定的。

它是由显卡之间的数据路径决定的。


五、最危险的情况:GPU 之间不能直接 P2P

理想的 GPU 间通信路径是:

GPU 0 显存 ↓ GPU P2P ↓ GPU 1 显存

GPU 0 可以直接访问或传输数据到 GPU 1 的显存。

CUDA 是否支持两张 GPU 直接访问彼此显存,可以通过cudaDeviceCanAccessPeer()判断,并通过cudaDeviceEnablePeerAccess()启用。它是否可用,取决于具体的 GPU、PCIe 或 NVLink 拓扑以及系统配置。

如果 P2P 无法使用,数据传输可能需要经过主机内存:

GPU 0 显存 ↓ PCIe ↓ CPU 内存 ↓ PCIe ↓ GPU 1 显存

这会带来两个直接问题。

第一,多了一次或多次数据复制。

第二,CPU、系统内存带宽和 PCIe 会同时成为瓶颈。

原本应该由 GPU 直接完成的数据交换,现在需要 CPU 内存参与中转。

如果每生成一个 Token,都要在几十层甚至上百层模型中反复进行这种传输,性能损失会被不断放大。

NVIDIA 的 CUDA 文档明确说明,启用 P2P 后,GPU 间复制不再需要通过 Host Staging,也就是不必经过主机内存中转,因此通常会更快。

但 P2P 并不是“显卡插在同一台机器里”就自动成立。

它还可能受到以下因素影响:

  • GPU 是否支持相应 P2P 路径;
  • PCIe 拓扑;
  • 驱动版本;
  • BIOS 配置;
  • 虚拟机环境;
  • 容器对系统拓扑的暴露;
  • IOMMU;
  • ACS;
  • GPU 与 PCIe Switch 的连接方式。

NCCL 官方文档指出,NCCL 会优先使用 GPU Direct 和 P2P 进行 GPU 间通信。但错误的虚拟机、容器、BIOS 或 PCIe 配置都可能导致 P2P 不可用或性能很差。

其中 ACS 是一个非常典型的坑。

ACS 可能把原本可以直接进行的 PCIe 点对点流量,强制重定向到 CPU Root Complex。

结果就是:

原本: GPU 0 → PCIe Switch → GPU 1 变成: GPU 0 → CPU Root Complex → GPU 1

NVIDIA 的 NCCL 故障排查文档明确指出,VT-d、IOMMU 和 ACS 可能干扰 GPU Direct,把点对点流量重定向到 CPU Root Complex,从而造成显著性能下降,严重时甚至可能导致任务挂起。

所以,绝对不能简单认为:

四张卡都插在同一台服务器里,就一定可以高速互访。

物理上位于同一台服务器,不等于逻辑上能够直接访问彼此显存。


六、不同并行方式,对通信的敏感度完全不同

很多多卡性能问题,本质上不是显卡性能差,而是并行策略和硬件条件不匹配。

常见并行方式至少包括:

数据并行 DP 张量并行 TP 流水线并行 PP 专家并行 EP

它们对 GPU 通信的依赖程度完全不同。


1. 数据并行:最适合消费级多卡推理

推理场景中的数据并行,可以理解为每张 GPU 保存一份完整模型,然后分别处理不同请求。

GPU 0:完整模型副本,处理用户 A GPU 1:完整模型副本,处理用户 B GPU 2:完整模型副本,处理用户 C GPU 3:完整模型副本,处理用户 D

不同 GPU 之间几乎不需要频繁交换中间状态。

它的优点是:

  • 单卡利用率通常更稳定;
  • 总并发能力强;
  • 对 PCIe 和 NVLink 要求较低;
  • 单个请求不需要跨 GPU 同步;
  • 某张 GPU 故障不一定影响全部服务;
  • 尾延迟更容易控制。

缺点也很明显:

每张 GPU 都必须完整保存一份模型。

但只要模型能放进单卡,这通常就是四卡服务器最高效的使用方式。

例如,企业内部的:

  • RAG;
  • 知识库问答;
  • Agent;
  • 代码助手;
  • 文档分析;
  • OCR;
  • Embedding;
  • Reranker。

这些系统通常面对的是多个并发用户。

真正需要优化的是:

同时服务更多请求

而不是:

让一个请求同时占满所有 GPU

所以,只要模型能放进一张卡,优先考虑多个模型副本。


2. 张量并行:最容易被通信拖死

张量并行会把同一层中的矩阵计算切分到多张 GPU。

一层 Transformer ├── GPU 0 计算 25% ├── GPU 1 计算 25% ├── GPU 2 计算 25% └── GPU 3 计算 25%

每张 GPU 完成自己的局部计算以后,还需要交换和合并结果。

因此,几乎每一层都可能执行:

  • All-Reduce;
  • All-Gather;
  • Reduce-Scatter。

假设模型有 80 层。

那么生成一个 Token 的过程中,就可能发生大量跨 GPU 同步。

张量并行最麻烦的地方,不一定是单次传输量特别大。

而是:

通信发生得非常频繁。

所以它非常依赖:

  • NVLink;
  • NVSwitch;
  • 高质量 PCIe P2P;
  • 良好的 GPU 拓扑;
  • NCCL 拓扑优化;
  • 足够大的 Batch;
  • 计算与通信重叠。

在只有 PCIe、没有 NVLink 的消费级多卡服务器上,经常会出现:

TP1:速度最快,但模型放不下 TP2:模型能运行,性能尚可 TP4:模型终于能放下,但生成速度下降

原因是 TP 从 2 增加到 4 后:

每张 GPU 的计算量减少了 但通信参与者增加了 同步点增加了 数据路径更加复杂 最慢 Rank 的影响更明显了

所以:

TP4 很多时候不是性能优化,而是显存不足时的容量妥协。


3. 流水线并行:通信少一些,但容易出现气泡

流水线并行按照模型层数进行切分。

GPU 0:第 1~20 层 GPU 1:第 21~40 层 GPU 2:第 41~60 层 GPU 3:第 61~80 层

GPU 0 完成前 20 层后,将 Hidden State 发送给 GPU 1。

GPU 1 再计算第 21~40 层。

与张量并行相比,它不需要在每一层内部进行完整的 All-Reduce。

相邻 Stage 主要传递 Hidden State。

但它存在一个严重问题:

Pipeline Bubble,也就是流水线气泡。

例如:

时间 1: GPU0 工作 GPU1、GPU2、GPU3 等待 时间 2: GPU0、GPU1 工作 GPU2、GPU3 等待 时间 3: GPU0、GPU1、GPU2 工作 GPU3 等待 时间 4: 四张 GPU 才全部进入工作状态

想要减少流水线气泡,就需要持续输入多个 Micro-batch,让不同 Stage 同时处理不同批次。

但对于单用户、本地聊天和低并发推理:

请求数量不足 Batch 太小 Micro-batch 不够

流水线就很难被填满。

于是,即使安装了四张 GPU,也可能不断出现部分 GPU 空转。


4. 专家并行:对通信最凶险

专家并行是 K3 这类 MoE 模型最需要警惕的部分。

K3 拥有 896 个路由专家,每个 Token 选择其中 16 个专家。

这些专家会被分布到不同 GPU。

Router 完成选择后,可能得到:

Token 1 → GPU 0 上的专家 Token 2 → GPU 3 上的专家 Token 3 → GPU 1 上的专家 Token 4 → GPU 2 上的专家

系统先执行 Token Dispatch:

把 Token 发送到专家所在 GPU

专家完成计算后,再执行 Expert Combine:

把专家结果发送回来 重新恢复原来的 Token 顺序 合并计算结果

这个过程通常依赖 All-to-All 通信。

All-to-All 的意思是:

每张 GPU 都可能向其他所有 GPU 发送数据 同时 每张 GPU 也可能从其他 GPU 接收数据

NCCL 对 All-to-All 的定义是:每个 Rank 都提供面向所有目标 Rank 的数据块,并将对应数据块发送给相应 Rank。

专家并行还有一个比通信更加麻烦的问题:

专家负载不均衡。

例如,某个 Batch 的路由结果是:

专家 A:收到 10000 个 Token 专家 B:收到 8000 个 Token 专家 C:收到 100 个 Token 专家 D:收到 20 个 Token

专家 C 和专家 D 很快就计算完成。

但整个系统不能直接继续。

因为专家 A 还没有完成。

结果可能变成:

GPU 0:完成,等待 GPU 1:完成,等待 GPU 2:仍在处理热门专家 GPU 3:完成,等待

整个系统的速度,最终由最慢的那个 Rank 决定。

这就是分布式计算中的 Straggler,也就是掉队者问题。

因此,四种并行方式的通信敏感度可以粗略排序为:

数据并行 较低 流水线并行 中等 张量并行 较高 专家并行 最高

这也解释了为什么 K3 这种拥有 896 个专家的模型,需要高带宽、低延迟的高速互联域。

而不能简单地认为:

找几十张消费级 GPU 把显存加起来 就等于拥有一套 K3 推理集群

显存容量可能够了。

但通信系统很可能完全撑不住。


七、为什么 104B 激活参数不等于一个普通的 104B 模型?

很多人看到 K3 的参数配置:

总参数:2.8T 激活参数:104B

会下意识认为:

虽然 K3 有 2.8T 参数,但每次只用 104B,所以部署难度应该和一个 104B Dense 模型差不多。

这个结论不成立。

可以把 K3 想象成一家拥有 896 名专家的公司。

每次处理一个任务,只邀请 16 名专家参加。

这样做的好处是:

公司可以拥有巨大的知识容量 但不需要每个任务都让全部专家参与

这就是 MoE 的价值。

但是,虽然一次只邀请 16 名专家开会,896 名专家依然都需要办公室。

同样:

总参数量 决定所有模型权重需要占用多少空间 激活参数量 决定一个 Token 大约需要执行多少计算

2.8T 总参数解释了为什么 K3 的 Checkpoint 接近 1.56TB。

104B 激活参数解释了为什么每个 Token 不必让全部 2.8T 参数参与计算。

但 104B 激活参数没有包括:

  • Router 计算;
  • Token Dispatch;
  • Expert Combine;
  • All-to-All 通信;
  • 专家负载不均衡;
  • 跨卡同步;
  • 通信缓冲区;
  • 等待最慢 Rank。

因此:

激活参数描述的是“算多少”,不是“搬多少”,更不是“等多久”。

K3 每个 Token 的计算量可能接近一个超大 Dense 模型。

但它的系统行为和普通 Dense 模型完全不同。


八、看 K3 这样的超大模型,必须同时算四本账

以后看到一个超大模型,不能只看参数量。

至少要同时计算四本账。


第一笔账:权重存储

理论权重大小可以粗略估算为:

权重大小 ≈ 参数数量 × 每个参数位数 ÷ 8

K3 有 2.8T 参数。

假设全部按照 4bit 保存:

2.8T × 4bit ÷ 8 ≈ 1.4TB

但真实模型中还包括:

  • 部分高精度参数;
  • 量化 Scale;
  • Embedding;
  • Norm 参数;
  • 视觉编码器;
  • 元数据;
  • 文件格式开销;
  • 内存对齐。

因此,K3 实际 Checkpoint 大约为 1.56TB。

这笔账决定的是:

模型权重能不能放进显存?

第二笔账:每个 Token 的计算量

激活参数决定一次前向传播中,大约有多少参数真正参与计算。

MoE 的价值可以理解为:

很大的总参数容量 + 相对受控的单 Token 计算量

但它没有完整计算:

路由开销 通信开销 同步开销 负载不均衡

所以这笔账回答的是:

大约需要算多少?

而不是:

最终需要运行多久?

第三笔账:KV Cache 和运行状态

生产环境中的显存占用,不只有模型权重。

完整占用更接近:

总显存占用 = 模型权重 + KV Cache + KDA / MLA 运行状态 + 活跃请求状态 + 通信缓冲区 + Kernel Workspace + CUDA Graph + 框架运行时 + 内存碎片

K3 支持最高 100 万 Token 上下文,但“一条百万 Token 请求能够运行”,不代表“几十条百万 Token 请求能够同时运行”。

并发环境中,运行状态还会受到以下因素影响:

上下文长度 × 模型层数 × 隐藏状态规模 × 活跃请求数量

所以,支持百万上下文是模型能力。

能否以合理成本并发服务百万上下文,则是系统能力。


第四笔账:GPU 通信

多卡总时间可以粗略理解为:

总时间 = 计算时间 + 数据传输时间 + 集合通信时间 + 同步等待时间 + 调度开销

这笔账最容易被忽略。

却经常决定模型最终到底能跑多快。

一个模型可能已经成功放进显存:

模型加载成功 GPU 全部识别 显存全部占用

但系统仍然可能处于:

GPU 很快完成计算 然后长时间等待通信

所以:

能不能装下,是容量问题;能不能高效运行,是系统问题。


九、没有 NVLink,消费级多卡还有价值吗?

当然有。

但必须用对方式。

以 RTX 4090 为例,它没有 NVLink,多卡之间主要依赖 PCIe。

这意味着它不适合所有跨卡并行方式。

如果一个模型可以装进单张 GPU,可以让多张 GPU 分别处理不同请求:

GPU 0:处理用户 A GPU 1:处理用户 B GPU 2:处理用户 C GPU 3:处理用户 D

这种情况下,不同 GPU 之间几乎不需要频繁交换中间状态。

四张 GPU 仍然可以显著提高总吞吐。

所以,真正应该问的不是:

服务器里有几张 GPU?

而是:

一个请求需要跨越几张 GPU?

一个请求跨越的 GPU 越多,对通信的要求通常越高。

因此,消费级多卡最重要的原则不是:

尽量让所有 GPU 都参与同一个请求

而是:

尽量减少一个请求 需要跨越的 GPU 数量

十、四张消费级 GPU,应该怎么分配?

假设你有四张 GPU,可以根据模型容量分成三种情况。


场景一:模型可以装进一张 GPU

优先部署四个独立副本:

GPU 0:模型副本 A GPU 1:模型副本 B GPU 2:模型副本 C GPU 3:模型副本 D

然后通过 API Gateway、LiteLLM 或负载均衡器分发请求。

如果并发量不高,也可以按照服务拆分:

GPU 0:主语言模型 GPU 1:视觉语言模型 GPU 2:Embedding + Reranker GPU 3:OCR、批处理或备用实例

这通常比强行把四张卡绑成一个 TP4 实例更加稳定。


场景二:模型必须两张 GPU 才能装下

优先考虑两个 TP2 实例:

GPU 0 + GPU 1:模型实例 A GPU 2 + GPU 3:模型实例 B

而不是一个 TP4 实例:

GPU 0 + GPU 1 + GPU 2 + GPU 3

两个 TP2 通常意味着:

  • 每个实例参与通信的 GPU 更少;
  • 总并发能力更高;
  • 尾延迟更稳定;
  • 故障隔离更容易;
  • GPU 更容易持续执行有效计算。

但 GPU 配对不能只看编号。

应该结合:

nvidia-smi topo -m

优先选择 PIX、PXB 或高速互联路径较近的 GPU。


场景三:模型必须四张 GPU 才能装下

这时候 TP4 是容量上的被迫选择。

目标不应该再是:

四张 GPU 必须长期保持 100% 利用率

更合理的目标是:

模型稳定加载 不发生 OOM TTFT 可以接受 TPOT 可以接受 并发达到业务要求 NCCL 没有走异常路径 没有严重 Host Staging 单位请求成本合理

如果跨卡通信已经占用大量时间,那么 GPU 利用率只有 40% 或 50%,不一定说明程序写错了。

它可能已经接近当前硬件拓扑的性能上限。


十一、真正排查多卡性能,不能只看 nvidia-smi

nvidia-smi的 GPU 利用率,只能告诉你某个采样窗口内 GPU 是否在执行 Kernel。

它不能直接告诉你:

GPU 为什么没有执行 Kernel 是在等待数据 还是在等待同步 还是在等待 CPU 还是在等待其他 GPU

一套完整的多卡排查流程,至少应该包括以下步骤。


第一步:查看 GPU 拓扑

nvidia-smi topo -m

重点查看:

GPU 之间是 NV#、PIX、PXB、PHB、NODE 还是 SYS GPU 分别属于哪个 NUMA 节点 GPU 和网卡之间的距离

第二步:查看 PCIe 实际速率

nvidia-smi -q

或者使用:

lspci -vv

确认每张 GPU 实际运行在:

PCIe 4.0 x16 PCIe 4.0 x8 PCIe 5.0 x16

不要只看主板插槽外观。


第三步:检查 GPU P2P

nvidia-smi topo -p2p p

其中p用于检查 PCIe P2P 能力。

NVIDIA 文档也建议使用 CUDA Samples 中的工具测试 GPU 间 Peer Access、带宽和延迟。

例如:

p2pBandwidthLatencyTest

它可以帮助确认:

  • GPU 是否支持 Peer Access;
  • 单向 P2P 带宽;
  • 双向 P2P 带宽;
  • GPU 间延迟。

第四步:测试 NCCL 集合通信

可以使用nccl-tests

./build/all_reduce_perf \ -b 8M \ -e 8G \ -f 2 \ -g 4

分别测试:

-g 1 -g 2 -g 4

重点关注:

algbw busbw 不同数据量下的带宽 GPU 数量增加后的扩展效率

如果从两张 GPU 增加到四张 GPU 后,通信带宽没有合理扩展,甚至明显下降,就需要继续检查:

  • PCIe 拓扑;
  • P2P;
  • PCIe Lane;
  • NUMA;
  • CPU 绑定;
  • ACS;
  • IOMMU;
  • BIOS 设置。

第五步:查看 NCCL 实际通信路径

运行任务前开启日志:

export NCCL_DEBUG=INFO export NCCL_DEBUG_SUBSYS=INIT,GRAPH,P2P

重点观察 NCCL 选择的路径:

P2P / IPC SHM NET Socket

可以粗略理解为:

P2P / IPC: GPU 之间直接传输,通常更理想 SHM: 通过主机共享内存中转 NET / Socket: 通过网络或 Socket 通信

如果同一台服务器中的 GPU 通信大量退化到 SHM,就需要进一步检查:

  • P2P 是否被禁用;
  • ACS 是否强制流量绕路;
  • IOMMU;
  • 容器权限;
  • /sys是否正确挂载;
  • PCIe 拓扑;
  • 驱动和 NCCL 版本。

第六步:对比 TP1、TP2、TP4

如果显存允许,应分别测试:

TP1 TP2 TP4

每一种配置至少记录:

  • TTFT;
  • TPOT;
  • 单请求 Tokens/s;
  • 总吞吐量;
  • 并发能力;
  • P50 延迟;
  • P95 延迟;
  • P99 延迟;
  • GPU 利用率;
  • GPU 显存占用;
  • CPU 内存占用。

不要只比较模型能不能启动。

真正需要回答的是:

GPU 数量增加以后,业务指标到底有没有改善?


十二、买显卡之前,应该先决定怎么并行

很多人的采购顺序是:

先买显卡 → 再选择模型 → 最后研究怎么并行

更合理的顺序应该反过来:

先确定业务负载 → 再确定模型规模 → 再选择并行策略 → 最后选择硬件

采购之前,至少应该回答以下问题。

1. 模型能不能装进一张卡?

如果可以,优先考虑多个独立副本。

2. 模型至少需要几张卡?

能用 TP2,就不要为了“让所有 GPU 都参与”而强行使用 TP4。

3. 业务目标是低延迟还是高并发?

低延迟更怕跨卡通信。

高并发通常更适合多个独立副本。

4. 模型是 Dense 还是 MoE?

MoE 对以下能力更加敏感:

All-to-All 专家负载均衡 专家放置 GPU 高速互联 跨节点 RDMA

5. 每张 GPU 实际获得多少 PCIe Lane?

物理 x16 插槽,不等于实际运行在 x16。

6. GPU 是否跨 CPU 和 NUMA?

跨 NUMA 会增加通信路径和延迟。

7. GPU P2P 是否真正可用?

必须通过命令和基准测试确认。

8. NCCL 实测带宽是多少?

购买多卡服务器时,应该要求供应商提供真实 NCCL 测试结果,而不只是显卡规格表。


十三、多卡服务器真正的采购清单

下一次采购多卡服务器,不要只问:

可以安装几张显卡? 总显存有多少? 电源功率够不够?

还要继续追问:

每张 GPU 实际运行在 PCIe x16 还是 x8? 四张卡同时安装后是否会降速? GPU 分别挂在哪一颗 CPU 下? GPU 是否跨 NUMA 节点? GPU 之间是 NV#、PIX、PXB、PHB 还是 SYS? 是否存在 PCIe Switch? GPU P2P 是否可用? ACS 和 IOMMU 如何配置? NCCL All-Reduce 实测带宽是多少? 目标模型准备使用 DP、TP、PP 还是 EP? TP2 和 TP4 的真实性能分别是多少? 是否支持 GPU Direct RDMA? 跨节点网络使用什么网卡和交换机?

显卡型号只能告诉你:

单个计算节点有多强

拓扑和通信才能告诉你:

这些节点能不能组成一个高效系统

结语:K3 开放了世界级模型,但没有消灭系统工程门槛

Kimi K3 的开放,确实具有标志性意义。

一个拥有 2.8T 参数、896 个专家、百万 Token 上下文、进入全球第一梯队的模型,其完整权重已经可以被开发者获取。

但 K3 同时也证明了一件更现实的事:

模型权重开放,不等于部署门槛消失。

8 张 MI355X 可以让 K3 完成加载和正确性验证。

但这首先解决的是:

模型能不能放进去?

它还没有完整回答:

模型放进去以后 能不能以合理的吞吐、延迟和成本运行?

同样,四张 24GB 显卡的确可以提供 96GB 总显存。

但它们不会自动变成一张拥有 96GB 统一显存、四倍算力和四倍速度的超级显卡。

显存只能相对直接地相加。

性能却取决于:

单卡计算能力 × 并行策略 × GPU 通信带宽 × PCIe 拓扑 × P2P 能力 × NUMA 路径 × 批处理与调度 × 推理框架优化

对于消费级多卡服务器,更合理的原则通常是:

模型尽量控制在一到两张 GPU 内 + 使用多个模型副本提高并发 + 按照真实拓扑选择 GPU 组合 + 让不同 GPU 承担不同服务 + 容量不足时再提高张量并行规模

以后再看到:

支持八卡 总显存 192GB 四卡并行加速

不要只看 GPU 数量。

真正应该追问的是:

这些 GPU 之间如何通信? 数据会经过哪些设备? P2P 是否可用? 是否跨 CPU 和 NUMA? NCCL 实测带宽是多少? 一个请求需要跨越几张 GPU? 选择的是 DP、TP、PP 还是 EP?

当你开始关注拓扑、P2P、NCCL、NUMA 和并行策略时,才算真正从“会买显卡”,进入了“会设计大模型计算系统”的阶段。

最后记住一句话:

K3 开放的是世界第一梯队模型的权重,但真正让这种模型运行起来的,不是某一张最强显卡,而是让几十张甚至上百张 GPU 像一台机器一样协同工作的系统能力。


文章标签:Kimi K3、大模型部署、MoE、GPU 通信、NCCL、张量并行、数据并行、流水线并行、专家并行、PCIe、P2P、NUMA、RTX 4090、AMD MI355X、分布式推理