

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 将 P6e-GB200 UltraServer 与 Amazon EKS 搭配使用
<a name="ml-eks-nvidia-ultraserver"></a>

本主题介绍如何配置和使用 Amazon EKS 与 P6e-GB200 UltraServer。配备 4 个 NVIDIA Blackwell GPU 的 `p6e-gb200.36xlarge` 实例类型仅作为 p6e-GB200 UltraServer 提供。P6e-GB200 UltraServer 有两种类型。`u-p6e-gb200x36` UltraServer 有 9 个 `p6e-gb200.36xlarge` 实例，`u-p6e-gb200x72` UltraServer 有 18 个 `p6e-gb200.36xlarge` 实例。

要了解更多信息，请参阅 [Amazon EC2 P6e-GB200 UltraServer 网页](https://aws.amazon.com/ec2/instance-types/p6/)。

## 注意事项
<a name="nvidia-ultraserver-considerations"></a>
+ Amazon EKS 支持适用于 Kubernetes 1.33 及更高版本的 P6e-GB200 UltraServer。此 Kubernetes 版本支持[动态资源分配](https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/)（DRA），在 EKS 和 [AL2023 EKS 优化版加速 AMI](https://docs.aws.amazon.com/eks/latest/userguide/ml-eks-optimized-ami.html) 中默认已启用。将 P6e-GB200 UltraServer 与 EKS 搭配使用才能实现 DRA。Karpenter 或 EKS 自动模式不支持 DRA，建议在将 p6e-GB200 UltraServer 与 EKS 搭配使用时，使用 EKS 自主管理型节点组或 EKS 托管式节点组。
+ p6e-GB200 UltraServer 可通过 [EC2 机器学习容量块](https://aws.amazon.com/ec2/capacityblocks/)提供。有关如何使用容量块启动 EKS 节点的信息，请参阅[管理 Amazon EKS 上人工智能/机器学习工作负载的计算资源](ml-compute-management.md)。
+ 将 EKS 托管式节点组与容量块搭配使用时，必须使用自定义启动模板。升级采用 P6e-GB200 UltraServer 的 EKS 托管式节点组时，在升级前必须将所需的节点组大小设置为 `0`。
+ 建议使用 EKS 优化版加速 AMI 的 AL2023 ARM NVIDIA 变体。此 AMI 包括使用 p6e-GB200 UltraServer 所需的节点组件和配置。如果您决定构建自己的 AMI，则应负责安装和验证节点与系统软件（包括驱动程序）的兼容性。有关更多信息，请参阅 [为 GPU 实例使用 EKS 优化版加速 AMI](ml-eks-optimized-ami.md)。
+ 建议使用 EKS 优化版 AMI 版本 `v20251103` 或更高版本，其中包括 NVIDIA 驱动程序版本 580。此 NVIDIA 驱动程序版本启用了基于驱动程序的一致性内存管理（CDMM），可解决潜在的内存过度报告问题。启用 CDMM 后，不支持以下功能：NVIDIA 多实例 GPU（MIG）和 vGPU。有关 CDMM 的更多信息，请参阅 [NVIDIA Coherent Driver-based Memory Management (CDMM)](https://nvdam.widen.net/s/gpqp6wmz7s/cuda-whitepaper—​cdmm-pdf)。
+ 在将 [NVIDIA GPU 操作器](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/overview.html)与 EKS 优化版 AL2023 NVIDIA AMI 搭配使用时，必须禁用驱动程序和工具包的操作器安装功能，因为这些驱动程序和工具包已包含在 AMI 中。EKS 优化版 AL2023 NVIDIA AMI 不包括 NVIDIA Kubernetes 设备插件或 NVIDIA DRA 驱动程序，这些插件和驱动程序必须单独安装。
+ 每个 `p6e-gb200.36xlarge` 实例最多可以配置 17 张网卡，并且可以利用 EFA 在 UltraServer 之间进行通信。工作负载网络流量可以跨 UltraServer 进行传输，但为了获得最高性能，建议在同一个 UltraServer 中计划工作负载，并利用 IMEX 进行 UltraServer 内的 GPU 通信。有关更多信息，请参阅 [P6e-GB200 实例的 EFA 配置](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html#efa-for-p6e)。
+ 每个 `p6e-gb200.36xlarge` 实例有 3 个 7.5 TB 的[实例存储空间](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)。默认情况下，EKS 优化版 AMI 不会格式化和挂载实例存储。节点的临时存储空间可以在请求临时存储的容器组（pod）和下载到该节点的容器映像之间共享。如果使用 AL2023 EKS 优化版 AMI，则可以通过将 [NodeConfig](https://docs.aws.amazon.com/eks/latest/eksctl/node-bootstrapping.html#configuring-the-bootstrapping-process) 中的实例本地存储策略设置为 RAID0，将该 AMI 配置为用户数据中节点引导的一部分。如果设置为 RAID0 条带，则实例会存储并配置容器运行时和 kubelet 以使用此临时存储。

## 组件
<a name="nvidia-ultraserver-components"></a>

建议使用以下组件在 EKS 上使用 p6e-GB200 UltraServer 运行工作负载。可以选择使用 [NVIDIA GPU 操作器](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/overview.html)来安装 NVIDIA 节点组件。在将 NVIDIA GPU 操作器与 EKS 优化版 AL2023 NVIDIA AMI 搭配使用时，必须禁用驱动程序和工具包的操作器安装功能，因为这些驱动程序和工具包已包含在 AMI 中。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/ml-eks-nvidia-ultraserver.html)

上表中的节点组件可执行以下功能：
+  **VPC CNI**：将 VPC IP 分配为在 EKS 上运行的容器组（pod）的主网络接口
+  **EFA 设备插件**：将 EFA 设备分配为在 EKS 上运行的容器组（pod）的辅助网络。负责跨 P6e-GB200 UltraServer 传输的网络流量。对于多节点工作负载，UltraServer 内的 GPU 到 GPU 流量可以流经多节点 NVLink。
+  **NVIDIA Kubernetes 设备插件**：将 GPU 分配为在 EKS 上运行的容器组（pod）的设备。建议使用 NVIDIA Kubernetes 设备插件，直到 NVIDIA DRA 驱动程序 GPU 分配功能结束实验阶段。有关更新后的信息，请参阅 [NVIDIA DRA 驱动程序版本](https://github.com/NVIDIA/k8s-dra-driver-gpu/releases)。
+  **NVIDIA DRA 驱动程序**：启用 ComputeDomain 自定义资源，便于创建 IMEX 域，这些域可跟踪在 p6e-GB200 UltraServer 上运行的工作负载。
  + ComputeDomain 资源描述了节点间内存交换（IMEX）域。将具有 ComputeDomain 的 ResourceClaim 的工作负载部署到集群时，NVIDIA DRA 驱动程序会自动创建在匹配节点上运行的 IMEX DaemonSet，并在工作负载启动之前在节点之间建立 IMEX 通道。要了解有关 IMEX 的更多信息，请参阅[适用于多节点 NVLink 系统的 NVIDIA IMEX 概述](https://docs.nvidia.com/multi-node-nvlink-systems/imex-guide/overview.html)。
  + NVIDIA DRA 驱动程序使用 NVIDIA GFD 应用的 clique ID 标签 (`nvidia.com/gpu.clique`)，该标签传递了网络拓扑和 NVLink 域的知识。
  + 最佳做法是为每个工作负载作业创建 ComputeDomain。
+  **NVIDIA 节点功能发现（NFD）**：GFD 需要依赖项才能根据发现的节点级属性应用节点标签。
+  **NVIDIA GPU 功能发现（GFD）**：将称为 `nvidia.com/gpu.clique` 的 NVIDIA 标准拓扑标签应用于节点。同一个 `nvidia.com/gpu.clique` 内的节点具有多节点 NVLink 可访问性，您可以在应用程序中使用容器组（pod）亲和性，将容器组（pod）调度到同一 NVLink 域。

## 过程
<a name="nvidia-ultraserver-procedure"></a>

以下部分假设您有一个运行 Kubernetes 1.33 或更高版本的 EKS 集群，其中一个或多个节点组的 p6e-GB200 UltraServer 运行 AL2023 ARM NVIDIA EKS 优化版加速 AMI。有关 EKS 自主管理型节点和托管式节点组的先决条件步骤，请参阅[管理 Amazon EKS 上人工智能/机器学习工作负载的计算资源](ml-compute-management.md)中的链接。

以下步骤使用下面的组件。


| 名称 | 版本 | 说明 | 
| --- | --- | --- | 
|  NVIDIA GPU 操作器  |  25.3.4\$1  |  用于管理所需插件（例如 NVIDIA Kubernetes 设备插件和 NFD/GFD）的生命周期。  | 
|  NVIDIA DRA 驱动程序  |  25.8.0\$1  |  用于 ComputeDomain CRD 和 IMEX 域管理。  | 
|  EFA 设备插件  |  0.5.14\$1  |  用于跨 UltraServer 通信。  | 

## 安装 NVIDIA GPU 操作器
<a name="nvidia-ultraserver-gpu-operator"></a>

NVIDIA GPU 操作器可简化在 Kubernetes 集群中使用 GPU 所需的组件的管理。由于 NVIDIA GPU 驱动程序和容器工具包是作为 EKS 优化版加速 AMI 的一部分安装，因此必须在 Helm 值配置中将这些对象设置为 `false`。

1. 使用以下配置创建名为 `gpu-operator-values.yaml` 的 Helm 值文件。

   ```
   devicePlugin:
     enabled: true
   nfd:
     enabled: true
   gfd:
     enabled: true
   driver:
     enabled: false
   toolkit:
     enabled: false
   migManager:
     enabled: false
   ```

1. 使用在上一步中创建 `gpu-operator-values.yaml` 文件为集群安装 NVIDIA GPU 操作器。

   ```
   helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
   helm repo update
   ```

   ```
   helm install gpu-operator nvidia/gpu-operator \
    --namespace gpu-operator \
    --create-namespace \
    --version v25.3.4 \
    --values gpu-operator-values.yaml
   ```

## 安装 NVIDIA DRA 驱动程序
<a name="nvidia-ultraserver-dra-driver"></a>

自 NVIDIA GPU 操作器版本 `v25.3.4` 起，必须单独安装 NVIDIA DRA 驱动程序。建议持续关注 NVIDIA GPU 操作器[发行说明](https://github.com/NVIDIA/gpu-operator/releases)，因为此内容在未来的版本中可能会发生变更。

1. 使用以下配置创建名为 `dra-values.yaml` 的 Helm 值文件。请注意 `nodeAffinity` 和 `tolerations` 会将 DRA 驱动程序配置为仅在搭载 NVIDIA GPU 的节点上部署。

   ```
   resources:
     gpus:
       enabled: false # set to false to disable experimental gpu support
     computeDomains:
       enabled: true
   
   controller:
     nodeSelector: null
     affinity: null
     tolerations: []
   
   kubeletPlugin:
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: "nvidia.com/gpu.present"
               operator: In
               values:
               - "true"
     tolerations:
       - key: "nvidia.com/gpu"
         operator: Exists
         effect: NoSchedule
   ```

1. 使用在上一步中创建的 `dra-values.yaml` 文件为集群安装 NVIDIA DRA 驱动程序。

   ```
   helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
   helm repo update
   ```

   ```
   helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
     --version="25.8.0" \
     --namespace nvidia-dra-driver-gpu \
     --create-namespace \
     -f dra-values.yaml
   ```

1. 安装后，DRA 驱动程序会创建 `DeviceClass` 资源，使 Kubernetes 能够了解和分配 `ComputeDomain` 资源，并使 P6e-GB200 UltraServer 上的分布式 GPU 工作负载可以进行 IMEX 管理。

   使用以下命令确认 DRA 资源是否可用。

   ```
   kubectl api-resources | grep resource.k8s.io
   ```

   ```
   deviceclasses           resource.k8s.io/v1  false        DeviceClass
   resourceclaims          resource.k8s.io/v1  true         ResourceClaim
   resourceclaimtemplates  resource.k8s.io/v1  true         ResourceClaimTemplate
   resourceslices          resource.k8s.io/v1  false        ResourceSlice
   ```

   ```
   kubectl get deviceclasses
   ```

   ```
   NAME
   compute-domain-daemon.nvidia.com
   compute-domain-default-channel.nvidia.com
   ```

## 安装 EFA 设备插件
<a name="nvidia-ultraserver-efa-plugin"></a>

要在 UltraServer 之间使用 EFA 通信，必须安装适用于 EFA 的 Kubernetes 设备插件。P6e-GB200 实例最多可以配置 [17 张网卡](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html#efa-for-p6e)，并且主 NCI（索引 0）必须是类型 `interface` 且支持高达 100 Gbps 的 ENA 带宽。在节点预调配期间，根据您的要求配置 EFA 和 ENA 接口。查看 [P6e-GB200 实例的 EFA 配置 AWS 文档](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html#efa-for-p6e)，了解有关 EFA 配置的更多详细信息。

1. 使用以下配置创建名为 `efa-values.yaml` 的 Helm 值文件。

   ```
   tolerations:
     - key: nvidia.com/gpu
       operator: Exists
       effect: NoSchedule
   ```

1. 使用在上一步中创建的 `dra-values.yaml` 文件为集群安装 NVIDIA DRA 操作器。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   helm repo update
   ```

   ```
   helm install efa eks/aws-efa-k8s-device-plugin -n kube-system \
     --version="0.5.14" \
     -f efa-values.yaml
   ```

   例如，如果您在每个 [NCI 组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html#efa-for-p6e)中为实例配置了 1 个仅限 EFA 的接口，则在描述节点时，预计每个节点会有 4 个可分配的 EFA 设备。

   ```
   kubectl describe node/<gb200-node-name>
   ```

   ```
   Capacity:
     ...
     vpc.amazonaws.com/efa:  4
   Allocatable:
     ...
     vpc.amazonaws.com/efa:  4
   ```

## 通过多节点 NVLink 验证 IMEX
<a name="nvidia-ultraserver-imex-nvlink"></a>

要进行多节点 NVLINK NCCL 测试和其他微基准测试，请查看 [awesome-distributed-training](https://github.com/aws-samples/awsome-distributed-training/tree/main/micro-benchmarks/nccl-tests) GitHub 存储库。以下步骤说明如何使用 nvbandwidth 运行多节点 NVLink 测试。

1. 要在 NVL72 域中的两个节点上运行多节点带宽测试，请先安装 MPI Operator：

   ```
   kubectl create -f https://github.com/kubeflow/mpi-operator/releases/download/v0.7.0/mpi-operator.yaml
   ```

1. 创建一个名为`nvbandwidth-test-job.yaml` 的 Helm 值文件，用于定义测试清单。请注意在具有多节点 NVLink 可访问性的同一 NVLink 域中调度 Worker 的 `nvidia.com/gpu.clique` 容器组（pod）亲和性。以下示例使用 cuMemcpyAsync 运行了多节点设备到设备 CE Read memcpy 测试，并将结果打印在日志中。

   自 NVIDIA DRA 驱动程序版本 `v25.8.0` 起，ComputeDomains 具有弹性，且 `.spec.numNodes` 可在 ComputeDomain 定义中设置为 `0`。查看最新的 [NVIDIA DRA 驱动程序发行说明](https://github.com/NVIDIA/k8s-dra-driver-gpu)以获取更新。

   ```
   ---
   apiVersion: resource.nvidia.com/v1beta1
   kind: ComputeDomain
   metadata:
     name: nvbandwidth-test-compute-domain
   spec:
     numNodes: 0 # This can be set to 0 from NVIDIA DRA Driver version v25.8.0+
     channel:
       resourceClaimTemplate:
         name: nvbandwidth-test-compute-domain-channel
   
   ---
   apiVersion: kubeflow.org/v2beta1
   kind: MPIJob
   metadata:
     name: nvbandwidth-test
   spec:
     slotsPerWorker: 4 # 4 GPUs per worker node
     launcherCreationPolicy: WaitForWorkersReady
     runPolicy:
       cleanPodPolicy: Running
     sshAuthMountPath: /home/mpiuser/.ssh
     mpiReplicaSpecs:
       Launcher:
         replicas: 1
         template:
           metadata:
             labels:
               nvbandwidth-test-replica: mpi-launcher
           spec:
             affinity:
               nodeAffinity:
                 requiredDuringSchedulingIgnoredDuringExecution:
                   nodeSelectorTerms:
                   - matchExpressions:
                     # Only schedule on NVIDIA GB200/GB300 nodes
                     - key: node.kubernetes.io/instance-type
                       operator: In
                       values:
                       - p6e-gb200.36xlarge
                       - p6e-gb300.36xlarge
             containers:
             - image: ghcr.io/nvidia/k8s-samples:nvbandwidth-v0.7-8d103163
               name: mpi-launcher
               securityContext:
                 runAsUser: 1000
               command:
               - mpirun
               args:
               - --bind-to
               - core
               - --map-by
               - ppr:4:node
               - -np
               - "8"
               - --report-bindings
               - -q
               - nvbandwidth
               - -t
               - multinode_device_to_device_memcpy_read_ce
       Worker:
         replicas: 2 # 2 worker nodes
         template:
           metadata:
             labels:
               nvbandwidth-test-replica: mpi-worker
           spec:
             affinity:
               nodeAffinity:
                 requiredDuringSchedulingIgnoredDuringExecution:
                   nodeSelectorTerms:
                   - matchExpressions:
                     # Only schedule on NVIDIA GB200/GB300 nodes
                     - key: node.kubernetes.io/instance-type
                       operator: In
                       values:
                       - p6e-gb200.36xlarge
                       - p6e-gb300.36xlarge
               podAffinity:
                 requiredDuringSchedulingIgnoredDuringExecution:
                 - labelSelector:
                     matchExpressions:
                     - key: nvbandwidth-test-replica
                       operator: In
                       values:
                       - mpi-worker
                   topologyKey: nvidia.com/gpu.clique
             containers:
             - image: ghcr.io/nvidia/k8s-samples:nvbandwidth-v0.7-8d103163
               name: mpi-worker
               securityContext:
                 runAsUser: 1000
               env:
               command:
               - /usr/sbin/sshd
               args:
               - -De
               - -f
               - /home/mpiuser/.sshd_config
               resources:
                 limits:
                   nvidia.com/gpu: 4  # Request 4 GPUs per worker
                 claims:
                 - name: compute-domain-channel # Link to IMEX channel
             resourceClaims:
             - name: compute-domain-channel
               resourceClaimTemplateName: nvbandwidth-test-compute-domain-channel
   ```

1. 创建 ComputeDomain，然后使用以下命令启动作业。

   ```
   kubectl apply -f nvbandwidth-test-job.yaml
   ```

1. 创建 ComputeDomain 时，可以看到工作负载的 ComputeDomain 有两个节点：

   ```
   kubectl get computedomains.resource.nvidia.com -o yaml
   ```

   ```
   status:
     nodes:
     - cliqueID: <ClusterUUID>.<Clique ID>
       ipAddress: <node-ip>
       name: <node-hostname>
     - cliqueID: <ClusterUUID>.<Clique ID>
       ipAddress: <node-ip>
       name: <node-hostname>
     status: Ready
   ```

1. 使用以下命令查看作业结果。

   ```
   kubectl logs --tail=-1 -l job-name=nvbandwidth-test-launcher
   ```

   成功的测试会显示多节点 memcpy 测试的带宽统计数据，单位为 GB/秒。成功测试输出的示例如下。

   ```
   ...
   nvbandwidth Version: ...
   Built from Git version: ...
   
   MPI version: ...
   CUDA Runtime Version: ...
   CUDA Driver Version: ...
   Driver Version: ...
   
   Process 0 (nvbandwidth-test-worker-0): device 0: NVIDIA GB200 (...)
   Process 1 (nvbandwidth-test-worker-0): device 1: NVIDIA GB200 (...)
   Process 2 (nvbandwidth-test-worker-0): device 2: NVIDIA GB200 (...)
   Process 3 (nvbandwidth-test-worker-0): device 3: NVIDIA GB200 (...)
   Process 4 (nvbandwidth-test-worker-1): device 0: NVIDIA GB200 (...)
   Process 5 (nvbandwidth-test-worker-1): device 1: NVIDIA GB200 (...)
   Process 6 (nvbandwidth-test-worker-1): device 2: NVIDIA GB200 (...)
   Process 7 (nvbandwidth-test-worker-1): device 3: NVIDIA GB200 (...)
   
   Running multinode_device_to_device_memcpy_read_ce.
   memcpy CE GPU(row) -> GPU(column) bandwidth (GB/s)
              0         1         2         3         4         5         6         7
    0       N/A    821.45    822.18    821.73    822.05    821.38    822.61    821.89
    1    822.34       N/A    821.67    822.12    821.94    820.87    821.53    822.08
    2    821.76    822.29       N/A    821.58    822.43    821.15    821.82    822.31
    3    822.19    821.84    822.05       N/A    821.67    821.23    820.95    822.47
    4    821.63    822.38    821.49    822.17       N/A    821.06    821.78    822.22
    5    822.08    821.52    821.89    822.35    821.27       N/A    821.64    822.13
    6    821.94    822.15    821.68    822.04    821.39    820.92       N/A    822.56
    7    822.27    821.73    822.11    821.86    822.38    821.04    821.49       N/A
   
   SUM multinode_device_to_device_memcpy_read_ce ...
   
   NOTE: The reported results may not reflect the full capabilities of the platform.
   Performance can vary with software drivers, hardware clocks, and system topology.
   ```

1. 测试完成后，使用以下命令将其删除。

   ```
   kubectl delete -f nvbandwidth-test-job.yaml
   ```