針對計算密集型工作負載使用 GPU

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

圖形化處理單位 (GPU) 用於計算密集型工作負載,例如機器學習、深度學習等等。 本文說明如何在 Azure Arc 所啟用的 AKS 中,針對計算密集型工作負載使用 GPU。

開始之前

如果您要從 2022 年 10 月之前執行 GPU 啟用節點集區的預覽版本更新 AKS,請務必先移除所有執行 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 或 Azure Stack HCI 中的故障轉移叢集。

安裝或更新 AKS

請參閱使用PowerShell或使用 Windows Admin Center 安裝或更新Arc啟用的AKS快速入門。

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

目前,使用已啟用 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 描述節點 命令來確認可以排程 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或執行 Standard_NK12,則每個實體主機都有一個額外的 GPU。 如果您是以完整容量執行,而且沒有額外的 GPU,建議您在升級之前將節點集區相應減少到單一節點,然後在升級成功之後相應增加。

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

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

下一步