

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 執行 GPU 加速容器 (Windows on EC2 G 系列)
<a name="ml-eks-windows-optimized-ami"></a>

**重要**  
[Kubernetes Device Plugin for DirectX](https://github.com/TensorWorks/DirectX-Device-Plugins) by TensorWorks 是一種第三方工具，未經 背書、支援或維護 AWS。 AWS 對此外掛程式的安全性、可靠性或效能不負任何責任。

了解如何使用 NVIDIA GPU 搭配 TensorWorks 的 DirectX 專用 Kubernetes 裝置外掛程式，在 Amazon EKS (Elastic Kubernetes Service) 上執行 GPU 加速 Windows 容器工作負載。如需詳細資訊，請參閱 [DirectX 專用 Kubernetes 裝置外掛程式](https://github.com/TensorWorks/DirectX-Device-Plugins)。

對於為 Windows 容器設定 GPU 加速，我們提供兩種主要方法：
+  **選項 1**：使用預先安裝的必要 GPU 驅動程式，[建置自訂 EKS Windows 最佳化 AMI](eks-custom-ami-windows.md)。
  + 當您需要一個一致且預先設定的環境來執行 GPU 加速 Windows 容器，並且您能夠投入額外努力來建置和維護自訂 AMI 時，請使用此方法。
+  **選項 2**：啟動執行個體後，在 EKS 工作節點上安裝必要的 GPU 驅動程式。
  + 當您想要更簡單的設定程序並且不介意在每個新的工作節點上安裝 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 節點 佈建 Windows Server 2022 或更新版本。
+ 以 G 系列執行個體類型佈建 Windows 節點，例如 [G4](https://aws.amazon.com/ec2/instance-types/g4/) 或 [G5](https://aws.amazon.com/ec2/instance-types/g5/)。
+ 使用 containerd `1.7.x` 或 `2.x.x` 為 Windows 節點佈建容器執行時期。(請參閱 [擷取 Windows AMI 版本資訊](eks-ami-versions-windows.md)，以驗證 Amazon EKS 最佳化 AMI 中的 containerd 版本。)

## 在每個 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 叢集中將 Tensorworks 的 [DirectX 裝置外掛程式](https://github.com/TensorWorks/DirectX-Device-Plugins)作為 DaemonSet 執行，請在每個工作節點上予以部署。請遵循 [README.md](https://github.com/TensorWorks/DirectX-Device-Plugins/blob/main/README.md) 中指定的安裝指南，其將包含下列步驟。建議：
+ 在 `kube-system` 命名空間中部署裝置外掛程式。
+ 為 DaemonSet 設定適當的資源限制，以確保它不會消耗節點上過多的資源。

**注意**  
裝置外掛程式 DaemonSet 將作為具有更高權限的主機程序容器，在每個節點上執行。建議實作 RBAC 控制，以限制對此 DaemonSet 的存取，因此只有授權使用者才能執行特殊權限命令。

執行 GPU 加速容器時，裝置外掛程式可支援兩種模式：
+  **單一租用模式**：此模式會將所有 GPU 資源專用於執行個體上的單一容器。使用下列命令，安裝具有單一租用支援的裝置外掛程式。如需詳細資訊，請參閱 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 裝置外掛程式在所有 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>

啟動 Pod 之前，請在 `directx.microsoft.com/display` 中指定資源名稱 `.spec.containers[].resources`。這表示您的容器需要已啟用 GPU 的功能，而 `kube-scheduler` 會嘗試將 Pod 放置在具有可用 GPU 資源且預先設定的 Windows 節點上。

例如，請參閱以下範例命令，而該命令會啟動 `Job`，以執行 Monte Carlo 模擬來估算 pi 的值。此範例來自 [DirectX 專用 Kubernetes 裝置外掛程式](https://github.com/TensorWorks/DirectX-Device-Plugins) GitHub 儲存庫，而該儲存庫具有[多個範例](https://github.com/TensorWorks/DirectX-Device-Plugins/tree/main/examples)可供選擇，而您可以執行這些範例來測試您的 Windows 節點 GPU 功能。

```
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 節點，且其中隨附四個 GPU。假設在此執行個體上啟動三個 Pod。此表格顯示，無論每個容器請求的 GPU 數量為何，這三個 Pod 都可以存取執行個體上的所有四個 GPU，並且根據預設，會使用具有裝置索引 0 的 GPU。


| Pod | 請求的 GPU | 實際 GPU 存取 | 預設 GPU 用量 | 可用的 GPU 索引 | 執行個體 GPU 總數 | 
| --- | --- | --- | --- | --- | --- | 
|  Pod 1  |  1 個 GPU  |  所有 4 個 GPU  |  具有索引 0 的 GPU  |  0、1、2、3  |  4  | 
|  Pod 2  |  2 GPU  |  所有 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>

[Kubernetes 裝置外掛程式](https://github.com/NVIDIA/k8s-device-plugin)的 NVIDIA 的正式實作不支援 Windows。您可以在 [NVIDIA/k8s-device-plugin 問題 \$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，或在啟動執行個體後，在 EKS 工作節點上安裝必要的 GPU 驅動程式。

### 不支援 Inferentia 和 Trainium
<a name="ml-eks-windows-ami-inferentia-tranium-support"></a>

 Windows 不支援 AWS [Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) 和 AWS [Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) 型工作負載。