다음을 통해 공유


계산 집약적 워크로드에 GPU 사용

적용 대상: Azure Stack HCI 22H2의 AKS, Windows Server의 AKS

GPU(그래픽 처리 장치)는 기계 학습, 딥 러닝 등과 같은 계산 집약적 워크로드에 사용됩니다. 이 문서에서는 Azure Arc에서 사용하도록 설정된 AKS에서 계산 집약적 워크로드에 GPU를 사용하는 방법을 설명합니다.

시작하기 전에

GPU 사용 노드 풀을 실행하는 2022년 10월 이전 미리 보기 버전에서 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에서 다음 명령을 실행합니다. instance ID를 복사합니다. 예를 들어 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단계 반복

장애 조치(failover) 클러스터의 각 노드에 대해 1~3단계를 반복합니다.

중요

GPU 사용 가상 머신은 Windows Server 2019, Windows Server 2022 또는 Azure Stack HCI의 장애 조치(failover) 클러스터링 추가되지 않습니다.

AKS 설치 또는 업데이트

PowerShell을 사용하거나 Windows Admin Center 사용하여 Arc에서 사용하도록 설정된 AKS를 설치하거나 업데이트하는 AKS 빠른 시작을 참조하세요.

GPU 사용 노드 풀을 사용하여 새 워크로드 클러스터 Create

현재 Linux 노드 풀에서만 GPU 사용 노드 풀을 사용할 수 있습니다.

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 노드 명령을 사용하여 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 드라이버 매트릭스 호환성 차트를 검토합니다.

FAQ

GPU 사용 노드 풀을 업그레이드하는 동안 어떻게 되나요?

GPU 사용 노드 풀 업그레이드는 일반 노드 풀에 사용되는 것과 동일한 롤링 업그레이드 패턴을 따릅니다. 새 VM의 GPU 사용 노드 풀을 실제 호스트 머신에서 성공적으로 만들려면 디바이스 할당에 성공하려면 하나 이상의 물리적 GPU를 사용할 수 있어야 합니다. 이 가용성을 통해 Kubernetes가 이 업그레이드된 노드에서 Pod를 예약할 때 애플리케이션이 계속 실행될 수 있습니다.

업그레이드하기 전에 다음을 수행합니다.

  1. 업그레이드하는 동안 가동 중지 시간을 계획합니다.
  2. Standard_NK6 실행하는 경우 물리적 호스트당 1개의 추가 GPU를 사용하거나 Standard_NK12실행하는 경우 2개의 추가 GPU를 갖습니다. 전체 용량으로 실행 중이고 추가 GPU가 없는 경우 업그레이드 전에 노드 풀을 단일 노드로 축소한 다음 업그레이드가 성공한 후 스케일 업하는 것이 좋습니다.

업그레이드하는 동안 물리적 컴퓨터에 추가 물리적 GPU가 없으면 어떻게 되나요?

롤링 업그레이드를 용이하게 하기 위해 추가 GPU 리소스가 없는 클러스터에서 업그레이드가 트리거되면 GPU를 사용할 수 있게 될 때까지 업그레이드 프로세스가 중단됩니다. 전체 용량으로 실행하고 추가 GPU가 없는 경우 업그레이드 전에 노드 풀을 단일 노드로 축소한 다음 업그레이드가 성공한 후 스케일 업하는 것이 좋습니다.

다음 단계