1. 先回答问题:同样是“发送数据”,为什么需要五层接口
一张 GPU 把局部 tensor 交给其他 GPU 时,应用检查的是所有 rank 是否属于同一个 communicator、all-reduce 是否完成、下一层能否开始。NIC 不理解 tensor、expert 或模型版本,它只看到已授权的 DMA 操作和可转发报文。运行时还要在两者之间管理内存所有权、流控、拥塞反馈和故障恢复。
因此,网络栈要同时保留两种视角。语义视角描述 collective、请求、KV block、deadline 和版本;传输视角描述 buffer、队列、包、路径、credit 与 completion。前者不能被交换机自动推断,后者也不能由一个调度器的“优先级”自动实现。正确设计是在两者之间传递足够但不过度暴露的 metadata。
2. 分层地图:MPI、NCCL、RDMA、DPDK 分别承诺什么
| 层 | 主要对象 | 给调用者的语义 | 不负责的事情 |
|---|---|---|---|
| MPI | process、rank、communicator、message | 进程组内的点对点与 collective 语义,常用于科学计算与控制/编排层 | 不会天然理解 GPU kernel、KV 生命周期或数据中心 QoS |
| NCCL | GPU、stream、tensor、communicator | 面向 GPU 的 all-reduce、all-gather、reduce-scatter、all-to-all 与 P2P | 不替代全局请求路由、租户策略或存储元数据 |
| RDMA / verbs | memory region、queue pair、WQE、CQ | 对已注册内存执行可完成、可受权限约束的远端数据移动 | 不会定义“这段字节属于哪个模型 epoch” |
| DPDK | port、queue、mbuf、ring、lcore | 用户态批量收发、轮询、flow steering 与自定义主机 packet pipeline | 不自动构成 RDMA transport,也不直接替代 NCCL collective |
| 可编程 NIC / switch | packet、flow、queue、counter、有限状态 | 转发、分类、限速、遥测、局部拥塞反应,以及受限的在线处理 | 通常不能安全地理解任意模型算子、全局事务或复杂 Agent 意图 |
这里的“层”不是严格的一条垂直协议栈。NCCL 可以利用 RDMA transport;MPI 实现也可以调用 GPU-aware 通信路径;DPDK 可以承载控制服务、采集遥测或构建专用 gateway。关键是每层的承诺边界要清楚:调用者依赖什么,失败时谁报告,哪些状态可见,哪些动作可以重试。
3. 消息语义:同一批字节在不同层里不是同一件事
MPI 的发送/接收通常由 communicator、rank、tag 和顺序规则描述;NCCL collective 要求所有参与 rank 以相容的顺序进入同一组操作;RDMA write 关注远端地址、权限、完成队列与 buffer 生命周期;DPDK 收到的只是一个或一批 mbuf。它们之间不能简单用“发出去了”四个字概括。
例如,MoE dispatch 的正确性需要 token 的目标 expert、offset 和 combine 顺序正确。一个 RDMA write 已完成,只说明远端 DMA 的字节操作到达了约定的内存区域;它不说明接收端已验证 token count,更不说明下一层 grouped GEMM 可以读取它。相反,NCCL all-to-all 返回或事件完成也不说明整个用户请求已完成,因为后面还有 expert compute、combine 和 decode。
把这四个事件分别记录,是隔离性能问题和正确性问题的基础。否则一个“网络超时”可能其实是 communicator 不一致、目标没有 credit、控制面没有提交元数据,或者 Agent 的工具调用仍未结束。
4. 一次 GPU 到 GPU 的数据路径:从 tensor 到 packet,再到 completion
以跨节点 TP 或 MoE 通信为例,运行时先确定 communicator 与目标 rank;GPU 侧 kernel 或通信库准备局部 tensor、计数和 offset;NIC 通过 DMA 读取已授权的 GPU memory,并将数据送往网络。远端 NIC 写入接收 buffer,完成队列或 GPU/CPU 可见事件通知运行时。运行时随后按调用语义解锁下一个 kernel。
有些实现会把 pack、collective 与后续计算重叠;有些使用分层 collective,先在 scale-up 域内合并,再跨 NIC 交换代表分片。无论实现怎样变化,buffer 在 DMA 结束前不得被复用,接收侧在对象提交前不得让下游读取未完整的数据。这是性能优化不可跨越的生命周期边界。
5. MPI 与 NCCL:不要把“训练通信”缩减成一个 all-reduce
训练的 data parallel 常用大规模梯度归约,tensor parallel 在模型层之间频繁做较小的归约或聚合,MoE expert parallel 需要两次 all-to-all,pipeline parallel 主要传点对点激活。它们调用的原语可能相同,但时间形态不同:梯度同步可以容忍较大的批量和一定的延迟;decode 的逐 token TP 则对启动开销与尾延迟敏感;MoE 同时受 payload、expert 不均衡与 incast 影响。
MPI 适合许多训练或模拟程序的进程编排、控制和数据分区表达,也可由实现选择 GPU-aware 路径。NCCL 更贴近 GPU tensor 与 CUDA stream 的执行依赖。两者可以同时出现在生产系统中,但资源成员关系、GPU collective 和服务请求调度分别由哪一层负责,必须写清楚。
6. RDMA 是数据移动基座,不是业务一致性协议
RDMA 让端点通过已建立的队列和已注册的内存直接移动数据,减少传统 host copy 与内核路径介入。CPU 仍然负责控制和异常处理;数据面工作更多地交给 DMA、NIC 和队列系统,权限、资源注册、completion 与拥塞处理也随之成为显式对象。
AI 服务里最容易被误解的路径是 KV transfer。prefill worker 可以把完成的 KV block 分段发送给 decode worker,但接收端必须同时确认 request_id、model_epoch、block generation、长度和完成状态。RDMA 完成之后还需要 runtime commit;模型热更新、请求取消或目标重启时,旧 block 不能因为“字节没坏”而被复用。
可见条件示例: KV block is readable only when transport_completion == true AND request_id matches AND model_epoch matches AND generation matches AND destination has committed the block table 失败后重试也必须受 deadline、credit 和幂等键约束。
7. DPDK 在 AI 系统里到底放在哪里
DPDK 让应用在用户态以 poll-mode、批量 mbuf、per-core queue 和 lockless ring 方式处理 packet。它适合需要控制 packet path 的组件,例如高吞吐 ingress/egress gateway、专用 L4/L7 proxy、旁路 telemetry collector、负载发生器、协议实验平台或把请求元数据送进硬件流表的 control agent。它的价值是减少通用网络栈的调度与复制成本,并让开发者直接控制队列亲和性、批量大小和 CPU core。
但 DPDK 不应被塞进任何“看起来很快”的位置。一个普通 HTTP/gRPC 模型网关若主要耗在 TLS、鉴权、JSON、排队和模型 router,上 DPDK 不会自动改善 TTFT;它甚至可能引入 busy polling、CPU 核独占、NUMA 亲和性和运维复杂度。GPU-NIC collective 的主数据面若已由通信库和 RDMA 管理,另写一套 DPDK packet sender 通常不会替换它,反而会破坏 completion、拥塞和 GPU memory 生命周期。
| DPDK 位置 | 可能合理的职责 | 必须避免的误用 |
|---|---|---|
| API / ingress gateway | 连接分流、粗粒度限速、服务链转发、低开销包级计数 | 把 LLM 排队、鉴权和 token 调度误当 packet-processing 问题 |
| control/telemetry agent | 采集队列、流、时间戳,给 scheduler 反馈网络压力 | 把采样 counters 当作精确的 request-level 因果证据 |
| 专用数据服务 | 缓存/存储网关、私有协议实验、批量数据摄取 | 绕过对象版本、ACL、backpressure 与故障恢复 |
| 测试与故障注入 | 重放 burst、构造 incast、验证 ECN/PFC/限速策略 | 用人工均匀流量替代真实 MoE/KV trace |
8. 可编程 NIC 与交换机:可卸载什么,绝不能假装卸载什么
端点与网络设备很擅长做局部、确定、可界定资源的工作:packet parsing、flow classification、转发、包级计数、时间戳、队列选择、限速、ECN 标记、隧道封装、接收端 steering,以及在明确约束下做分块聚合或协议辅助。把这类能力放近数据路径,可以减少 host 干预、缩短反馈环路、增强可观测性。
它们通常不应承担开放式业务逻辑。交换机看不到“这个 token 是否来自过期模型”“这个 Agent tool 是否有副作用”“是否应为了租户公平抢占一个长 prefill”,也不该维护无限大或任意复杂的 per-request 状态。即使实现 in-network aggregation,也要先固定 operands、顺序/精度、故障语义和 fallback;否则一旦设备重置、路径重路由或成员变化,结果正确性会变得无法证明。
边界清楚后,卸载才有办法验证。硬件负责快速执行明确动作;runtime 保持对象所有权、全局策略和异常恢复。两者通过 flow id、service class、deadline bucket、tenant class 或 transfer generation 关联,数据面无需猜测模型内部状态。
9. 训练数据面:collective、checkpoint 与网络隔离必须同时设计
训练的典型关键路径是前向/反向计算与梯度同步的交叠。optimizer、gradient shard、checkpoint 和数据读取又会形成不同的 I/O 与网络压力。把所有流量放进同一个高优先级队列,会让周期性 checkpoint 或重启恢复挤掉 latency-sensitive collective;反过来,完全压低后台流量又会导致恢复时间不可接受。
部署时应至少区分:GPU collective、模型/数据装载、checkpoint/存储、控制与管理流量。每一类都要定义目标,如带宽下限、P99、最大 burst、可抢占性和恢复优先级。MPI 或训练框架层负责集体操作的逻辑成员关系;NCCL/通信运行时选择算法与 stream;RDMA/NIC/网络设备实现传输与流控;scheduler 负责在作业、租户与故障域之间做资源预算。
可观测性也要按这条边界组织。单看 GPU utilization 看不出某个 all-reduce 被存储流量压住;单看链路利用率也看不出是梯度、KV 还是 checkpoint 占满了队列。要让同一个 trace 可以从训练 step 到 communicator,再到 NIC queue、交换端口和速率策略。
10. 推理数据面:TP、MoE、KV 传输的网络形态不同
推理不是训练通信的缩小版。TP 在 decode 时几乎每层发生,消息较小但同步频繁,宜尽量留在低延迟 scale-up 域;MoE 的 all-to-all 一方面需要大双向 bisection bandwidth,另一方面受 expert 热点决定,均匀 microbenchmark 往往失真;P/D 分离则把一次大段 KV transfer 放在 prefill 和 decode 之间,最怕长 prompt 同时结束时向同一 decode pool incast。
所以同一台 NIC 上的流量也要有不同 policy。TP collective 可能需要最低延迟和快速失败;MoE traffic 需要按 token histogram 识别热点并控制排队;KV transfer 需要接收端 credit 与对象提交;缓存预取和后台迁移应该在 SLO 紧张时让路。把“GPU 网络带宽”作为一个全局数字会掩盖这些差异。
11. Agentic serving:网络控制面要看到“程序”,但不应把程序塞进网络
Agent 请求会经历 planner、工具调用、检索、代码执行、回退和 verifier 等多个节点。一个节点等待工具时,GPU 可能空闲而 KV 仍占内存;工具结果返回后,scheduler 需要恢复正确的模型、prefix、KV tier 和优先级。控制面因此应按程序节点记账,每个节点携带 deadline、tenant、workflow id、node id、cache reference 和副作用标记,而不能只按 HTTP request 管理。
网络可以帮助控制面:gateway 提供 admission control,NIC/交换机提供 flow/queue telemetry,DPU 可执行隔离和限速,数据服务可报告 KV transfer 的 completion 与 congestion。可是调度器仍必须决定一个慢工具是否应换出 KV、一个 verifier 是否应抢占长 prefill、一次失败是否允许重试。那些决定依赖跨节点状态和业务语义,不应交给 packet pipeline。
这套分工让网络成为一个可控资源,而不是 opaque 的“另一个等待时间”。关于程序级调度、工具等待和 KV 保留策略,请配合阅读 09 Agentic serving。
12. 性能模型:吞吐、延迟与 CPU 周期三者不能互相代替
DPDK 常被用来降低 packet processing 的每包开销,RDMA 常被用来减少 host data copy,NCCL 常被用来提高 GPU collective 效率;这些都不是端到端加速的同义词。一个系统的时延包含排队、批量等待、NUMA/PCIe 路径、DMA、序列化、网络 hop、重传、completion 轮询,以及下一阶段的依赖等待。
例如 busy polling 可能把平均 packet latency 降低,却长期占满一个或多个 core;更大的 batch 可能提升有效带宽,却把小请求的 tail 拉高;更激进的 in-network aggregation 可能减少网络字节,却增加精度、成员重配置和失败恢复成本。评估必须把这些代价放在同一 SLO 与预算里。
13. 多租户隔离与 QoS:优先级标签必须贯穿端到端
AI 数据中心在高峰时常遇到多类流量同时 burst:EP all-to-all、KV transfer、训练 checkpoint、模型加载和租户 API 流量共用队列,即使链路没有永久失效,也会产生严重拥塞。仅在服务端设置“高优先级”不够;NIC、ToR 与 spine 还需要一致的 class、rate 和 buffer policy。
一个可审计的 QoS 设计至少包含:流量分类的来源、每类可用带宽/队列/credit、拥塞时的降级顺序、租户上限、burst 规则、控制面例外以及观测指标。不要把用户 request id 原样塞进所有包头;应使用可控且隐私可接受的 service class/flow key,把精确的业务映射留在 trusted control plane。
- 硬实时近似类:decode 的逐层通信、明确 deadline 的 KV completion;追求低尾延迟。
- 高吞吐类:prefill、MoE 大 payload、训练梯度;追求可预测的有效带宽。
- 后台类:checkpoint、缓存迁移、数据导入、镜像拉取;可让路且需限速。
- 控制类:membership、健康检查、元数据提交;字节少但不能与数据面拥塞一起消失。
14. 可观测性:从一个慢 token 追到一个慢队列
可观测系统应让应用、运行时、GPU、NIC 和网络共享可关联的时间轴。最小关联键可以是 request_id、workflow_id、transfer_id、communicator_epoch 与 model_epoch 的组合。它们不必全部进入数据包,但 control plane 必须能把各层的局部事件连接起来。
| 层 | 应记录什么 | 可以回答的问题 |
|---|---|---|
| 服务 / Agent | TTFT、TPOT、workflow deadline、取消/重试、工具等待 | 用户为什么觉得慢,是否是模型之前就排队 |
| 运行时 | collective 类型、bytes、rank group、算法、KV commit | 慢的是 TP、EP、P/D 还是调度选择 |
| GPU | stream wait、kernel duration、SM/HBM 指标、pack/unpack | 通信是否真的与计算重叠,谁是 straggler |
| NIC / DPU | queue depth、CQ delay、retry、DMA fault、ECN/CNP/PFC | 是端点排队、拥塞还是设备异常 |
| 交换网络 | port utilization、buffer watermark、drop/mark、路径不均衡 | burst 从哪里进入,哪个 rail 或路径形成热点 |
平均利用率会掩盖同步系统的尾部行为:collective 总时间由最慢 rank 决定,KV 的 P99 由最拥塞的瞬间决定。仪表盘必须能下钻到一次具体 request 或 step 的尾部事件。
15. 故障与恢复:每一层都需要自己的超时,但超时不能各自乱重试
NIC reset、链路 flap、远端 worker 重启、queue overflow、communicator 成员变化、模型 epoch 更新和 Agent 工具超时都会表现为“下游没有返回”。如果每层立刻独立重试,系统可能把一次短暂拥塞放大为重复流量、重复工具副作用或污染的 KV 可见性。
因此,控制面应给每个可恢复对象分配 epoch、generation、deadline 和 owner。端点传输层报告它知道的失败;运行时判断 collective 是否可重建、KV 是否可重新计算、请求是否应换 worker;Agent 层才决定工具动作能否重放。对有副作用的工具或写操作,网络层的“至少一次送达”绝不等价于业务层的“可以重试”。
失败处理顺序示例: detect → stop new posts → preserve evidence → classify scope → invalidate affected epoch/generation → retry only idempotent units → rebuild communicator / reroute / recompute → expose committed result 不能证明可重试的对象,应 fail closed,而不是静默重复。
16. 一套可落地的责任划分
- 模型 runtime:拥有 tensor/KV 语义、communicator 生命周期、stream 依赖和对象提交条件。
- 服务 scheduler:拥有请求、租户、deadline、Agent program、admission 与 placement 决策。
- 通信库与端点:拥有 collective algorithm、DMA buffer、queue、completion、端点重试与 health signal。
- 网络控制面:拥有拓扑、路由、service class、速率/拥塞策略、设备配置与容量模型。
- DPDK / gateway / DPU:只在明确的 packet/control hotspot 上承担转发、采集、限速、隔离或协议辅助,并保留 host fallback。
- 可观测系统:保存跨层关联与容量证据,避免让调优依赖猜测。
这份责任划分同时定义了故障边界。每个动作都应有唯一 owner,每个跨层状态都要有版本和可观察的提交点。满足这些条件后,增加 DPDK、DPU 或可编程交换机才是受控扩展;否则只是把关键路径转移到更难调试的位置。
17. 2026 状态:网络正在更贴近 AI runtime,但还不是统一替代栈
截至 2026,AI cluster 的公开方向很清楚:更强的 scale-up 互联、更高带宽的 scale-out Ethernet/IB、GPU/NIC 更直接的数据路径、DPU/SmartNIC 卸载、面向 AI 流量的可靠传输与拥塞控制、以及以 telemetry 驱动的 runtime placement。网络不再只是“尽量不成为瓶颈”的背景设施,而是模型并行、KV 共享和多租户 SLO 的显式输入。
可编程设备仍不能随意互换。NIC firmware、PCIe/IOMMU 拓扑、GPU driver、通信库、交换 ASIC、拥塞策略、协议版本和运维工具必须成组验证。在单机架、单模型、均匀 payload 下成立的优化,换到多 rail、MoE 热点、混合训练推理或 Agent burst 后可能失效。2026 年较稳妥的做法是固定 workload 和正确性条件,验证局部 offload,再用 failure injection 与 P99 决定是否扩大范围。
18. 评审与上线检查清单
- 为每条通信路径写清楚对象、语义完成条件、buffer owner、epoch/generation 和超时 owner。
- 画出真实 GPU、PCIe root complex、NIC、DPU、交换机与 rail 拓扑,不用设备编号推断亲和性。
- 分别 benchmark TP 小消息、EP 非均匀 all-to-all、KV burst、checkpoint 和混合流量的 P50/P95/P99。
- 使用真实 MoE token histogram、Agent workflow 和上下文长度分布,而不是只有均匀流量。
- 对 DPDK busy polling、NUMA、core pinning、队列数和 backpressure 做容量预算。
- 验证 QoS 标签从服务入口到 NIC/交换端口是否一致,并测试拥塞与 background traffic。
- 注入 NIC reset、链路抖动、worker 重启、epoch 切换、CQ 堆积、目标 OOM 和请求取消。
- 保留 host/runtime fallback;没有可解释回滚路径的硬件卸载不应成为生产关键依赖。
19. 公众号选题映射:网络栏目和 2025 文章如何进入这条主线
以下条目只保留用户提供的栏目名称,以及公开存档中的标题、日期和链接。本页没有复制任何原文、图片或图表;栏目名称用于把学习入口与本页的分层模型对应起来,而不把标题当作标准或实现保证。
| 索引入口 / 原文标题 | 对应本页问题 | 使用边界 |
|---|---|---|
| 网络架构师 | 如何把业务目标、拓扑、容量、队列和故障域放进同一张设计图。 | 用户提供的公众号总索引分支;标题级导航。 |
| 可编程网络 | 何时把分类、遥测、限速或局部处理下沉到 NIC/交换设备,何时必须留在 runtime。 | 用户提供的公众号总索引分支;标题级导航。 |
| MPI | 进程/communicator 语义如何与 GPU collective、控制面和故障恢复衔接。 | 用户提供的公众号总索引分支;标题级导航。 |
| DPDK | 用户态 packet pipeline 在 gateway、telemetry、测试和专用数据服务中的正确边界。 | 用户提供的公众号总索引分支;标题级导航。 |
| 网络设备测试及运维 | 如何把 benchmark、故障注入、队列遥测和 roll-back 变成上线条件。 | 用户提供的公众号总索引分支;标题级导航。 |
| 同构视角下的异构计算:谈谈 AI 的软硬件交付界面,GPGPU or DSA 2025-07-19 · 2247494485:1 | 为何交付接口、对象所有权与 fallback 比“某芯片能否卸载”更关键。 | 第三方公开存档;只用作标题级学习索引。 |
| 谈谈 AI 时代的 CIPU 2.0 2025-04-10 · 2247493847:1 | 端点数据路径、控制面、可靠性和隔离应如何划分责任。 | 第三方公开存档;只用作标题级学习索引。 |
20. Mainline 连接:把网络知识放回推理全链路
通信与拓扑
07 通信与拓扑:collective、NVLink、RDMA 与 TP/EP/PD 放置。
Agent 调度
09 Agentic serving:工具等待、程序级优先级与 KV 状态。
训练与推理集群
18 训练与推理共用集群:共享资源、QoS 与故障域。
文章索引
相关文章索引:按模型、GPU、网络、存储和基础设施继续浏览。
来源边界
来源与证据:区分官方资料、论文与标题级索引。
主线入口
Mainline 总目录:从架构、算子、缓存、调度到数据中心。
21. 资料边界与延伸来源
| 来源 | 本页用途 |
|---|---|
| MPI Forum documents | MPI 语义与术语的规范入口;具体实现行为仍应看实现文档。 |
| NCCL User Guide | GPU collective、communicator、stream 与调试接口的官方入口。 |
| NVIDIA GPUDirect RDMA documentation | GPU 与第三方设备直接数据路径及平台限制。 |
| NVIDIA GPUDirect RDMA, Figure 1 | 本页 GPU/第三方设备直接 DMA 图的原始驱动模型出处。 |
| DPDK Guides | mbuf、queue、poll-mode 与应用开发的官方入口。 |
| DPDK Programmer’s Guide 2.0, Figure 1 | 用户态 EAL、memory、ring、mempool 与 PMD 的基础组件图;作为历史架构基线。 |
| Ultra Ethernet Consortium specification history | 2026 公开规范仍持续演进的版本入口。 |
本页的系统解释不宣称任一实现、NIC、DPU 或可编程交换机同时提供全部能力。部署时应以目标硬件与软件版本的 release note、支持矩阵、拓扑发现和本地 failure-injection 结果为最终依据。