ML 모델 배포
1) 역할과 목표
배포 = RG/AML/Legal 및 예산을 충족하면서 제품 및 운영에 대한 추론을 안정적으로 제공합니다.
목표: 대기 시간이 짧고 가용성이 높으며 재현성, 안전 및 빠른 롤백.
2) 아키텍처 제공
2. 1 개의 패턴
온라인 (실시간): 개인화를위한 REST/gRPC, p95 50-150 ms; RG/AML 경고의 경우
거의 실시간: 마이크로 매치 1-5 분 (OLAP-showcase).
배치/오프라인: 골드 나이트 쇼케이스, 규제 기관을위한 WORM 수출.
프로세스 내 점수: 라이트 모델을 서비스에 포함 (낮은 대기 시간).
서버리스: 드문 작업을위한 콜드 스타트 기능.
2. 2 가지 토폴로지
단일 모델 서비스 → 간단하고 빠릅니다.
앙상블/그래프 (라우터 → 프리 프로세스 → 모델 → 프로세스 후) → 복잡한 파이프 라인.
Sidecar Feature Fetcher → 캐시 (Redis/Scylla) 에서 온라인 기능을 가져옵니다.
3) 모델 레지스터 및 버전
레지스트리: 'model _ id', '버전', 'stage = {Staging, Production, Archarded}', 아티팩트 (가중치, 프리 프로세서, 교정), 요구 사항 (CPU/GPU/메모리), 모델 카드 (데이터, 메트릭, 위험, 공정성).
불변의 아티팩트: 컨텐츠 해시; 릴리스의 WORM 사본.
출력 정책: 레지스트리 및 선언적 표현을 통해서만.
4) 컨테이너 화 및 포장
도커 파일:dockerfile
FROM python:3. 11-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements. txt.
RUN pip install -r requirements. txt --no-cache-dir
COPY artifacts/./artifacts/
COPY src/./src/
CMD ["python", "src/serve. py"]
서버 (FastAPI + gRPC, 아이디어):
python serve. py from fastapi import FastAPI import joblib, time app = FastAPI()
model = joblib. load("artifacts/model. joblib")
scaler = joblib. load("artifacts/scaler. joblib")
@app. post("/score")
def score(payload: dict):
t0 = time. time()
x = preprocess(payload, scaler)
y = float(model. predict_proba([x])[0,1])
return {"score": y, "latency_ms": int((time. time()-t0)1000), "model_version": "1. 8. 3"}
5) Kubernetes/Helm and Autoscaling
배포 (조각):yaml apiVersion: apps/v1 kind: Deployment metadata: {name: ml-score, labels: {app: ml-score}}
spec:
replicas: 3 selector: {matchLabels: {app: ml-score}}
template:
metadata: {labels: {app: ml-score}}
spec:
containers:
- name: api image: registry/ml-score:1. 8. 3@sha256:...
ports: [{containerPort: 8080}]
resources:
requests: {cpu: "500m", memory: "512Mi"}
limits: {cpu: "2", memory: "2Gi"}
envFrom: [{secretRef: {name: ml-secrets}}]
readinessProbe: {httpGet: {path: /healthz, port: 8080}, periodSeconds: 5}
livenessProbe: {httpGet: {path: /livez, port: 8080}, periodSeconds: 10}
HPA (RPS/CPU 별):
yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: {name: ml-score-hpa}
spec:
scaleTargetRef: {apiVersion: apps/v1, kind: Deployment, name: ml-score}
minReplicas: 3 maxReplicas: 50 metrics:
- type: Pods pods:
metric: {name: requests_per_second}
target: {type: AverageValue, averageValue: "15"}
- type: Resource resource: {name: cpu, target: {type: Utilization, averageUtilization: 70}}
6) 롤아웃 전략
그림자: 새로운 모델은 요청의 사본을 처리하고 응답은 무시됩니다. 지표/대기 시간/비용의 비교.
카나리아: 트래픽의 1-10% → 녹색 SLO의 경우 25% → 50% → 100%; 분해에 대한 자동 롤백.
청록색: 병렬 스택; 즉석 라우팅 스위치.
점진적 기능 플래그: 시장/임차인/장치 라우팅.
A/B/n: 순차적 테스트를 통한 온라인 실험.
yaml routes:
- match: {tenant: "EEA"} # feature-flags/rules to: {model: "1. 8. 3", weight: 20}
- match: {tenant: "EEA"}
to: {model: "1. 7. 9", weight: 80}
7) 온라인/오프라인 기능: 동등성
통합 변환 라이브러리 및 기능 저장소 (온라인 + 오프라인).
동등성 테스트: 온라인 기능과 참조 샘플의 오프라인 참조 사이의 MAE/MAPE.
캐시 기능: Redis/Scylla, 창 기능을위한 TTL; 타임 아웃 및 하락.
8) 관찰 가능성, SLO 및 경고
8. SLI/SLO 벤치 마크 1 개
대기 시간: p95 λ150 ms (개인화), p99 λ300 ms; RG/AML은 엔드-투-엔드로
가용성: 99 이상. 9%.
오류 추론: 할 수 없습니다. 5% 5xx; 적용 범위는 99% 이상입니
드리프트: PSI 특성/속도 <임계 값, ECE (보정) 는 안정적입니다.
차이가 있는 것 같습니다.
8. 2 메트릭 (Prometheus)
yaml
- http_request_duration_seconds{quantile="0. 95"}
- http_requests_total{code=~"5.."}
- model_inference_latency_ms_bucket
- feature_fetch_latency_ms_bucket
- model_score_distribution_bucket
- psi_feature_{name}
- expected_cost_live
경고 (조각):
yaml
- alert: HighP95Latency expr: histogram_quantile(0. 95, sum(rate(model_inference_latency_ms_bucket[5m])) by (le)) > 0. 15 for: 10m
- alert: DriftDetected expr: psi_feature_amount_base > 0. 25 for: 15m
계정: OpenTelemetry - score 'figure _ fetch', 'score', 'postprocess', 'guardrail'.
9) RG/AML 가드 레일 및 보안 정책
필터 전/필터: 금지 된 동작 마스크 (노출 빈도, 대기 시간, 공격적인 제안 금지).
정책 차폐: RG 임계 값 이상의 속도 → 소프트 개입/일시 정지.
감사: '정책 _ id', '성향', '마스크', '결정', '이유' 로깅.
PII 및 거주자: EEA/UK/BR의 ID 대신 토큰, 별도의 암호화 및 클러스터 키; 정당화없이 지역 간 가입 금지.
비밀: KMS/CMK, 비밀 관리자; 로그/트랙에 PII가 없습니다.
10) 교정, 임계 값 및 의사 결정 정책
인공물로서의 교정 (Platt/Isotonic).
예상 비용 별 임계 값; 레지스트리/기능 플래그에서 구성 할 수 있습니다.
안전 한도: 동작 상한/하한, 규정 준수에 대한 수동 재정의.
11) 롤백, 열화 및 DR
한 번 클릭 롤백-경로를 이전 '모델 _ 버전' 으로 전환합니다.
런북: 스크립트 "latentnost q", "5xx TP 오류", "드리프트/교정 중단", "외부 기능 제공 업체 사용 불가".
결함 격리: 회로 차단기, 재 시도/백오프, 마지막 유효한 솔루션의 캐시.
DR: 아티팩트/레지스트리의 백업, "따뜻한" 영역으로의 복제, 연습.
python try:
features = fetch_features(timeout=30)
except TimeoutError:
features = last_known_good(user_id) # fallback
12) 비용 공학 및 성능
경로 프로파일 링: 기능 (30-60%), 모델 (20-40%), 네트워크/IO (10-30%).
비용 절감: 캐싱 핫 기능, 재생 할당량, 경량 모델, INT8/FP16 (적절한 경우), 게으른 포스트 프로세스.
RPS/CPU/대기 시간에 대한 HPA, 스트림 기능에 대한 상태 크기 제한.
충전: 비용/요청, 비용/기능; 시장/팀을위한 예산.
13) 안전한 출시 및 준수
제품 준비 기준: 그림자에 SLO 녹색, 드리프트/누출 없음, 모델 카드가 가득 차고 공정성 조각이 정상입니다.
레귤레이터: 릴리스의 WORM 아카이브 (가중치, 교정, 임계 값, 메트릭, 테스트 로그), 변경할 수없는 내보내기 보고서.
DSAR/RTBF: 캐시/로그/기능에서 특정 사용자의 흔적을 제거하는 절차.
14) 출시 전 QA
통합 테스트: API 계약, 기능 다이어그램, 빈/익스트림 케이스.
로드: p99, 배포 테일, 버스트 트래픽.
온라인/오프라인 동등성 테스트.
혼돈 테스트: 기능 캐시/베이스 끄기, 외부 서비스 타임 아웃.
15) 설정 예
카나리아 경로 침입 (아이디어):yaml
- match: [headers: {x-exp: "canary"}]
route:
- destination: {host: ml-score-v1-8-3, weight: 20}
- destination: {host: ml-score-v1-7-9, weight: 80}
모델 건강 (엔드 포인트):
python
@app. get("/healthz")
def health():
return {"ok": True, "model_version": "1. 8. 3", "registry_sig_ok": verify_signature()}
16) 프로세스 및 RACI
R (책임): MLops (서빙/오케스트레이션/관찰 가능성), Data Eng (기능/캐시/계약), Data Science (모델 카드/보정/임계 값).
A (책임): 데이터/CDO 책임자.
C (컨설팅): 준수/DPO (PII/RG/AML/DSAR), 보안 (KMS/Secrets/Audit), SRE (SLO/Incidents), 재무 (ROI/Budgets).
I (정보): 제품/마케팅/운영/지원.
17) 구현 로드맵
MVP (3-6 주):1. 모델 레지스트리 및 불변의 아티팩트; FastAPI/gRPC 서비스 + K8/Helm.
2. p95/5xx/드리프트 모니터링을 통한 섀도우 출시, 등가 테스트 기능.
3. 자동 스크립트 롤백 및 경고와 함께 카나리아 10% → 50% → 100%.
4. 모델 카드, 교정, 예상 비용 임계 값 및 Guardrails v1.
2 단계 (6-12 주):- 기능 캐시, 회로 차단기, 런북/DR 연습.
- RPS/대기 시간, 비용 대시 보드 및 요금 환급.
- 공정성 슬라이스 모니터링, WORM 릴리스 아카이브.
- 서빙 그래프 (후보 → 순위 변경), 슬레이트 로깅 성향.
- 개별 키가있는 다중 지역, 거주 (EEA/UK/BR).
- 자동 롤/오버 드라이브, 자동 유전자 품질/보정 보고서.
18) 배송 점검표
- 모델 카드가 가득 찼습니다. 데이터/기능/보정/임계 값이 다양합니다.
- 계약 기능 및 온라인/오프라인 등가 테스트는 녹색입니다.
- SLO: p95, 5xx, 적용 범위-그림자에 녹색 및 10% 카나리아 이하 24 시간.
- 경고 및 대시 보드 (대기 시간/오류/드리프트/예상 비용) 가 포함됩니다.
- Guardrails RG/AML 및 솔루션 감사가 활성화되었습니다. PII/레지던트가 만났습니다.
- 한 번의 클릭 롤백 및 런북 사고가 테스트되었습니다.
- 비용은 예산에 맞습니다. HPA 및 캐시가 구성됩니다.
19) 반 패턴 및 위험
레지스트리 및 불변의 아티팩트가없는 수동 롤아웃.
일관성이없는 온라인/오프라인 기능 → 판매 불일치.
그림자/카나리아 → 숨겨진 회귀가 없습니다.
임계 값은 예상 비용이 아니며 교정이 없습니다.
타임 아웃/캐시가없는 동기식 외부 조회수
DR/롤백, WORM 릴리스 아카이브 없음.
20) 결론
ML 생산은 "모델 과제" 가 아니라 엔지니어링 플랫폼: 레지스트리 및 버전, 안전 롤아웃 (그림자/카나리/청록색), 교정 분야, 관찰 및 SLO, RG/AML 용 가드 레일 및 명확한 롤백 계획. 이 플레이 북을 따르면 통제 된 비용으로 비즈니스 가치를 지속적으로 제공하는 빠르고 신뢰할 수 있으며 호환되는 추론을받을 수 있습니다