執行 GPU 加速容器 (Windows on EC2 G 系列) - Amazon EKS

協助改進此頁面

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

執行 GPU 加速容器 (Windows on EC2 G 系列)

重要

TensorWorks 的 DirectX 專用 Kubernetes 裝置外掛程式 是一種第三方工具,且未獲 AWS 背書、支援或維護。對於該外掛程式的安全性、可靠性或效能,AWS 不承擔任何責任。

了解如何使用 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 裝置外掛程式,為您的 Windows 容器安裝和設定 GPU 加速的步驟。這些步驟均已經過測試和驗證,可為 Amazon EKS 上的 Windows 容器工作負載提供 GPU 加速。如需有關相容驅動程式和裝置外掛程式的詳細資訊,請參閱 已知限制。在繼續之前,請注意下列事項:

  • 僅具有 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 或更新版本。

  • 以 G 系列執行個體類型佈建 Windows 節點,例如 G4G5

  • 使用 containerd 1.7.x2.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 裝置外掛程式作為 DaemonSet 執行,請在每個工作節點上予以部署。請遵循 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"

驗證裝置外掛程式部署

部署裝置外掛程式後,請取代 <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 裝置外掛程式 GitHub 儲存庫,而該儲存庫具有多個範例可供選擇,而您可以執行這些範例來測試您的 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

已知限制

所有 GPU 皆可使用

該執行個體上的所有 GPU 皆可供主機上的每個執行中的容器使用,即使您為指定容器請求特定數量的 GPU。此外,預設行為是,即使節點上有多個 GPU 可用,在主機上執行的所有容器都會使用具有索引 0 的 GPU。因此,若要讓多 GPU 任務正常運作,您必須明確指定要在應用程式程式碼中使用的特定 GPU 裝置。

配置裝置以用於應用程式的確切實作,將取決於您使用的程式設計語言或架構。例如,如果您使用 CUDA 程式設計,若要選取特定 GPU,您可以使用 函數 cudaSetDevice() 明確指定要在應用程式程式碼中使用的裝置。

由於存在會影響 Windows 容器的已知問題,需要明確指定裝置。您可以在 microsoft/Windows-Containers 問題 #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 裝置外掛程式支援

Kubernetes 裝置外掛程式的 NVIDIA 的正式實作不支援 Windows。您可以在 NVIDIA/k8s-device-plugin 問題 #419 中追蹤新增官方 Windows 支援的進度。

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 和 AWS Trainium 型工作負載。