共用方式為


針對計算密集型工作負載使用 GPU (Azure Stack HCI 23H2 上的 AKS)

適用於:Azure Stack HCI 版本 23H2

注意

如需 Azure Stack HCI 22H2 上 AKS 中的 GPU 相關信息,請參閱使用 GPU(HCI 22H2)。

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

支援的 GPU 模型

Azure Stack HCI 23H2 上的 AKS 支援下列 GPU 模型:

製造商 GPU 模型 支援的版本
Nvidia A2 2311.2
Nvidia A16 2402.0

支援的 VM 大小

Azure Stack HCI 23H2 上的 AKS 支援每個 GPU 模型的下列 VM 大小。

NC2 A2 SKU 支援 Nvidia A2

VM 大小 GPU GPU 記憶體:GiB vCPU 記憶體:GiB
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 48 16 64
Standard_NC32_A2 2 48 32 28

NC2 A16 SKU 支援 Nvidia A16

VM 大小 GPU GPU 記憶體:GiB vCPU 記憶體:GiB
Standard_NC4_A16 1 16 4 8
Standard_NC8_A16 1 16 8 16
Standard_NC16_A16 2 48 16 64
Standard_NC32_A16 2 48 32 28

開始之前

若要在 AKS Arc 中使用 GPU,請先確定您已安裝必要的 GPU 驅動程式,再開始部署叢集。 請遵循本節中的步驟。

步驟 1:安裝 OS

在 Azure Stack HCI 叢集中的每部伺服器上本機安裝 Azure Stack HCI 版本 23H2 操作系統。

步驟 2:卸載 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 

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

當您卸載主機驅動程式時,實體 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 

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

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

請參閱 NVIDIA 資料中心檔,以下載 NVIDIA 風險降低驅動程式。 下載驅動程序之後,請展開封存,並在每部主計算機上安裝風險降低驅動程式。 您可以遵循此 PowerShell 腳本來下載風險降低驅動程式並將其解壓縮:

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\

若要安裝風險降低驅動程式,請流覽至包含所擷取檔案的資料夾,並根據 Azure Stack HCI 主機上所安裝的實際 GPU 類型選取 GPU 驅動程式檔案。 例如,如果類型為 A2 GPU,請以滑鼠右鍵按兩下 nvidia_azure_stack_A2_base.inf 檔案,然後選取 [ 安裝]。

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

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

安裝風險降低驅動程序之後,GPU 會列在 Nvidia A2_base - 已卸除[確定] 狀態中:

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

步驟 5:重複步驟 1 到 4

針對 HCI 叢集中的每個伺服器重複步驟 1 到 4。

步驟 6:繼續部署 Azure Stack HCI 叢集

遵循 Azure Stack HCI 23H2 版部署中的 步驟,繼續部署 Azure Stack HCI 叢集。

取得已啟用 GPU 的 VM SKU 清單

完成 Azure Stack HCI 叢集部署之後,您可以執行下列 CLI 命令來顯示部署上的可用 VM SKU。 如果您的 GPU 驅動程式已正確安裝,則會列出對應的 GPU VM SKU:

az aksarc vmsize list --custom-location <custom location ID> -g <resource group name>

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

目前,使用已啟用 GPU 的節點集區僅適用於 Linux 節點集區。 若要建立新的 Kubernetes 叢集:

az aksarc create -n <aks cluster name> -g <resource group name> --custom-location <custom location ID> --vnet-ids <vnet ID>

下列範例會新增具有 2 個已啟用 GPU 的節點集區 (NVDIA A2) 節點,其中包含 Standard_NC4_A2 VM SKU:

az aksarc nodepool add --cluster-name <aks cluster name> -n <node pool name> -g <resource group name> --node-count 2 --node-vm-size Standard_NC4_A2 --os-type Linux

確認您可以排程 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(s),如下所示:

Capacity: 
  cpu:                4 
  ephemeral-storage:  103110508Ki 
  hugepages-1Gi:      0 
  hugepages-2Mi:      0 
  memory:             7865020Ki 
  nvidia.com/gpu:     1 
  pods:               110

執行已啟用 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 或 2 個額外的 GPU,則每個實體主機都有一個額外的 GPU,如果您執行 Standard_NK12。 如果您以完整容量執行,而且沒有額外的 GPU,建議您在升級前將節點集區相應減少為單一節點,然後在升級成功后相應增加。

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

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

下一步