View a markdown version of this page

Amazon EKS에서 NVIDIA GPU와 함께 다중 인스턴스 GPU(MIG) 사용 - Amazon EKS

이 페이지 개선에 도움 주기

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.

Amazon EKS에서 NVIDIA GPU와 함께 다중 인스턴스 GPU(MIG) 사용

다중 인스턴스 GPU(MIG)는 단일 물리적 GPU를 여러 격리된 인스턴스로 분할하는 NVIDIA GPU의 하드웨어 기능입니다. 분할된 인스턴스의 최대 수는 GPU에 따라 다릅니다. 각 인스턴스에는 전용 메모리, 컴퓨팅 유닛, 메모리 대역폭이 있으므로 한 인스턴스에서 실행되는 워크로드가 다른 인스턴스의 워크로드에 영향을 미칠 수 없습니다. 격리 없이 소프트웨어 시간 멀티플렉싱을 통해 GPU를 공유하는 시간 분할과 달리 MIG는 하드웨어 수준 메모리 및 포드 간 장애 격리를 제공합니다.

MIG는 예측 가능한 서비스 품질이 필요한 멀티 테넌트 추론 및 워크로드에 가장 적합합니다. NVIDIA Ampere(A100), Hopper(H100 및 H200) 및 Blackwell GPU에서 사용할 수 있습니다. AWS에서는 P 패밀리 인스턴스 유형과 Blackwell 기반 g7g7e 인스턴스 유형입니다. 전체 목록은 MIG 지원 인스턴스 유형 단원을 참조하십시오.

MIG는 다음과 같은 경우에 적합합니다.

  • 한 워크로드가 다른 워크로드에 필요한 GPU 메모리를 사용할 수 없도록 메모리 격리가 필요합니다.

  • 테넌트가 GPU 하드웨어를 공유하지만 테넌트별 서비스 품질이 필요한 다중 테넌트 추론을 실행합니다.

  • 이미 A100, H100, H200 또는 Blackwell 인스턴스에서 훈련을 실행하고 훈련이 유휴 상태일 때 더 작은 추론 워크로드에 해당 GPU를 재사용하려고 합니다.

다음과 같은 경우 다른 접근 방식을 고려하세요.

  • 노드가 g5, g6 또는 g6e 패밀리와 같이 MIG를 지원하지 않는 GPU 인스턴스 유형을 사용합니다. 대신 시간 분할을 사용합니다.

  • 메모리 격리가 필요하지 않으며 가장 단순한 구성을 원합니다. 대신 시간 분할을 사용합니다.

  • GPU 파티션을 중단 없이 자주 변경해야 합니다. MIG 모드 또는 파티션 레이아웃을 변경하려면 GPU 재설정이 필요하며, 이는 GPU Operator가 노드를 재부팅하여 수행합니다.

  • GPU 간 집합적 또는 피어 투 피어 통신에 의존하는 다중 GPU 훈련을 실행합니다. MIG는 NCCL 또는 교차 GPU P2P를 지원하지 않습니다.

고려 사항

프로덕션 환경에서 MIG를 사용하기 전에 다음 고려 사항을 검토하세요.

일반적인 고려 사항

  • MIG 구성을 변경하려면 GPU 재설정이 필요합니다. MIG 모드를 활성화 또는 비활성화하거나 파티션 레이아웃을 변경하려면 GPU 재설정이 필요하므로 실행 중에 변경할 수 없습니다. 예를 들어 NVIDIA GPU Operator의 MIG Manager는 MIG 모드를 변경하기 위해 재부팅이 필요한 경우 노드의 GPU 포드를 중지하고 노드를 재부팅하여 구성 변경을 적용합니다.

  • 컴퓨팅은 인스턴스 크기와 엄격하게 비례하여 할당되지 않습니다. 메모리 대역폭 및 캐시 동작이 프로필마다 다르기 때문에 1g 인스턴스는 전체 GPU 처리량을 모든 워크로드에 비례적으로 제공하지 않습니다. 파티션 크기를 조정하기 전에 사용하려는 프로필에서 워크로드를 벤치마킹합니다.

  • 시간 분할은 MIG 인스턴스에 영향을 미치지 않습니다. MIG 인스턴스는 이미 하드웨어 격리되어 있으며 시간 분할을 통해 더 이상 공유할 수 없습니다. MIG 디바이스에서 TimeSlicing 공유 전략을 요청해도 하드웨어 동작은 변경되지 않습니다. 컨테이너 간에 단일 MIG 인스턴스를 공유하려면 대신 NVIDIA Multi-Process Service(MPS)를 사용합니다.

  • GPU 간 통신이 제한적입니다. MIG가 활성화된 경우 다른 GPU의 MIG 인스턴스는 GPU 간 피어 투 피어(P2P) 통신을 사용할 수 없으며, NCCL은 MIG에서 작동하지 않습니다. 텐서 병렬 다중 GPU 훈련과 같이 GPU 전반의 집합적 통신 또는 P2P에 의존하는 다중 GPU 워크로드에는 대신 전체 GPU가 필요합니다. 자세한 내용은 NVIDIA 웹사이트의 NVIDIA MIG 사용 설명서에서 애플리케이션 고려 사항을 참조하세요.

NVIDIA 디바이스 플러그인 고려 사항

  • 포드 리소스 요청은 전략과 일치해야 합니다. 단일 전략을 사용하면 포드가 nvidia.com/gpu를 요청합니다. 혼합 전략을 사용하면 포드가 nvidia.com/mig-1g.10gb와 같은 프로필별 리소스를 요청합니다. 노드가 광고하지 않는 프로필을 요청하는 포드는 Pending 상태를 유지합니다. kubectl describe node <node-name>를 사용하여 광고된 리소스를 확인합니다.

  • AL2023의 독립 실행형 디바이스 플러그인. 예를 들어 클러스터 설정의 일부로 NVIDIA 디바이스 플러그인을 별도로 설치하는 경우 GPU Operator가 관리하는 디바이스 플러그인과 충돌하지 않도록 MIG 노드에서 제외합니다. 독립 실행형 디바이스 플러그인에 nvidia.com/mig.config 레이블이 지정된 노드를 제외하는 노드 선호도 규칙을 추가합니다.

  • EKS Auto Mode에서는 지원되지 않습니다. EKS Auto Mode는 NVIDIA 디바이스 플러그인을 관리하고 해당 구성을 노출하지 않습니다(가속화된 워크로드 배포 참조). EKS Auto Mode 노드에서는 MIG를 활성화할 수 없습니다. 사용자가 디바이스 플러그인 설정을 제어하는 자체 관리형 Karpenter 노드 또는 AMI 및 관리형 노드 그룹에서 MIG를 구성합니다.

NVIDIA DRA 드라이버 고려 사항

  • 정적 MIG에는 사전 생성된 인스턴스가 필요합니다. 정적 MIG를 사용하면 DRA 드라이버가 기존 MIG 인스턴스를 할당하지만 MIG 모드를 활성화하거나 GPU를 분할하지 않습니다. 먼저 MIG 모드를 활성화하고 인스턴스를 생성해야 합니다(예: NVIDIA GPU Operator의 MIG Manager 또는 nvidia-smi 사용). 자세한 내용은 NVIDIA DRA 드라이버를 통해 MIG 사용 섹션을 참조하세요.

  • 동적 MIG는 알파 기능입니다. 동적 MIG를 사용하면 드라이버가 워크로드 요청에 대한 응답으로 온디맨드로 MIG 파티션을 생성 및 삭제합니다. 기본적으로 비활성화되어 있는 DynamicMIG 기능 게이트가 필요합니다. 자세한 내용은 NVIDIA DRA 드라이버를 통해 MIG 사용 섹션을 참조하세요.

  • Bottlerocket에서 내장 디바이스 플러그인을 비활성화합니다. DRA 드라이버는 동일한 노드에서 NVIDIA 디바이스 플러그인과 함께 실행할 수 없습니다. Bottlerocket에서 내장 디바이스 플러그인을 비활성화합니다. 이 작업에는 Bottlerocket 버전 1.63.0 이상이 필요합니다. 자세한 내용은 NVIDIA DRA 드라이버 설치 섹션을 참조하세요.

  • 컴퓨팅 지원. NVIDIA DRA 드라이버는 Karpenter, EKS 관리형 노드 그룹 또는 자체 관리형 노드의 정적 용량 프로비저닝에서 지원되며 EKS Auto Mode에서는 지원되지 않습니다. 자세한 내용은 Karpenter 웹사이트의 Karpenter 정적 NodePool 설명서를 참조하세요.

MIG 지원 인스턴스 유형

AWS에서 다음 인스턴스 유형이 MIG 지원 GPU를 제공합니다.

인스턴스 유형 GPU GPU 메모리

p4d.24xlarge

8 x NVIDIA A100 40GB

320GB

p4de.24xlarge

8 x NVIDIA A100 80GB

640GB

p5.48xlarge

8 x NVIDIA H100 80GB

640GB

p5e.48xlarge

8 x NVIDIA H200

1128 GB

p5en.48xlarge

8 x NVIDIA H200

1128 GB

p6-b200.48xlarge

8 x NVIDIA Blackwell B200

1432 GB

p6-b300.48xlarge

8 x NVIDIA Blackwell Ultra B300

2144 GB

g7.48xlarge

8 x NVIDIA RTX PRO 4500 Blackwell Server Edition

256GB

g7e.48xlarge

8 x NVIDIA RTX PRO 6000 Blackwell Server Edition

768GB

g5, g6 또는 g6e 패밀리에서는 MIG를 사용할 수 없습니다. MIG 지원 NVIDIA GB200 GPU를 사용하는 p6e-gb200 UltraServer는 Amazon EKS에서 P6e-GB200 UltraServers 사용 섹션을 참조하세요.

참고

g7 인스턴스 유형에는 NVIDIA 드라이버 버전 595 이상이 필요합니다. EKS 최적화 가속 AMI에는 현재 NVIDIA 드라이버 버전 580이 포함되어 있으므로 g7에서 MIG를 사용하려면 드라이버 버전 595를 사용하여 사용자 지정 AMI를 빌드해야 합니다. 자세한 내용은 사용자 지정 ECS 최적화 Amazon Linux AMI 빌드 섹션을 참조하세요.

MIG 인스턴스는 이름 지정 패턴 <slices>g.<memory>gb를 사용하는 프로필로 설명됩니다. 여기서 <slices>는 컴퓨팅 슬라이스 수이고 <memory>는 기가바이트 단위의 인스턴스 메모리입니다. 예를 들어 3g.40gb 프로필은 7개의 컴퓨팅 슬라이스 중 3개와 40GB 메모리를 제공합니다. 각 GPU가 지원하는 프로필은 하드웨어에 의해 고정됩니다. 전체 목록은 NVIDIA 웹사이트의 NVIDIA 다중 인스턴스 GPU 사용 설명서를 참조하세요.

인스턴스 유형당 MIG 프로필

하나의 노드에서 사용할 수 있는 MIG 프로필은 인스턴스 유형의 GPU에 따라 다릅니다. 다음 섹션에서는 각 MIG 지원 Amazon EC2 인스턴스 유형에 대한 프로필을 나열합니다. 각 프로필에 대해 최대 인스턴스는 단일 GPU에서 생성할 수 있는 해당 프로필의 최대 인스턴스 수이고 인스턴스당 메모리는 각 인스턴스에 할당된 GPU 메모리입니다.

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.5gb

1/7

5GB

7

1g.10gb

1/7

10GB

4

2g.10gb

2/7

10GB

3

3g.20gb

3/7

20GB

2

4g.20gb

4/7

20GB

1

7g.40gb

7/7

40GB

1

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.10gb

1/7

10GB

7

1g.20gb

1/7

20GB

4

2g.20gb

2/7

20GB

3

3g.40gb

3/7

40GB

2

4g.40gb

4/7

40GB

1

7g.80gb

7/7

80GB

1

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.10gb

1/7

10GB

7

1g.20gb

1/7

20GB

4

2g.20gb

2/7

20GB

3

3g.40gb

3/7

40GB

2

4g.40gb

4/7

40GB

1

7g.80gb

7/7

80GB

1

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.18gb

1/7

18GB

7

1g.35gb

1/7

35GB

4

2g.35gb

2/7

35GB

3

3g.71gb

3/7

71GB

2

4g.71gb

4/7

71GB

1

7g.141gb

7/7

141GB

1

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.23gb

1/7

23GB

7

1g.45gb

1/7

45GB

4

2g.45gb

2/7

45GB

3

3g.90gb

3/7

90GB

2

4g.90gb

4/7

90GB

1

7g.180gb

7/7

180GB

1

p6-b300.48xlarge – NVIDIA Blackwell Ultra B300

p6-b300.48xlarge는 각 GPU를 32GB 인스턴스 7개, 67GB 인스턴스 4개, 135GB 인스턴스 2개 또는 270GB 인스턴스 1개로 분할하는 것을 지원하는 HGX B300을 사용합니다. 이러한 크기는 잠정적 수치이며 변경될 수 있습니다. 프로필 세부 정보는 NVIDIA 웹사이트의 NVIDIA 지원 MIG 프로필을 참조하세요.

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.16gb

1/2

16 GB

2

2g.32gb

2/2

32GB

1

RTX PRO 4500 Blackwell은 그래픽 지원(+gfx) 및 미디어 엔진(+me.all, -me) 프로필 변형도 지원합니다. 전체 목록은 NVIDIA 웹사이트의 NVIDIA 지원 MIG 프로필을 참조하세요.

프로필 컴퓨팅 슬라이스 인스턴스당 메모리 최대 인스턴스

1g.24gb

1/4

24GB

4

2g.48gb

2/4

48GB

2

4g.96gb

4/4

96GB

1

RTX PRO 6000 Blackwell Server Edition은 그래픽 지원(+gfx) 및 미디어 엔진(+me.all, -me) 프로필 변형도 지원합니다. 전체 목록은 NVIDIA 웹사이트의 NVIDIA 지원 MIG 프로필을 참조하세요.

MIG 전략

NVIDIA DRA 드라이버와 NVIDIA 디바이스 플러그인은 다양한 방식으로 MIG 인스턴스를 Kubernetes에 노출합니다. 디바이스 플러그인은 노드 전체의 MIG 전략 설정을 사용하는 반면, DRA 드라이버는 해당 속성을 기준으로 인스턴스를 선택하므로 동등한 설정이 없습니다. 이 차이를 이해하는 것이 두 모델 중에서 선택하는 데 중요합니다.

NVIDIA DRA 드라이버

NVIDIA DRA 드라이버는 단일 또는 혼합 전략 개념을 사용하지 않으며 구성할 동등한 설정이 없습니다. MIG 인스턴스를 계수된 리소스로 광고하는 대신 드라이버는 각 인스턴스를 mig.nvidia.com DeviceClassprofile과 같은 속성이 있는 디바이스로 게시합니다. 포드는 NVIDIA DRA 드라이버를 통해 MIG 사용에 표시된 대로 이러한 속성을 ResourceClaim 또는 ResourceClaimTemplate의 공통 표현식 언어(CEL) 선택기와 일치시켜 인스턴스를 선택합니다.

선택은 인스턴스별이므로 혼합 프로필 노드는 전략 모드 전환 없이 작동합니다. 단일 GPU를 여러 개의 서로 다른 프로필로 분할할 수 있으며 각 클레임은 필요한 프로필을 선택합니다. DRA 드라이버에 중요한 선택은 단일 전략 또는 혼합 전략이 아니라 정적 MIG 또는 동적 MIG입니다. 이 선택은 MIG 인스턴스를 미리 생성할지 아니면 드라이버가 온디맨드로 생성할지를 제어합니다. 자세한 내용은 NVIDIA DRA 드라이버를 통해 MIG 사용 섹션을 참조하세요.

NVIDIA 디바이스 플러그인

NVIDIA 디바이스 플러그인은 두 전략 중 하나를 사용하여 MIG 인스턴스를 Kubernetes에 광고합니다. 디바이스 플러그인은 MIG 인스턴스를 인스턴스별 속성이 아닌 정수 형식 개수만 포함하는 노드 수준 확장 리소스로 노출하기 때문에 전략은 해당 리소스의 이름을 지정하는 방법을 결정합니다.

  • 단일 전략 – 노드의 모든 GPU가 동일한 MIG 프로필을 사용합니다. 디바이스 플러그인은 각 인스턴스를 nvidia.com/gpu 리소스로 광고하고 포드는 전용 GPU와 마찬가지로 nvidia.com/gpu: 1을 요청합니다. 기존 매니페스트는 변경되지 않습니다. Bottlerocket과 AL2023 모두 단일 전략을 지원합니다.

  • 혼합 전략 – 동일한 노드의 GPU가 서로 다른 MIG 프로필을 사용할 수 있습니다. 디바이스 플러그인은 각 프로필을 nvidia.com/mig-1g.10gb 또는 nvidia.com/mig-3g.40gb와 같은 개별 리소스로 광고하며, 포드는 필요한 특정 프로필을 요청합니다. Bottlerocket의 내장 NVIDIA 디바이스 플러그인에는 혼합 전략을 사용할 수 없습니다. 자세한 내용은 GitHub의 Bottlerocket GitHub issue #4483을 참조하세요.

NVIDIA DRA 드라이버를 통해 MIG 사용

NVIDIA DRA 드라이버로 MIG 인스턴스를 할당할 때 포드는 디바이스 플러그인의 nvidia.com/mig-<profile> 확장 리소스가 아닌 ResourceClaim 또는 ResourceClaimTemplate을 통해 MIG 인스턴스를 요청합니다.

DRA 드라이버는 계수된 리소스가 아닌 속성으로 인스턴스를 설명하므로 디바이스 플러그인에 필요한 단일 또는 혼합 전략을 사용하지 않습니다(MIG 전략 참조). 드라이버는 각 MIG 인스턴스를 gpu.nvidia.com/type 속성이 migmig.nvidia.com DeviceClass의 디바이스로 노출하고, 물리적 GPU의 profile(예: 1g.5gb) 및 parentUUID와 같은 인스턴스별 속성을 광고합니다. 특정 프로필을 요청하거나 동일한 GPU에 여러 인스턴스를 유지하려면 이러한 속성을 공통 표현식 언어(CEL) 선택기와 일치시킵니다.

DRA 드라이버는 다음 두 가지 모드 중 하나로 MIG 인스턴스를 할당합니다.

  • 정적 MIG - 드라이버가 시작되기 전에 MIG 모드를 활성화하고 노드에서 MIG 인스턴스를 생성합니다. 예를 들어 NVIDIA 디바이스 플러그인을 통해 AL2023 노드에서 MIG 사용에 설명된 대로 NVIDIA GPU Operator의 MIG Manager를 사용합니다. 드라이버는 기존 인스턴스를 검색하여 포드에 할당하지만 노드의 MIG 구성은 수정하지 않습니다. 드라이버 시작 후 추가된 인스턴스는 GPU kubelet 플러그인이 다시 시작될 때까지 검색되지 않습니다. 정적 MIG는 기본값이며 기능 게이트가 필요하지 않습니다.

  • 동적 MIG - 드라이버는 워크로드 요청에 대한 응답으로 온디맨드로 MIG 파티션을 생성 및 삭제하므로 GPU를 미리 분할하지 않아도 됩니다. 동적 MIG는 기본적으로 비활성화된 알파 기능입니다. 다음 섹션에 표시된 것과 동일한 ResourceClaimTemplate 선택기를 사용하여 프로필을 요청하면 드라이버가 요청을 이행하기 위해 GPU를 분할합니다.

고려 사항

  • 동적 MIG는 노드상의 정적 검색을 대체합니다. 드라이버는 모든 파티션을 관리하고 GPU kubelet 플러그인이 시작될 때 생성하지 않은 모든 MIG 파티션을 삭제합니다. 유지하려는 파티션이 미리 생성된 노드에서는 동적 MIG를 활성화하지 마십시오. 또한 플러그인이 실행 중인 동안에는 mig-parted 또는 nvidia-smi mig를 실행하지 마십시오. 수동 변경 사항이 드라이버의 파티션 상태와 충돌하여 포드 준비 또는 정리가 실패할 수 있습니다.

  • 동적 MIG는 알파 상태이며 NVIDIA DRA 드라이버를 설치할 때 기능 게이트를 활성화해야 합니다. 지침은 NVIDIA DRA 드라이버 설치 섹션을 참조하세요.

  • Hopper(H100 및 H200) 이상 아키텍처는 온디맨드로 MIG 모드를 활성화합니다. Ampere(A100) GPU를 포함하여 이전 세대는 온디맨드로 MIG 모드를 활성화할 수 없습니다.

  • 동적 MIG는 Kubernetes 버전 1.36 이상에서 기본적으로 활성화되는 Kubernetes 파티션 가능 디바이스 기능(GitHub의 KEP-4815)에 따라 달라집니다. 이전 버전에서는 이 기능이 기본적으로 활성화되어 있지 않으므로 스케줄러가 동적으로 생성된 MIG 디바이스를 할당할 수 없습니다.

사전 조건

  • Karpenter, EKS 관리형 노드 그룹 또는 자체 관리형 노드 그룹을 통해 정적 용량이 프로비저닝된 Kubernetes 버전 1.34 이상을 실행하는 Amazon EKS 클러스터

  • MIG 모드가 활성화되고 GPU가 MIG 인스턴스로 분할된 MIG 지원 P 패밀리 노드 정적 MIG는 NVIDIA 웹사이트의 NVIDIA GPU Operator의 MIG Manager를 참조하세요.

  • NVIDIA DRA 드라이버 설치에 설명된 대로 설치된 NVIDIA DRA 드라이버. 정적 MIG 파티셔닝을 사용하지 않는 경우 선택적으로 동적 MIG를 활성화할 수 있습니다.

절차

다음 예제는 정적 또는 동적 MIG 및 NVIDIA DRA 드라이버와 함께 사용할 수 있습니다.

  1. mig.nvidia.com DeviceClass에서 MIG 인스턴스를 요청하는 ResourceClaimTemplate과 이를 참조하는 포드를 생성합니다. 이 예제에서는 프로필을 제약하지 않고 사용 가능한 MIG 인스턴스를 요청합니다.

    cat <<EOF | kubectl apply -f - apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: mig-profile-any spec: spec: devices: requests: - name: mig exactly: deviceClassName: mig.nvidia.com count: 1 --- apiVersion: v1 kind: Pod metadata: name: mig-dra-pod spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: claims: - name: mig resourceClaims: - name: mig resourceClaimTemplateName: mig-profile-any restartPolicy: OnFailure EOF
  2. 포드에 단일 MIG 인스턴스가 할당되었는지 확인합니다.

    kubectl logs mig-dra-pod

    예제 출력은 다음과 같습니다. 포드는 분할된 GPU에서 하나의 MIG 인스턴스를 인식합니다.

    GPU 0: NVIDIA A100-SXM4-40GB (UUID: GPU-edd63844-8488-f76a-f6e0-1027a7319a88) MIG 2g.10gb Device 0: (UUID: MIG-a5ad493e-e7e8-5675-9381-1d0f5311a456)

특정 MIG 프로필 요청

사용 가능한 인스턴스 대신 특정 프로필을 요청하려면 profile 속성과 일치시키는 CEL 선택기를 추가합니다. 다음 ResourceClaimTemplate1g.5gb 인스턴스를 요청하고 포드는 해당 인스턴스를 참조합니다.

cat <<EOF | kubectl apply -f - apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: mig-profile-1g.5gb spec: spec: devices: requests: - name: mig exactly: deviceClassName: mig.nvidia.com selectors: - cel: expression: "device.attributes['gpu.nvidia.com'].profile == '1g.5gb'" --- apiVersion: v1 kind: Pod metadata: name: mig-profile-pod spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: claims: - name: mig resourceClaims: - name: mig resourceClaimTemplateName: mig-profile-1g.5gb restartPolicy: OnFailure EOF

동일한 GPU에서 여러 MIG 인스턴스 요청

단일 클레임의 여러 MIG 인스턴스가 동일한 물리적 GPU에서 오도록 하려면 matchAttribute: "gpu.nvidia.com/parentUUID"를 사용하여 constraints 블록을 추가합니다. 다음 ResourceClaimTemplate은 동일한 GPU에서 1g.5gb 인스턴스와 2g.10gb 인스턴스를 요청하고 포드는 클레임을 참조합니다. 컨테이너는 특정 요청의 이름을 지정하지 않고 클레임을 참조하기 때문에 두 MIG 인스턴스를 모두 할당받습니다.

cat <<EOF | kubectl apply -f - apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: multi-mig spec: spec: devices: requests: - name: mig-small exactly: deviceClassName: mig.nvidia.com selectors: - cel: expression: "device.attributes['gpu.nvidia.com'].profile == '1g.5gb'" - name: mig-medium exactly: deviceClassName: mig.nvidia.com selectors: - cel: expression: "device.attributes['gpu.nvidia.com'].profile == '2g.10gb'" constraints: - requests: [] matchAttribute: "gpu.nvidia.com/parentUUID" --- apiVersion: v1 kind: Pod metadata: name: multi-mig-pod spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: claims: - name: mig resourceClaims: - name: mig resourceClaimTemplateName: multi-mig restartPolicy: OnFailure EOF

NVIDIA 디바이스 플러그인을 통해 Bottlerocket 노드에서 MIG 사용

Bottlerocket에서 EKS 최적화 가속 AMI에는 NVIDIA 디바이스 플러그인이 포함되어 있습니다. settings.kubelet-device-plugins.nvidia 설정을 통해 단일 전략으로 MIG를 활성화합니다. Bottlerocket은 버전 1.34.0 이상에서 MIG를 지원합니다.

사전 조건

  • Amazon EKS 클러스터. 다음 절차에서는 EKS 최적화 Bottlerocket NVIDIA AMI 버전 1.34.0 이상을 사용하여 MIG 지원 P 패밀리 노드를 프로비저닝합니다.

  • 클러스터에 설치 및 구성된 Karpenter. 다음 절차에서는 Karpenter EC2NodeClass를 사용하여 Bottlerocket 노드 사용자 데이터에 MIG 설정을 제공합니다. 자세한 내용은 Karpenter 웹사이트의 Karpenter 시작하기를 참조하세요.

  • 클러스터와 통신하도록 구성된 kubectl. 자세한 내용은 kubectl 설치 또는 업데이트 섹션을 참조하세요.

절차

GPU 노드의 Bottlerocket 사용자 데이터에 MIG 파티셔닝 설정을 추가합니다. 사용자 데이터를 제공하는 방법은 노드를 프로비저닝하는 방법에 따라 달라집니다. 다음 예제에서는 p4d.24xlarge 노드의 Karpenter EC2NodeClass를 보여줍니다.

cat <<EOF | kubectl apply -f - apiVersion: karpenter.k8s.aws/v1 kind: EC2NodeClass metadata: name: gpu-bottlerocket-mig spec: amiFamily: Bottlerocket amiSelectorTerms: - alias: bottlerocket@latest role: eksctl-KarpenterNodeRole-<cluster-name> subnetSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> securityGroupSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> userData: | [settings.kubelet-device-plugins.nvidia] device-partitioning-strategy = "mig" [settings.kubelet-device-plugins.nvidia.mig.profile] "a100.40gb" = "2g.10gb" EOF

이러한 설정으로 프로비저닝된 노드가 클러스터에 조인하면 GPU에서 MIG 모드가 활성화되고 각 GPU가 2g.10gb 인스턴스로 분할되며 디바이스 플러그인은 결과 인스턴스를 nvidia.com/gpu 리소스로 광고합니다. p4d.24xlarge에는 8개의 A100 GPU가 있고 각각 3개의 2g.10gb 인스턴스를 지원하므로 노드는 nvidia.com/gpu: 24를 광고합니다.

참고

mig.profile 설정은 a100.40gb 또는 h100.80gb와 같은 GPU 모델을 키로 사용합니다. mig.profile 설정이 없으면 GPU는 MIG 모드를 활성화하고 가장 큰 프로필을 사용합니다. Bottlerocket은 단일 전략을 사용하기 때문에 노드의 모든 GPU는 동일한 프로필을 사용합니다. 동일한 노드에서 다른 프로필을 사용하려면(혼합 전략) NVIDIA GPU Operator와 함께 AL2023 경로를 사용합니다.

NVIDIA 디바이스 플러그인을 통해 AL2023 노드에서 MIG 사용

AL2023에서 다음 단계는 NVIDIA GPU Operator를 사용하여 NVIDIA 디바이스 플러그인과 MIG Manager를 설치합니다. MIG Manager는 MIG 모드를 활성화하고 사용자가 제공하는 구성에 따라 GPU를 분할합니다. 그런 다음 NVIDIA 디바이스 플러그인이 결과 인스턴스를 Kubernetes에 광고합니다. GPU Operator는 단일 전략과 혼합 전략을 모두 지원합니다.

EKS 최적화 AL2023 NVIDIA AMI에는 이미 NVIDIA 드라이버 및 도구 키트가 포함되어 있으므로, 사전 설치된 드라이버와 충돌하지 않도록 GPU Operator에서 드라이버 관리를 비활성화합니다. 또는 GPU Operator를 사용하지 않고도 NVIDIA 디바이스 플러그인과 MIG Manager를 직접 설치하고 관리할 수 있습니다.

사전 조건

  • Amazon EKS 클러스터. 다음 절차는 EKS 최적화 AL2023 NVIDIA AMI를 사용하여 MIG 지원 P 패밀리 노드(예: p4d.24xlarge)를 프로비저닝합니다.

  • 이 절차는 GPU 노드를 프로비저닝하기 위해 Karpenter EC2NodeClassNodePool을 생성하므로 Karpenter가 클러스터에 설치 및 구성되어 있어야 합니다. 자세한 내용은 Karpenter 웹사이트의 Karpenter 시작하기를 참조하세요.

  • 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 Helm 설정 지침을 참조하세요.

  • 클러스터와 통신하도록 구성된 kubectl. 자세한 내용은 kubectl 설치 또는 업데이트 섹션을 참조하세요.

절차

  1. AL2023 P 패밀리 GPU 노드에 대한 EC2NodeClassNodePool을 생성합니다. AL2023에서는 이후 단계에서 GPU Operator에 의해 MIG 파티셔닝이 적용되므로 이는 표준 AL2023 GPU 노드 클래스입니다. 다음 예제에서는 EKS 최적화 AL2023 NVIDIA AMI로 p4d.24xlarge 노드를 프로비저닝합니다.

    cat <<EOF | kubectl apply -f - apiVersion: karpenter.k8s.aws/v1 kind: EC2NodeClass metadata: name: gpu-mig-al2023 spec: amiFamily: AL2023 amiSelectorTerms: - alias: al2023@latest role: eksctl-KarpenterNodeRole-<cluster-name> subnetSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> securityGroupSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> tags: karpenter.sh/discovery: <cluster-name> --- apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu-mig-al2023 spec: template: spec: nodeClassRef: group: karpenter.k8s.aws kind: EC2NodeClass name: gpu-mig-al2023 taints: - key: nvidia.com/gpu effect: NoSchedule requirements: - key: karpenter.sh/capacity-type operator: In values: ["spot", "on-demand"] - key: node.kubernetes.io/instance-type operator: In values: ["p4d.24xlarge"] - key: kubernetes.io/arch operator: In values: ["amd64"] limits: cpu: 1000 memory: 5000Gi EOF
  2. NVIDIA 헬름 리포지토리를 추가합니다.

    helm repo add nvidia https://nvidia.github.io/gpu-operator helm repo update
  3. 드라이버 관리를 비활성화하고, 혼합 전략을 선택하고, 적용할 MIG 프로필을 정의하는 gpu-operator-values.yaml 파일을 생성합니다. 다음 예제에서는 p4d.24xlarge 노드에서 8개 GPU 중 4개를 분할하고 나머지는 그대로 두는 p4d-half-balanced 구성을 정의합니다.

    cat <<EOF > gpu-operator-values.yaml driver: enabled: false toolkit: enabled: false devicePlugin: enabled: true nfd: enabled: true gfd: enabled: true mig: strategy: mixed migManager: enabled: true env: - name: WITH_REBOOT value: "true" config: create: true name: custom-mig-parted-configs default: all-disabled data: config.yaml: |- version: v1 mig-configs: all-disabled: - devices: all mig-enabled: false p4d-half-balanced: - devices: [0, 1, 2, 3] mig-enabled: true mig-devices: "1g.5gb": 2 "2g.10gb": 1 "3g.20gb": 1 - devices: [4, 5, 6, 7] mig-enabled: false EOF
  4. 값 파일을 사용하여 GPU Operator를 설치합니다.

    helm install gpu-operator nvidia/gpu-operator \ --namespace gpu-operator \ --create-namespace \ --values gpu-operator-values.yaml
  5. 적용할 프로필 구성으로 MIG 지원 노드에 레이블을 지정합니다. MIG Manager 구성 요소는 이 레이블을 감시하고 그에 따라 GPU를 분할하여 노드를 재부팅함으로써 변경 사항을 적용합니다.

    kubectl label nodes -l node.kubernetes.io/instance-type=p4d.24xlarge \ nvidia.com/mig.config=p4d-half-balanced --overwrite
  6. GPU Operator가 GPU를 분할한 후 포드는 nvidia.com/gpu 대신 리소스 이름으로 특정 MIG 프로필을 요청합니다. 다음 예제에서는 하나의 1g.5gb 인스턴스를 요청하는 포드를 실행합니다.

    cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: mig-inference spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: limits: nvidia.com/mig-1g.5gb: 1 EOF

용량 예약 및 프로필별 워크로드가 있는 관리형 노드 그룹을 포함하여 P 패밀리 인스턴스에 대한 전체 혼합 전략 구성 예제는 Amazon EKS 모범 사례 가이드의 MIG 섹션을 참조하세요.

MIG가 활성 상태인지 확인

MIG 지원 노드가 Ready 상태가 되면 GPU에서 MIG 모드가 활성 상태이고 노드가 예상 MIG 리소스를 광고하는지 확인합니다.

  1. 노드가 MIG 리소스를 광고하는지 확인합니다. 단일 전략을 사용하면 노드는 인스턴스를 nvidia.com/gpu로 보고합니다. 혼합 전략을 사용하면 노드는 nvidia.com/mig-1g.10gb와 같은 프로필별 리소스를 보고합니다.

    kubectl describe node <node-name> | grep nvidia.com
  2. MIG 지원 노드의 포드에서 nvidia-smi를 실행하여 MIG 모드가 활성 상태인지 확인합니다.

    nvidia-smi는 MIG 모드가 켜져 있는 GPU에 대해 MIG M.: Enabled를 보고하고 각각에 구성된 MIG 인스턴스를 나열합니다. 다음은 MIG가 활성화되고 3g.20gb, 2g.10gb1g.5gb 인스턴스로 분할된 A100 40GB GPU의 출력 예제입니다.

    +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 580.159.03 Driver Version: 580.159.03 CUDA Version: 13.0 | +-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA A100-SXM4-40GB On | 00000000:10:1C.0 Off | On | | N/A 35C P0 65W / 400W | 213MiB / 40960MiB | N/A Default | | | | Enabled | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | MIG devices: | +------------------+----------------------------------+-----------+-----------------------+ | GPU GI CI MIG | Shared Memory-Usage | Vol| Shared | | ID ID Dev | Shared BAR1-Usage | SM Unc| CE ENC DEC OFA JPG | | | | ECC| | |==================+==================================+===========+=======================| | 0 1 0 0 | 107MiB / 20096MiB | 42 0 | 3 0 2 0 0 | | | 0MiB / 12211MiB | | | +------------------+----------------------------------+-----------+-----------------------+ | 0 5 0 1 | 71MiB / 9984MiB | 28 0 | 2 0 1 0 0 | | | 0MiB / 6105MiB | | | +------------------+----------------------------------+-----------+-----------------------+ | 0 13 0 2 | 36MiB / 4864MiB | 14 0 | 1 0 0 0 0 | | | 0MiB / 3052MiB | | | +------------------+----------------------------------+-----------+-----------------------+

    혼합 전략을 사용하면 포드는 노드의 전체 GPU 레이아웃이 아니라 요청한 MIG 인스턴스만 인식할 수 있습니다. 이전 단계의 mig-inference 포드가 하나의 nvidia.com/mig-1g.5gb 인스턴스를 요청했으므로 해당 포드 내의 nvidia-smi -L에 하나의 MIG 디바이스가 나열됩니다.

    kubectl logs mig-inference

    예제 출력은 다음과 같습니다.

    GPU 0: NVIDIA A100-SXM4-40GB (UUID: GPU-5b7ce860-1951-004c-4881-6ac6997df770) MIG 1g.5gb Device 0: (UUID: MIG-9b065868-21b6-5b8d-8ab9-e99089ed472c)

    노드에 있는 모든 GPU의 전체 파티션 레이아웃을 보려면 워크로드 포드 내부가 아닌 호스트에서 nvidia-smi -L을 실행합니다. 다음 명령은 노드에서 권한 있는 디버깅 포드를 시작하고 호스트의 nvidia-smi를 실행합니다. node-name을 MIG 지원 노드의 이름으로 바꿉니다.

    kubectl debug node/<node-name> -it --profile=sysadmin --image=nvidia/cuda:12.6.0-base-ubuntu22.04 -- chroot /host nvidia-smi -L

    다음은 p4d-half-balanced 구성에 대한 예제 출력입니다. 처음 4개의 GPU는 MIG 인스턴스로 분할되고 나머지 4개는 전체 GPU입니다. 각 MIG 줄은 자체 UUID, 메모리 및 컴퓨팅 슬라이스가 있는 하드웨어 격리 인스턴스입니다.

    GPU 0: NVIDIA A100-SXM4-40GB (UUID: GPU-5b7ce860-1951-004c-4881-6ac6997df770) MIG 3g.20gb Device 0: (UUID: MIG-7dc16162-7ba2-5894-abde-d753dc8ecf56) MIG 2g.10gb Device 1: (UUID: MIG-56cfe1f0-0662-50e4-a5f7-111107e4d5e6) MIG 1g.5gb Device 2: (UUID: MIG-1409727e-2ffa-5fd4-9586-204c9e2b36d5) MIG 1g.5gb Device 3: (UUID: MIG-9b065868-21b6-5b8d-8ab9-e99089ed472c) GPU 1: NVIDIA A100-SXM4-40GB (UUID: GPU-73692a43-dd2d-f1a1-b0df-2f4734e2a87d) MIG 3g.20gb Device 0: (UUID: MIG-745fd93a-9582-57a6-8b3b-9782d289ca1b) MIG 2g.10gb Device 1: (UUID: MIG-8440294e-c4a0-5687-add5-2cc506babb2f) MIG 1g.5gb Device 2: (UUID: MIG-559810c0-f2bb-5ca2-b529-47228d99437f) MIG 1g.5gb Device 3: (UUID: MIG-a91cf3f9-6459-59e9-97a8-dc69b9958eef) GPU 2: NVIDIA A100-SXM4-40GB (UUID: GPU-4e56019e-84de-eef5-5ac3-85e468e93639) MIG 3g.20gb Device 0: (UUID: MIG-c130392b-fd7c-59f8-9f4b-ecab27a2984b) MIG 2g.10gb Device 1: (UUID: MIG-7d61cf16-ad08-57be-b2c2-ac6e515b28c3) MIG 1g.5gb Device 2: (UUID: MIG-f5388dec-d841-506c-bb7a-6ac136ceee53) MIG 1g.5gb Device 3: (UUID: MIG-02d54020-c6cb-5997-894b-e95af0f49388) GPU 3: NVIDIA A100-SXM4-40GB (UUID: GPU-4fd894a0-b471-9e77-eb67-0ad15002ed5b) MIG 3g.20gb Device 0: (UUID: MIG-10399b59-2625-5106-b3f8-76ae19da46e1) MIG 2g.10gb Device 1: (UUID: MIG-ef81ee7d-fc48-56ed-8479-8ffa76eb4154) MIG 1g.5gb Device 2: (UUID: MIG-ed9bf59d-6bf2-5e07-80fb-dd0d7ca41f9d) MIG 1g.5gb Device 3: (UUID: MIG-a15d6f7d-661b-514e-8838-06fe4ffe7f75) GPU 4: NVIDIA A100-SXM4-40GB (UUID: GPU-05b6b91b-da6e-3078-1f4f-a7bbf1ff7ed2) GPU 5: NVIDIA A100-SXM4-40GB (UUID: GPU-078a8df1-f387-0315-6b0b-af12e082f6d5) GPU 6: NVIDIA A100-SXM4-40GB (UUID: GPU-6cdeffe7-45f1-7e8e-bcc1-4634399ad877) GPU 7: NVIDIA A100-SXM4-40GB (UUID: GPU-5f68814a-4e4a-5dec-79b4-8d70a61c7714)