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

이 페이지에서는 Google Distributed Cloud 베어메탈 클러스터에서 동적 리소스 할당을 사용하도록 GPU 워크로드를 구성하는 방법을 설명합니다. 동적 리소스 할당은 포드와 컨테이너 간에 GPU와 같은 일반 리소스를 요청하고 공유할 수 있는 Kubernetes API입니다. 서드 파티 드라이버가 이러한 리소스를 관리합니다.

동적 리소스 할당을 사용하면 Kubernetes는 참조된 기기 구성을 기반으로 포드를 예약합니다. 앱 운영자는 워크로드에서 특정 노드를 선택할 필요가 없으며 각 포드가 해당 노드에 연결된 정확한 수의 기기를 요청하는지 확인할 필요가 없습니다. 이 프로세스는 스토리지를 위한 볼륨 할당과 유사합니다.

이 기능을 사용하면 베어 메탈 클러스터 내에서 GPU 리소스를 동적이고 정확하게 할당하여 AI 워크로드를 실행할 수 있으므로 리소스 활용률과 까다로운 워크로드의 성능이 향상됩니다.

이 페이지는 기본 기술 인프라 수명 주기를 관리하는 관리자, 설계자, 운영자를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.

시작하기 전에

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

동적 리소스 할당을 사용하는 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. GPU에 액세스하는 데 필요한 SELinux 정책 모듈 nvidia_container_t를 다운로드하고 설치합니다.

      자세한 내용은 NVIDIA dgx-selinux 저장소를 참고하세요.

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

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        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 OS를 사용하는 경우 SELinux 정책이 GPU에 액세스하려고 하는 컨테이너를 방해할 수 있습니다. 자세한 내용은 베어메탈 RHEL 8의 컨테이너에서 GPU를 사용하는 방법을 참고하세요.

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

다음 단계