이 페이지에서는 멀티 인스턴스 GPU, GPU 시간 공유, NVIDIA MPS와 같은 Google Kubernetes Engine(GKE)에서 사용할 수 있는 각 GPU 공유 전략의 특성과 최적 워크로드 유형에 대해 설명합니다.
이 페이지에서는 사용자가 다음에 익숙하다고 가정합니다.
- 포드, 노드, 배포, 네임스페이스와 같은 Kubernetes 개념
- 노드 풀, 자동 확장, 노드 자동 프로비저닝과 같은 GKE 개념
Kubernetes에서 GPU 요청 작동 방식
Kubernetes를 사용하면 워크로드가 작동하는 데 필요한 리소스 양을 정확하게 요청할 수 있습니다. 워크로드에 대한 부분 CPU 단위를 요청할 수 있지만 부분 GPU 단위는 요청할 수 없습니다. 포드 매니페스트는 GPU 리소스를 정수로 요청해야 합니다. 즉, 컨테이너가 올바르게 작동하는 데 리소스 일부만 필요한 경우에도 전체 물리적 GPU가 컨테이너 하나에 할당됩니다. 이는 비효율적이며 특히 낮은 GPU 요구사항이 유사한 여러 워크로드를 실행하는 경우 비용이 많이 들 수 있습니다.
따라서 워크로드가 GPU 리소스를 모두 사용하지 않는 경우 GPU 공유 전략을 사용하여 GPU 사용률을 향상시키는 것이 좋습니다.
GPU 공유 전략이란 무엇인가요?
GPU 공유 전략을 사용하면 여러 컨테이너에서 연결된 GPU를 효율적으로 사용하고 실행 비용을 절약할 수 있습니다. GKE는 다음과 같은 GPU 공유 전략을 제공합니다.
- 멀티 인스턴스 GPU: GKE는 지원되는 단일 지원 GPU를 최대 7개의 슬라이스로 나눕니다. 각 슬라이스는 노드의 컨테이너 하나에 개별적으로 할당할 수 있으므로 GPU당 최대 7개 컨테이너에 할당할 수 있습니다. 멀티 인스턴스 GPU는 워크로드 간에 하드웨어 격리를 제공하며 GPU에서 실행되는 모든 컨테이너에 대해 일관되고 예측 가능한 서비스 품질(QoS)을 제공합니다.
- GPU 시간 공유: GKE는 NVIDIA GPU 및 소프트웨어 스택에서 제공하는 기본 제공되는 시간 공유 기능을 사용합니다. Pascal 아키텍처를 시작으로 NVIDIA GPU는 명령 수준 선점을 지원합니다. GPU에서 실행되는 프로세스 간에 컨텍스트 전환을 수행할 때 명령 수준 선점이 모든 프로세스가 공정한 시간 구획을 갖도록 보장합니다. GPU 시간 공유는 주소 공간 격리, 성능 격리, 오류 격리 측면에서 워크로드 간의 소프트웨어 수준 격리를 제공합니다.
- NVIDIA MPS: GKE는 NVIDIA의 Multi-Process Service(MPS)를 사용합니다. NVIDIA MPS는 단일 GPU 기기에서 동시에 실행할 수 있는 협업 방식의 멀티 프로세스 CUDA 워크로드를 투명하게 지원하도록 설계된 CUDA API의 바이너리 호환 구현 대안입니다. NVIDIA MPS를 사용하는 GPU는 리소스 한도(활성 스레드 비율 및 고정된 기기 메모리) 측면에서 소프트웨어 수준 격리를 제공합니다.
사용하려는 GPU 공유 전략
다음 표에서는 사용 가능한 GPU 공유 전략의 특성을 요약하고 비교합니다.
멀티 인스턴스 GPU | GPU 시간 공유 | NVIDIA MPS | |
---|---|---|---|
일반 | 컨테이너 간 병렬 GPU 공유 | 빠른 컨텍스트 전환 | 컨테이너 간 병렬 GPU 공유 |
격리 | 단일 GPU는 최대 7개의 슬라이스로 분할되며 동일한 물리적 GPU의 각 컨테이너에는 전용 컴퓨팅, 메모리 및 대역폭이 있습니다. 따라서 파티션의 컨테이너는 다른 컨테이너가 다른 파티션을 포화시킬 때도 예측 가능한 처리량과 지연 시간을 가집니다. |
각 컨테이너는 GPU에서 실행 중인 프로세스 간에 컨텍스트를 전환하여 기본 물리적 GPU의 전체 용량에 액세스합니다. 하지만 시간 공유는 공유 작업 간에 메모리 한도가 적용되지 않으며 공유 액세스를 위한 빠른 컨텍스트 전환으로 인해 오버헤드가 발생할 수 있습니다. |
NVIDIA MPS는 리소스 격리가 제한적이지만 GPU 유형 및 최대 공유 단위와 같은 다른 측정기준에서 더 많은 유연성을 확보하여 리소스 할당을 간소화합니다. |
다음 워크로드에 적합 | 동시에 실행되고 특정 복원력과 QoS가 필요한 워크로드에 사용하는 것이 좋습니다. 예를 들어, AI 추론 워크로드를 실행할 때 멀티 인스턴스 GPU를 사용하면 여러 추론 쿼리를 동시에 실행하여 상호 속도를 저하시키지 않으면서 빠르게 응답할 수 있습니다. |
유휴 기간이 있는 버스트 및 대화형 워크로드에 권장됩니다. 이러한 워크로드는 완전 전용 GPU를 사용하면 비용 효율적이지 않습니다. 시간 공유를 사용하면 워크로드가 활성 단계에 있을 때 GPU에 빠르게 액세스할 수 있습니다. GPU 시간 공유는 여러 사용자가 워크로드를 테스트하거나 프로토타입을 만드는 경우와 같이 완전한 격리 및 지속적인 GPU 액세스가 필요하지 않을 수 있는 상황에서 비용이 많이 드는 유휴 상태의 GPU를 방지하는 시나리오에 적합합니다. 시간 공유를 사용하는 워크로드는 특정 성능 및 지연 시간 저하를 감수해야 합니다. |
MPS는 GPU의 처리량과 동시 사용량을 극대화하므로 소규모 작업의 일괄 처리에 권장됩니다. MPS를 사용하면 중소 규모의 워크로드에 대해 일괄 작업을 동시에 효율적으로 처리할 수 있습니다. NVIDIA MPS는 단일 애플리케이션으로 작동하는 협력 프로세스에 최적화되어 있습니다. 예를 들어 MPI 간 순위 동시 로드를 사용하는 MPI 작업이 있습니다. 이러한 작업을 사용하면 각각의 작은 CUDA 프로세스(일반적으로 MPI 순위)는 GPU에서 동시에 실행되어 전체 GPU를 완전히 포화시킬 수 있습니다. CUDA MPS를 사용하는 워크로드는 메모리 보호 및 오류 억제 제한사항을 허용해야 합니다. |
모니터링 | 멀티 인스턴스 GPU에 대해 GPU 사용률 측정항목을 사용할 수 없습니다. | Cloud Monitoring을 사용하여 GPU 시간 공유 성능을 모니터링합니다. 사용 가능한 측정항목에 대한 자세한 내용은 GPU 시간 공유 또는 NVIDIA MPS 노드 모니터링을 참조하세요. | Cloud Monitoring을 사용하여 NVIDIA MPS의 성능을 모니터링합니다. 사용 가능한 측정항목에 대한 자세한 내용은 GPU 시간 공유 또는 NVIDIA MPS 노드 모니터링을 참조하세요. |
워크로드에서 공유 GPU 요청 | 멀티 인스턴스 GPU 실행 | 시간 공유로 GPU 실행 | NVIDIA MPS로 GPU 실행 |
GPU 사용률을 극대화하려면 GPU 공유 전략을 결합하여 각 멀티 인스턴스 GPU 파티션에 대해 시간 공유 또는 NVIDIA MPS를 사용할 수 있습니다. 그런 다음 각 파티션에서 컨테이너 여러 개를 실행할 수 있으며 이 컨테이너는 해당 파티션의 리소스에 대한 액세스를 공유합니다. 다음 조합 중 하나를 사용하는 것이 좋습니다.
- 멀티 인스턴스 GPU 및 GPU 시간 공유
- 멀티 인스턴스 GPU 및 NVIDIA MPS
GPU 공유 전략의 작동 방식
물리적 GPU를 공유할 수 있는 최대 컨테이너 수를 지정할 수 있습니다.
- Autopilot 클러스터에서는 워크로드 사양으로 구성됩니다.
- Standard 클러스터에서는 GPU가 연결된 새 노드 풀을 만들 때 구성됩니다. 노드 풀의 모든 GPU는 노드 풀 수준에서 지정한 설정에 따라 공유됩니다.
다음 섹션에서는 각 GPU 공유 전략의 예약 동작 및 작동에 대해 설명합니다.
멀티 인스턴스 GPU
spec: nodeSelector
아래의 포드 사양 nodeSelector
필드에서 cloud.google.com/gke-gpu-partition-size
라벨을 지정하여 워크로드에서 멀티 인스턴스 GPU를 요청할 수 있습니다.
GKE는 이러한 라벨을 일치시켜 사용 가능한 적절한 노드에 워크로드를 예약합니다. 적절한 사용 가능한 노드가 없으면 GKE는 자동 확장과 노드 자동 프로비저닝을 사용하여 이 라벨과 일치하는 새 노드나 노드 풀을 만듭니다.
GPU 시간 공유 또는 NVIDIA MPS
spec:nodeSelector
아래의 포드 사양 nodeSelector
필드에 다음 라벨을 지정하여 워크로드에서 GPU 시간 공유 또는 NVIDIA MPS를 요청할 수 있습니다.
cloud.google.com/gke-max-shared-clients-per-gpu
: 특정 클라이언트 수가 기본 GPU를 공유할 수 있게 해주는 노드를 선택합니다.cloud.google.com/gke-gpu-sharing-strategy
: GPU의 시간 공유 또는 NVIDIA MPS 전략을 사용하는 노드를 선택합니다.
다음 표에서는 매니페스트에 지정한 노드 라벨의 조합에 따라 예약 동작이 어떻게 변경되는지 설명합니다.
노드 라벨 | |
---|---|
cloud.google.com/gke-max-shared-clients-per-gpu 및 cloud.google.com/gke-gpu-sharing-strategy
|
GKE는 두 라벨과 모두 일치하는 사용 가능한 노드에 워크로드를 예약합니다. 사용 가능한 노드가 없으면 GKE는 자동 확장과 노드 자동 프로비저닝을 사용하여 라벨과 모두 일치하는 새 노드나 노드 풀을 만듭니다. |
cloud.google.com/gke-max-shared-clients-per-gpu 만 해당 |
Autopilot: GKE가 워크로드를 거부합니다. Standard: GKE는 라벨과 일치하는 사용 가능한 노드에 워크로드를 예약합니다. 사용 가능한 노드가 없으면 GKE는 자동 확장과 노드 자동 프로비저닝을 사용하여 라벨과 일치하는 새 노드나 노드 풀을 만듭니다. 기본적으로 자동 프로비저닝된 노드에는 각 전략에 대해 다음과 같은 라벨과 값이 지정됩니다.
|
cloud.google.com/gke-gpu-sharing-strategy 만 해당 |
Autopilot: GKE가 워크로드를 거부합니다. Standard: GKE는 특정 공유 전략을 사용하는 사용 가능한 노드에서 워크로드를 예약합니다.
|
완료하는 GPU 요청 프로세스는 GPU 시간 공유 및 NVIDIA MPS 전략과 동일합니다.
GPU 시간 공유 또는 NVIDIA MPS에서 실행되는 GPU 애플리케이션을 개발하는 경우 컨테이너마다 GPU를 하나만 요청할 수 있습니다. GKE는 예기치 않은 동작을 방지하기 위해 컨테이너에서 GPU 두 개 이상에 대한 요청을 거부합니다. 또한 시간 공유 및 NVIDIA MPS에서 요청한 GPU 수는 컨테이너에서 사용할 수 있는 컴퓨팅 성능의 척도가 아닙니다.
다음 표에서는 특정 GPU 수를 요청하는 경우의 예상 결과를 보여줍니다.
GPU 시간 공유 및 NVIDIA MPS에 적용되는 GPU 요청 수 | |
---|---|
컨테이너당 하나의 GPU 시간 공유 또는 NVIDIA MPS | GKE는 노드에 하나의 물리적 GPU 또는 여러 개의 물리적 GPU가 있는 경우에도 요청을 허용합니다. |
컨테이너당 둘 이상의 GPU 시간 공유 | GKE에서 요청을 거부합니다. 각 GPU 인스턴스는 개별 물리적 GPU로 간주되므로 이 동작은 한 컨테이너에서 멀티 인스턴스 GPU 인스턴스를 두 개 이상 요청할 때와 동일합니다. |
컨테이너당 둘 이상의 NVIDIA MPS | 노드의 물리적 GPU 수를 기반으로 GKE는 다음과 같은 작업을 수행합니다.
|
GKE에서 워크로드를 거부하면 다음과 유사한 오류 메시지가 표시됩니다.
status:
message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
phase: Failed
reason: UnexpectedAdmissionError
GPU 시간 공유 또는 NVIDIA MPS 노드 모니터링
Cloud Monitoring을 사용하여 GPU 시간 공유 또는 NVIDIA MPS 노드의 성능을 모니터링합니다. GKE는 각 GPU 노드의 측정항목을 Cloud Monitoring으로 보냅니다. 이러한 GPU 시간 공유 또는 NVIDIA MPS 노드 측정항목은 노드 수준(node/accelerator/
)에서 적용됩니다.
Cloud Monitoring에서 각 GPU 시간 공유 또는 NVIDIA MPS 노드에 대해 다음 측정항목을 확인할 수 있습니다.
- 가동 주기(
node/accelerator/duty_cycle
): 지난 샘플 기간(10초) 중에 GPU 노드가 실제로 처리를 수행한 시간의 백분율입니다. 범위는 1%~100%입니다. - 메모리 사용량(
node/accelerator/memory_used
): 각 GPU 노드에 할당된 가속기 메모리 양(바이트)입니다. - 메모리 용량(
node/accelerator/memory_total
): 각 GPU 노드의 총 가속기 메모리(바이트)입니다.
이러한 측정항목은 시간 공유 또는 NVIDA MPS 노드가 아닌 일반 GPU 측정항목과 다릅니다.
일반 물리적 GPU에 대한 측정항목은 컨테이너 수준(container/accelerator
)에 적용되며 GPU 시간 공유 또는 NVIDIA MPS를 사용하는 GPU에서 예약된 컨테이너에 대해서는 수집되지 않습니다.
다음 단계
- GPU 시간 공유를 사용하여 여러 워크로드와 GPU를 공유하는 방법 알아보기
- NVIDIA MPS를 사용하여 여러 워크로드와 GPU를 공유하는 방법 알아보기
- 멀티 인스턴스 GPU 실행 방법 알아보기
- GPU 자세히 알아보기
- NVIDIA GPU의 컴퓨팅 선점에 대한 자세한 내용은 NVIDIA Pascal 조정 가이드를 참조하세요.