AKS 클러스터에서 GPU 를 쓰려면 클러스터를 새로 만들 필요가 없다. GPU VM SKU 를 쓰는 노드 풀을 따로 추가하면 된다. 실제로 막히는 지점은 기술이 아니라 할당량(quota) 이다. GPU 계열 vCPU 할당량은 신규 구독에서 기본값이 0 인 경우가 많아서, 포털에서 노드 풀을 만들려는 순간 "이 구성에는 vCPU 64개가 필요하지만 해당 제품군에 0개만 남아 있습니다" 같은 메시지로 차단된다.
| 계열 | 대표 GPU | 주 용도 |
|---|---|---|
| NC (A100 / T4 / V100) | A100 80GB, T4 | AI 학습 · 추론, HPC |
| ND | A100 · H100 (NVLink 다중 GPU) | 대규모 분산 학습 |
| NV (A10 · M60) | A10 24GB | VDI · 그래픽 · 가벼운 추론 |
NC A100 v4 계열의 크기별 구성은 다음과 같다. GPU 메모리는 GPU 개수 × 80GB 로 계산한다.
| VM 크기 | vCPU | 메모리 | GPU |
|---|---|---|---|
| Standard_NC24ads_A100_v4 | 24 | 220 GiB | 1 × A100 80GB |
| Standard_NC48ads_A100_v4 | 48 | 440 GiB | 2 × A100 80GB |
| Standard_NC96ads_A100_v4 | 96 | 880 GiB | 4 × A100 80GB |
Standard_NV36ads_A10_v5 는 이름이 비슷하지만 A10(24GB) 기반의 그래픽 · VDI 계열이라 성격이 다르다. 학습 워크로드를 A10 계열에 올리면 GPU 메모리에서 먼저 막힌다.
VM 크기별 실제 사양은 시점에 따라 바뀌므로 발주 전에 공식 VM 크기 문서에서 다시 확인한다.[1]
여기서 자주 헷갈린다. 할당량은 GPU 개수가 아니라 VM 계열별 vCPU 총합으로 관리된다.
| 쓰려는 VM | 요청할 할당량 이름 | 최소 요청값 |
|---|---|---|
| Standard_NC48ads_A100_v4 | Standard NCADS_A100_v4 Family vCPUs | 48 |
| Standard_NC64as_T4_v3 | Standard NCASv3_T4 Family vCPUs | 64 |
노드를 2대 이상 두려면 VM vCPU × 노드 수 만큼 요청해야 한다. 여기에 더해 구독 전체의 Total Regional vCPUs 할당량도 함께 넘지 않아야 하므로 둘 다 확인한다. 리전마다 별도 값이므로, 서울(koreacentral)에 받아 둔 할당량은 미국 동부에서 쓸 수 없다. GPU VM 은 지원 리전 자체가 제한적이라 원하는 리전에 재고가 없으면 할당량이 있어도 배포가 실패한다.
az aks nodepool add \
--resource-group ${RG} \
--cluster-name ${AKS_NAME} \
--name gpunp \
--node-count 1 \
--node-vm-size Standard_NC24ads_A100_v4 \
--node-taints sku=gpu:NoSchedule \
--labels accelerator=nvidia
taint 를 걸어 두는 것이 핵심이다. GPU 를 요구하지 않는 일반 파드가 값비싼 GPU 노드에 올라가 자리를 차지하는 것을 막는다. 대신 GPU 파드에는 반드시 대응하는 toleration 을 준다.
apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
tolerations:
- key: sku
operator: Equal
value: gpu
effect: NoSchedule
nodeSelector:
accelerator: nvidia
containers:
- name: cuda
image: nvidia/cuda:12.2.0-base-ubuntu22.04
command: ["nvidia-smi"]
resources:
limits:
nvidia.com/gpu: 1
AKS 는 노드 풀을 시스템(System)과 사용자(User)로 나눈다. 시스템 노드 풀에는 CoreDNS · metrics-server 같은 클러스터 필수 구성 요소가 올라가며, 클러스터당 최소 하나가 있어야 하고 Linux 여야 한다. 시스템 노드 풀에 사용자 파드가 못 올라가는 것은 아니지만, GPU 노드 풀을 시스템 풀로 만들면 GPU 노드를 0 으로 축소할 수 없고 비용이 계속 발생한다. GPU 는 반드시 사용자 노드 풀로 둔다.
kubectl get nodes -o wide
kubectl describe node <gpu-node> | grep -i nvidia.com/gpu
kubectl get ds -n kube-system | grep -i nvidia
Capacity / Allocatable 에 nvidia.com/gpu 가 잡혀야 스케줄링이 된다. 잡히지 않으면 드라이버 설치와 디바이스 플러그인 기동을 먼저 본다.
AKS 워커 노드는 관리형이라 SSH 로 바로 접속하는 경로가 없다. 노드에서 뭔가 확인하거나 디렉터리를 만들어야 한다면 kubectl debug node/<node> -it --image=<image> 로 호스트 네임스페이스에 붙거나, hostPath 를 마운트한 권한 있는 파드를 띄운다. 클러스터 조작용으로는 같은 VNet 안에 점프 VM 을 하나 두고 az · kubectl 을 그쪽에 설치하는 편이 운영상 편하다.
Azure VM 크기 — GPU 가속 컴퓨팅. https://learn.microsoft.com/azure/virtual-machines/sizes/overview ↩︎