

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# Amazon EKS で P6e-GB200 UltraServer を使用する
<a name="ml-eks-nvidia-ultraserver"></a>

このトピックでは、P6e-GB200 UltraServer で Amazon EKS を設定して使用する方法について説明します。4 基の NVIDIA Blackwell GPU を搭載した `p6e-gb200.36xlarge` インスタンスタイプは、P6e-GB200 UltraServer としてのみ使用できます。P6e-GB200 UltraServer には 2 つのタイプがあります。`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 バージョンリリースでは、EKS および [AL2023 EKS 最適化高速 AMI](https://docs.aws.amazon.com/eks/latest/userguide/ml-eks-optimized-ami.html) でデフォルトで有効になっている[動的リソース割り当て](https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/) (DRA) がサポートされています。DRA は、P6e-GB200 UltraServer を EKS で使用するための要件です。DRA は Karpenter または EKS Auto Mode ではサポートされていません。EKS で P6e-GB200 UltraServer を使用する場合は、EKS セルフマネージド型ノードグループまたは EKS マネージド型ノードグループを使用することをお勧めします。
+ P6e-GB200 UltraServer は、[EC2 Capacity Blocks for ML](https://aws.amazon.com/ec2/capacityblocks/) を通じて利用できます。キャパシティブロックを使用して EKS ノードを起動する方法については、「[Amazon EKS で AI/ML ワークロードのコンピューティングリソースを管理する](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)」を参照してください。
+ NVIDIA ドライバーバージョン 580 を含む EKS 最適化 AMI リリース `v20251103` 以降を使用することをお勧めします。この 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)」を参照してください。
+ EKS 最適化 AL2023 NVIDIA AMI で [NVIDIA GPU Operator](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/overview.html) を使用する場合は、ドライバーとツールキットのオペレータインストールを無効にする必要があります。これらは既に AMI に含まれているためです。EKS 最適化 AL2023 NVIDIA AMI には、NVIDIA Kubernetes デバイスプラグインまたは NVIDIA DRA ドライバーが含まれていないため、これらは個別にインストールする必要があります。
+ 各 `p6e-gb200.36xlarge` インスタンスは、最大 17 枚のネットワークカードで構成でき、UltraServer 間の通信に EFA を活用できます。ワークロードのネットワークトラフィックは UltraServer をまたぐことができますが、最高のパフォーマンスを得るには、UltraServer 内の GPU 通信に IMEX を活用し、同じ UltraServer にワークロードをスケジュールすることをお勧めします。詳細については、「[P6e-GB200 インスタンスの EFA 設定](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html#efa-for-p6e)」を参照してください。
+ 各 `p6e-gb200.36xlarge` インスタンスには、7.5 TB の[インスタンスストアストレージ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)が 3 つあります。デフォルトでは、EKS 最適化 AMI はインスタンスストアをフォーマットおよびマウントしません。ノードのエフェメラルストレージは、エフェメラルストレージをリクエストするポッドと、ノードにダウンロードされるコンテナイメージとの間で共有できます。AL2023 EKS 最適化 AMI を使用している場合は、[NodeConfig](https://docs.aws.amazon.com/eks/latest/eksctl/node-bootstrapping.html#configuring-the-bootstrapping-process) のインスタンスローカルストレージポリシーを RAID0 に設定することで、ユーザーデータのノードブートストラップの一部として設定できます。RAID0 に設定すると、インスタンスストアがストライプ化され、コンテナランタイムおよび kubelet がこのエフェメラルストレージを使用するように設定されます。

## コンポーネント
<a name="nvidia-ultraserver-components"></a>

P6e-GB200 UltraServer を使用して EKS でワークロードを実行するには、次のコンポーネントをお勧めします。オプションで、[NVIDIA GPU Operator](https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/overview.html) を使用して NVIDIA ノードコンポーネントをインストールできます。EKS 最適化 AL2023 NVIDIA AMI で NVIDIA GPU Operator を使用する場合は、ドライバーとツールキットのオペレータインストールを無効にする必要があります。これらは既に AMI に含まれているためです。

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

上記の表のノードコンポーネントは、次の機能を実行します。
+  **VPC CNI**: EKS で実行されているポッドのプライマリネットワークインターフェイスとして VPC IP を割り当てます
+  **EFA デバイスプラグイン**: EKS で実行されているポッドのセカンダリネットワークとして EFA デバイスを割り当てます。P6e-GB200 UltraServer 間のネットワークトラフィックを担当します。マルチノードワークロードの場合、UltraServe 内の GPU 間通信はマルチノード NVLink を介して行われます。
+  **NVIDIA Kubernetes デバイスプラグイン**: EKS で実行されているポッドのデバイスとして GPU を割り当てます。NVIDIA DRA ドライバー の GPU 割り当て機能が実験段階を終えるまで、NVIDIA Kubernetes デバイスプラグインを使用することをお勧めします。最新情報については、[NVIDIA DRA ドライバーのリリース](https://github.com/NVIDIA/k8s-dra-driver-gpu/releases)を参照してください。
+  **NVIDIA DRA ドライバー**: P6e-GB200 UltraServer で実行されているワークロードに従う IMEX ドメインの作成を容易にする ComputeDomain カスタムリソースを有効にします。
  + ComputeDomain リソースは、Internode Memory Exchange (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 ドライバーは、ネットワークトポロジと NVLink ドメインに関する情報を伝達する NVIDIA GFD によって適用される clique ID ラベル (`nvidia.com/gpu.clique`) を使用します。
  + ワークロードジョブごとに ComputeDomain を作成するのがベストプラクティスです。
+  **NVIDIA Node Feature Discovery (NFD)**: 検出されたノードレベルの属性に基づいて GFD がノードラベルを適用するために必要な依存関係。
+  **NVIDIA GPU Feature Discovery (GFD)**: `nvidia.com/gpu.clique` という NVIDIA 標準のトポロジーラベルをノードに適用します。同じ `nvidia.com/gpu.clique` 内のノードにはマルチノードの NVLink 到達可能性があり、アプリケーションのポッドアフィニティを使用して、ポッドを同じ NVlink ドメインにスケジュールできます。

## 手順
<a name="nvidia-ultraserver-procedure"></a>

次のセクションでは、Kubernetes バージョン 1.33 以降を実行している EKS クラスターと、AL2023 ARM NVIDIA EKS 最適化高速 AMI を実行している P6e-GB200 UltraServer を含む 1 つ以上のノードグループがあることを前提としています。EKS セルフマネージドノードとマネージドノードグループの前提条件の手順については、「[Amazon EKS で AI/ML ワークロードのコンピューティングリソースを管理する](ml-compute-management.md)」にあるリンクを参照してください。

次の手順では、以下のコンポーネントを使用します。


| 名前 | バージョン | 説明 | 
| --- | --- | --- | 
|  NVIDIA GPU Operator  |  25.3.4 以降  |  NVIDIA Kubernetes デバイスプラグインや NFD/GFD などの必要なプラグインのライフサイクル管理用。  | 
|  NVIDIA DRA ドライバー  |  25.8.0 以降  |  ComputeDomain CRD と IMEX ドメイン管理用。  | 
|  EFA デバイスプラグイン  |  0.5.14 以降  |  UltraServer 間通信用。  | 

## NVIDIA GPU Operator をインストールする
<a name="nvidia-ultraserver-gpu-operator"></a>

NVIDIA GPU Operator は、Kubernetes クラスターで GPU を使用するために必要なコンポーネントの管理を簡素化します。NVIDIA GPU ドライバーとContainer Toolkit は、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 Operator をインストールします。

   ```
   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 Operator バージョン `v25.3.4` 以降では、NVIDIA DRA ドライバーを個別にインストールする必要があります。今後のリリースで変更される可能性があるため、NVIDIA GPU Operator の[リリースノート](https://github.com/NVIDIA/gpu-operator/releases)を追跡することをお勧めします。

1. 以下の設定を使用して、`dra-values.yaml` という名前の Helm 値ファイルを作成します。NVIDIA GPU を搭載したノードにのみデプロイするように DRA ドライバーを設定する `nodeAffinity` と `tolerations` に注意してください。

   ```
   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 ドライバーは Kubernetes が `ComputeDomain` リソースを理解して割り当てられるようにする `DeviceClass` リソースを作成し、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 インターフェイスを設定します。EFA 設定の詳細については、[「P6e-GB200 インスタンスの EFA 設定」に関する AWS ドキュメント](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-acc-inst-types.html#efa-for-p6e)を参照してください。

1. 以下の設定を使用して、`efa-values.yaml` という名前の Helm 値ファイルを作成します。

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

1. 前のステップで作成した `dra-values.yaml` ファイルを使用して、クラスターに NVIDIA DRA Operator をインストールします。

   ```
   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 ドメイン内の 2 つのノードにまたがるマルチノード帯域幅テストを実行するには、まず 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 ドメインにワーカーをスケジュールするための `nvidia.com/gpu.clique` ポッドアフィニティに注意してください。以下のサンプルでは、cuMemcpyAsync を使用してマルチノードデバイス間 CE Read memcpy テストを実行し、結果をログに出力します。

   NVIDIA DRA ドライバーバージョン `v25.8.0` 以降では、ComputeDomains は伸縮自在であり、ComputeDomain 定義で `.spec.numNodes` を `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 に 2 つのノードがあることを確認できます。

   ```
   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
   ```