llm-d 기반 EKS 분산 추론 배포 가이드
📌 현재 버전: llm-d v0.4 (2025). 본 문서의 배포 예시는 Intelligent Inference Scheduling well-lit path 기준입니다.
📅 작성일: 2026-02-10 | 수정일: 2026-03-16 | ⏱️ 읽는 시간: 약 10분
개요
llm-d는 Red Hat이 주도하는 Apache 2.0 라이선스의 Kubernetes 네이티브 분산 추론 스택입니다. vLLM 추론 엔진, Envoy 기반 Inference Gateway, 그리고 Kubernetes Gateway API를 결합하여 대규모 언어 모델의 지능적인 추론 라우팅을 제공합니다.
기존 vLLM 배포가 단순한 Round-Robin 로드 밸런싱에 의존하는 반면, llm-d는 KV Cache 상태를 인식하는 지능적 라우팅을 통해 동일한 prefix를 가진 요청을 이미 해당 KV Cache를 보유한 Pod로 전달합니다. 이를 통해 Time To First Token(TTFT)을 크게 단축하고 GPU 연산을 절약할 수 있습니다.
llm-d는 EKS의 다양한 노드 관리 방식에서 배포할 수 있으며, 모델 크기와 GPU 활용 전략에 따라 최적의 배포 방식이 달라집니다. 본 문서에서는 EKS Auto Mode 환경을 기본 배포 예시로 다루되, Karpenter 자체 관리 환경과의 차이점과 선택 기준도 함께 안내합니다.
llm-d의 핵심 가치인 KV Cache-aware 라우팅은 배포 환경에 관계없이 동일하게 동작합니다. 그러나 GPU 리소스 분할(MIG, Time-Slicing) 이 필요한 경우에는 EKS Auto Mode가 아닌 Karpenter + GPU Operator 환경을 선택해야 합니다.
| 기준 | EKS Auto Mode | Karpenter + GPU Operator |
|---|---|---|
| 적합한 모델 크기 | 70B+ (GPU 전체 활용) | 7B~30B (MIG로 분할 가능) |
| GPU 드라이버 관리 | AWS 자동 관리 | 직접 설치 (GPU Operator) |
| MIG / Time-Slicing | 불가 | 가능 |
| 운영 복잡도 | 낮음 | 중간 |
| GPU 비용 효율 | 대형 모델에 최적 | 소형 모델에 최적 |
모델 크기별 상세 비용 분석과 의사결정 플로차트는 EKS GPU 노드 전략을 참조하세요.
llm-d의 Envoy 기반 Inference Gateway는 LLM 추론 요청 전용으로 설계된 특수 목적 게이트웨이입니다. NGINX Ingress Controller를 대체하는 범용 Gateway API 구현체(AWS LBC v3, Cilium, Envoy Gateway 등)와는 목적과 스코프가 다릅니다.
- llm-d Gateway: InferenceModel/InferencePool CRD 기반, KV Cache-aware 라우팅, 추론 트래픽 전용
- 범용 Gateway API: HTTPRoute/GRPCRoute 기반, TLS/인증/Rate Limiting, 클러스터 전체 트래픽 관리
프로덕션 환경에서는 범용 Gateway API 구현체가 클러스터 진입점을 담당하고, llm-d는 그 하위에서 AI 추론 트래픽을 최적화하는 구조를 권장합니다. 범용 Gateway API 구현체 선택은 Gateway API 도입 가이드를 참조하세요.
주요 목표
- llm-d 아키텍처 이해: Inference Gateway와 KV Cache-aware 라우팅의 동작 원리
- 배포 전략 선택: Auto Mode vs Karpenter 환경별 장단점 비교
- EKS Auto Mode GPU 구성: p5.48xlarge 노드 자동 프로비저닝 설정
- Qwen3-32B 배포: helmfile 기반 통합 배포 및 검증
- 추론 테스트: OpenAI 호환 API를 통한 추론 요청 및 스트리밍
- 운영 최적화: 모니터링, 비용 최적화, 트러블슈팅
llm-d의 3가지 Well-Lit Path
llm-d는 세 가지 검증된 배포 경로를 제공합니다.
아키텍처
llm-d의 Intelligent Inference Scheduling 아키텍처는 다음과 같이 구성됩니다.
llm-d vs 기존 vLLM 배포 비교
| 특성 | 기존 vLLM 배포 | llm-d 배포 ✨ |
|---|---|---|
| 라우팅 방식 | Round-Robin / Random | KV Cache-aware Intelligent Routing |
| Gateway 통합 | 별도 Ingress/Service 구성 | Gateway API 네이티브 통합 |
| 스케일링 관리 | 수동 HPA 구성 | InferencePool 기반 자동 관리 |
| KV Cache 활용 | Pod별 독립적 관리 | Cross-pod prefix 재사용으로 TTFT 단축 |
| 설치 방식 | 개별 Helm chart 조합 | helmfile 통합 배포 (원커맨드) |
| 모델 정의 | Deployment YAML 직접 작성 | InferenceModel CRD 선언적 관리 |
Qwen3-32B 모델 선정 이유
Qwen3-32B는 llm-d의 공식 기본 모델이며, Apache 2.0 라이선스로 상업적 사용이 자유롭습니다. BF16 기준 약 65GB VRAM이 필요하여 TP=2 (2× GPU)로 H100 80GB에서 안정적으로 서빙할 수 있습니다.
사전 요구사항
| 항목 | 요구사항 | 비고 |
|---|---|---|
| AWS 계정 | p5.48xlarge 쿼터 승인 | Service Quotas → Running On-Demand P instances ≥ 192 |
| eksctl | >= 0.200.0 | EKS Auto Mode 지원 버전 |
| kubectl | >= 1.33 | EKS 1.33/1.34 호환 |
| Helm | >= 3.0 | Helm chart 배포용 |
| helmfile | 최신 버전 | llm-d 통합 배포 도구 |
| yq | >= 4.0 | YAML 처리 도구 |
| HuggingFace Token | Qwen3-32B 접근 권한 | https://huggingface.co/settings/tokens |
| AWS CLI | v2 최신 | 자격 증명 구성 완료 |
클라이언트 도구 설치
# eksctl 설치 (macOS)
brew install eksctl
# helmfile 설치
brew install helmfile
# yq 설치
brew install yq
# 버전 확인
eksctl version
kubectl version --client
helm version
helmfile --version
yq --version
p5.48xlarge는 192 vCPU를 사용합니다. AWS Service Quotas에서 Running On-Demand P instances 한도가 최소 192 이상인지 확인하세요. 쿼터 증가 요청은 승인까지 1-3 영업일 소요될 수 있습니다.
# 현재 P 인스턴스 쿼터 확인
aws service-quotas get-service-quota \
--service-code ec2 \
--quota-code L-417A185B \
--region us-west-2 \
--query 'Quota.Value'
배포 전략 선택: Auto Mode vs Karpenter
llm-d 자체는 Kubernetes 표준 리소스(Deployment, Service, CRD)를 사용하므로 노드 관리 방식에 독립적입니다. 그러나 GPU 리소스 활용 효율은 배포 환경에 따라 크게 달라집니다.
Auto Mode가 적합한 경우
- 70B+ 대형 모델: Qwen3-32B(TP=2), Llama-3-70B(TP=4), DeepSeek-V3(TP=8) 등 GPU를 충분히 활용하는 모델
- 빠른 프로토타이핑: GPU 드라이버·AMI 관리 없이 바로 배포하고 싶은 경우
- 운영 단순화 우선: GPU Operator 설치·업데이트 부담을 줄이고 싶은 경우
Karpenter + GPU Operator가 적합한 경우
- 7B~13B 소형 모델: MIG로 H100을 7개 인스턴스로 분할하여 비용 75% 절감
- 멀티테넌시: 팀별로 GPU 슬라이스를 격리 할당해야 하는 경우
- DCGM 모니터링: GPU 레벨 세밀한 메트릭 수집이 필요한 경우
- 커스텀 AMI/드라이버: 특정 CUDA 버전이나 드라이버 핀이 필요한 경우
Karpenter + GPU Operator 환경에서의 llm-d 배포는 본 문서의 Auto Mode 예시에서 다음 부분만 변경하면 됩니다:
- 클러스터 생성:
autoModeConfig대신 Karpenter를 직접 설치 - NodePool:
nodeClassRef를EC2NodeClass로 변경 (커스텀 AMI, GPU Operator userData 포함) - GPU Operator 설치:
helm install gpu-operator nvidia/gpu-operator
상세 구성은 EKS GPU 노드 전략 — Karpenter + GPU Operator를 참조하세요.
EKS Auto Mode 클러스터 생성
클러스터 구성 파일
# cluster-config.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: llm-d-cluster
region: us-west-2
version: "1.33"
autoModeConfig:
enabled: true
# 클러스터 생성 (약 15-20분 소요)
eksctl create cluster -f cluster-config.yaml
# 클러스터 상태 확인
kubectl get nodes
kubectl cluster-info
GPU NodePool 생성
EKS Auto Mode에서 p5.48xlarge 인스턴스를 자동 프로비저닝하기 위한 Karpenter NodePool을 생성합니다.
# gpu-nodepool.yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: gpu-p5
spec:
template:
spec:
requirements:
- key: eks.amazonaws.com/instance-family
operator: In
values: ["p5"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
nodeClassRef:
group: eks.amazonaws.com
kind: NodeClass
name: default
taints:
- key: nvidia.com/gpu
effect: NoSchedule
limits:
cpu: "384"
memory: 4096Gi
nvidia.com/gpu: "16"
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
kubectl apply -f gpu-nodepool.yaml
# NodePool 상태 확인
kubectl get nodepool gpu-p5
EKS Auto Mode는 NVIDIA GPU 드라이버를 자동으로 설치하고 관리합니다. 별도의 GPU Operator나 NVIDIA Device Plugin 설치가 필요 없습니다. NodeClass default를 사용하면 Auto Mode가 최적의 AMI와 드라이버 버전을 자동 선택합니다.
제약사항: Auto Mode의 NodeClass는 AWS 관리형(read-only)이므로 MIG, Time-Slicing 등 GPU 분할 설정이 불가능합니다. 소형 모델(7B~13B)에서 GPU 효율이 낮아질 수 있습니다. GPU 분할이 필요하면 Karpenter + GPU Operator 전략을 참조하세요.
p5.48xlarge 인스턴스 사양
p5e.48xlarge 인스턴스 사양 (H200)
- p5e.48xlarge (H200): 100B+ 파라미터 모델, 최대 메모리 활용
- p5.48xlarge (H100): 70B+ 파라미터 모델, 최고 성능
- g6e family (L40S): 13B-70B 모델, 비용 효율적 추론
llm-d 배포
5.1 네임스페이스 및 시크릿 생성
export NAMESPACE=llm-d
kubectl create namespace ${NAMESPACE}
# HuggingFace 토큰 시크릿 생성
kubectl create secret generic llm-d-hf-token \
--from-literal=HF_TOKEN=<your-huggingface-token> \
-n ${NAMESPACE}
# 시크릿 생성 확인
kubectl get secret llm-d-hf-token -n ${NAMESPACE}
5.2 llm-d 저장소 클론
git clone https://github.com/llm-d/llm-d.git
cd llm-d/guides/inference-scheduling
디렉토리 구조:
guides/inference-scheduling/
├── helmfile.yaml # 통합 배포 정의
├── values/
│ ├── vllm-values.yaml # vLLM 서버 설정
│ ├── gateway-values.yaml # Gateway 설정
│ └── ...
└── README.md