开发者生态
evening
高性能 EP 内核剖析
2026-06-10
1 阅读
kkm
剖析高性能 EP 内核 2026 年 6 月 10 日 · 阅读时间 19 分钟 · 封面:“Estación telefónicacentral en Paris”,来自 El mundo físico (1882),来自 Wikimedia Commons。大语言模型很大。因为它们很大,所以我们需要大量 GPU 来运行它们。如果 LLM 推理是“令人尴尬的并行”,并且我们总是可以在不同的 GPU 上计算独立的事物,那就太好了。但可惜的是,要在 LLM 推理中使用大量 GPU,我们需要让这些 GPU 相互通信。有很多不同的方法可以让不同的 GPU 协同工作:张量并行、管道并行、上下文并行、专家并行等。所有这些都有自己的用处。但对于 MoE 模型来说,在 MoE 层中,当您想要大规模服务时,“宽专家并行”(wideEP) 才是王道。请参阅 vLLM 的原始 DeepSeek 大规模服务帖子,了解生产规模的演示:在 H200 集群上每 GPU 2.2k 令牌/秒的 DeepSeek,采用 WideEP 和数据并行注意力机制。 。其他类型的并行性都需要 GPU 之间的通信,但它们的模式由架构固定:谁发送、谁接收以及接收多少,在前向传递开始之前都是已知的,并且每一步都是相同的。通信可以作为标准集体运行。专家并行性是不同的。哪些令牌需要到达哪些 GPU 由路由器根据运行时的数据决定,每个 MoE 层中的数据都是新鲜的。并且令牌可以从某个地方到达:我们假设 DeepSeek 所服务的“数据并行注意力”安排,其中每个令牌恰好位于一个等级上(一个等级是我们集群中某处的一个 GPU)。专家分布在相同的级别中,因此令牌及其路由到的专家通常不会位于同一位置。下面是一个示例,8 个 GPU 分布在 2 个节点上,每个 GPU 两名专家,每个等级 1 个代币,每个代币 2 个路由专家:将鼠标悬停在一个等级芯片上进行其代币的往返,或者将一个专家悬停在路由到它的所有内容上。十六位专家中有四位在这一步中没有绘制任何令牌:路由是不稳定的。调度专家组合节点 0 · NVLINK 节点 1 · NVLINK 交叉 = RDMA · 节点内 = NVLink GPU 0 GPU 1 GPU 2 GPU 3 GPU 4 GPU 5 GPU 6 GPU 7 Expert 0 Expert 1 Expert 2 Expert 3 Expert 4 Expert 5 Expert 6 Expert 7 Expert 8 Expert 9 Expert 10 Expert 11 Expert 12 Expert 13 Expert 14 Expert 15 r0 r0 r1 r1 r2 r2 r3 r3 r4 r4 r5 r5 r6 r6 r7 r7 当需要运行我们的 MoE 层时,我们的代币必须去见他们的专家,无论他们位于网络结构中的哪个位置。 EP 通信内核的工作就是实现这一点。这些内核的现代形状是由 DeepSeek 的 DeepEP 库设置的。在这篇文章中,我们将构建 DeepEP 风格的调度和组合内核的结构:首先是高吞吐量形状,然后是低延迟形状。我们要做的工作 § 让我们把设置具体化。我们有 8 个 GPU,分布在 2 个节点上,通过 RDMA 连接,每个数据并行列拥有一个 GPU。注意力机制在每个 GPU 上运行一批 B i B_i B i 令牌,其中 B i B_i B i 在 GPU 之间可能有所不同。我们正在进行专家并行,其中 E = 16 E=16 E = 16 个专家,每个 GPU 两个,其中 K = 2 K=2 K = 2 为每个令牌路由。在每个等级 r i r_i r i 处,在 EP 层的入口处,我们有一个形状为 ( B i , H ) (B_i, H) ( B i , H ) H H H 的张量是隐藏大小。 。路由层将在本地运行,并为我们提供每个令牌的专家分配。我们路由 16 中的 2:对于每个 token,路由器给我们一组长度为 16 16 16 的 logits(即形状为 ( B i , 16 ) (B_i, 16) ( B i , 16 ) )的张量,从中我们获取前 2 个标记的索引,以获得形状为 ( B i , 2 ) (B_i, 2) (B i, 2) .例如,如果令牌 k k k 被路由到专家 3 3 3 和 13 13 13 ,则行 k k k 将为 [ 3 , 13 ] [3, 13] [ 3 , 13 ] 。因此,在 EP 层的入口处,每个等级包含两件事:它产生的激活行,以及在本地路由传递之后,为每行分配的前 2 位专家。激活 (Bᵢ, H) 路由器专家逻辑 (Bᵢ, E=16) 分配 (Bᵢ, K=2) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 E: Wᵣ x H→E t0 −1.2 0.3 −0.4 2.1 0.1 −0.8 0.5 −0.2 0.9 −0.6 0.2 −1.0 0.4 1.7 −0.3 0.6 3 13 t1 2.4 0.2 −0.5 0.9 −1.1 0.3 1.9 −0.2 0.7 −0.9 0.1 0.5 −0.7 0.2 −0.1 −0.4 0 6 t2 0.1 2.2 −0.3 0.4 −0.9 0.2 −0.6 0.8 0.3 1.8 −0.2 0.6 −1.1 0.1 0.5 −0.8 1 9 t3 −0.6 0.3 2.0 0.1 −0.2 0.7 −1.0 0.4 −0.5 0.2 0.8 −0.3 0.6 1.6 −0.7 0.1 2 13 并非所有专家都居住在当地。有些住在隔壁,在相邻的 NVLink 对等点上,有些住在很远的地方,在只能通过 RDMA 访问的节点上。专家并行内核的目标是让激活到达需要去的地方,在到达那里时运行专家 GEMM,然后将它们带回家。我们在这里进行通信,通过通信可以方便地专注于我们最关心的事情:吞吐量或延迟。这种划分映射到推理的两个阶段:预填充带来大的计算