最新n1n v2.0.1 正式上线!企业级大模型接口聚合平台 (LLM API Gateway),为您接入 500+ AI Models,价格低至 1 折, 立即尝试

在 Amazon EKS 上借助 EFA 与 DeepEP 实现 MoE 强化学习规模化扩展与 40% 吞吐提升

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

基于人类反馈的强化学习(RLHF)以及组相对策略优化(GRPO)已成为对齐现代大语言模型(LLM)的核心技术路径。随着模型架构逐步从传统的 Dense(密集型)架构转向混合专家模型(MoE,如 DeepSeek-V3 和 Mixtral 8x22B),强化学习采样生成(Rollout)阶段的算力与通信特征发生了根本性变化。在 MoE 模型训练中,系统需要根据 Gate 路由决策将不同的 Token 实时分发给分布在不同节点上的专家 GPU,这引发了极高频次的节点间 All-to-All 通信。

尽管自行搭建高性能云原生集群能够最大化控制训练细节,但对于多数专注于上层应用研发的团队而言,直接通过 n1n.ai 这样的统一 API 平台调用已托管的开源与商业级大模型,是更为快捷高效的选择。然而,在企业自主构建和演进 MoE 强化学习基础设施的场景下,优化底层网络通信至关重要。本文将系统阐述如何在 Amazon Elastic Kubernetes Service (Amazon EKS) 上结合 AWS Elastic Fabric Adapter (EFA)、DeepEP 通信库与 Amazon S3,构建高吞吐的 MoE 强化学习训练架构,将 RL 采样吞吐量大幅提升 40%。

MoE 强化学习训练中的通信瓶颈分析

大语言模型的强化学习流程通常分为两大阶段:Rollout(轨迹采样生成)与 Policy Update(策略梯度更新与损失计算)。在 Rollout 阶段,模型以自回归方式并发生成成千上万的 Token。在 MoE 架构中,每个生成的 Token 都必须经过路由层计算,并跨节点转发至指定的专家 GPU 上进行前向计算。

+-----------------------------------------------------------------------+
|                      MoE All-to-All Token 路由传输                     |
+-----------------------------------------------------------------------+
|  节点 A GPU 0 (Token 1 -> 专家 3)  --\\                                |
|  节点 A GPU 1 (Token 2 -> 专家 0)  ----+--> 跨节点底层网络 (EFA Fabric)|
|  节点 B GPU 0 (Token 3 -> 专家 1)  --/           |                    |
|                                                  v                    |
|                                          目标专家 GPU 接入处理         |
+-----------------------------------------------------------------------+

在跨节点多卡集群中,使用传统的通用网络通信组件(如未优化的标准 NCCL ncclAllToAll)会导致严重的传输延迟,原因包括内存多次拷贝、缓冲区分配开销大以及缺少通信与计算的重叠(Overlap)机制。在 GRPO 和 RLHF 训练中,Rollout 阶段往往占据整个训练时间的 70% 至 80%。如果节点间的 Token 路由陷入阻塞,GPU 计算单元将长时间处于等待状态,导致总体算力利用率剧烈下降。

为突破这一限制,必须在硬件网络层与软件通信库两个维度同步创新:

  1. 硬件网络加速:AWS Elastic Fabric Adapter (EFA) 提供了操作系统旁路(OS Bypass)功能的专用网络接口,基于 Libfabric 协议实现 EC2 实例(如 p4d.24xlarge 和 p5.48xlarge)之间高带宽、极低延迟的 GPU 间直接内存访问。
  2. 专用专家并行通信库:DeepEP 是专为 MoE 模型训练与推理打造的高性能开源通信库。它通过低精度(FP8/BF16)数据传输、细粒度 Buffer 管理以及算子融合技术,实现了 All-to-All 通信与 GPU GEMM 计算的高效重叠。

架构设计:Amazon EKS + EFA + DeepEP + Amazon S3

该方案构建于 Kubernetes 云原生生态之上,兼具弹性伸缩能力与高性能计算基础设施:

  • Amazon EKS:作为容器编排引擎,配合 AWS Node Termination Handler 和 Topology Aware Hints,实现分布式 Pod 的精准拓扑调度与资源生命周期管理。
  • AWS EFA 驱动与设备插件:将 EFA 硬件网卡映射至 Kubernetes 容器命名空间内,使 Pod 能够以低至 8 微秒的延迟进行跨节点 GPU-to-GPU 极速数据通信。
  • DeepEP 内核集成:作为 PyTorch 与 vLLM 采样引擎的底层动态路由扩展,替代传统的通信算子。
  • Amazon S3 与 S3 Express One Zone:提供超高吞吐量的存储支撑,用于保存 Policy Checkpoint、流式写入 Rollout Replay Buffer 以及分布式状态恢复。

网络通信拓扑与性能对比表

网络配置方案节点间网络带宽路由通信延迟计算与通信重叠能力相对 Rollout 吞吐量
标准 TCP/IP (Kubernetes CNI)10-25 Gbps较高 (> 150us)无重叠1.0x
AWS EFA + 标准 NCCL400-3200 Gbps较低 (< 20us)部分重叠1.18x
AWS EFA + DeepEP + EKS400-3200 Gbps极低 (< 8us)深度重叠 (Deep Overlap)1.40x (提升 40%)

实操指南:Amazon EKS 环境部署与代码配置

在 Amazon EKS 上构建此方案,需要完成支持 EFA 的 Pod 部署清单配置、通信内核接入以及 GRPO Rollout 流水线编写。

步骤 1:配置支持 EFA 的 Kubernetes Pod 部署文件

在容器 Pod 声明中,需要向 Kubernetes 请求 vpc.amazonaws.com/efa 硬件资源,并注入相应的 Libfabric 与 NCCL 环境变量:

apiVersion: v1
kind: Pod
metadata:
  name: moe-grpo-worker-0
  namespace: ml-training
spec:
  containers:
  - name: training-container
    image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/moe-rlhf:latest
    resources:
      limits:
        nvidia.com/gpu: "8"
        vpc.amazonaws.com/efa: "4"
        memory: "512Gi"
        cpu: "64"
      requests:
        nvidia.com/gpu: "8"
        vpc.amazonaws.com/efa: "4"
        memory: "512Gi"
        cpu: "64"
    env:
    - name: FI_PROVIDER
      value: "efa"
    - name: FI_EFA_USE_DEVICE_RDMA
      value: "1"
    - name: NCCL_BUFFSIZE
      value: "8388608"
    - name: DEEPEP_ENABLE_FP8
      value: "1"
    securityContext:
      capabilities:
        add: ["IPC_LOCK"]
    volumeMounts:
    - mountPath: /dev/infiniband
      name: infiniband-hardware
  volumes:
  - name: infiniband-hardware
    hostPath:
      path: /dev/infiniband

步骤 2:利用 DeepEP 优化 Token 路由调度代码

在 PyTorch 强化学习采样模块中,使用 DeepEP 提供的分发 API 替换默认的 torch.distributed.all_to_all 函数。以下示例演示如何调用 DeepEP 进行跨节点 Token 调度:

import torch
import torch.distributed as dist

try:
    import deepep
except ImportError:
    deepep = None

class MoERolloutRouter(torch.nn.Module):
    def __init__(self, num_experts, hidden_dim, group):
        super().__init__()
        self.num_experts = num_experts
        self.hidden_dim = hidden_dim
        self.group = group
        
    def forward(self, hidden_states, expert_indices, top_k_weights):