🤖 AI/ML

Seldon

Seldon Core / Seldon Enterprise Platform

Kubernetes 기반의 ML 모델 배포 및 서빙 플랫폼입니다. 모델 배포, A/B 테스트, 카나리 배포, 설명 가능성(Explainability), 드리프트 모니터링 등 MLOps 전체 라이프사이클을 지원합니다.

📖 상세 설명

Seldon은 Kubernetes 환경에서 머신러닝 모델을 프로덕션에 배포하고 관리하기 위한 오픈소스 플랫폼입니다. 2018년 설립된 영국 기업 Seldon Technologies가 개발했으며, 금융, 자동차, 보험 등 엔터프라이즈 환경에서 널리 사용됩니다. Seldon의 핵심 철학은 "모든 ML 프레임워크를 지원하는 표준화된 서빙 레이어"를 제공하는 것입니다.

Seldon의 제품군은 크게 세 가지로 구성됩니다. MLServer는 Apache 2.0 라이선스의 오픈소스 추론 서버로, REST/gRPC API를 통해 모델을 서빙합니다. Seldon Core는 Kubernetes CRD(Custom Resource Definition) 기반의 배포 프레임워크로, SeldonDeployment 리소스를 통해 복잡한 추론 그래프를 정의할 수 있습니다. Seldon Enterprise Platform은 GUI 기반 관리 도구, 고급 모니터링, 기술 지원을 포함한 상용 버전입니다.

Seldon Core의 핵심 기능은 추론 그래프(Inference Graph)입니다. 단일 모델 배포뿐 아니라, 여러 모델을 파이프라인으로 연결하거나(A→B→C), A/B 테스트, 카나리 배포, 앙상블, 라우터 등 복잡한 배포 패턴을 YAML 한 파일로 정의할 수 있습니다. 또한 Alibi ExplainAlibi Detect를 통해 모델 설명 가능성(SHAP, Anchors 등)과 데이터 드리프트/이상치 탐지 기능을 기본 제공합니다.

2024년 1월부터 Seldon Core v1, v2, Alibi 프로젝트의 라이선스가 Apache 2.0에서 BSL 1.1(Business Source License)로 변경되었습니다. 이는 상업적 SaaS 제공 시 라이선스 구매가 필요함을 의미하지만, 자체 인프라 내 사용은 여전히 무료입니다. MLServer는 계속 Apache 2.0을 유지합니다. Seldon Core+는 테스트된 바이너리, SLA 지원, 전용 기술 지원을 제공하는 엔터프라이즈 버전입니다.

💻 코드 예제

Seldon Core를 사용하여 scikit-learn 모델을 Kubernetes에 배포하는 예제입니다.

# 1. 모델 학습 및 저장 (model.py)
import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

# 모델 학습
iris = load_iris()
model = LogisticRegression(max_iter=200)
model.fit(iris.data, iris.target)

# 모델 저장
joblib.dump(model, "model.joblib")


# 2. Seldon 래퍼 클래스 작성 (MyModel.py)
import joblib

class MyModel:
    def __init__(self):
        self.model = joblib.load("model.joblib")

    def predict(self, X, features_names=None):
        """
        X: numpy array 형태의 입력 데이터
        returns: 예측 결과
        """
        return self.model.predict(X)

    def predict_proba(self, X, features_names=None):
        """확률 예측 (선택적)"""
        return self.model.predict_proba(X)


# 3. Dockerfile
"""
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY model.joblib .
COPY MyModel.py .
EXPOSE 9000
CMD ["seldon-core-microservice", "MyModel", "--service-type", "MODEL"]
"""

# 4. requirements.txt
"""
seldon-core
scikit-learn
joblib
"""

SeldonDeployment YAML 정의

# seldon-deployment.yaml
apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
  name: iris-model
  namespace: seldon
spec:
  predictors:
  - name: default
    replicas: 2
    graph:
      name: classifier
      implementation: SKLEARN_SERVER
      modelUri: gs://your-bucket/iris-model
      # 또는 커스텀 이미지 사용:
      # children: []
      # implementation: null
      # name: classifier
    componentSpecs:
    - spec:
        containers:
        - name: classifier
          image: your-registry/iris-model:v1
          resources:
            requests:
              memory: "256Mi"
              cpu: "100m"
            limits:
              memory: "512Mi"
              cpu: "500m"
    traffic: 100

---
# A/B 테스트 예제
apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
  name: iris-ab-test
spec:
  predictors:
  - name: model-a
    traffic: 80
    graph:
      name: classifier-a
      implementation: SKLEARN_SERVER
      modelUri: gs://bucket/model-v1
  - name: model-b
    traffic: 20
    graph:
      name: classifier-b
      implementation: SKLEARN_SERVER
      modelUri: gs://bucket/model-v2

배포 및 테스트

# Seldon Core 설치 (Helm)
helm repo add seldon https://storage.googleapis.com/seldon-charts
helm repo update
helm install seldon-core seldon-core-operator \
  --namespace seldon-system \
  --create-namespace \
  --set usageMetrics.enabled=true

# 모델 배포
kubectl apply -f seldon-deployment.yaml

# 배포 상태 확인
kubectl get seldondeployments -n seldon
kubectl get pods -n seldon

# 추론 요청 (curl)
curl -X POST http://<INGRESS_IP>/seldon/seldon/iris-model/api/v1.0/predictions \
  -H "Content-Type: application/json" \
  -d '{"data": {"ndarray": [[5.1, 3.5, 1.4, 0.2]]}}'

# Python 클라이언트
import requests
import json

url = "http://<INGRESS_IP>/seldon/seldon/iris-model/api/v1.0/predictions"
payload = {"data": {"ndarray": [[5.1, 3.5, 1.4, 0.2], [6.2, 3.4, 5.4, 2.3]]}}

response = requests.post(url, json=payload)
print(json.dumps(response.json(), indent=2))

📊 성능 & 비용

Seldon은 오픈소스와 엔터프라이즈 버전으로 제공됩니다.

제품 라이선스 가격 주요 기능
MLServer Apache 2.0 무료 REST/gRPC 추론 서버, 다중 모델 지원
Seldon Core BSL 1.1 무료* K8s 배포, 추론 그래프, A/B 테스트
Seldon Core+ Commercial 커스텀 테스트된 바이너리, SLA 지원, 기술 지원
Enterprise Platform Commercial 커스텀 GUI 대시보드, 고급 모니터링, GenAI 지원

* 자체 인프라 내 사용 무료, 상업적 SaaS 제공 시 라이선스 필요

기능 비교

기능 Core (오픈소스) Core+ Enterprise Platform
모델 배포 O O O
A/B 테스트, 카나리 O O O
Alibi Explain/Detect O (BSL) O O
Multi-Model Serving O O (최적화) O (최적화)
GUI 대시보드 X X O
GenAI/LLM 지원 제한적 애드온 O
기술 지원 커뮤니티 SLA 포함 전담 팀

🗣️ 실무에서 이렇게 말하세요

올바른 표현

"새 모델 배포할 때 Seldon으로 카나리 배포하면 트래픽 10%만 먼저 테스트해볼 수 있어요. 문제 없으면 점진적으로 올리면 됩니다."

올바른 표현

"모델 설명이 필요하면 Seldon에 Alibi Explain 붙여서 SHAP 값을 API로 제공할 수 있습니다. 추가 서버 구축 없이요."

부정확한 표현

"Seldon으로 모델 학습하면 됩니다." → Seldon은 서빙 플랫폼이지 학습 플랫폼이 아닙니다. 학습은 별도 환경에서 하고 Seldon으로 배포합니다.

⚠️ 흔한 실수 & 주의사항

  • Kubernetes 필수: Seldon Core는 Kubernetes 환경이 필수입니다. Docker만으로는 사용할 수 없으며, 최소 minikube라도 필요합니다.
  • 라이선스 변경 주의: 2024년 1월부터 Core, Alibi가 BSL 1.1로 변경되었습니다. SaaS 서비스 제공 시 상용 라이선스가 필요합니다.
  • Istio/Ambassador 설정: 외부 트래픽을 받으려면 Ingress(Istio, Ambassador 등) 설정이 필요합니다. 기본 설치만으로는 클러스터 내부에서만 접근 가능합니다.
  • 모델 포맷: sklearn, xgboost, tensorflow 등 표준 서버를 제공하지만, 커스텀 모델은 래퍼 클래스 작성이 필요합니다.
  • 리소스 설정: 프로덕션에서는 반드시 requests/limits를 설정하세요. 기본값은 테스트용으로 너무 작습니다.
  • 모니터링 연동: Prometheus, Grafana와 연동하여 메트릭을 수집하세요. 내장 메트릭만으로는 프로덕션 운영이 어렵습니다.

🔗 관련 용어

📚 더 배우기