Udostępnij za pośrednictwem


Używanie procesorów GPU na potrzeby obciążeń intensywnie korzystających z obliczeń

Dotyczy: AKS w Azure Local 22H2, AKS na Windows Server

Jednostki przetwarzania graficznego (GPU) są używane do obciążeń intensywnie korzystających z obliczeń, takich jak uczenie maszynowe, uczenie głębokie i nie tylko. W tym artykule opisano, jak używać GPU do obciążeń intensywnie korzystających z obliczeń w klastrach AKS obsługiwanych przez Azure Arc.

Przed rozpoczęciem

Jeśli aktualizujesz usługę AKS z wersji zapoznawczej starszej niż październik 2022 r., na której uruchomiono pule węzłów z obsługą procesora GPU, przed rozpoczęciem upewnij się, że wszystkie klastry obciążeń z uruchomionymi procesorami GPU zostały usunięte. Wykonaj kroki opisane w tej sekcji.

Krok 1. Odinstalowanie sterownika hosta firmy Nvidia

Na każdej maszynie hosta przejdź do panelu sterowania > Dodaj lub usuń programy, odinstaluj sterownik hosta FIRMY NVIDIA, a następnie uruchom ponownie komputer. Po ponownym uruchomieniu maszyny upewnij się, że sterownik został pomyślnie odinstalowany. Otwórz terminal programu PowerShell z podwyższonym poziomem uprawnień i uruchom następujące polecenie:

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

Urządzenia GPU powinny być wyświetlane w stanie błędu, jak pokazano w poniższym przykładowym wyjściu.

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 

Krok 2. Odinstalowywanie sterownika hosta z hosta

Po odinstalowaniu sterownika hosta fizyczny procesor GPU przechodzi w stan błędu. Należy odinstalować wszystkie urządzenia gpu z hosta.

Dla każdego urządzenia z procesorem GPU (kontroler wideo 3D) uruchom następujące polecenia w programie PowerShell. Skopiuj identyfikator wystąpienia, na przykład PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000, z wyniku poprzedniego polecenia.

$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

Aby potwierdzić, że procesory GPU zostały poprawnie odinstalowane z hosta, uruchom następujące polecenie. Należy umieścić procesory GPU w stanie 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 

Krok 3. Pobieranie i instalowanie sterownika ograniczania ryzyka firmy NVIDIA

Oprogramowanie może zawierać składniki opracowane i należące do firmy NVIDIA Corporation lub jej licencjodawców. Korzystanie z tych składników podlega umowie licencyjnej użytkownika końcowego firmy NVIDIA.

Zapoznaj się z dokumentacją centrum danych firmy NVIDIA , aby pobrać sterownik ograniczania ryzyka firmy NVIDIA. Po pobraniu sterownika rozwiń archiwum i zainstaluj sterownik ograniczania ryzyka na każdej maszynie hosta.

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\

Aby zainstalować sterownik ograniczania ryzyka, przejdź do folderu zawierającego wyodrębnione pliki, kliknij prawym przyciskiem myszy plik nvidia_azure_stack_T4_base.inf, a następnie wybierz pozycję Zainstaluj. Sprawdź, czy masz prawidłowy sterownik; Usługa AKS obecnie obsługuje tylko procesor GPU NVIDIA Tesla T4.

Możesz również zainstalować za pomocą wiersza polecenia, przechodząc do folderu i uruchamiając następujące polecenia, aby zainstalować sterownik ograniczania ryzyka:

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

Po zainstalowaniu sterownika ograniczania ryzyka procesory GPU są wyświetlane w stanie OK w obszarze Nvidia T4_base — Odinstalowany:

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

Krok 4. Powtórz kroki od 1 do 3

Powtórz kroki od 1 do 3 dla każdego węzła w klastrze przełączania awaryjnego.

Ważny

Maszyny wirtualne z obsługą GPU nie są dodawane do klastra przełączania awaryjnego w Windows Server 2019, Windows Server 2022 lub Azure Local.

Instalowanie lub aktualizowanie usługi AKS

Zapoznaj się z szybkim startem AKS przy użyciu programu PowerShell lub Windows Admin Center, aby zainstalować lub zaktualizować AKS z włączoną obsługą Arc.

Utwórz nowy klaster obciążeniowy z pulą węzłów wyposażoną w GPU

Obecnie korzystanie z pul węzłów z obsługą procesora GPU jest dostępne tylko dla pul węzłów systemu Linux.

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

Po zainstalowaniu klastra obciążeń uruchom następujące polecenie, aby pobrać aplikację Kubeconfig:

Get-AksHciCredential -Name gpucluster

Potwierdź, że możesz zaplanować GPU

Po utworzeniu puli węzłów GPU upewnij się, że można przydzielić GPU na platformie Kubernetes. Najpierw wyświetl węzły w klastrze przy użyciu polecenia „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

Teraz użyj polecenia kubectl describe node, aby potwierdzić, że można zaplanować procesory GPU. W sekcji Pojemność procesor GPU powinien być wyświetlany jako nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

Wyjście powinno wyświetlać procesory GPU z węzła roboczego i wyglądać mniej więcej tak:

         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

Uruchom obciążenie obsługiwane przez GPU

Po wykonaniu poprzednich kroków utwórz nowy plik YAML na potrzeby testowania; na przykład gpupod.yaml. Skopiuj i wklej następujący kod YAML do nowego pliku o nazwie gpupod.yaml, a następnie zapisz go:

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

Uruchom następujące polecenie, aby wdrożyć przykładową aplikację:

kubectl apply -f gpupod.yaml

Sprawdź, czy pod został uruchomiony, zakończył działanie, a procesor GPU jest przypisany.

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

Poprzednie polecenie powinno wyświetlić jeden przypisany procesor GPU:

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

Sprawdź plik dziennika podu, aby sprawdzić, czy test zakończył się pomyślnie.

kubectl logs cuda-vector-add

Poniżej przedstawiono przykładowe dane wyjściowe z poprzedniego polecenia:

[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

Jeśli podczas wywoływania sterowników wystąpi błąd niezgodności wersji, taki jak "Wersja sterownika CUDA jest niewystarczająca dla wersji środowiska uruchomieniowego CUDA", zapoznaj się z wykresem zgodności macierzy sterowników firmy NVIDIA .

FAQ

Co się dzieje podczas aktualizacji puli węzłów z obsługą GPU?

Uaktualnianie pul węzłów z obsługą procesora GPU jest zgodne z tym samym wzorcem uaktualniania stopniowego, który jest używany w zwykłych pulach węzłów. Aby pule węzłów z obsługą procesora GPU na nowej maszynie wirtualnej zostały pomyślnie utworzone na maszynie hosta fizycznego, wymaga to udostępnienia co najmniej jednego fizycznego procesora GPU w celu pomyślnego przypisania urządzenia. Ta dostępność zapewnia, że aplikacje będą mogły nadal działać, podczas gdy platforma Kubernetes planuje zasobniki na tym uaktualnionym węźle.

Przed uaktualnieniem:

  1. Zaplanuj przestój podczas uaktualniania.
  2. Jeśli uruchamiasz Standard_NK6, musisz mieć jeden dodatkowy procesor GPU na hosta fizycznego, a jeśli uruchamiasz Standard_NK12, potrzebujesz dwóch dodatkowych procesorów GPU na hosta fizycznego. Jeśli korzystasz z pełnej pojemności i nie masz dodatkowego GPU, sugerujemy zmniejszenie puli węzłów do jednego przed aktualizacją, a następnie zwiększenie po zakończeniu aktualizacji.

Co się stanie, jeśli nie mam dodatkowych fizycznych procesorów GPU na mojej maszynie fizycznej podczas uaktualniania?

Jeśli uaktualnienie zostanie wyzwolone w klastrze bez dodatkowych zasobów procesora GPU w celu ułatwienia uaktualnienia stopniowego, proces uaktualniania zawiesza się do momentu udostępnienia procesora GPU. Jeśli uruchamiasz pełną wydajność i nie masz dodatkowego procesora graficznego, zalecamy zmniejszenie puli węzłów do pojedynczego węzła przed aktualizacją, a następnie zwiększenie jej po pomyślnym zakończeniu aktualizacji.

Następne kroki