EKS 클러스터 전체 GPU 비용 할당
이 문서에서는 Amazon EKS에서 GPU 슬라이스 비용 할당을 위한 엔드투엔드 개념 증명(PoC)을 설명합니다.
문제 정의
여러 테넌트가 GPU 용량(예: MIG 슬라이스)을 공유할 때 다음 질문에 답해야 합니다:
- 누가 어떤 GPU 지분을 요청했는가 (파드 / 네임스페이스 / BU별)?
- 누가 실제로 GPU를 사용했는가 ( 그리고 얼마나)?
- GPU 시간당 $12와 같은 "공개" 가격이 주어졌을 때 어떻게 계산하는가:
- 할당 비용 (요청된 지분 기반)
- 실효 비용 (관찰된 사용률 기반)
- 낭비 (할당 - 실효)
아키텍처 (고수준)

사전 요구사항
AWS + EKS 사전 요구사항
- 다음을 생성할 수 있는 권한이 있는 AWS 계정:
- EKS 클러스터 + 노드그룹
- 서비스 계정용 IAM 역할 (IRSA)
- AMP 워크스페이스
- 리전에서 GPU 인스턴스를 실행하기 위한 할당량 및 AZ 용량
사용되는 변수
export AWS_REGION="us-west-2"
export CLUSTER_NAME="gpu-cost-poc"
export AMP_ALIAS="gpu-cost-poc"
# 시연하려는 공개/벤치마크 가격 (아직 CUR이 아님)
export GPU_HOURLY_RATE="12"
# PoC를 위한 MIG 프로파일 (예: A100 40GB는 일반적으로 7개 슬라이스/GPU로 1g.5gb 지원)
export MIG_PROFILE_LABEL="all-1g.5gb"
# 중요: 이 PoC에서 MIG 슬라이스는 nvidia.com/gpu로 노출됨 (1 "gpu" == 1 MIG 슬라이스)
export MIG_RESOURCE_KEY="nvidia.com/gpu"
# A100에서 1g.5gb의 경우: 물리적 GPU당 일반적으로 7개 슬라이스
export SLICES_PER_GPU="7"
# kube-state-metrics는 확장 리소스 이름을 "정리"할 수 있음
export KSM_RESOURCE_REGEX='nvidia.*(gpu|mig).*'
단계별 지침
단계 1 — EKS 클러스터 생성
eksctl이 지원하는 버전 목록 확인:
eksctl utils describe-cluster-versions
클러스터 생성 (--version을 생략하면 eksctl이 지원되는 기본값을 선택):
eksctl create cluster \
--name "$CLUSTER_NAME" \
--region "$AWS_REGION" \
--managed
단계 2 — "시스템" 노드그룹 추가 (권장)
CoreDNS와 operator를 고비용 GPU 노드에서 분리합니다.
eksctl create nodegroup \
--cluster "$CLUSTER_NAME" \
--region "$AWS_REGION" \
--name "system-ng" \
--node-type "m5.large" \
--nodes 2 --nodes-min 2 --nodes-max 3
단계 3 — GPU 노드그룹 추가
eksctl create nodegroup \
--cluster "$CLUSTER_NAME" \
--region "$AWS_REGION" \
--name "gpu-ng-ubuntu" \
--node-type "p4d.24xlarge" \
--node-ami-family "Ubuntu2204" \
--install-nvidia-plugin=false \
--nodes 1 --nodes-min 1 --nodes-max 1 \
--node-labels "workload=gpu"
GPU 워크로드만 스케줄링되도록 taint 적용:
kubectl taint nodes -l workload=gpu nvidia.com/gpu=present:NoSchedule --overwrite
단계 4 — NVIDIA GPU Operator 설치 (MIG 활성화)
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm upgrade --install gpu-operator nvidia/gpu-operator \
-n gpu-operator --create-namespace \
--set mig.strategy=single
단계 5 — GPU 노드에 MIG 프로파일 활성화
현재 MIG 레이블 확인:
kubectl get nodes -l workload=gpu -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.nvidia\.com/mig\.capable}{"\t"}{.metadata.labels.nvidia\.com/mig\.config}{"\t"}{.metadata.labels.nvidia\.com/mig\.config\.state}{"\n"}{end}'
MIG 지오메트리 적용:
kubectl label nodes -l workload=gpu nvidia.com/mig.config="$MIG_PROFILE_LABEL" --overwrite
성공 대기:
kubectl get nodes -l workload=gpu -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels.nvidia\.com/mig\.config}{"\t"}{.metadata.labels.nvidia\.com/mig\.config\.state}{"\n"}{end}'
단계 6 — AMP 워크스페이스 생성
aws amp create-workspace --alias "$AMP_ALIAS" --region "$AWS_REGION"
export AMP_WORKSPACE_ID="$(aws amp list-workspaces --region "$AWS_REGION" --query "workspaces[?alias=='$AMP_ALIAS'].workspaceId | [0]" --output text)"
export AMP_ENDPOINT="$(aws amp describe-workspace --workspace-id "$AMP_WORKSPACE_ID" --region "$AWS_REGION" --query "workspace.prometheusEndpoint" --output text)"
echo "$AMP_WORKSPACE_ID"
echo "$AMP_ENDPOINT"
단계 7 — 수집 + 쿼리를 위한 IRSA
eksctl utils associate-iam-oidc-provider \
--cluster "$CLUSTER_NAME" \
--region "$AWS_REGION" \
--approve
eksctl create iamserviceaccount \
--cluster "$CLUSTER_NAME" --region "$AWS_REGION" \
--name amp-ingest --namespace observability \
--attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
--approve --override-existing-serviceaccounts
eksctl create iamserviceaccount \
--cluster "$CLUSTER_NAME" --region "$AWS_REGION" \
--name amp-query --namespace observability \
--attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusQueryAccess \
--approve --override-existing-serviceaccounts