GPU 실행

이 페이지에서는 Google Kubernetes Engine(GKE) 클러스터 노드에서 NVIDIA® 그래픽 처리 장치(GPU) 하드웨어 액셀러레이터를 사용하는 방법을 보여줍니다.

개요

GKE에서는 NVIDIA Tesla® K80, P100, P4, V100, T4, A100(베타) GPU가 탑재된 노드 풀을 만들 수 있습니다. GPU는 영상 인식 및 자연어 처리와 같은 딥 러닝 작업은 물론 동영상 트랜스코딩 및 이미지 처리와 같은 다른 컴퓨팅 집약적인 작업을 수행할 수 있는 컴퓨팅 성능을 제공합니다.

빈번한 노드 중단에도 워크로드를 처리할 수 있으면 선점형 VM에서 GPU를 사용할 수도 있습니다. 선점형 VM을 사용하면 GPU 실행 비용이 줄어듭니다. 자세한 내용은 선점형 인스턴스의 GPU를 참조하세요.

요구사항

GKE에서 GPU를 사용하기 위한 요구사항은 다음과 같습니다.

  • Kubernetes 버전: [Container-Optimized OS] 노드 이미지를 사용하는 노드 풀의 경우 GKE 버전 1.9 이상에서 GPU 노드를 사용할 수 있습니다. Ubuntu 노드 이미지를 사용하는 노드 풀의 경우 GKE 버전 1.11.3 이상에서 GPU 노드를 사용할 수 있습니다.
  • GPU 할당량: GPU 노드를 만들려면 먼저 원하는 영역에 Compute Engine GPU 할당량이 있어야 합니다. 프로젝트에 GPU 할당량이 충분한지 확인하려면 Google Cloud Console에서 할당량을 참조하세요.

    추가 GPU 할당량이 필요하면 Cloud Console에서 GPU 할당량을 요청해야 합니다. 결제 계정을 설정한 경우에는 할당량 요청을 제출한 후 프로젝트에 할당량이 자동으로 배정됩니다.

  • NVIDIA GPU 드라이버: 노드에 NVIDIA GPU 드라이버를 수동으로 설치해야 합니다. 이 페이지의 하단에서 드라이버 설치 방법을 설명합니다.

  • A100 GPU: A100 GPU는 a2 머신 유형에서만 지원되며 GKE 버전 1.18.6-gke.3504 이상이 필요합니다.

제한사항

GKE에서 GPU를 사용하기 전에 다음 제한사항에 유의해야 합니다.

  • 기존 노드 풀에 GPU를 추가할 수 없습니다.
  • GPU 노드는 유지보수 이벤트 중 실시간 이전할 수 없습니다.
  • GPU는 범용 N1 머신 유형에서만 지원됩니다.

가용성

GPU는 특정 지역 및 영역에서 제공됩니다. GPU 할당량을 요청할 때는 클러스터를 실행할 리전을 고려합니다.

적용 가능한 지역 및 영역의 전체 목록은 [Compute Engine의 GPU]를 참조하세요.

또한 gcloud 명령줄 도구를 사용하여 영역에서 사용할 수 있는 GPU를 확인할 수 있습니다. 각 영역에서 지원되는 모든 GPU 가속기 유형의 목록을 보려면 다음 명령어를 실행하세요.

gcloud compute accelerator-types list

가격 책정

GPU 가격 책정 정보는 Google Cloud GPU 페이지의 가격표를 참조하세요.

GPU 할당량

GPU 할당량은 [Google Cloud 프로젝트]에서 실행할 수 있는 총 GPU 수입니다. GPU가 포함된 클러스터를 만들려면 프로젝트에 있는 GPU 할당량이 충분해야 합니다.

GPU 할당량은 클러스터에서 실행하려는 전체 GPU 수와 동일해야 합니다. 클러스터 자동 확장을 사용 설정할 경우, 노드당 GPU 수만큼 곱해진 최대 클러스터 노드 수와 최소한 동일 개수 이상의 GPU 할당량을 요청해야 합니다.

예를 들어 노드당 2개의 GPU를 실행하는 노드가 3개 포함된 클러스터를 만들 경우, 프로젝트에는 최소한 6개의 GPU 할당량이 필요합니다.

GPU 할당량 요청

GPU 할당량을 요청하려면 Cloud Console을 사용합니다. 할당량 요청에 대한 자세한 내용은 Compute Engine 문서에서 추가 할당량 요청을 참조하세요.

GPU 할당량을 검색하려면 Cloud Console에서 다음 단계를 수행하세요.

  1. Cloud Console에서 ID 및 액세스 관리(IAM) 할당량 메뉴로 이동합니다.

    할당량 메뉴로 이동

  2. 측정항목 드롭다운 메뉴에서 없음을 클릭한 후 검색 필드에 'gpus'를 입력합니다.

  3. 검색 결과에서 원하는 GPU를 선택합니다.

    선택된 GPU 측정항목을 보여주는 측정항목 드롭다운 메뉴의 스크린샷입니다.

  4. 측정항목 드롭다운 메뉴를 닫습니다.

할당량 요청 제출

할당량 요청을 제출하려면 Cloud Console에서 다음 단계를 수행하세요.

  1. GPU 할당량 목록에서 원하는 리전(예: us-central1)의 할당량을 선택합니다.
  2. 할당량 수정을 클릭합니다. 요청 양식이 Cloud Console의 오른쪽에 열립니다.
  3. 각 할당량 요청의 새 할당량 한도 필드를 채웁니다.
  4. 요청 세부정보를 요청 설명 필드에 입력합니다.
  5. 완료를 클릭합니다.
  6. 요청 제출을 클릭합니다.

GPU 실행

다음 섹션에서는 GKE 클러스터에서 GPU를 실행하는 방법을 설명합니다.

자동 확장 GPU 노드 풀 만들기

GKE에서 GPU를 가장 비용 효율적인 방식으로 활용하고, 클러스터 자동 확장을 활용하기 위해서는 클러스터에서 개별적으로 GPU 노드 풀을 만드는 것이 좋습니다.

이미 GPU가 아닌 노드 풀을 실행하는 기존 클러스터에 GPU 노드 풀을 추가하면 GKE가 다음 노드 taint를 사용해서 GPU 노드를 자동으로 taint합니다.

  • 키: nvidia.com/gpu
  • 효과: NoSchedule

또한 GKE는 ExtendedResourceToleration 수락 컨트롤러를 실행하여 GPU를 요청하는 pod에 해당하는 내결함성을 자동으로 적용합니다.

그러면 GPU를 요청하는 pod만 GPU 노드에 예약되고, 더 효율적인 자동 확장이 가능해집니다. GPU를 요청하는 pod가 충분하지 않으면 GPU 노드가 빠르게 축소될 수 있습니다.

Cloud Console 또는 gcloud 명령줄 도구를 사용하여 기존 클러스터에서 GPU 노드 풀을 만듭니다.

gcloud

GPU가 포함된 노드 풀을 만들려면 다음 명령어를 실행하세요.

gcloud container node-pools create POOL_NAME \
  --accelerator type=GPU_TYPE,count=AMOUNT \
  --zone COMPUTE_ZONE --cluster CLUSTER_NAME \
  [--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling
  --machine-type a2-highgpu-1g]

다음을 바꿉니다.

  • POOL_NAME: 선택한 노드 풀의 이름입니다.
  • GPU_TYPE: GPU 유형으로, nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 또는 nvidia-tesla-a100입니다.
  • AMOUNT: 노드 풀의 노드에 연결할 GPU 수입니다.
  • COMPUTE_ZONE: 노드 풀을 만들 컴퓨팅 영역입니다(예: us-central1-c). 클러스터는 지정된 영역에서 이미 실행되고 있어야 합니다.
  • CLUSTER_NAME: 노드 풀을 만들 클러스터의 이름입니다.

추가 옵션은 다음과 같습니다.

  • --num-nodes는 생성할 초기 노드 수를 지정합니다.
  • --min-nodes는 특정 시점에 실행되는 최소 노드 수를 지정합니다.
  • --max-nodes는 실행 가능한 최대 노드 수를 지정합니다.
  • --enable-autoscaling은 워크로드 요구사항이 변경될 때 노드 풀의 자동 확장을 허용합니다.
  • --machine-type은 노드의 머신 유형을 지정합니다. a2 머신 유형에서만 실행할 수 있는 nvidia-tesla-a100 GPU에 필요합니다.

예를 들어 다음 명령어는 p100-cluster 클러스터에 P100 GPU 2개가 있는 자동 확장 노드 풀 p100을 만듭니다.

gcloud container node-pools create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --zone us-central1-c --cluster p100-cluster \
  --num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

Console

GPU가 포함된 노드 풀을 만들려면 다음 안내를 따르세요.

  1. Cloud Console에서 Google Kubernetes Engine 메뉴로 이동합니다.

    Google Kubernetes Engine 메뉴로 이동

  2. 클러스터 목록에서 수정하려는 클러스터의 이름을 클릭합니다.

  3. 노드 풀 추가를 클릭합니다.

  4. 필요한 경우 노드 풀 세부정보 페이지에서 자동 확장 사용 설정 체크박스를 선택합니다.

  5. 노드 풀을 원하는 대로 구성합니다.

  6. 탐색창에서 노드를 선택합니다.

  7. 머신 계열에서 GPU를 클릭합니다.

  8. 각 노드에서 실행할 GPU 유형GPU 수를 선택합니다.

  9. 경고를 읽고 제한사항을 이해합니다를 선택합니다.

  10. 머신을 원하는 대로 구성합니다.

  11. 만들기를 클릭합니다.

GPU가 포함된 새 영역 클러스터 만들기

Cloud Console 또는 gcloud 명령줄 도구를 사용하여 GPU를 실행하는 영역 클러스터를 만듭니다.

gcloud

기본 노드 풀에서 실행되는 GPU가 포함된 영역 클러스터를 만들려면 다음 명령어를 실행하세요.

gcloud container clusters create CLUSTER_NAME \
  --accelerator type=GPU_TYPE,count=AMOUNT \
  --zone COMPUTE_ZONE

다음을 바꿉니다.

  • CLUSTER_NAME: 선택한 클러스터의 이름입니다.
  • GPU_TYPE: GPU 유형으로, nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 또는 nvidia-tesla-a100입니다.
  • AMOUNT: 기본 노드 풀에서 실행할 GPU 수입니다.
  • COMPUTE_ZONE: 클러스터의 컴퓨팅 영역입니다(예: us-central1-c).

예를 들어 다음 명령어는 노드가 3개(--num-nodes가 생략된 경우의 기본값)이고 노드당 P100 GPU가 2개 있는 p100이라는 클러스터를 만듭니다.

gcloud container clusters create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --zone us-central1-c

Console

  1. GPU 가속 컴퓨팅 클러스터 템플릿으로 이동합니다.

    GPU 가속 컴퓨팅 템플릿으로 이동

  2. 원하는 대로 클러스터를 구성합니다. GPU 노드 풀을 맞춤설정하거나 GPU 노드 풀을 추가합니다.

  3. 경고를 읽고 제한사항을 이해합니다를 선택합니다.

  4. 만들기를 클릭합니다.

GPU가 포함된 새 리전 클러스터 만들기

기본적으로 리전 클러스터는 한 리전의 3개 영역에 노드를 만듭니다. 하지만 3개 영역 모두에 GPU가 포함된 Google Cloud 리전은 없습니다. GPU가 포함된 리전별 클러스터를 만들 때는 --node-locations 명령어를 사용하여 영역을 지정해야 합니다. 클러스터를 만든 후에도 이 명령어를 사용할 수 있습니다. GPU가 포함되는 영역에 대해 알아보려면 가용성을 참조하세요.

gcloud 명령줄 도구 또는 Cloud Console을 사용하여 리전별 GPU 클러스터를 만듭니다.

gcloud

GPU가 포함된 리전 클러스터를 만들려면 다음 명령어를 실행하세요.

gcloud container clusters create CLUSTER_NAME \
  --accelerator type=GPU_TYPE,count=AMOUNT \
  --region COMPUTE_REGION \
  --node-locations COMPUTE_ZONE,COMPUTE_ZONE

다음을 바꿉니다.

  • CLUSTER_NAME: 선택한 클러스터의 이름입니다.
  • GPU_TYPE: GPU 유형으로, nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 또는 nvidia-tesla-a100입니다.
  • AMOUNT: 노드당 실행할 GPU 수입니다.
  • COMPUTE_REGION: 클러스터의 리전입니다(예: us-central1).
  • COMPUTE_ZONE: 리전 내 컴퓨팅 영역입니다(예: us-central1-c). 영역에는 지정한 GPU 유형이 있어야 합니다.

예를 들어 다음 명령어는 노드별로 2개의 P100 GPU가 포함되며, 이러한 노드가 3개 포함된(--num-nodes가 생략된 경우의 기본값) p100이라는 클러스터를 us-central1 내에 있는 2개 영역에 만듭니다.

gcloud container clusters create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --region us-central1 \
  --node-locations us-central1-a,us-central1-c

Console

  1. GPU 가속 컴퓨팅 클러스터 템플릿으로 이동합니다.

    GPU 가속 컴퓨팅 템플릿으로 이동

  2. 위치 유형에서 리전을 선택합니다.

  3. 리전 드롭다운 목록에서 원하는 리전을 선택합니다.

  4. 원하는 대로 클러스터를 구성합니다. GPU 노드 풀을 맞춤설정하거나 GPU 노드 풀을 추가합니다.

  5. 경고를 읽고 제한사항을 이해합니다를 선택합니다.

  6. 만들기를 클릭합니다.

NVIDIA GPU 장치 드라이버 설치

클러스터에 GPU 노드를 추가한 후에는 노드에 NVIDIA의 장치 드라이버를 설치해야 합니다. Google에서는 드라이버를 설치하는 데 적용할 수 있는 DaemonSet를 제공합니다.

컨테이너 최적화 O(COS) 및 Ubuntu 노드 설치 방법은 아래 섹션을 참조하세요.

COS

설치 DaemonSet를 배포하려면 다음 명령어를 실행하세요.

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml

설치를 완료하는 데 몇 분 정도 걸립니다. 설치되면 NVIDIA GPU 기기 플러그인이 Kubernetes API를 통해 NVIDIA GPU 용량을 표시합니다.

다음 표에는 각 GKE 버전마다 지원하는 Nvidia 드라이버 버전이 나열되어 있습니다.

GKE 버전 Nvidia 드라이버
1.18.6-gke.3504 이상 450.51.06
1.14.x 이상 418.67

Ubuntu

GPU를 지원하려면 Ubuntu 노드 v1.11.3 이상이 필요합니다.

설치 DaemonSet를 배포하려면 다음 명령어를 실행하세요.

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml

설치를 완료하는 데 몇 분 정도 걸립니다. 설치되면 NVIDIA GPU 기기 플러그인이 Kubernetes API를 통해 NVIDIA GPU 용량을 표시합니다.

다음 표에는 각 GKE 버전마다 지원하는 Nvidia 드라이버 버전이 나열되어 있습니다.

GKE 버전 Nvidia 드라이버
1.14.6-gke.13 이상 418.74
1.14.6-gke.12 이하 410.104
1.13.9-gke.11 이상 418.74
1.13.9-gke.10 이하 410.104
1.12.6-gke.6 이상 410.104
1.12.6-gke.5 이하 384.111
1.11.8-gke.4 이상 410.104
1.11.8-gke.3 이하 384.111

GPU를 사용하도록 pod 구성

리소스 제한을 사용하여 GPU를 사용하도록 pod를 구성합니다. 다음 키-값 쌍을 사용해서 pod 사양에 리소스 제한을 지정합니다.

  • 키: nvidia.com/gpu
  • 값: 사용할 GPU 수

아래는 GPU를 사용하는 pod 사양의 예시입니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
       nvidia.com/gpu: 2

여러 GPU 유형 사용

클러스터별로 여러 GPU 가속기 유형을 사용하려면 각각 고유한 가속기 유형을 사용해서 여러 노드 풀을 만들어야 합니다. GKE는 특정 GPU 유형의 노드에서 GPU 워크로드 배치를 돕기 위해 GPU 노드에 고유한 노드 선택기를 연결합니다.

  • 키: cloud.google.com/gke-accelerator
  • 값: nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 또는 nvidia-tesla-a100

이 노드 선택기를 워크로드의 pod 사양에 추가하여 특정 GPU 유형을 대상으로 지정할 수 있습니다. 예를 들면 다음과 같습니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
       nvidia.com/gpu: 2
  nodeSelector:
    cloud.google.com/gke-accelerator: nvidia-tesla-k80 # or nvidia-tesla-p100 or nvidia-tesla-p4 or nvidia-tesla-v100 or nvidia-tesla-t4 or nvidia-tesla-a100

CUDA 라이브러리 정보

CUDA®는 GPU를 위한 NVIDIA의 병렬 컴퓨팅 플랫폼이자 프로그래밍 모델입니다. 클러스터에 설치하는 NVIDIA 기기 드라이버에는 CUDA 라이브러리가 포함됩니다.

CUDA 라이브러리 및 디버그 유틸리티는 각각 /usr/local/nvidia/lib64/usr/local/nvidia/bin의 컨테이너 내부에서 사용할 수 있습니다.

NVIDIA GPU를 사용하는 pod에서 실행되는 CUDA 애플리케이션은 동적으로 CUDA 라이브러리를 검색해야 합니다. 이를 위해서는 /usr/local/nvidia/lib64LD_LIBRARY_PATH 환경 변수에 포함해야 합니다.

GKE에서 CUDA 애플리케이션에 LD_LIBRARY_PATH가 이미 적절하게 설정된 Ubuntu 기반 CUDA Docker 기본 이미지를 사용해야 합니다. 지원되는 최신 CUDA 버전은 COS(1.11.5 이상) 및 Ubuntu(1.11.8-gke.4 이상, 1.12.6-gke.6 이상) 모두에서 10.0입니다.

GPU 노드 모니터링

GKE는 GPU를 사용하는 컨테이너에 대해 다음과 같은 [Cloud Monitoring] 측정항목을 노출합니다. 이러한 측정항목을 사용해서 GPU 워크로드 성능을 모니터링할 수 있습니다.

  • 가동 주기(container/accelerator/duty_cycle): 이전 샘플 기간(10초) 중에 가속기가 실제로 처리를 수행한 시간의 백분율입니다. 1~100 사이입니다.
  • 메모리 사용량(container/accelerator/memory_used): 할당된 가속기 메모리 양(바이트)입니다.
  • 메모리 용량(container/accelerator/memory_total): 총 가속기 메모리 용량(바이트)입니다.

이러한 측정항목은 Cloud Monitoring에서 사용할 수 있습니다.

클러스터 및 해당 리소스의 모니터링에 대한 자세한 내용은 모니터링을 참조하세요.

사용량 측정항목 보기

Cloud Console의 워크로드 대시보드에서 워크로드의 GPU 사용량 측정항목을 볼 수 있습니다.

워크로드의 GPU 사용량을 보려면 다음 단계를 수행하세요.

  1. Cloud Console에서 워크로드 메뉴로 이동합니다.

    Google Kubernetes Engine 메뉴로 이동

  2. 원하는 워크로드를 선택합니다.

워크로드 대시보드에는 GPU 메모리 사용량 및 용량과 GPU 사용 주기에 대한 차트가 표시됩니다.

다음 단계