GPU 시간 공유를 사용하여 여러 워크로드와 GPU 공유


이 페이지에서는 여러 워크로드에 Google Kubernetes Engine(GKE) 노드의 단일 NVIDIA® GPU 하드웨어 가속기에 대한 GPU 시간 공유 액세스 권한을 부여하는 방법을 보여줍니다. GPU 시간 공유 작동 방식과 GPU 시간 공유를 사용해야 하는 경우의 제한사항 및 예시에 대한 자세한 내용은 GKE의 GPU 시간 공유를 참조하세요.

개요

GPU 시간 공유는 컨테이너 여러 개에서 노드에 연결된 단일 물리적 GPU를 공유할 수 있게 해주는 GKE 기능입니다. GKE에서 GPU 시간 공유를 사용하면 연결된 GPU를 더욱 효율적으로 사용하고 실행 비용을 절약할 수 있습니다.

이 가이드의 대상

이 가이드에 나와 있는 안내는 다음 중 하나에 해당하는 경우에 적용됩니다.

  • 플랫폼 관리자: GKE 클러스터를 생성 및 관리하고, 인프라 및 리소싱 요구사항을 계획하며, 클러스터 성능을 모니터링합니다.
  • 애플리케이션 개발자: GKE 클러스터에서 워크로드를 설계하고 배포합니다. GPU 시간 공유 요청에 대한 안내는 GPU 시간 공유를 사용하는 워크로드 배포를 참조하세요.

요구사항

  • GKE 버전: GKE 버전 1.23.7-gke.1400 이상을 실행하는 GKE Standard 클러스터에서 GPU 시간 공유를 사용 설정할 수 있습니다. GKE 버전 1.29.3-gke.1093000 이상을 실행하는 GKE Autopilot 클러스터에서 시간 공유 GPU를 사용할 수 있습니다.
  • GPU 유형: 모든 NVIDIA GPU 모델에서 GPU 시간 공유를 사용 설정할 수 있습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

GKE 클러스터 및 노드 풀에서 GPU 시간 공유 사용 설정

플랫폼 관리자는 개발자가 GPU를 사용하도록 워크로드를 배포하기 전에 GKE Standard 클러스터에서 GPU 시간 공유를 사용 설정해야 합니다. GPU 시간 공유를 사용 설정하려면 다음을 수행해야 합니다.

  1. GKE 클러스터에서 GPU 시간 공유 사용 설정
  2. NVIDIA GPU 기기 드라이버 설치(필요한 경우)
  3. 노드에서 사용 가능한 GPU 리소스 확인

버전 1.29.3-gke.1093000 이상을 실행하는 Autopilot 클러스터는 기본적으로 시간 공유 GPU를 사용 설정합니다. Autopilot 클러스터의 시간 공유는 워크로드 사양에서 구성됩니다. 자세한 내용은 시간 공유 GPU를 사용하는 워크로드 배포 섹션을 참조하세요.

GKE Standard 클러스터에서 GPU 시간 공유 사용 설정

GKE Standard 클러스터를 만들 때 GPU 시간 공유를 사용 설정할 수 있습니다. 클러스터의 기본 노드 풀에 기능이 사용 설정되어 있습니다. 클러스터에서 새 노드 풀을 수동으로 만들 때는 GPU 시간 공유를 사용 설정해야 합니다.

gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • COMPUTE_REGION: 새 클러스터의 Compute Engine 리전입니다. 영역 클러스터의 경우 --zone=COMPUTE_ZONE을 지정합니다.
  • CLUSTER_VERSION: 클러스터 제어 영역과 노드의 GKE 버전입니다. GKE 버전 1.23.7-gke.1400 이상을 사용합니다. 또는 --release-channel=RELEASE_CHANNEL 플래그를 사용하여 해당 GKE 버전으로 출시 채널을 지정합니다.
  • MACHINE_TYPE: 노드의 Compute Engine 머신 유형입니다. 가속기 최적화 머신 유형을 선택하는 것이 좋습니다.
  • GPU_TYPE: GPU 유형으로, nvidia-tesla-v100과 같은 NVIDIA GPU 플랫폼이어야 합니다.
  • GPU_QUANTITY: 기본 노드 풀의 각 노드에 연결할 물리적 GPU 수입니다.
  • CLIENTS_PER_GPU: 각 물리적 GPU를 공유할 수 있는 최대 컨테이너 수입니다.
  • DRIVER_VERSION: 설치할 NVIDIA 드라이버 버전입니다. 다음 중 하나일 수 있습니다.
    • default: GKE 버전의 기본 드라이버 버전을 설치합니다.
    • latest: GKE 버전에 사용 가능한 최신 드라이버 버전을 설치합니다. Container-Optimized OS를 사용하는 노드에서만 사용할 수 있습니다.
    • disabled: 자동 드라이버 설치를 건너뜁니다. 노드 풀을 만든 후에는 수동으로 드라이버를 설치해야 합니다. gpu-driver-version을 생략한 경우 기본 옵션입니다.

GKE 노드 풀에서 GPU 시간 공유 사용 설정

GKE 클러스터에서 새 노드 풀을 수동으로 만들 때 GPU 시간 공유를 사용 설정할 수 있습니다.

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

다음을 바꿉니다.

  • NODEPOOL_NAME: 새 노드 풀의 이름입니다.
  • CLUSTER_NAME: 클러스터의 이름으로, GKE 버전 1.23.7-gke.1400 이상을 실행해야 합니다.
  • COMPUTE_REGION: 클러스터의 Compute Engine 리전입니다. 영역 클러스터의 경우 --zone=COMPUTE_ZONE을 지정합니다.
  • MACHINE_TYPE: 노드의 Compute Engine 머신 유형입니다. 가속기 최적화 머신 유형을 선택하는 것이 좋습니다.
  • GPU_TYPE: GPU 유형으로, nvidia-tesla-v100과 같은 NVIDIA GPU 플랫폼이어야 합니다.
  • GPU_QUANTITY: 노드 풀의 각 노드에 연결할 물리적 GPU 수입니다.
  • CLIENTS_PER_GPU: 각 물리적 GPU를 공유할 수 있는 최대 컨테이너 수입니다.
  • DRIVER_VERSION: 설치할 NVIDIA 드라이버 버전입니다. 다음 중 하나일 수 있습니다.

    • default: GKE 버전의 기본 드라이버 버전을 설치합니다.
    • latest: GKE 버전에 사용 가능한 최신 드라이버 버전을 설치합니다. Container-Optimized OS를 사용하는 노드에서만 사용할 수 있습니다.
    • disabled: 자동 드라이버 설치를 건너뜁니다. 노드 풀을 만든 후에는 수동으로 드라이버를 설치해야 합니다. gpu-driver-version을 생략한 경우 기본 옵션입니다.

NVIDIA GPU 기기 드라이버 설치

계속하기 전에 다음 명령어를 실행하여 클러스터에 연결하세요.

gcloud container clusters get-credentials CLUSTER_NAME

클러스터를 만들 때 자동 드라이버 설치를 사용 중지한 경우 또는 1.27.2-gke.1200 이전의 GKE 버전을 사용하는 경우 호환되는 NVIDIA 드라이버를 수동으로 설치하여 물리적 GPU의 GPU 시간 공유 분할을 관리해야 합니다. 드라이버를 설치하려면 드라이버를 설정하는 GKE 설치 DaemonSet를 배포합니다.

자세한 내용은 NVIDIA GPU 기기 드라이버 설치를 참조하세요.

클러스터에서 노드 자동 프로비저닝을 사용하려면 GKE가 GPU 기기 드라이버를 자동으로 설치할 수 있는 범위로 노드 자동 프로비저닝을 구성해야 합니다. 자세한 내용은 GPU를 사용한 노드 자동 프로비저닝 사용을 참조하세요.

노드에서 사용 가능한 GPU 리소스 확인

노드에 표시되는 GPU 수가 GPU 시간 공유를 사용 설정할 때 지정한 수와 일치하는지 확인하려면 노드를 설명합니다.

kubectl describe nodes NODE_NAME

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

...
Capacity:
  ...
  nvidia.com/gpu:             3
Allocatable:
  ...
  nvidia.com/gpu:             3

이 출력 예시에서 max-shared-clients-per-gpu의 지정된 값은 3이고 노드에 연결할 물리적 GPU의 count1이므로 노드의 GPU 리소스 수는 3입니다. 또 다른 예로, 물리적 GPU의 count2인 경우 출력은 6개의 할당 가능한 GPU 리소스를 표시하며, 물리적 GPU 하나당 3개씩입니다.

GPU 시간 공유를 사용하는 워크로드 배포

GPU 워크로드를 배포하는 애플리케이션 운영자는 매니페스트의 nodeSelector에 적절한 노드 라벨을 지정하여 사용 설정된 GPU 시간 공유를 선택할 수 있습니다. 요청을 계획할 때는 요청 한도를 검토하여 GKE가 배포를 거부하지 않는지 확인하세요.

GPU 시간 공유를 사용하도록 워크로드를 배포하려면 다음 단계를 완료합니다.

  1. 다음 워크로드 매니페스트에 nodeSelector를 추가합니다.

    • cloud.google.com/gke-gpu-sharing-strategy: time-sharing: GPU 시간 공유를 사용하는 노드를 선택합니다.
    • cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU": 특정 개수의 컨테이너가 기본 GPU를 공유할 수 있도록 하는 노드를 선택합니다.
  2. spec.containers.resources.limits의 컨테이너 사양에 nvidia.com/gpu=1 GPU 리소스 요청을 추가합니다.

예를 들어 다음 단계는 포드 3개를 GPU 시간 공유 노드 풀에 배포하는 방법을 보여줍니다. GKE는 각 컨테이너를 동일한 물리적 GPU에 할당합니다. 컨테이너는 컨테이너에 연결된 GPU의 UUID를 출력합니다.

  1. 다음 매니페스트를 gpu-timeshare.yaml로 저장합니다.

Autopilot

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-accelerator: "GPU_TYPE"
                cloud.google.com/gke-gpu-sharing-strategy: "time-sharing"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
                cloud.google.com/gke-accelerator-count: "GPU_COUNT"
              containers:
              - name: cuda-simple
                image: nvidia/cuda:11.0.3-base-ubi7
                command:
                - bash
                - -c
                - |
                  /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                resources:
                  limits:
                    nvidia.com/gpu: 1
      

다음을 바꿉니다.

  • GPU_TYPE: GPU 유형입니다.
  • CLIENTS_PER_GPU: 이 GPU를 사용할 워크로드 수입니다. 이 예시에서는 3을 사용합니다.
  • GPU_COUNT: 노드에 연결할 물리적 GPU 수입니다. 이 예시에서는 1을 사용합니다.

Standard

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-gpu-sharing-strategy: "SHARING_STRATEGY"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
              containers:
              - name: cuda-simple
                image: nvidia/cuda:11.0.3-base-ubi7
                command:
                - bash
                - -c
                - |
                  /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                resources:
                  limits:
                    nvidia.com/gpu: 1
      

다음을 바꿉니다.

  • GPU의 시간 공유를 요청하려면 SHARING_STRATEGY를 '시간 공유'로 바꿉니다.
  • CLIENTS_PER_GPU: 이 GPU를 사용할 워크로드 수입니다. 이 예시에서는 3을 사용합니다.
  1. 매니페스트를 적용합니다.

    kubectl apply -f gpu-timeshare.yaml
    
  2. 모든 Pod가 실행 중인지 확인합니다.

    kubectl get pods -l=app=cuda-simple
    
  3. Pod의 로그를 확인하여 GPU의 UUID를 확인합니다.

    kubectl logs POD_NAME
    

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

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    
  4. 노드에 하나의 물리적 GPU가 연결되어 있으면 같은 노드에 있는 다른 Pod의 로그를 확인하여 GPU UUID가 동일한지 확인합니다.

    kubectl logs POD2_NAME
    

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

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    

멀티 인스턴스 GPU와 함께 GPU 시간 공유 사용

플랫폼 관리자는 여러 GKE GPU 기능을 결합할 수 있습니다. GPU 시간 공유는 단일한 물리적 GPU를 최대 7개의 슬라이스로 분할하는 멀티 인스턴스 GPU와 호환됩니다. 이러한 파티션은 서로 격리됩니다. 각 멀티 인스턴스 GPU 파티션에 GPU 시간 공유를 구성할 수 있습니다.

예를 들어 gpu-partition-size1g.5gb로 설정하면 기본 GPU가 7개의 파티션으로 분할됩니다. 또한 max-shared-clients-per-gpu3으로 설정하면 각 파티션은 최대 3개의 컨테이너를 지원하므로 해당 물리적 GPU에 총 21개의 GPU 시간 공유 기기를 할당할 수 있습니다. gpu-partition-size가 실제 파티션으로 변환되는 방법을 알아보려면 멀티 인스턴스 GPU 파티션을 참조하세요.

GPU 시간 공유가 사용 설정된 멀티 인스턴스 GPU 클러스터를 만들려면 다음 명령어를 실행합니다.

Autopilot

Autopilot을 사용하면 두 노드 선택기 집합을 모두 사용하여 GPU 시간 공유 및 멀티 인스턴스 GPU를 함께 사용할 수 있습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cuda-simple
spec:
  replicas: 7
  selector:
    matchLabels:
      app: cuda-simple
  template:
    metadata:
      labels:
        app: cuda-simple
    spec:
      nodeSelector:
        cloud.google.com/gke-gpu-partition-size: 1g.5gb
        cloud.google.com/gke-gpu-sharing-strategy: time-sharing
        cloud.google.com/gke-max-shared-clients-per-gpu: "3"
        cloud.google.com/gke-accelerator: nvidia-tesla-a100
        cloud.google.com/gke-accelerator-count: "1"
      containers:
      - name: cuda-simple
        image: nvidia/cuda:11.0.3-base-ubi7
        command:
        - bash
        - -c
        - |
          /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
        resources:
          limits:
            nvidia.com/gpu: 1

Standard

Standard의 경우 다음 명령어를 실행하여 GPU 시간 공유 멀티 인스턴스 클러스터를 만들어야 합니다.

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=nvidia-tesla-a100,count=GPU_QUANTITY,gpu-partition-size=PARTITION_SIZE,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

PARTITION_SIZE를 원하는 멀티 인스턴스 GPU 파티션 크기(예: 1g.5gb)로 바꿉니다.

제한사항

  • GKE는 GPU 시간 공유를 사용하여 물리적 GPU를 공유하는 컨테이너 간에 주소 공간 격리, 성능 격리, 오류 격리를 적용합니다. 그러나 GPU에는 메모리 한도가 적용되지 않습니다. 메모리 부족(OOM) 문제를 방지하려면 워크로드에서 GPU 메모리 한도를 설정합니다. 보안 문제를 방지하려면 같은 신뢰 경계에 있는 워크로드만 GPU 시간 공유에 배포합니다.
  • 용량 할당 중에 예기치 않은 동작이 방지되도록 GKE는 특정 GPU 시간 공유 요청을 거부할 수 있습니다. 자세한 내용은 GPU 시간 공유에 대한 GPU 요청을 참조하세요.
  • 단일 물리적 GPU에서 시간 공유를 사용할 수 있는 최대 컨테이너 수는 48개입니다. GPU 시간 공유 구성을 계획할 때는 성능과 응답성이 최적화되도록 워크로드의 리소스 요구사항과 기본 물리적 GPU의 용량을 고려합니다.

다음 단계