協助改進此頁面
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
執行 GPU 加速容器 (Windows on EC2 G 系列)
重要
TensorWorks 的 DirectX 專用 Kubernetes 裝置外掛程式
了解如何使用 NVIDIA GPU 搭配 TensorWorks 的 DirectX 專用 Kubernetes 裝置外掛程式,在 Amazon EKS (Elastic Kubernetes Service) 上執行 GPU 加速 Windows 容器工作負載。如需詳細資訊,請參閱 DirectX 專用 Kubernetes 裝置外掛程式
對於為 Windows 容器設定 GPU 加速,我們提供兩種主要方法:
-
選項 1:使用預先安裝的必要 GPU 驅動程式,建置自訂 EKS Windows 最佳化 AMI。
-
當您需要一個一致且預先設定的環境來執行 GPU 加速 Windows 容器,並且您能夠投入額外努力來建置和維護自訂 AMI 時,請使用此方法。
-
-
選項 2:啟動執行個體後,在 EKS 工作節點上安裝必要的 GPU 驅動程式。
-
當您想要更簡單的設定程序並且不介意在每個新的工作節點上安裝 GPU 驅動程式時,請使用此方法。當您評估 GPU 加速工作負載並對此建立原型時,則更適合開發環境。
-
您可以使用本指南中詳述的步驟,以藉此利用這兩種方法。
考量事項
本指南提供使用 NVIDIA GPU、NVIDIA GRID 驅動程式和 TensorWorks 的 DirectX 專用 Kubernetes 裝置外掛程式
-
僅具有 NVIDIA GRID 驅動程式的 G 系列執行個體類型已經過測試和驗證,可搭配本指南使用。雖然其他執行個體類型和驅動程式組合或許也能執行 GPU 加速 Windows 容器,但他們可能需要本指南中未涵蓋的其他組態步驟。
-
僅 DirectX 型工作負載已經過測試和驗證,可搭配本指南使用。雖然 OpenGL、Vulkan 和 OpenCL 等其他 GPU API 可能相容於執行 GPU 加速 Windows 容器,但他們可能需要本指南中未涵蓋的其他組態步驟。
-
在執行 GPU 加速 Windows 容器之前,需要注意一些已知限制。如需詳細資訊,請參閱 已知限制 一節。
先決條件
若要在 Amazon EKS 上啟用適用於 Windows 容器的 GPU 加速,您必須先準備好下列要求,才能繼續:
-
使用 Kubernetes v1.27 或更新版本啟動 Amazon EKS 叢集。
-
為 Windows 節點 佈建 Windows Server 2022 或更新版本。
-
使用 containerd
1.7.x或2.x.x為 Windows 節點佈建容器執行時期。(請參閱 擷取 Windows AMI 版本資訊,以驗證 Amazon EKS 最佳化 AMI 中的 containerd 版本。)
在每個 Windows 節點上安裝 GPU 驅動程式
若要在 EKS 工作節點上安裝 NVIDIA GRID 驅動程式,請遵循 Amazon EC2 執行個體的 NVIDIA 驅動程式中概述的步驟。導覽至安裝選項 - 選項 3:GRID 驅動程式,並遵循安裝步驟。
為 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 裝置外掛程式
若要啟用探索並將 GPU 資源公開至 Windows 節點上的容器,您需要一個裝置外掛程式。透過在 EKS 叢集中將 Tensorworks 的 DirectX 裝置外掛程式
-
在
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"
驗證裝置外掛程式部署
部署裝置外掛程式後,請取代 <namespace> 並執行下列命令,以驗證 DirectX 裝置外掛程式是否在您的所有 Windows 節點上正確執行。
kubectl get ds device-plugin-wddm -n <namespace>
驗證容器是否已準備好部署
裝置外掛程式 DaemonSet 在採用 GPU 技術的 Windows 工作節點上執行後,請使用下列命令,以驗證每個節點是否具有可配置的 GPU。對應數量應與每個節點上的 DirectX 裝置數量相符。
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"
使用 GPU 加速執行 Windows 容器
啟動 Pod 之前,請在 directx.microsoft.com/display 中指定資源名稱 .spec.containers[].resources。這表示您的容器需要已啟用 GPU 的功能,而 kube-scheduler 會嘗試將 Pod 放置在具有可用 GPU 資源且預先設定的 Windows 節點上。
例如,請參閱以下範例命令,而該命令會啟動 Job,以執行 Monte Carlo 模擬來估算 pi 的值。此範例來自 DirectX 專用 Kubernetes 裝置外掛程式
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
已知限制
所有 GPU 皆可使用
該執行個體上的所有 GPU 皆可供主機上的每個執行中的容器使用,即使您為指定容器請求特定數量的 GPU。此外,預設行為是,即使節點上有多個 GPU 可用,在主機上執行的所有容器都會使用具有索引 0 的 GPU。因此,若要讓多 GPU 任務正常運作,您必須明確指定要在應用程式程式碼中使用的特定 GPU 裝置。
配置裝置以用於應用程式的確切實作,將取決於您使用的程式設計語言或架構。例如,如果您使用 CUDA 程式設計,若要選取特定 GPU,您可以使用 函數 cudaSetDevice()
由於存在會影響 Windows 容器的已知問題,需要明確指定裝置。您可以在 microsoft/Windows-Containers 問題 #333
假設存在 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 裝置外掛程式支援
Kubernetes 裝置外掛程式
GPU 運算執行個體限制
視您的 AWS 帳戶組態而定,您可啟動的 Amazon EC2 GPU 運算執行個體的數量和類型可能會有服務限制。如果您需要額外容量,您可以請求提高配額。
必須建置 Windows GPU 最佳化 AMI
Amazon EKS 並未提供 EKS Windows GPU 最佳化 AMI 或 EC2 Image Builder 受管元件。您需要遵循本指南中的步驟,以使用預先安裝的必要 GPU 驅動程式建置自訂 EKS Windows 最佳化 AMI,或在啟動執行個體後,在 EKS 工作節點上安裝必要的 GPU 驅動程式。
不支援 Inferentia 和 Trainium
Windows 不支援 AWS Inferentia