GPUStack으로 시작
Docker 기반 Spark 여러 대를 빨리 묶는다.
vLLM과 embedding이 중심이다.
자체 모델은 단일 FastAPI container다.
모델별 replica·route·재시작이 주 요구다.
별도 LiteLLM이 사용자 정책을 맡는다.
도구 선택은 기능 개수 비교가 아니라 우리의 배포 단위가 무엇인지 고르는 일이다
model platformapplication platformcanary카나리 배포SLOService Level ObjectiveGPUStack으로 시작
Docker 기반 Spark 여러 대를 빨리 묶는다.
vLLM과 embedding이 중심이다.
자체 모델은 단일 FastAPI container다.
모델별 replica·route·재시작이 주 요구다.
별도 LiteLLM이 사용자 정책을 맡는다.
Kubernetes로 시작
이미 운영 가능한 cluster와 담당팀이 있다.
모델 서비스가 여러 container와 stateful dependency를 갖는다.
GitOps·secret·network policy·admission·autoscaling이 처음부터 필수다.
모델 외 workload도 같은 장비 풀에 올린다.
이 덱의 예시 시나리오는 왼쪽이다. NVIDIA GPU Operator는 DGX Spark와 ARM64, K3s를 지원 목록에 포함하고 KServe는 vLLM·custom model server를 제공하므로 Kubernetes 경로도 기술적으로 가능하다. 그러나 가능하다는 사실과 지금 운영할 가치가 있다는 판단은 다르다.
| 선택 | 잘하는 일 | 지금의 비용 |
|---|---|---|
| GPUStack | GPU fleet·model backend·route를 한 제품에서 관리 | 일반 앱 orchestration은 제한적 |
| K3s + GPU Operator + KServe | model과 일반 Kubernetes 생태계, custom runtime·rollout | control plane·CNI·storage·operator 운영이 추가됨 |
| Ray Serve | Python graph·분산 inference logic·application composition | fleet 전체 정책·gateway·운영 조합을 더 만들어야 함 |
| Slurm | 학습·batch job queue, priority·fair-share | 장시간 API route와 model lifecycle은 별도 구축 |
| 개별 Docker + Portainer | host·container를 단순히 보고 조작 | model-aware scheduling·route·artifact lifecycle이 약함 |
KServe의 multi-node vLLM도 가능하지만 Standard mode, RWX PVC, autoscaling 제한이 있다. pair 몇 세트를 운영한다는 이유만으로 Kubernetes가 자동으로 더 단순해지지는 않는다.
기능 시연이 아니라 운영 질문에 점수를 준다.
| 영역 | 합격 기준 예 |
|---|---|
| 재현성 | 새 Spark에 같은 image digest·model revision으로 동일 배포 성공 |
| 장애 | single replica 하나 종료 시 route가 살아 있는 target으로 새 요청 전달 |
| 복구 | worker 재부팅 후 정한 RTO 안에 instance Ready 복귀 |
| LiteLLM | streaming·timeout·quota·모델 alias·fallback이 end-to-end 동작 |
| FastAPI | Generic Proxy, readiness, schema 오류, auto-restart 확인 |
| 메모리 | 목표 동시성·context에서 OOM 없이 headroom 유지 |
| pair | member 장애가 route에 반영되고 다른 pair 또는 fallback이 동작 |
| 운영 | 로그 한곳 진입, 핵심 metric·alert, image/model rollback 성공 |
| 보안 | 관리망 격리, TLS, API key 회전, secret 비노출 |
수치는 팀의 SLO와 모델 크기에 따라 채운다. 표의 빈칸을 채우지 못했다면 “GPUStack이 안 된다”가 아니라 아직 운영 가능성을 증명하지 못한 것이다.
다음 중 여러 개가 반복되면 GPUStack custom backend에 일반 플랫폼을 억지로 넣고 있는 것이다.
그때는 GPUStack을 버린다고 보기보다 model endpoint contract와 artifact 규칙을 유지한 채
KServe InferenceService 또는 custom runtime으로 실행 계층을 옮긴다. LiteLLM의 northbound contract는
그대로 남길 수 있다.