NVIDIA GPU 설정 및 사용

베어메탈용 Google Distributed Cloud (소프트웨어 전용)의 BYON을 사용하면 GPU가 있는 머신 등 고급 하드웨어를 활용하여 클러스터의 성능과 유연성을 극대화할 수 있습니다.

이 문서에서는 NVIDIA GPU Operator를 설치하고 사용하여 NVIDIA GPU와 함께 사용하기 위해 Google Distributed Cloud로 만든 베어메탈 클러스터를 설정하는 방법을 설명합니다.

NVIDIA GPU Operator는 Operator Framework를 사용하여 GPU 기기를 프로비저닝하고 관리하는 데 필요한 NVIDIA 소프트웨어 구성요소를 관리합니다. 다음과 같은 유연성과 이점을 위해 NVIDIA GPU Operator를 사용하는 것이 좋습니다.

  • GPU 유형 선택: Google Distributed Cloud 소프트웨어 전용은 최신 NVIDIA GPU Operator에서 지원하는 다양한 GPU 유형과 호환됩니다.

  • 지원되는 운영체제 선택: 클러스터 워커 노드는 NVIDIA GPU와 함께 지원되는 운영체제 (OS)를 사용할 수 있으며, 사전 설치된 GPU 드라이버를 사용하거나 NVIDIA GPU Operator와 함께 동적 드라이버 설치를 사용할 수 있습니다.

  • 배포 모델 선택: 워커 노드가 있는 모든 클러스터 유형(사용자 클러스터, 독립형 클러스터, 하이브리드 클러스터)에서 NVIDIA GPU를 사용할 수 있습니다.

이 페이지는 기본 기술 인프라의 수명 주기를 관리하는 IT 관리자 및 운영자를 위해 작성되었습니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 작업에 대해 자세히 알아보려면 일반 GKE Enterprise 사용자 역할 및 작업을 참고하세요.

시작하기 전에

다음 섹션의 단계를 수행하기 전에 다음 요구사항을 준비해야 합니다.

  • 운영 클러스터: Google Distributed Cloud로 만든 작동하는 베어메탈 클러스터가 있는지 확인합니다.

  • NVIDIA GPU: 클러스터 작업자 노드에 NVIDIA GPU가 설치되어 있는지 확인합니다. 다음 NVIDIA GPU Operator 설치 섹션에는 GPU가 올바르게 설치되어 있고 운영체제에서 인식하는지 확인하는 단계가 포함되어 있습니다.

  • 호환되는 NVIDIA 드라이버 버전: 사용하는 NVIDIA 드라이버 버전은 GPU, 운영체제, 애플리케이션에서 사용하는 CUDA 버전과 호환되어야 합니다. 다음과 같은 NVIDIA 드라이버 설치 옵션이 있습니다.

    • 다음 섹션에 설명된 대로 NVIDIA GPU Operator를 사용하여 적절한 버전의 NVIDIA GPU 드라이버를 설치합니다.

    • 운영체제 이미지에 사전 설치된 NVIDIA 드라이버를 사용합니다.

    • NVIDIA 드라이버 설치 빠른 시작 가이드의 안내에 따라 NVIDIA 드라이버를 수동으로 설치합니다.

  • Helm 버전 3.0.0 이상: 관리자 워크스테이션에 패키지 관리를 위한 Helm 명령줄 인터페이스를 설치합니다. Helm을 사용하여 NVIDIA GPU Operator를 설치합니다. 다음 명령어를 실행하여 Helm 명령줄 도구를 다운로드하고 설치할 수 있습니다.

    curl -fsSL -o get_helm.sh \
        https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
    chmod 700 get_helm.sh \
        ./get_helm.sh
    

NVIDIA GPU Operator 설치 및 확인

다음 단계에서는 베어메탈 클러스터에 NVIDIA GPU Operator를 설치하고 GPU와 함께 작동하는지 확인하는 방법을 안내합니다.

  1. 주변기기 간 연결(PCIe)을 통해 연결된 GPU 기기의 경우 다음 명령어를 실행하여 이름에 'NVIDIA'가 포함된 시스템 PCI 버스의 목록을 가져옵니다.

    sudo lspci | grep NVIDIA
    

    출력은 다음과 비슷합니다.

    25:00.0 3D controller: NVIDIA Corporation Device 20b5 (rev a1)
    
  2. 지정된 노드에서 NVIDIA 시스템 관리 인터페이스 (nvidia-smi) 명령줄 도구를 사용하여 GPU 기기에 관한 자세한 정보를 가져올 수 있습니다.

    nvidia-smi
    

    출력은 다음과 비슷합니다.

    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.183.01             Driver Version: 535.183.1    CUDA Veersion 12.2     |
    |-----------------------------------------+----------------------+----------------------|
    | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
    |                                         |                      |               MIG M. |
    |=========================================+======================+======================|
    |   0  NVIDIA A100 80GB PCIe          Off | 00000000:25:00.0 Off |                    0 |
    | N/A   30C    P0              44W / 300W |      0MiB / 81920MiB |      0%      Default |
    |                                         |                      |             Disabled |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |  No running processes found                                                           |
    +---------------------------------------------------------------------------------------+
    
  3. 관리자 워크스테이션에 NVIDIA Helm 저장소를 추가합니다.

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  4. NVIDIA GPU Operator를 설치합니다.

    NVIDIA GPU Operator를 설치할 때는 세 가지 기본 명령어 변형이 있습니다.

    • 기본 구성으로 NVIDIA GPU Operator를 설치합니다.

      helm install --wait --generate-name \
          -n gpu-operator --create-namespace \
          nvidia/gpu-operator
      
    • --set 플래그를 사용하여 쉼표로 구분된 키-값 쌍 집합을 전달하여 구성 옵션을 지정합니다.

      helm install --wait --generate-name \
          -n gpu-operator --create-namespace \
          nvidia/gpu-operator \
          --set OPTION_1_NAME=OPTION_1_VALUE,OPTION_2_NAME=OPTION_2_VALUE
      

      구성 옵션의 자세한 목록은 NVIDIA 문서의 일반 차트 맞춤설정 옵션을 참고하세요. --set 플래그 사용에 관한 로지스틱스에 관한 자세한 내용은 Helm 문서의 --set 형식 및 제한사항을 참고하세요.

    • 노드에 NVIDIA GPU 드라이버를 이미 설치한 경우 드라이버 설치를 사용 중지합니다.

      기본적으로 NVIDIA GPU Operator는 클러스터의 모든 GPU 워커 노드에 최신 또는 지정된 GPU 드라이버를 배포합니다. 이를 위해서는 GPU가 있는 모든 작업자 노드가 NVIDIA GPU 드라이버 컨테이너를 사용하려면 동일한 운영체제 버전을 실행해야 합니다. 이 문제를 해결하려면 노드에 GPU 드라이버를 수동으로 설치하고 --set driver.enabled=false와 함께 helm install 명령어를 실행하여 NVIDIA GPU Operator가 드라이버를 배포하지 못하도록 할 수 있습니다.

      helm install --wait --generate-name \
          -n gpu-operator --create-namespace \
          nvidia/gpu-operator \
          --set driver.enabled=false
      

    일반적인 배포 시나리오 및 샘플 명령어는 NVIDIA 문서의 일반적인 배포 시나리오를 참고하세요.

  5. GPU 리소스 내보내기를 확인합니다.

    GPU 드라이버와 기기 플러그인이 제대로 실행되는 상태에서 NVIDIA GPU Operator가 설치되면 노드 리소스의 Allocatable 필드에 GPU 수가 올바르게 구성된 것을 확인할 수 있습니다.

    kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
    

    GPU_NODE_NAME을 테스트 중인 GPU가 있는 노드 머신의 이름으로 바꿉니다.

    출력은 다음과 비슷합니다.

    Allocatable:
      cpu:                127130m
      ephemeral-storage:  858356868519
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             509648288Ki
      nvidia.com/gpu:     1
      pods:               250
    
  6. GPU가 작동하는지 확인하려면 nvidia-smi 명령어를 실행하는 다음 샘플 GPU 작업을 실행합니다.

    export NODE_NAME=GPU_NODE_NAME
    
    cat <<EOF | kubectl create --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test-job-gpu
    spec:
      template:
        spec:
          runtimeClassName: nvidia
          containers:
          - name: nvidia-test
            image: nvidia/cuda:12.0.0-base-ubuntu22.04
            command: ["nvidia-smi"]
            resources:
              limits:
                nvidia.com/gpu: 1
          nodeSelector:
            kubernetes.io/hostname: ${NODE_NAME}
          restartPolicy: Never
    EOF
    

    CLUSTER_KUBECONFIG를 클러스터 kubeconfig 파일의 경로로 바꿉니다.

  7. 샘플 작업 출력의 로그를 확인합니다.

    kubectl logs job/test-job-gpu –kubeconfig=CLUSTER_KUBECONFIG
    

    출력은 다음과 비슷합니다.

    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.183.01             Driver Version: 535.183.1    CUDA Veersion 12.2     |
    |-----------------------------------------+----------------------+----------------------|
    | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
    |                                         |                      |               MIG M. |
    |=========================================+======================+======================|
    |   0  NVIDIA A100 80GB PCIe          Off | 00000000:25:00.0 Off |                    0 |
    | N/A   30C    P0              44W / 300W |      0MiB / 81920MiB |      0%      Default |
    |                                         |                      |             Disabled |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |  No running processes found                                                           |
    +---------------------------------------------------------------------------------------+
    

제한사항

Google Distributed Cloud로 만든 클러스터에서 NVIDIA GPU Operator를 사용할 때는 다음 제한사항이 적용됩니다.

  • 최신 버전의 NVIDIA GPU Operator를 설치하면 운영자가 적용한 containerd 구성이 클러스터 또는 노드 풀 업데이트 또는 업그레이드 중에 덮어쓸 수 있습니다.

  • 지원되는 버전의 Google Distributed Cloud는 컨테이너 기기 인터페이스 (CDI)를 사용 설정하지 않는 containerd LTS 출시 1.6을 설치합니다. NVIDIA 문서의 컨테이너 기기 인터페이스 지원에 나온 안내를 따르면 nvidia-cdi 런타임이 작동하지 않을 수 있습니다. 클러스터는 예상대로 작동하지만 일부 CDI 기능은 사용할 수 없을 수 있습니다.

  • 부하 분산기 노드 풀은 7일마다 업데이트 작업을 자동으로 실행합니다. 이 작업은 NVIDIA GPU Operator에서 추가한 구성을 포함하여 containerd 구성을 덮어씁니다.

권장사항

NVIDIA 구성의 충돌 및 문제를 최소화하려면 다음 예방 조치를 사용하는 것이 좋습니다.

  • 클러스터 또는 노드 풀을 업그레이드하거나 업데이트하기 전에 컨테이너 구성 파일 /etc/containerd/config.toml를 백업합니다. 이 파일에는 nvidia 런타임 구성이 포함되어 있습니다. 업그레이드 또는 업데이트가 완료된 후 config.toml 파일을 복원하고 구성 변경사항이 적용되도록 containerd를 다시 시작합니다.

  • containerd 구성과 관련된 잠재적 충돌이나 문제를 방지하려면 GPU 노드를 부하 분산기 노드 (loadBalancer.nodePoolSpec)로 사용하지 마세요.

지원받기

Google Distributed Cloud에서 GPU를 사용하는 것과 관련하여 추가 지원이 필요한 경우 Cloud Customer Care에 문의하세요.

운영체제에서 GPU 하드웨어를 설정하거나 사용하는 것과 관련된 문제는 하드웨어 공급업체 또는 해당하는 경우 NVIDIA 지원팀에 직접 문의하세요.

보내 주신 의견은 소중하게 활용하겠습니다.