共用方式為


在 Windows Server 上的 AKS 中使用 GPU 進行計算密集型工作負載

適用於:在 Windows Server 上運行的 AKS

圖形處理單位 (GPU) 用於計算密集型工作負載,例如機器學習、深度學習等等。 本文說明如何在 Windows Server 上的 AKS 中使用 GPU 進行計算密集型工作負載。

開始之前

如果您要將執行已啟用 GPU 的節點集區的 AKS 從早於 2022 年 10 月的預覽版本升級,請務必在開始前移除所有運行 GPU 的工作負載叢集。 請遵循本節中的步驟。

步驟 1:卸載 Nvidia 主機驅動程式

在每個主計算機上,流覽至 >] 控制台 卸載 NVIDIA 主機驅動程式,然後重新啟動電腦。 機器重新啟動之後,請確認驅動程式已成功卸載。 開啟提升權限的 PowerShell 終端機,然後執行下列命令:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video" 

您應該會看到 GPU 裝置出現錯誤狀態,如下列範例輸出所示:

Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

步驟 2:從主機卸除主機驅動程式

當您卸載主機驅動程式時,實體 GPU 會進入錯誤狀態。 您必須從主機卸除所有 GPU 裝置。

針對每個 GPU(3D 影片控制器)裝置,請在 PowerShell 中執行下列命令。 複製實例標識碼;例如, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 從上一個命令輸出:

$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force

若要確認 GPU 已從主機正確卸除,請執行下列命令。 您應該將 GPU 置於 Unknown 狀態。

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

步驟 3:下載並安裝 NVIDIA 風險降低驅動程式

軟體可能包括 NVIDIA Corporation 或其授權商所開發的元件。 這些元件的使用是由 NVIDIA 終端使用者許可協定所控管。

請參閱 NVIDIA 資料中心檔,以下載 NVIDIA 風險降低驅動程式。 下載驅動程序之後,請展開封存,並在每部主計算機上安裝風險降低驅動程式。

Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\

若要安裝風險降低驅動程式,請流覽至包含解壓縮檔案的資料夾,以滑鼠右鍵按兩下 nvidia_azure_stack_T4_base.inf 檔案,然後選取 [ 安裝]。 檢查您是否有正確的驅動程式;AKS 目前僅支援 NVIDIA Tesla T4 GPU。

您也可以使用命令列進行安裝,方法是進入資料夾並執行下列命令來安裝風險降低驅動程式:

pnputil /add-driver nvidia_azure_stack_T4_base.inf /install 
pnputil /scan-devices 

安裝緩解驅動程式之後,GPU 會列在 Nvidia T4_base - 卸除 下的 確定 狀態:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

步驟 4:重複步驟 1 到 3

針對故障轉移叢集中的每個節點重複步驟 1 到 3。

這很重要

已啟用 GPU 的虛擬機不會新增至 Windows Server 2019 和 Windows Server 2022 中的故障轉移叢集。

安裝或更新 AKS

請參閱「AKS 快速入門」,以使用 PowerShellWindows Admin Center 在 Windows Server 上安裝或更新 AKS。

使用已啟用 GPU 的節點集區建立新的工作負載叢集

目前,使用已啟用 GPU 的節點集區僅適用於 Linux 節點集區。

New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6 

安裝工作負載叢集之後,請執行下列命令以取得 Kubeconfig:

Get-AksHciCredential -Name gpucluster

確認您可以安排這些 GPU

建立 GPU 節點集區後,請確認您可以在 Kubernetes 中排程 GPU。 首先,使用 kubectl get nodes 命令列出叢集中的 節點:

kubectl get nodes
NAME             STATUS  ROLES                 AGE   VERSION
moc-l9qz36vtxzj  Ready   control-plane,master  6m14s  v1.22.6
moc-lhbkqoncefu  Ready   <none>                3m19s  v1.22.6
moc-li87udi8l9s  Ready   <none>                3m5s  v1.22.6

現在,使用 kubectl describe node 命令來確認 GPU 能夠排程。 在 [ 容量] 區段下,GPU 應該會顯示為 nvidia.com/gpu:1

kubectl describe <node> | findstr "gpu" 

輸出應該顯示工作節點中的 GPU,如下所示:

         nvidia.com/gpu.compute.major=7
         nvidia.com/gpu.compute.minor=5
         nvidia.com/gpu.count=1
         nvidia.com/gpu.family=turing
         nvidia.com/gpu.machine=Virtual-Machine
         nvidia.com/gpu.memory=16384
         nvidia.com/gpu.product=Tesla-T4
Annotations:    cluster.x-k8s.io/cluster-name: gpucluster
                cluster.x-k8s.io/machine: gpunodepool-md-58d9b96dd9-vsdbl
                cluster.x-k8s.io/owner-name: gpunodepool-md-58d9b96dd9
         nvidia.com/gpu:   1
         nvidia.com/gpu:   1
ProviderID:         moc://gpunodepool-97d9f5667-49lt4
kube-system         gpu-feature-discovery-gd62h       0 (0%)    0 (0%)   0 (0%)      0 (0%)     7m1s
         nvidia.com/gpu   0     0

執行已啟用 GPU 的工作負載

完成上述步驟之後,請建立新的 YAML 檔案進行測試;例如 ,gpupod.yaml。 將下列 YAML 複製並貼到名為 gpupod.yaml 的新檔案中,然後儲存它:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "k8s.gcr.io/cuda-vector-add:v0.1"
    resources:
      limits:
        nvidia.com/gpu: 1

執行下列命令以部署範例應用程式:

kubectl apply -f gpupod.yaml

確認 Pod 已啟動、完成執行,並已指派 GPU:

kubectl describe pod cuda-vector-add | findstr 'gpu'

上一個命令應該會顯示一個已指派的 GPU:

nvidia.com/gpu: 1
nvidia.com/gpu: 1

檢查 Pod 的記錄檔,以檢視測試是否已通過:

kubectl logs cuda-vector-add

以下是上一個指令的範例輸出:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

如果您在呼叫驅動程式時收到版本不符錯誤,例如「CUDA 驅動程式版本不足以使用 CUDA 執行時間版本」,請檢閱 NVIDIA 驅動程式矩陣相容性圖表

常見問題

在升級已啟用 GPU 的節點集區期間會發生什麼事?

升級已啟用 GPU 的節點集區會遵循用於一般節點集區的相同滾動升級模式。 若要讓新 VM 中已啟用 GPU 的節點集區在實體主電腦上成功建立,它需要一或多個實體 GPU 才能成功指派裝置。 此可用性可確保當 Kubernetes 排程此升級節點上的 Pod 時,您的應用程式可以繼續執行。

升級之前:

  1. 規劃升級期間的停機時間。
  2. 如果您執行 Standard_NK6,每個實體主機應有一個額外的 GPU;如果您執行 Standard_NK12,則應有兩個額外的 GPU。 如果您以完整容量執行,且沒有額外的 GPU,建議您在升級前將節點池調整至單一節點,並在升級成功後再擴編回去。

如果在升級期間我的實體計算機上沒有額外的實體 GPU,會發生什麼事?

如果在叢集上觸發升級,但沒有額外的 GPU 資源來加速滾動升級,升級程式會停止回應,直到 GPU 可供使用為止。 如果您以最大容量運行,而且沒有額外的 GPU,建議您在升級之前將節點集區縮減為單一節點,然後在升級成功之後擴增。

後續步驟