Part 3 — Ray-vLLM 배포 딥다이브

Helm Chart, RayService 매니페스트, 파라미터 튜닝, 모델별 최적 설정

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: g5-gpu-karpenter
spec:
  template:
    metadata:
      labels:
        NodeGroupType: g5-gpu-karpenter
    spec:
      requirements:
        - key: node.kubernetes.io/instance-type
          operator: In
          values: ["g5.xlarge","g5.2xlarge","g5.4xlarge"]
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand", "spot"]
      taints:
        - key: nvidia.com/gpu
          effect: NoSchedule
  limits:
    resources:
      nvidia.com/gpu: "8"
  disruption:
    consolidationPolicy: WhenEmpty
핵심 포인트
NodeGroupType 라벨
Pod nodeSelector로 GPU 전용 노드 타겟
GPU Taint
nvidia.com/gpu NoSchedule로 일반 Pod 방지
Spot + On-Demand 혼합
비용 절감 + 가용성 확보
limits.gpu: "8"
과다 프로비저닝 방지 상한
WhenEmpty Consolidation
빈 GPU 노드 즉시 종료

apiVersion: ray.io/v1
kind: RayService
metadata:
  name: vllm
  namespace: rayserve-vllm
spec:
  serveConfigV2: |
    applications:
      - name: mistral
        import_path: "vllm_serve:deployment"
        runtime_env:
          env_vars:
            MODEL_ID: "mistralai/Mistral-7B-Instruct-v0.2"
            GPU_MEMORY_UTILIZATION: "0.9"
            MAX_MODEL_LEN: "8192"
        deployments:
          - name: mistral-deployment
            autoscaling_config:
              min_replicas: 1
              max_replicas: 4
              target_num_ongoing_requests_per_replica: 20
            ray_actor_options:
              num_gpus: 1
  rayClusterConfig:
    workerGroupSpecs:
      - replicas: 1
        minReplicas: 1
        maxReplicas: 4
        template:
          spec:
            nodeSelector:
              NodeGroupType: g5-gpu-karpenter
            tolerations:
              - key: "nvidia.com/gpu"
                effect: "NoSchedule"

파라미터 기본값 권장 범위 설명 영향
GPU_MEMORY_UTILIZATION 0.9 0.85~0.95 vLLM 엔진 전체가 사용할 VRAM 비율 (가중치+KV Cache+Activation) 높을수록 동시처리↑, OOM↑
MAX_MODEL_LEN 8192 2048~32768 최대 입출력 시퀀스 길이 길수록 메모리↑, 유연성↑
TENSOR_PARALLEL_SIZE 1 1/2/4/8 모델을 분산할 GPU 수 GPU 수에 맞게 설정
MAX_NUM_SEQ 256 32~256 동시 처리 시퀀스 수 높을수록 처리량↑, 레이턴시↑
dtype auto bfloat16 추론 정밀도 bfloat16 권장 (H100+)
튜닝 시작점: GPU_MEMORY_UTILIZATION=0.9에서 시작 → OOM 발생 시 0.85로 낮춤
메모리 계산: 모델 크기(GB) ≈ 파라미터 수(B) × 2 (BF16 기준). 나머지가 KV Cache
Prefix Caching: 반복 프롬프트(RAG, 시스템 프롬프트)가 많으면 --enable-prefix-caching 추가

autoscaling_config:
  metrics_interval_s: 0.2
  min_replicas: 1
  max_replicas: 4
  look_back_period_s: 2
  downscale_delay_s: 600
  upscale_delay_s: 30
  target_num_ongoing_requests_per_replica: 20
스케일링 시나리오
요청 60개 유입 → target=20
필요 replicas = 60 ÷ 20 = 3
현재 1개 → 30초 후 3개로 확장
→ Karpenter가 g5 노드 2개 추가 (2~5분)
파라미터별 의미
target_num_ongoing_requests
레플리카당 목표 동시 요청 수. 낮으면 빠른 확장(비용↑), 높으면 느린 확장(레이턴시↑). 권장: 15~25
downscale_delay_s: 600
트래픽 감소 후 10분 기다렸다가 축소. GPU 노드 프로비저닝 비용 고려 (절대 값 낮추지 말 것)
upscale_delay_s: 30
트래픽 급증 시 30초 후 확장. 지나치게 낮으면 불안정한 스케일링 발생
metrics_interval_s: 0.2
200ms마다 메트릭 수집. 빠른 반응 + 안정적 판단을 위해 look_back_period_s: 2와 조합

Step 1
~20분
인프라 배포
terraform apply -var-file=blueprint.tfvars
EKS + Karpenter
+ 모니터링 + GPU 플러그인
Step 2
~2분
Helm Repo 추가
helm repo add ai-on-eks https://awslabs.github.io/ai-on-eks-charts/
KubeRay Operator
자동 포함
Step 3
~10분
모델 배포
helm install deepseek ai-on-eks/inference-charts --values values-deepseek-r1.yaml
이미지 Pull
+ 모델 로딩
Step 4
즉시
검증
kubectl get rayservice -n default && curl http://localhost:8000/v1/chat/completions
서비스 상태
+ API 테스트

모델 크기 권장 인스턴스 TP GPU MEM MAX LEN 특이사항
DeepSeek-R1-8B 8B g5.xlarge (1×A10G) 1 0.90 32768 CoT 추론, 긴 출력 필수
Llama-3.1-8B 8B g5.xlarge (1×A10G) 1 0.90 8192 기본 채팅, 범용
Llama-3.1-70B 70B p4d.24xlarge (8×A100) 8 0.90 8192 TP=8 필수, 고성능
Qwen3-7B 7B g5.xlarge (1×A10G) 1 0.90 32768 Thinking mode 지원
Mistral-7B 7B g5.xlarge (1×A10G) 1 0.90 8192 Function Calling 강점
DeepSeek-R1 671B 671B LWS: 2×p5.48xlarge 16 0.85 32768 멀티노드 필수
VRAM 공식: 모델 크기(GB) ≈ 파라미터(B) × 2 (BF16)  |  KV Cache = (GPU VRAM × GPU_MEM_UTIL) - 모델 크기  |  DeepSeek-R1 8B: 모델 15GB + KV Cache 5GB = 총 20GB (A10G 24GB에 딱 맞음)

⚙️
Helm Chart 배포
inference-charts로
3줄 배포 완성
📊
오토스케일링
target_requests=20
RayServe 내장
🎯
모델별 최적 설정
GPU_MEM × 크기별
TP/MAX_LEN 조정
← 목차로 돌아가기 다음: 운영 & 최적화 →