

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

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

# GPU アクセラレーションコンテナを実行する (EC2 G シリーズでの Windows)
<a name="ml-eks-windows-optimized-ami"></a>

**重要**  
TensorWorks による [DirectX 用 Kubernetes Device Plugin](https://github.com/TensorWorks/DirectX-Device-Plugins) は、AWS によって承認、サポート、または保守されていないサードパーティーのツールです。AWS は、このプラグインのセキュリティ、信頼性、またはパフォーマンスについて責任を負いません。

TensorWorks の DirectX 用 Kubernetes デバイスプラグインで NVIDIA GPU を使用して、Amazon EKS (Elastic Kubernetes Service) で GPU アクセラレーション Windows コンテナワークロードを実行する方法について説明します。詳細については、「[Kubernetes Device Plugin for DirectX](https://github.com/TensorWorks/DirectX-Device-Plugins)」を参照してください。

Windows コンテナの GPU アクセラレーションをセットアップするには、主に 2 つの方法があります。
+  **オプション 1**: 必要な GPU ドライバーがプリインストールされた[カスタム EKS Windows 最適化 AMI を構築](eks-custom-ami-windows.md)します。
  + このアプローチは、GPU アクセラレーションされた Windows コンテナをすぐに実行できる、一貫性のある事前設定済みの環境が必要で、カスタム AMI を構築して維持するために追加の労力を費やすことができる場合に使用します。
+  **オプション 2**: インスタンスの起動後に、必要な GPU ドライバーを EKS ワーカーノードにインストールします。
  + このアプローチは、より簡単なセットアッププロセスが必要で、新しいワーカーノードそれぞれに GPU ドライバーをインストールしたくない場合に使用します。GPU アクセラレーションのワークロードを評価またはプロトタイプ化する開発環境により適しています。

どちらのアプローチも、本ガイドで説明されているステップで活用することができます。

## 考慮事項
<a name="_considerations"></a>

本ガイドでは、NVIDIA GPU、NVIDIA GRID ドライバー、および TensorWorks による [DirectX 用 Kubernetes デバイスプラグイン](https://github.com/TensorWorks/DirectX-Device-Plugins)を使用して、Windows コンテナの GPU アクセラレーションをインストールしてセットアップする手順について説明します。これらのステップは、Amazon EKS の Windows コンテナワークロードに GPU アクセラレーションを提供するようにテストおよび検証されています。互換性のあるドライバーとデバイスプラグインの詳細については、「[既知の制限事項](#ml-eks-windows-ami-known-limitations)」を参照してください。先に進める前に、次の点に注意してください。
+ [NVIDIA GRID ドライバー](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver#nvidia-GRID-driver)を使用する G ファミリーインスタンスタイプのみが、本ガイドで動作することがテストおよび検証されています。他のインスタンスタイプとドライバーの組み合わせでも GPU アクセラレーション Windows コンテナを実行できる場合がありますが、本ガイドでは説明されていない追加の設定手順が必要になる場合があります。
+ DirectX ベースのワークロードのみが、本ガイドで動作することがテストおよび検証されています。OpenGL、Vulkan、OpenCL などの他の GPU API でも、GPU アクセラレーションされた Windows コンテナの実行と互換性がある可能性がありますが、このガイドでは説明されていない追加の設定手順が必要になる場合があります。
+ GPU アクセラレーション Windows コンテナを実行する前に注意すべき既知の制限がいくつかあります。詳細については、[既知の制限事項](#ml-eks-windows-ami-known-limitations) のセクションを参照してください。

## 前提条件
<a name="ml-eks-windows-ami-prerequisites"></a>

Amazon EKS で Windows コンテナの GPU アクセラレーションを有効にするには、手順を進める前に次の要件を準備する必要があります。
+ Kubernetes v1.27 以降で Amazon EKS クラスターを起動します。
+ Windows Server 2022 以降で Windows ノードをプロビジョニングします。
+ [G4](https://aws.amazon.com/ec2/instance-types/g4/) や [G5](https://aws.amazon.com/ec2/instance-types/g5/) などのインスタンスタイプの G ファミリーで Windows ノードをプロビジョニングします。
+ containerd `1.7.x` または `2.x.x` でコンテナランタイムを使用して Windows ノードをプロビジョニングします。(Amazon EKS 最適化 AMI 内の containerd バージョンを確認するには、「[Windows AMI バージョンに関する情報を取得する](eks-ami-versions-windows.md)」を参照してください。)

## 各 Windows ノードに GPU ドライバーをインストールする
<a name="ml-eks-windows-ami-install-gpu-driver"></a>

EKS ワーカーノードに NVIDIA GRID ドライバーをインストールするには、[Amazon EC2 インスタンスの NVIDIA ドライバー](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver.html)で説明されているステップに従ってください。[インストールオプション - オプション 3: GRID ドライバー](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-nvidia-driver#nvidia-GRID-driver)に移動し、インストール手順に従ってください。

 **Windows Server Core のためのインストール** 

デスクトップエクスペリエンスのない Windows Server Core の場合は、次のコマンドを使用して NVIDIA GRID ドライバーをサイレントインストールします。

```
$nvidiaInstallerFilePath = nvidia-driver-installer.exe # Replace with path to installer
$installerArguments = "-s -clean -noreboot -noeula"
Start-Process -FilePath $nvidiaInstallerFilePath -ArgumentList $installerArguments -Wait -NoNewWindow -PassThru
```

 **インストールを確認する** 

次の PowerShell コマンドを実行して、インスタンスの GPU に関する診断情報を表示します。

```
nvidia-smi
```

このコマンドは、NVIDIA ドライバーのバージョンと GPU ハードウェアに関する情報を表示します。このコマンドの出力が、インストールされると想定している NVIDIA GRID ドライバーのバージョンと一致することを確認します。

## 各ノードに GPU デバイスプラグインをデプロイする
<a name="ml-eks-windows-ami-deploy-gpu-driver"></a>

GPU リソースの検出と Windows ノード上のコンテナへの公開を有効にするには、デバイスプラグインが必要になります。EKS クラスターで DaemonSet として実行することで、各ワーカーノードに Tensorworks による [DirectX デバイスプラグイン](https://github.com/TensorWorks/DirectX-Device-Plugins)をデプロイします。[README.md](https://github.com/TensorWorks/DirectX-Device-Plugins/blob/main/README.md) で指定されているインストールガイドに従ってください。これには、次のステップが求められます。以下を行うことをお勧めします。
+ デバイスプラグインを `kube-system` 名前空間にデプロイします。
+ DaemonSet に適切なリソース制限を設定して、ノードでリソースを過剰に消費しないようにします。

**注記**  
デバイスプラグイン DaemonSet は、昇格された権限を持つホストプロセスコンテナとしてすべてのノードで実行されます。この DaemonSet へのアクセスを制限する RBAC コントロールを実装して、権限のあるユーザーのみが特権コマンドを実行できるようにすることをお勧めします。

GPU アクセラレーションコンテナを実行する場合、デバイスプラグインは 2 つのモードをサポートします。
+  **シングルテナンシーモード**: このモードは、すべての GPU リソースをインスタンス上の 1 つのコンテナ専用にします。次のコマンドを使用して、シングルテナンシーをサポートするデバイスプラグインをインストールします。詳細については、「README.md」を参照してください。

  ```
  kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/default-daemonsets.yml"
  ```
+  **マルチテナンシーモード**: このモードでは、インスタンス上の複数のコンテナ間で GPU リソースを共有できます。次のコマンドを使用して、マルチテナンシーをサポートするデバイスプラグインをインストールします。詳細については、「README.md」を参照してください。

  ```
  kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-inline.yml"
  ```

  または、ConfigMap を使用してマルチテナンシーを指定します。

  ```
  kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-configmap.yml"
  ```

### デバイスプラグインのデプロイの検証
<a name="ml-eks-windows-ami-verify-device-plugin"></a>

デバイスプラグインをデプロイしたら、`<namespace>` を置き換えてから次のコマンドを実行して、DirectX Device Plugin がすべての Windows ノードで正しく動作していることを確認します。

```
kubectl get ds device-plugin-wddm -n <namespace>
```

### コンテナをデプロイする準備が整っていることの検証
<a name="ml-eks-windows-ami-verify-container-deployment"></a>

デバイスプラグイン DaemonSet が GPU 搭載の Windows ワーカーノードで実行されると、次のコマンドを使用して、各ノードに割り当て可能な GPU があることを確認します。対応する番号は、各ノードの DirectX デバイスの番号と一致する必要があります。

```
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"
```

## GPU アクセラレーションを使用した Windows コンテナの実行
<a name="ml-eks-windows-ami-run-with-gpu-acceleration"></a>

ポッドを起動する前に、`.spec.containers[].resources` でリソース名 `directx.microsoft.com/display` を指定します。これは、コンテナに GPU が対応している機能が必要であることを示し、`kube-scheduler` は使用可能な GPU リソースを持つ事前設定された Windows ノードにポッドを配置しようとします。

例として、pi の値を推定するモンテカルロ・シミュレーションを実行する `Job` を起動する以下のサンプル・コマンドをご覧ください。この例は、[DirectX 用の Kubernetes Device Plugins](https://github.com/TensorWorks/DirectX-Device-Plugins) を持つ GitHub リポジトリのものです。このリポジトリには、Windows ノード GPU の機能をテストするために実行できる[複数の例](https://github.com/TensorWorks/DirectX-Device-Plugins/tree/main/examples)があります。

```
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
  name: example-cuda-montecarlo-wddm
spec:
  template:
    spec:
      containers:
      - name: example-cuda-montecarlo-wddm
        image: "index.docker.io/tensorworks/example-cuda-montecarlo:0.0.1"
        resources:
          limits:
            directx.microsoft.com/display: 1
      nodeSelector:
        "kubernetes.io/os": windows
      restartPolicy: Never
  backoffLimit: 0
EOF
```

## 既知の制限事項
<a name="ml-eks-windows-ami-known-limitations"></a>

### すべての GPU が使用可能です
<a name="ml-eks-windows-ami-gpus-usable"></a>

インスタンスのすべての GPU は、特定のコンテナに対して特定の数の GPU をリクエストした場合でも、ホストで実行中の各コンテナで使用できるようになります。さらに、デフォルトの動作では、ノードで使用可能な複数の GPU がある場合でも、ホストで実行されているすべてのコンテナがインデックス 0 の GPU を使用します。したがって、マルチ GPU タスクを正しく動作させるには、アプリケーションのコード内で使用される特定の GPU デバイスを明示的に指定する必要があります。

アプリケーションに使用するデバイスを割り当てるための正確な実装は、使用しているプログラミング言語やフレームワークによって変わります。例えば、CUDA プログラミングを使用している場合、特定の GPU を選択するために、関数 [cudaSetDevice()](https://docs.nvidia.com/cuda/cuda-runtime-api/group_%5FCUDART%5F_DEVICE.html) を使用して、アプリケーションコードで使用するデバイスを明示的に指定できます。

デバイスを明示的に指定する必要があるのは、Windows コンテナに影響する既知の問題があるからです。この問題の解決の進捗状況は、[microsoft/Windows-Containers の問題 \$1333](https://github.com/microsoft/Windows-Containers/issues/333) で追跡できます。次の表は、この GPU 割り当て動作の視覚的な表現と実例を示しています。

EC2 インスタンスタイプ `g4dn.12xlarge` の Windows ノードが 1 つあり、4 つの GPU が搭載されているというシナリオを考えてみましょう。このインスタンスで起動されるポッドが 3 つあるシナリオを考えてみましょう。この表は、各コンテナがリクエストした GPU の数に関係なく、3 つのポッドすべてがインスタンス上の 4 つの GPU すべてにアクセスできることを示しており、デフォルトではデバイスインデックス 0 の GPU を利用できます。


| ポッド | リクエストされた GPU | 実際の GPU アクセス | デフォルトの GPU 使用率 | 使用可能な GPU インデックス | インスタンス GPU の合計 | 
| --- | --- | --- | --- | --- | --- | 
|  Pod 1  |  1 GPU  |  すべての 4 GPU  |  インデックス 0 の GPU  |  0、1、2、3  |  4  | 
|  Pod 2  |  GPU 2 個  |  すべての 4 GPU  |  インデックス 0 の GPU  |  0、1、2、3  |  4  | 
|  Pod 3  |  1 GPU  |  すべての 4 GPU  |  インデックス 0 の GPU  |  0、1、2、3  |  4  | 

### Kubernetes デバイスプラグインのサポート
<a name="ml-eks-windows-ami-device-plugin-support"></a>

NVIDIA の [Kubernetes デバイスプラグイン](https://github.com/NVIDIA/k8s-device-plugin)の公式実装は Windows をサポートしていません。[NVIDIA/k8s-device-plugin issue \$1419](https://github.com/NVIDIA/k8s-device-plugin/issues/419) で、Windows の公式サポート追加の進行状況を追跡できます。

### GPU コンピューティングインスタンスの制限
<a name="ml-eks-windows-ami-compute-instance-limitations"></a>

AWS アカウント設定によっては、起動できる Amazon EC2 GPU コンピューティングインスタンスの数とタイプにサービス制限がある場合があります。追加の容量が必要な場合は、[クォータの引き上げをリクエスト](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)できます。

### Windows GPU 最適化 AMI を構築する必要があります
<a name="ml-eks-windows-ami-build-gpu-ami"></a>

Amazon EKS が提供する EKS Windows GPU 最適化 AMI または EC2 Image Builder マネージドコンポーネントはありません。このガイドの手順に従って、必要な GPU ドライバーがプリインストールされたカスタム EKS Windows 最適化 AMI を構築するか、インスタンスの起動後に必要な GPU ドライバーを EKS ワーカーノードにインストールする必要があります。

### Inferentia と Trainium はサポートされていません
<a name="ml-eks-windows-ami-inferentia-tranium-support"></a>

 AWS [Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) および AWS [Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) ベースのワークロードは Windows ではサポートされていません。