Part 4 — 운영 & 최적화

모니터링, 비용 최적화, 장애 대응, OpenAI 마이그레이션

TTFT
Time to First Token
vllm:time_to_first_token_seconds
첫 토큰 생성까지 시간. 사용자 체감 응답성 핵심 지표
목표: p50 < 2s
경고: p99 > 5s
TPOT / ITL
Inter-Token Latency
vllm:time_per_output_token_seconds
토큰 간 생성 간격. 스트리밍 품질 결정
목표: < 100ms
경고: > 200ms
Queue Time
대기 시간
vllm:request_queue_time_seconds
요청 대기 시간. 서버 과부하 지표
목표: p95 < 2s
급증 시 replica↑
Preemptions
KV Cache 부족
vllm:num_preemptions_total
KV Cache 부족으로 요청 중단. 발생 시 즉시 조치
목표: 0
발생 시 MEM↓/LEN↓

Karpenter Spot 인스턴스
g5 Spot: On-Demand 대비 60~70% 할인 | capacity-type: [on-demand, spot] 혼합 전략 | vLLM Stateless → Spot 중단 시 빠른 재시작 가능
Consolidation 정책
WhenEmpty: 빈 GPU 노드 즉시 제거 (기본 권장) | downscale_delay_s=600으로 불필요한 축소 방지 | 야간/주말 min_replicas=0 설정 고려
Right-sizing
g5.xlarge(7B) → g5.2xlarge(13B) → g5.12xlarge(34B) | 모델 크기에 딱 맞는 인스턴스 선택이 핵심 | 오버프로비저닝 = 비용 낭비 (GPU 활용률 모니터링)
Multi-LoRA 서빙
Base 모델 1개 + N개 LoRA Adapter 동시 서빙 | --enable-lora --max-loras 4 설정 | 3개 태스크 = GPU 1개 (기존 3개 필요) → 비용 66% 절감

비교 항목 OpenAI GPT-4o Claude 3.5 Sonnet vLLM Llama-3 70B vLLM Llama-3 8B
입력 토큰 (1M) $5.00 $3.00 ~$0.35 ~$0.07
출력 토큰 (1M) $15.00 $15.00 ~$0.35 ~$0.07
일 1억 토큰 ~$500/day ~$400/day ~$84/day ~$17/day
월 비용 ~$15,000 ~$12,000 ~$2,520 ~$510
월 절감액 (vs GPT-4o) $3,000 ~$12,480 ~$14,490
ROI 전제: g5.xlarge On-Demand $1.01/hr × 24hr = $24.24/day (Spot 적용 시 ~$7/day)
Break-even: 초기 구축 비용 $5,000 기준, Llama-3 8B 대비 약 10일
주의: 모델 품질 트레이드오프 필수 검토 | 운영 인건비(SRE) 포함 시 ROI 재계산

vLLM은 OpenAI 호환 API 제공 → base_url + api_key 2줄 변경만으로 전환 완료
BEFORE — OpenAI API
import openai
client = openai.OpenAI(
  api_key="sk-proj-xxxxxxxxx"
)
response = client.chat.completions.create(
  model="gpt-4o",
  messages=[{"role": "user", "content": "안녕"}],
  stream=True,
  temperature=0.7
)
# GPT-4o: $5/1M input + $15/1M output
# 일 1억 토큰 → ~$500/day
AFTER — Self-hosted vLLM
import openai
client = openai.OpenAI(
  api_key="EMPTY", # vLLM 인증 불필요
  base_url="http://vllm-svc:8000/v1"
)
response = client.chat.completions.create(
  model="Llama-3.1-8B-Instruct",
  messages=[{"role": "user", "content": "안녕"}],
  stream=True,
  temperature=0.7
)
# GPU 인스턴스 비용만 발생
# g5.xlarge: ~$1.01/hr (Spot: ~$0.30)
호환 API: /v1/chat/completions | /v1/completions | /v1/embeddings | /v1/models — Function Calling / Streaming / Logprobs 모두 지원

증상 원인 진단 해결
Pod OOMKilled GPU VRAM 초과 kubectl describe pod GPU_MEM_UTIL 0.9→0.85
MAX_LEN 축소
TTFT > 10초 요청 큐 과부하 vllm:request_queue_time max_replicas 증가
target_requests 낮춤
Preemptions 급증 MAX_MODEL_LEN 실제 사용 초과 vllm:num_preemptions MAX_LEN 실측에 맞춤
MAX_NUM_SEQ 줄임
GPU 노드 미생성 EC2 가용성 부족 kubectl get nodeclaim NodePool에 인스턴스 타입 추가
Multi-AZ 확장
ImagePullBackOff ECR 권한 없음 kubectl describe pod IRSA 역할 권한 확인
ECR 이미지 존재 확인
모델 로딩 실패 HF Token 없음 kubectl logs <pod> K8s Secret 확인
모델 ID 오타 확인
RayService Unhealthy Worker CrashLoop kubectl get rayservice ray status 확인
Head Pod logs 분석
빠른 진단: kubectl get events -n <ns> --sort-by=.lastTimestamp | tail -20

준비 단계
1
GPU 요구사항 분석
모델 크기, 동시 사용자 수, SLO (TTFT/TPOT 목표)
2
인스턴스 타입 선정
모델 크기 × 2 = VRAM 필요량, Spot 가용성 확인
3
EKS 클러스터 구축
terraform apply (inference-ready-cluster)
4
Karpenter NodePool 설정
GPU/CPU NodePool, Spot 혼합, limits 설정
5
NVIDIA Device Plugin 확인
GPU 리소스 광고, NFD/DCGM Exporter 설치
배포 & 운영 단계
6
Ray-vLLM 서비스 배포
inference-charts Helm Chart, values 설정
7
모니터링 스택 구성
ServiceMonitor + Grafana 대시보드 import
8
벤치마크 실행
Inference Perf: Baseline → Saturation 테스트
9
Alert 규칙 설정
TTFT, Queue Time, Preemptions, GPU Temp
10
프로덕션 트래픽 전환
Canary → Blue-Green, base_url 변경으로 전환

GitHub Repository
github.com/awslabs/ai-on-eks
전체 Terraform, 블루프린트, Helm Charts, 문서 포함 | Apache 2.0
Hands-on Workshop
genai.eksworkshop.com
EKS Auto Mode + AMP + Grafana + vLLM 실습 | 무료
Inference Charts (Helm)
github.com/awslabs/ai-on-eks-charts
DeepSeek, Llama, Qwen3, Mistral 프리셋 포함
Grafana Dashboard
vllm-dashboard.json (ai-on-eks 레포 포함)
8개 패널: TTFT, TPOT, Queue Time, Preemptions 등
Observability Reference
github.com/awslabs/ai-ml-observability-reference-architecture
Prometheus + Grafana + OpenSearch 전체 관측 스택 자동 배포

Q & A

감사합니다

github.com/awslabs/ai-on-eks | genai.eksworkshop.com