왜 지금 이게 문제인가

“GPT-4를 그냥 API로 쓰면 되지 않나?” 많은 기업이 이 질문에서 출발하지만, 넷플릭스는 다른 답을 내렸다. 범용 LLM은 넷플릭스의 콘텐츠 카탈로그, 추천 알고리즘, 사용자 행동 패턴을 모른다. “이 영화가 한국 30대 남성에게 왜 매력적인가"를 GPT-4에게 물어봐야 일반론만 돌아온다.

넷플릭스 AI 플랫폼 팀은 범용 모델을 가져다가 자사 데이터로 **Post-Training(사후 학습)**하는 내부 프레임워크를 구축했다. 이는 단순한 파인튜닝을 넘어, 프로덕션에서 추천·검색·개인화에 직접 투입되는 모델을 대규모로 생산하는 LLM 공장이다.

  • API 의존의 한계: 외부 LLM API는 자사 데이터로 학습되지 않았고, 모델 업데이트 시점을 통제할 수 없으며, 민감한 사용자 데이터를 외부로 보내야 한다. 넷플릭스 규모에서 이 세 가지는 모두 수용 불가능하다.
  • 파인튜닝의 인프라 복잡성: 수십~수백 대의 GPU 노드에서 분산 학습을 돌리는 것은 모델 코드를 짜는 것보다 10배 어렵다. 노드 하나가 죽으면 수일간의 학습이 날아가고, 체크포인팅은 네트워크 대역폭을 잡아먹으며, GPU 메모리 관리는 악몽이다.
  • 한국적 맥락: 쿠팡, 토스, 카카오 같은 데이터 기반 서비스가 “우리만의 LLM을 만들어야 하나"를 고민 중이다. 넷플릭스의 사례는 Pre-training(처음부터 학습)이 아닌 Post-Training(기존 모델 위에 학습)이라는 현실적 경로를 보여준다.

어떻게 동작하는가

넷플릭스의 Post-Training Framework는 세 개의 레이어로 구성된다.

아키텍처 개요

graph TD
    subgraph "1. 오케스트레이션 레이어"
        A[Training Job Scheduler] --> B[Ray Cluster Manager]
    end

    subgraph "2. 분산 학습 레이어"
        B --> C[GPU Node 1]
        B --> D[GPU Node 2]
        B --> E[GPU Node N]
        C <--> D
        D <--> E
        C <--> E
    end

    subgraph "3. 내결함성 레이어"
        F[Async Checkpointing] --> G[Distributed Storage]
        C -.-> F
        D -.-> F
        E -.-> F
        H[Health Monitor] --> B
    end

    I[Base LLM] --> B
    J[Netflix Domain Data] --> B
    B --> K[Fine-tuned Model]
    K --> L[Model Registry]
    L --> M[Production Serving]

Ray 기반 분산 학습

넷플릭스는 분산 학습 프레임워크로 Ray를 선택했다. PyTorch의 DDP(DistributedDataParallel)나 FSDP(Fully Sharded Data Parallel)를 직접 쓸 수도 있지만, Ray를 택한 이유는 명확하다.

# 개념 예시: Ray 기반 분산 파인튜닝 워크플로우
import ray
from ray.train.torch import TorchTrainer

def train_func(config):
    model = load_base_model(config["base_model"])
    dataset = load_netflix_dataset(config["domain"])  # 추천/검색/개인화

    # FSDP로 모델을 GPU 노드들에 분산 배치
    model = FSDP(model, sharding_strategy=ShardingStrategy.FULL_SHARD)

    for epoch in range(config["epochs"]):
        for batch in dataset:
            loss = model(batch)
            loss.backward()
            optimizer.step()

        # 비동기 체크포인팅: 학습을 멈추지 않고 백그라운드로 저장
        ray.train.report(metrics={"loss": loss.item()})

trainer = TorchTrainer(
    train_func,
    scaling_config=ScalingConfig(
        num_workers=32,           # 32 GPU 노드
        use_gpu=True,
        resources_per_worker={"GPU": 8}  # 노드당 8 GPU
    ),
    run_config=RunConfig(
        # 노드 장애 시 자동 복구
        failure_config=FailureConfig(max_failures=5)
    ),
)
result = trainer.fit()

Ray를 선택한 핵심 이유는 다음과 같다.

기능PyTorch 직접 사용Ray Train
노드 장애 복구수동으로 재시작자동 복구 (max_failures 설정)
체크포인팅학습 중단 후 동기 저장비동기, 학습 계속 진행
리소스 관리직접 SLURM/K8s 관리Ray가 클러스터 자동 스케일링
실험 추적별도 MLflow 등 통합ray.train.report로 통합

내결함성: 체크포인팅의 공학

대규모 분산 학습에서 가장 값비싼 실패는 노드 하나가 죽어서 전체 학습이 날아가는 것이다. 넷플릭스는 이를 세 가지 메커니즘으로 해결한다.

  1. 비동기 체크포인팅(Async Checkpointing): 모델 파라미터를 저장하는 동안 학습을 멈추지 않는다. 체크포인트를 별도 스레드에서 분산 스토리지로 전송하여 GPU idle time을 최소화한다.
  2. 탄력적 재스케줄링(Elastic Rescheduling): 노드가 죽으면 남은 노드에서 학습을 이어가거나, 새 노드를 할당받아 자동 복구한다. 전체 작업을 처음부터 다시 시작하지 않는다.
  3. 계층적 스토리지: 체크포인트를 로컬 NVMe → 네트워크 파일시스템 → 오브젝트 스토리지로 계층적으로 저장하여 복구 속도와 내구성을 동시에 확보한다.

학습과 서빙의 분리

파인튜닝된 모델은 즉시 프로덕션에 투입되지 않는다. 모델 레지스트리에 등록된 후, A/B 테스트를 거쳐 기존 모델보다 핵심 지표(클릭률, 시청 시간, 이탈률 등)가 개선되었을 때만 점진적으로 배포된다. 학습 인프라와 서빙 인프라를 완전히 분리하여, 학습 실험이 프로덕션 안정성을 위협하지 않도록 설계했다.

실제로 써먹을 수 있는가

도입하면 좋은 상황

  • 자사 도메인 데이터가 차별화 요소인 서비스: 커머스의 상품 리뷰, 금융의 거래 패턴, 헬스케어의 진료 기록 등 범용 모델이 알 수 없는 데이터를 가진 기업에서 Post-Training은 명확한 ROI를 만든다.
  • GPU 클러스터를 이미 운영 중인 팀: 추천/검색에 이미 GPU를 쓰고 있다면, 유휴 시간에 파인튜닝을 돌릴 수 있다. 신규 인프라 투자 없이 시작할 수 있는 범위다.
  • 데이터 보안이 최우선인 환경: 금융·의료·공공 분야에서 사용자 데이터를 외부 API로 보낼 수 없다면, 자체 파인튜닝이 유일한 선택지다.

굳이 도입 안 해도 되는 상황

  • 데이터 양이 충분하지 않은 경우: 파인튜닝에 최소 수만 건의 고품질 라벨 데이터가 필요하다. 데이터가 부족하면 오히려 과적합(Overfitting)되어 범용 모델보다 성능이 떨어진다.
  • 비용 대비 효과가 불분명한 경우: GPU 클러스터 운영 비용은 월 수천만 원에서 수억 원에 달한다. “GPT-4 API 비용 vs 자체 파인튜닝 인프라 비용"을 냉정하게 비교해야 한다. 월 API 비용이 1,000만 원 이하라면 자체 인프라가 오히려 비쌀 수 있다.
  • 모델 운영 역량이 없는 팀: 분산 학습, 체크포인팅, 모델 서빙, A/B 테스트를 운영할 MLOps 엔지니어가 최소 2~3명은 있어야 한다. 없다면 API부터 시작하는 것이 맞다.

운영 리스크

1. GPU 자원 경쟁 학습과 서빙이 같은 GPU 풀을 공유하면, 파인튜닝 작업이 프로덕션 추론 성능을 떨어뜨릴 수 있다. 넷플릭스처럼 학습/서빙 클러스터를 물리적으로 분리하거나, 우선순위 기반 스케줄링을 적용해야 한다.

2. 모델 드리프트(Model Drift) 파인튜닝된 모델은 학습 시점의 데이터 분포에 최적화된다. 사용자 행동이 바뀌면(예: 새 시즌 공개, 계절 변화) 모델 성능이 서서히 하락한다. 정기적인 재학습 파이프라인과 성능 모니터링이 필수다.

3. 평가 지표의 함정 “Loss가 낮아졌으니 좋은 모델이다"는 위험한 판단이다. 넷플릭스는 오프라인 평가(벤치마크) → 온라인 A/B 테스트 → 점진적 배포의 3단계를 거친다. 오프라인에서 좋았던 모델이 프로덕션에서 되려 지표를 떨어뜨리는 사례는 흔하다.

한 줄로 남기는 생각

LLM 경쟁력은 “더 큰 모델"이 아니라 “우리 데이터로 길들인 모델"에서 나오며, 그 길들이기를 안정적으로 반복할 수 있는 인프라가 진짜 해자(moat)다.


참고자료