동적 리소스 할당으로 GPU 기기 관리

동적 리소스 할당은 Google Distributed Cloud 베어메탈 클러스터의 포드와 컨테이너 간에 GPU와 같은 리소스를 요청하고 공유할 수 있는 Kubernetes API입니다. 서드 파티 드라이버가 이러한 기기를 관리하고 Kubernetes는 스토리지 볼륨과 마찬가지로 이를 동적으로 할당합니다. AI 워크로드가 특정 노드를 타겟팅하거나 연결된 기기의 정확한 수를 요청할 필요가 없습니다. 이 문서에서는 동적 리소스 할당을 사용하도록 GPU 워크로드를 구성하는 방법을 보여줍니다.

시작하기 전에

동적 리소스 할당을 사용하도록 GPU 워크로드를 구성하기 전에 다음 기본 요건이 충족되는지 확인합니다.

  • 베어메탈 클러스터가 버전 1.33.0 이상입니다.
  • 운영체제가 Ubuntu 22.04 또는 Red Hat Enterprise Linux(RHEL) 9.4입니다.
  • 동적 리소스 할당 사용 설정에 설명된 대로 동적 리소스 할당을 사용 설정하도록 클러스터를 업데이트했습니다.
  • GPU가 연결되고 NVIDIA GPU 드라이버가 설치된 노드 머신이 하나 이상 있습니다. 자세한 내용은 번들 NVIDIA GPU Operator 설치 또는 제거를 참조하세요.
  • 번들로 제공되는 NVIDIA GPU 연산자를 사용하는 경우 버전 1.33.0 이상에서는 컨테이너 기기 인터페이스(CDI)가 기본적으로 사용 설정됩니다. 수동으로 설치된 GPU 연산자를 사용하는 경우 ClusterPolicy에서 CDI가 사용 설정되어 있는지 확인합니다.
  • GPU용 NVIDIA DRA 드라이버의 안내에 따라 모든 GPU 연결 노드에 NVIDIA DRA 드라이버를 설치했습니다.

동적 리소스 할당을 사용하는 GPU 워크로드 만들기

GPU 워크로드가 동적 리소스 할당을 활용하여 GPU를 요청하려면 GPU 기기 할당 요청을 설명하는 ResourceClaim가 있는 공유 네임스페이스에 있어야 합니다. Kubernetes가 GPU 리소스를 할당하려면 워크로드가 ResourceClaim를 참조해야 합니다.

다음 단계에서는 워크로드가 동적 리소스 할당을 사용하여 GPU 리소스를 요청하는 환경을 설정합니다.

  1. 동적 리소스 할당과 관련된 리소스를 만들려면 클러스터에 새 Namespace를 만듭니다.

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_KUBECONFIG: 사용자 클러스터 kubeconfig 파일의 경로입니다.

    • NAMESPACE_NAME: 동적 리소스 할당 네임스페이스의 이름

  2. GPU 액세스 요청을 설명하는 ResourceClaim를 만듭니다.

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    RESOURCE_CLAIM_NAME을 GPU 요청의 리소스 클레임 이름으로 바꿉니다.

  3. 이전 단계에서 만든 ResourceClaim을 참조하는 워크로드를 만듭니다.

    다음 워크로드 예시에서는 dra-test 네임스페이스에서 gpu-claim라는 ResourceClaim를 참조하는 방법을 보여줍니다. pod1 포드의 컨테이너는 GPU에서 CUDA 워크로드를 실행하도록 설계된 NVIDIA 컴퓨팅 통합 기기 아키텍처(CUDA) 샘플입니다. pod1 포드가 성공적으로 완료되면 동적 리소스 할당 기능이 제대로 작동하고 동적 리소스 할당이 클러스터에서 GPU 리소스를 관리할 준비가 되었음을 나타냅니다.

    Ubuntu

    1. 다음 명령어를 사용하여 매니페스트를 클러스터에 적용합니다.

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. 다음 명령어를 사용하여 매니페스트를 클러스터에 적용합니다.

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

제한사항

동적 리소스 할당을 사용할 때는 다음 제한사항을 고려하세요.

  • 지원되는 버전의 NVIDIA GPU Operator와 함께 RHEL OS를 사용하면 컨테이너 기기 인터페이스(CDI)가 기기 삽입 및 SELinux 라벨 지정을 자동으로 처리합니다. 수동 SELinux 정책 구성을 사용하거나 포드 securityContext를 설정할 필요가 없습니다.

  • 이 기능은 이 기능의 오픈소스 Kubernetes API 그룹인 resource.k8s.io/v1과 다른 resource.k8s.io/v1beta1 API 그룹을 사용합니다. v1 오픈소스 API 그룹은 v1beta1 API 그룹보다 더 많은 기능과 더 나은 안정성을 제공합니다.

다음 단계