본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 8장: 비용 최적화 - 스팟 인스턴스, 모델 공유, 리소스 관리
2026년 2월 1일·AI / ML·

8장: 비용 최적화 - 스팟 인스턴스, 모델 공유, 리소스 관리

GPU 기반 AI 서비스의 운영 비용을 체계적으로 절감하는 전략을 다루며, 스팟 인스턴스 활용, 모델 공유 아키텍처, 리소스 관리 기법을 소개합니다.

18분537자7개 섹션
mlopskubernetesinfrastructureperformance
공유
ai-deployment8 / 10
12345678910
이전7장: 오토스케일링 - 트래픽 기반 GPU 워크로드 확장다음9장: CI/CD 파이프라인 - GitHub Actions로 모델 배포 자동화

AI 서비스 비용 구조의 이해

AI 서비스 운영에서 GPU 비용은 전체 인프라 비용의 80~90%를 차지합니다. 비용 최적화를 위해서는 먼저 비용 구조를 정확히 이해해야 합니다.

text
AI 서비스 월간 비용 예시 (A100 80GB x 4, 온디맨드):
 
GPU 인스턴스 (p4d.24xlarge):
  시간당 $32.77 x 24시간 x 30일 = $23,594/월
 
스토리지 (EBS + S3):
  모델 스토리지 500GB = 약 $50/월
 
네트워크:
  데이터 전송 1TB = 약 $90/월
 
모니터링:
  CloudWatch + Prometheus = 약 $50/월
 
총 비용: 약 $23,784/월
GPU 비용 비중: 99.2%

GPU 비용이 이처럼 압도적이므로, 비용 최적화의 핵심은 GPU 활용률을 높이거나 GPU 단가를 낮추는 것에 집중됩니다.

스팟 인스턴스 활용

스팟 인스턴스란

스팟 인스턴스(AWS), 선점형 VM(GCP), 스팟 VM(Azure)은 클라우드 제공자의 여유 용량을 할인된 가격에 사용하는 서비스입니다. 온디맨드 대비 60~90% 저렴하지만, 클라우드 제공자가 해당 용량을 필요로 하면 2분 전 통보 후 인스턴스를 회수합니다.

text
GPU 인스턴스 비용 비교 (시간당, ap-northeast-2):
 
인스턴스 타입        온디맨드    스팟       할인율
-----------------  ---------  --------  ------
p4d.24xlarge(A100)  $32.77     $9.83     70%
g5.xlarge(A10G)     $1.01      $0.30     70%
g5.2xlarge(A10G)    $1.21      $0.36     70%
p5.48xlarge(H100)   $98.32     $29.50    70%
 
* 스팟 가격은 변동하며, 위 수치는 참고용입니다.

스팟 인스턴스의 AI 서비스 적용 전략

스팟 인스턴스의 회수 가능성 때문에, 모든 AI 워크로드에 적합한 것은 아닙니다. 워크로드 특성에 따라 적용 전략을 달리해야 합니다.

스팟에 적합한 워크로드:

  • 배치 추론(Batch Inference): 대량의 데이터를 비실시간으로 처리하는 작업
  • 개발/테스트 환경: 서비스 중단이 허용되는 환경
  • 비프로덕션 스테이징: 성능 테스트, 로드 테스트
  • 프로덕션 추가 용량: 기본 용량은 온디맨드, 추가 버스트는 스팟

온디맨드가 필요한 워크로드:

  • 프로덕션 최소 용량: 항상 가용해야 하는 기본 서빙 인스턴스
  • SLA가 있는 서비스: 가용성 보장이 필요한 서비스

Kubernetes에서 스팟 노드 풀 구성

EKS 스팟 노드 그룹 생성
bash
eksctl create nodegroup \
  --cluster ai-serving-cluster \
  --name gpu-spot-nodes \
  --node-type p4d.24xlarge \
  --nodes-min 0 \
  --nodes-max 4 \
  --spot \
  --node-labels "capacity-type=spot,accelerator=nvidia-a100" \
  --node-taints "capacity-type=spot:PreferNoSchedule"

스팟 노드에 AI 서비스를 배포하려면 Pod에 적절한 톨러레이션과 어피니티를 설정합니다.

스팟 노드 배포 설정
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-spot
  namespace: ai-serving
spec:
  replicas: 2
  template:
    spec:
      tolerations:
        - key: nvidia.com/gpu
          operator: Equal
          value: present
          effect: NoSchedule
        - key: capacity-type
          operator: Equal
          value: spot
          effect: PreferNoSchedule
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 90
              preference:
                matchExpressions:
                  - key: capacity-type
                    operator: In
                    values:
                      - spot
            - weight: 10
              preference:
                matchExpressions:
                  - key: capacity-type
                    operator: In
                    values:
                      - on-demand
      containers:
        - name: vllm
          # ... (기존 설정 동일)

스팟 중단 처리

스팟 인스턴스가 회수될 때 서비스 중단을 최소화하려면, 중단 핸들러를 설정해야 합니다. AWS Node Termination Handler가 이 역할을 수행합니다.

AWS Node Termination Handler 설치
bash
helm repo add eks https://aws.github.io/eks-charts
helm install aws-node-termination-handler eks/aws-node-termination-handler \
  --namespace kube-system \
  --set enableSpotInterruptionDraining=true \
  --set enableScheduledEventDraining=true

이 핸들러는 스팟 인스턴스 회수 통보(2분 전)를 감지하면 해당 노드의 Pod를 안전하게 축출(Eviction)합니다. Pod는 다른 노드에 재스케줄링되며, 진행 중인 요청의 Graceful Shutdown이 수행됩니다.

Warning

스팟 인스턴스만으로 프로덕션 서비스를 운영하는 것은 위험합니다. 반드시 온디맨드 인스턴스로 최소 용량을 확보하고, 스팟 인스턴스는 추가 용량으로 활용하는 혼합 전략을 사용해야 합니다.

온디맨드와 스팟 혼합 전략

프로덕션 환경에서 가장 효과적인 패턴은 기본 용량을 온디맨드로 확보하고, 추가 트래픽을 스팟으로 처리하는 혼합 전략입니다.

text
혼합 전략 예시:
 
기본 용량 (온디맨드, 항상 가동):
  vllm-ondemand: replicas=2 (p4d.24xlarge, 온디맨드)
  비용: $32.77 x 2 x 24 x 30 = $47,188/월
 
추가 용량 (스팟, 트래픽 기반):
  vllm-spot: replicas=0~4 (p4d.24xlarge, 스팟)
  평균 가동: 하루 8시간, 2인스턴스
  비용: $9.83 x 2 x 8 x 30 = $4,718/월
 
총 비용: $51,906/월
순수 온디맨드 대비: $94,376/월 --> 45% 절감

모델 최적화를 통한 비용 절감

양자화로 GPU 등급 낮추기

3장에서 다룬 양자화 기법을 비용 절감 관점에서 다시 살펴보겠습니다. 양자화를 적용하면 더 저렴한 GPU로도 동일한 모델을 서빙할 수 있습니다.

text
Llama-3.1-70B 서빙 옵션:
 
FP16 (양자화 없음):
  필요 GPU: 4x A100 80GB
  인스턴스: p4d.24xlarge ($32.77/시간)
  월 비용: $23,594
 
INT4 (AWQ 양자화):
  필요 GPU: 1x A100 80GB 또는 1x A10G 24GB
  인스턴스: g5.xlarge ($1.01/시간)
  월 비용: $727
 
비용 절감: 96.9%
품질 손실: 약 1-3% (작업에 따라 다름)

양자화는 가장 극적인 비용 절감 수단이지만, 품질 손실을 반드시 평가해야 합니다.

작은 모델 활용

모든 요청에 대형 모델이 필요한 것은 아닙니다. 요청의 복잡도에 따라 모델을 선택하는 라우팅 전략을 통해 비용을 크게 절감할 수 있습니다.

text
모델 라우팅 전략:
 
간단한 질의 (70%):
  - FAQ, 정형 응답
  - Llama-3.1-8B로 처리
  - 비용: $727/월
 
복잡한 질의 (30%):
  - 분석, 추론, 창작
  - Llama-3.1-70B로 처리
  - 비용: $23,594/월 x 30% = $7,078/월
 
총 비용: $7,805/월
전부 70B 사용 대비: 67% 절감
router.py - 모델 라우팅 예시
python
from openai import OpenAI
 
small_client = OpenAI(
    base_url="http://vllm-8b-service/v1",
    api_key="not-needed"
)
 
large_client = OpenAI(
    base_url="http://vllm-70b-service/v1",
    api_key="not-needed"
)
 
def classify_complexity(message: str) -> str:
    """요청 복잡도를 분류합니다."""
    simple_keywords = ["정의", "뜻", "의미", "설명해", "알려줘"]
    if any(kw in message for kw in simple_keywords):
        return "simple"
    if len(message) > 500:
        return "complex"
    return "simple"
 
def route_request(messages: list) -> OpenAI:
    """복잡도에 따라 적절한 모델로 라우팅합니다."""
    user_message = messages[-1]["content"]
    complexity = classify_complexity(user_message)
 
    if complexity == "simple":
        return small_client
    return large_client

리소스 활용률 극대화

GPU 시간 분할(Time-Slicing)

NVIDIA GPU Time-Slicing은 하나의 GPU를 여러 Pod가 시간적으로 분할하여 사용하는 기능입니다. MIG(Multi-Instance GPU)와 달리 메모리를 분리하지 않으므로 격리 수준이 낮지만, 설정이 간단하고 유연합니다.

time-slicing ConfigMap
yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: time-slicing-config
  namespace: gpu-operator
data:
  a100-80gb: |
    version: v1
    sharing:
      timeSlicing:
        resources:
          - name: nvidia.com/gpu
            replicas: 4

이 설정은 각 A100 GPU를 4개의 가상 GPU로 분할합니다. 각 Pod는 GPU의 전체 메모리에 접근할 수 있지만, 연산 시간은 분할됩니다.

Warning

GPU Time-Slicing은 추론 서비스보다는 개발/테스트 환경에 적합합니다. 프로덕션 추론에서는 시간 분할로 인한 지연 시간 변동이 서비스 품질에 영향을 줄 수 있습니다. 또한 하나의 Pod가 GPU 메모리를 모두 소비하면 다른 Pod가 OOM 오류를 겪을 수 있습니다.

프리픽스 캐싱 극대화

동일한 시스템 프롬프트를 사용하는 서비스에서 프리픽스 캐싱은 효과적인 비용 절감 수단입니다. 캐시 히트 시 프리필 연산이 생략되어 GPU 시간이 절약되고, 결과적으로 같은 GPU로 더 많은 요청을 처리할 수 있습니다.

text
프리픽스 캐싱 비용 절감 효과:
 
시스템 프롬프트 2000 토큰, 사용자 입력 평균 200 토큰:
  캐싱 미적용: 2200 토큰 프리필 필요 (100% GPU 시간)
  캐싱 적용:   200 토큰 프리필 필요 (약 9% GPU 시간)
 
동일 GPU로 처리 가능한 요청 수: 약 2-3배 증가
실질적 비용 절감: 50-66%

배치 추론 활용

실시간 응답이 필요하지 않은 작업(데이터 처리, 콘텐츠 생성, 분석 등)은 배치 추론으로 처리하면 비용을 크게 절감할 수 있습니다.

배치 추론의 장점은 다음과 같습니다.

  • 스팟 인스턴스를 활용할 수 있습니다(중단 시 재시작 가능).
  • 비업무 시간(야간, 주말)에 실행하여 GPU를 효율적으로 활용합니다.
  • 큰 배치 크기로 GPU 활용률을 극대화합니다.
batch_inference.py
python
import json
from openai import OpenAI
 
client = OpenAI(
    base_url="http://vllm-batch-service/v1",
    api_key="not-needed"
)
 
def run_batch_inference(input_file: str, output_file: str):
    """파일 기반 배치 추론을 실행합니다."""
    with open(input_file) as f:
        items = [json.loads(line) for line in f]
 
    results = []
    # 동시에 여러 요청을 보내 GPU 활용률 극대화
    for item in items:
        response = client.chat.completions.create(
            model="meta-llama/Llama-3.1-8B-Instruct",
            messages=[
                {"role": "user", "content": item["prompt"]}
            ],
            max_tokens=512,
        )
        results.append({
            "id": item["id"],
            "response": response.choices[0].message.content
        })
 
    with open(output_file, "w") as f:
        for r in results:
            f.write(json.dumps(r, ensure_ascii=False) + "\n")

비용 모니터링

비용 추적 대시보드

비용 최적화의 전제 조건은 현재 비용을 정확히 파악하는 것입니다. GPU 사용 시간, 활용률, 요청당 비용 등을 추적하는 대시보드를 구축해야 합니다.

text
추적해야 할 비용 메트릭:
 
인프라 메트릭:
  - GPU 인스턴스 가동 시간 (온디맨드 vs 스팟)
  - GPU 활용률 (nvidia_gpu_duty_cycle)
  - GPU 메모리 사용률
 
서비스 메트릭:
  - 요청당 평균 토큰 수 (입력 + 출력)
  - 요청당 평균 처리 시간
  - 요청당 비용 = (GPU 시간당 비용 x 처리 시간) / 3600
 
비즈니스 메트릭:
  - 일간/주간/월간 총 비용
  - 서비스/모델별 비용 분배
  - 비용 추세와 예측

Kubecost 활용

Kubecost는 Kubernetes 환경의 비용을 추적하고 최적화 권장 사항을 제공하는 도구입니다.

Kubecost 설치
bash
helm repo add kubecost https://kubecost.github.io/cost-analyzer
helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost \
  --create-namespace \
  --set kubecostToken="YOUR_TOKEN"

Kubecost를 통해 네임스페이스별, 서비스별, 라벨별 비용을 분석하고, 유휴 리소스와 과잉 프로비저닝을 식별할 수 있습니다.

비용 최적화 체크리스트

text
비용 최적화 체크리스트:
 
[즉시 적용 가능]
- 양자화 적용 검토 (INT4/INT8)
- 프리픽스 캐싱 활성화
- 최대 컨텍스트 길이 필요량에 맞게 제한
- 개발/테스트 환경을 스팟 인스턴스로 전환
 
[단기 (1-2주)]
- 프로덕션 스팟 혼합 전략 구현
- 비업무 시간 스케일다운 예약
- 비실시간 작업을 배치 추론으로 전환
- 비용 모니터링 대시보드 구축
 
[중기 (1-2개월)]
- 모델 라우팅 (복잡도 기반 모델 선택)
- GPU 활용률 기반 오토스케일링 튜닝
- Reserved/Savings Plans 검토
- 작은 특화 모델 파인튜닝 검토
 
[장기]
- 자체 GPU 서버 구축 비용 분석 (코로케이션)
- 온프레미스와 클라우드 하이브리드 아키텍처
Tip

AWS Reserved Instances나 Savings Plans를 통해 1년 또는 3년 약정으로 온디맨드 대비 40~60% 할인을 받을 수 있습니다. 워크로드가 안정적이고 장기 운영이 확실하다면 반드시 검토해야 할 옵션입니다.

정리

AI 서비스의 비용 최적화는 단일 기법이 아닌 다층적인 접근이 필요합니다. 스팟 인스턴스로 GPU 단가를 낮추고, 양자화와 프리픽스 캐싱으로 GPU 효율을 높이며, 모델 라우팅으로 불필요한 대형 모델 사용을 줄이는 것이 핵심입니다. 무엇보다 비용 모니터링을 통해 현재 상태를 정확히 파악하고, 지속적으로 최적화하는 문화를 만드는 것이 중요합니다.

다음 장에서는 AI 서비스의 배포를 자동화하는 CI/CD 파이프라인을 구축하겠습니다. GitHub Actions를 활용하여 코드 변경부터 프로덕션 배포까지의 전 과정을 자동화합니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#mlops#kubernetes#infrastructure#performance

관련 글

AI / ML

9장: CI/CD 파이프라인 - GitHub Actions로 모델 배포 자동화

GitHub Actions를 활용하여 AI 서비스의 빌드, 테스트, 배포를 자동화하는 CI/CD 파이프라인을 구축하고, 모델 평가를 파이프라인에 통합합니다.

2026년 2월 3일·14분
AI / ML

7장: 오토스케일링 - 트래픽 기반 GPU 워크로드 확장

Kubernetes에서 GPU 기반 AI 서비스의 자동 확장 전략을 구현하며, HPA 커스텀 메트릭과 Cluster Autoscaler를 활용한 효율적인 스케일링 방법을 다룹니다.

2026년 1월 30일·17분
AI / ML

10장: 실전 프로젝트 - 프로덕션 AI 서비스 파이프라인 구축

모델 서빙부터 Kubernetes 배포, 오토스케일링, CI/CD까지 전체 AI 서비스 배포 파이프라인을 처음부터 끝까지 구축하는 종합 실전 프로젝트입니다.

2026년 2월 5일·20분
이전 글7장: 오토스케일링 - 트래픽 기반 GPU 워크로드 확장
다음 글9장: CI/CD 파이프라인 - GitHub Actions로 모델 배포 자동화

댓글

목차

약 18분 남음
  • AI 서비스 비용 구조의 이해
  • 스팟 인스턴스 활용
    • 스팟 인스턴스란
    • 스팟 인스턴스의 AI 서비스 적용 전략
    • Kubernetes에서 스팟 노드 풀 구성
    • 스팟 중단 처리
    • 온디맨드와 스팟 혼합 전략
  • 모델 최적화를 통한 비용 절감
    • 양자화로 GPU 등급 낮추기
    • 작은 모델 활용
  • 리소스 활용률 극대화
    • GPU 시간 분할(Time-Slicing)
    • 프리픽스 캐싱 극대화
    • 배치 추론 활용
  • 비용 모니터링
    • 비용 추적 대시보드
    • Kubecost 활용
  • 비용 최적화 체크리스트
  • 정리