GPU 가속 컨테이너 실행하기
GPU 가속 컨테이너 실행하기 (Windows on EC2 G-Series)
중요
TensorWorks의 Kubernetes Device Plugin for DirectX는 AWS가 보증·지원·유지 관리하지 않는 타사 도구예요. AWS는 이 플러그인의 보안, 신뢰성, 성능에 대해 어떤 책임도 지지 않습니다.
TensorWorks의 Kubernetes Device Plugin for DirectX와 함께 NVIDIA GPU를 사용해서 Amazon EKS (Elastic Kubernetes Service)에서 GPU 가속 Windows 컨테이너 워크로드를 실행하는 방법을 알아봅니다. 자세한 내용은 Kubernetes Device Plugin for DirectX를 참고하세요.
Windows 컨테이너를 위한 GPU 가속을 설정하는 데는 두 가지 주요 접근 방식이 있어요.
- 옵션 1: 필요한 GPU 드라이버가 사전 설치된 사용자 정의 EKS Windows Optimized AMI를 빌드합니다. GPU 가속 Windows 컨테이너를 실행할 준비가 된 일관되고 사전 구성된 환경이 필요하고, 사용자 정의 AMI를 빌드·유지 관리하는 데 추가 노력을 투자할 수 있을 때 이 방식을 사용해요.
- 옵션 2: 인스턴스를 시작한 후 EKS 워커 노드에 필요한 GPU 드라이버를 설치합니다. 더 간단한 설정 과정을 원하고 각 새 워커 노드에 GPU 드라이버를 설치해도 괜찮을 때 이 방식을 사용합니다. GPU 가속 워크로드를 평가하거나 프로토타이핑하는 개발 환경에 더 적합해요.
두 접근 방식 모두 이 가이드에서 설명하는 단계로 활용할 수 있습니다.
고려 사항 (Considerations)
이 가이드는 NVIDIA GPUs, NVIDIA GRID drivers, TensorWorks의 Kubernetes Device Plugin for DirectX를 사용해서 Windows 컨테이너를 위한 GPU 가속을 설치·설정하는 단계를 제공해요. 이 단계들은 Amazon EKS에서 Windows 컨테이너 워크로드에 GPU 가속을 제공하도록 테스트되고 검증되었습니다. 호환되는 드라이버와 device plugin에 대한 자세한 내용은 Known limitations를 참고하세요. 진행하기 전에 다음 사항에 유의하세요.
- 이 가이드와 함께 작동하도록 테스트·검증된 것은 NVIDIA GRID 드라이버를 사용하는 G-family 인스턴스 유형뿐이에요. 다른 인스턴스 유형과 드라이버 조합도 GPU 가속 Windows 컨테이너를 실행할 수는 있겠지만, 이 가이드에서 다루지 않는 추가 구성 단계가 필요할 수 있습니다.
- 이 가이드와 함께 작동하도록 테스트·검증된 것은 DirectX 기반 워크로드뿐입니다. OpenGL, Vulkan, OpenCL 같은 다른 GPU API도 GPU 가속 Windows 컨테이너 실행에 잠재적으로 호환될 수 있지만, 이 가이드에서 다루지 않는 추가 구성 단계가 필요할 수 있어요.
- GPU 가속 Windows 컨테이너를 실행하기 전에 알아야 할 알려진 제한 사항이 몇 가지 있어요. 자세한 내용은 Known limitations 섹션을 참고하세요.
사전 조건 (Prerequisites)
Amazon EKS에서 Windows 컨테이너의 GPU 가속을 활성화하려면 진행 전에 다음 요구 사항을 준비해야 해요.
- Kubernetes v1.27 이상으로 Amazon EKS 클러스터를 시작합니다.
- Windows Server 2022 이상으로 Windows 노드를 프로비저닝합니다.
- G4 또는 G5 같은 G-family 인스턴스 유형으로 Windows 노드를 프로비저닝합니다.
- containerd
1.7.x또는2.x.x컨테이너 런타임으로 Windows 노드를 프로비저닝합니다. (Amazon EKS Optimized AMI의 containerd 버전을 확인하려면 Retrieve Windows AMI version information을 참고하세요.)
각 Windows 노드에 GPU 드라이버 설치
EKS 워커 노드에 NVIDIA GRID 드라이버를 설치하려면 NVIDIA drivers for your Amazon EC2 instance의 단계를 따르세요. Installation options - Option 3: GRID drivers로 이동해서 설치 단계를 진행합니다.
Windows Server Core용 설치
데스크톱 환경이 없는 Windows Server Core의 경우 다음 명령으로 NVIDIA GRID 드라이버를 자동으로 설치해요.
$nvidiaInstallerFilePath = nvidia-driver-installer.exe # Replace with path to installer
$installerArguments = "-s -clean -noreboot -noeula"
Start-Process -FilePath $nvidiaInstallerFilePath -ArgumentList $installerArguments -Wait -NoNewWindow -PassThru
설치 확인
다음 PowerShell 명령을 실행해서 인스턴스의 GPU에 대한 진단 정보를 확인합니다.
nvidia-smi
이 명령은 NVIDIA 드라이버 버전과 GPU 하드웨어에 대한 정보를 표시해요. 이 명령의 출력이 설치하려고 예상한 NVIDIA GRID 드라이버 버전과 일치하는지 확인하세요.
각 노드에 GPU device plugin 배포
Windows 노드의 컨테이너에 GPU 리소스를 발견하고 노출하려면 device plugin이 필요해요. EKS 클러스터에서 DaemonSet으로 실행해서 각 워커 노드에 TensorWorks의 DirectX Device Plugin을 배포합니다. README.md에 지정된 설치 가이드를 따르면 다음 단계가 포함돼요. 다음을 권장합니다.
kube-system네임스페이스에 device plugin을 배포합니다.- 노드에서 과도한 리소스를 소비하지 않도록 DaemonSet에 적절한 리소스 제한을 설정합니다.
참고
device plugin DaemonSet은 승격된 권한을 가진 호스트 프로세스 컨테이너로 모든 노드에서 실행됩니다. 권한 있는 명령을 실행할 수 있는 사람을 승인된 사용자로 제한하도록 RBAC 제어를 구현해 이 DaemonSet에 대한 접근을 제한하는 것을 권장해요.
GPU 가속 컨테이너를 실행할 때 device plugin은 두 가지 모드를 지원합니다.
-
단일 테넌시(single-tenancy) 모드: 이 모드는 인스턴스의 단일 컨테이너에 모든 GPU 리소스를 전용으로 할당해요. 다음 명령으로 단일 테넌시 지원 device plugin을 설치합니다. 자세한 내용은 README.md를 참고하세요.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/default-daemonsets.yml" -
다중 테넌시(multi-tenancy) 모드: 이 모드는 인스턴스의 여러 컨테이너 간에 GPU 리소스 공유를 허용해요. 다음 명령으로 다중 테넌시 지원 device plugin을 설치합니다. 자세한 내용은 README.md를 참고하세요.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-inline.yml"또는 ConfigMap을 사용해서 다중 테넌시를 지정할 수 있어요.
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-configmap.yml"
device plugin 배포 확인
device plugin을 배포한 후 다음 명령을 실행해서 DirectX Device Plugin이 모든 Windows 노드에서 올바르게 실행되고 있는지 확인하세요.
kubectl get ds device-plugin-wddm -n
컨테이너 배포 준비 확인
device plugin DaemonSet이 GPU 지원 Windows 워커 노드에서 실행되면 다음 명령을 사용해서 각 노드에 할당 가능한 GPU가 있는지 확인해요. 해당 숫자는 각 노드의 DirectX 장치 수와 일치해야 합니다.
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"
GPU 가속으로 Windows 컨테이너 실행
Pod를 시작하기 전에 .spec.containers[].resources에 리소스 이름 directx.microsoft.com/display를 지정하세요. 이는 컨테이너가 GPU 지원 기능을 요구한다는 것을 나타내며, kube-scheduler는 사용 가능한 GPU 리소스가 있는 사전 구성된 Windows 노드에 Pod를 배치하려고 시도해요.
예를 들어 파이(pi)의 값을 추정하는 Monte Carlo 시뮬레이션을 실행하는 Job을 시작하는 샘플 명령을 아래에서 볼 수 있어요. 이 예는 Windows 노드 GPU 기능을 테스트할 때 실행할 수 있는 여러 예제가 있는 Kubernetes Device Plugins for DirectX GitHub 저장소에서 가져온 것입니다.
cat cudaSetDevice().
장치를 명시적으로 지정해야 하는 필요성은 Windows 컨테이너에 영향을 주는 알려진 문제 때문이에요. 이 문제 해결의 진행 상황은 microsoft/Windows-Containers issue #333에서 추적할 수 있습니다.
다음 표는 이 GPU 할당 동작의 시각적 표현과 실제 예를 보여줘요.
GPU가 네 개인 EC2 인스턴스 유형 g4dn.12xlarge의 Windows 노드가 하나 있다고 가정해 봅시다. 이 인스턴스에 세 개의 Pod가 시작된다고 가정해요. 표는 각 컨테이너가 요청한 GPU 수와 무관하게 세 Pod 모두 인스턴스의 네 GPU 모두에 접근할 수 있고, 기본적으로 장치 인덱스 0의 GPU를 사용한다는 것을 보여줍니다.
| Pod | 요청 GPU | 실제 GPU 접근 | 기본 GPU 사용 | 사용 가능한 GPU 인덱스 | 인스턴스 총 GPU |
|---|---|---|---|---|---|
| Pod 1 | 1 GPU | 전체 4 GPU | 인덱스 0 GPU | 0, 1, 2, 3 | 4 |
| Pod 2 | 2 GPU | 전체 4 GPU | 인덱스 0 GPU | 0, 1, 2, 3 | 4 |
| Pod 3 | 1 GPU | 전체 4 GPU | 인덱스 0 GPU | 0, 1, 2, 3 | 4 |
Kubernetes device plugin 지원
NVIDIA의 공식 Kubernetes device plugin 구현은 Windows를 지원하지 않아요. 공식 Windows 지원 추가의 진행 상황은 NVIDIA/k8s-device-plugin issue #419에서 추적할 수 있습니다.
GPU 컴퓨팅 인스턴스 제한 사항
AWS 계정 구성에 따라 시작할 수 있는 Amazon EC2 GPU 컴퓨팅 인스턴스의 수와 유형에 서비스 한도가 있을 수 있어요. 추가 용량이 필요하면 Request a quota increase를 할 수 있습니다.
Windows GPU Optimized AMI를 빌드해야 함
Amazon EKS에서 제공하는 EKS Windows GPU Optimized AMI나 EC2 Image Builder 관리 구성 요소는 없어요. 이 가이드의 단계에 따라 필요한 GPU 드라이버가 사전 설치된 사용자 정의 EKS Windows Optimized AMI를 빌드하거나, 인스턴스 시작 후 EKS 워커 노드에 필요한 GPU 드라이버를 설치해야 합니다.
Inferentia 및 Trainium 미지원
AWS Inferentia 및 AWS Trainium 기반 워크로드는 Windows에서 지원되지 않습니다.
더 알아보기 (Learn more)
출처: 문서