{"componentChunkName":"component---src-templates-blog-post-js","path":"/ai/MLOps-실전-가이드-AI-모델-서빙과-운영-자동화/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"5bcfbec9-51f3-5b4a-b17a-e19a7e06eff7","excerpt":"MLOps 실전 가이드 - AI 모델 서빙과 운영 자동화 완벽 정리 머신러닝 모델을 개발하는 것과 프로덕션 환경에서 안정적으로 운영하는 것은 완전히 다른 차원의 문제다. Jupyter Notebook에서 9…","html":"<h1 id=\"mlops-실전-가이드---ai-모델-서빙과-운영-자동화-완벽-정리\" style=\"position:relative;\"><a href=\"#mlops-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C---ai-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC\" aria-label=\"mlops 실전 가이드   ai 모델 서빙과 운영 자동화 완벽 정리 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MLOps 실전 가이드 - AI 모델 서빙과 운영 자동화 완벽 정리</h1>\n<p>머신러닝 모델을 개발하는 것과 프로덕션 환경에서 안정적으로 운영하는 것은 완전히 다른 차원의 문제다. Jupyter Notebook에서 95% 정확도를 달성한 모델이 실제 서비스에서는 성능이 급격히 떨어지거나, 모델 업데이트 후 롤백이 어려워 서비스 장애가 발생하는 사례는 흔하다. <strong>MLOps(Machine Learning Operations)</strong>는 이러한 문제를 해결하기 위한 실무 방법론이다. 이 글은 MLOps의 핵심 개념부터 실전 구현까지, 프로덕션 환경에서 AI 모델을 안정적으로 운영하는 모든 것을 다룬다.</p>\n<h2 id=\"1-mlops란-무엇인가\" style=\"position:relative;\"><a href=\"#1-mlops%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80\" aria-label=\"1 mlops란 무엇인가 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. MLOps란 무엇인가?</h2>\n<h3 id=\"1-1-정의와-배경\" style=\"position:relative;\"><a href=\"#1-1-%EC%A0%95%EC%9D%98%EC%99%80-%EB%B0%B0%EA%B2%BD\" aria-label=\"1 1 정의와 배경 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-1. 정의와 배경</h3>\n<p>MLOps는 DevOps의 머신러닝 버전으로, ML 모델의 개발부터 배포, 모니터링, 재학습까지 전체 라이프사이클을 자동화하고 표준화하는 관행이다. 전통적인 소프트웨어 개발과 달리 ML은 다음과 같은 특수성을 가진다:</p>\n<ul>\n<li><strong>데이터 의존성</strong>: 모델 성능이 데이터 품질과 분포에 직접적으로 의존</li>\n<li><strong>실험 중심 개발</strong>: 다양한 하이퍼파라미터와 아키텍처를 시도해야 함</li>\n<li><strong>모델 재학습 필요성</strong>: 데이터 분포 변화(Concept Drift)에 따라 주기적 업데이트 필요</li>\n<li><strong>재현성 요구</strong>: 동일한 결과를 보장하기 위한 환경 관리 필요</li>\n</ul>\n<h3 id=\"1-2-mlops의-핵심-가치\" style=\"position:relative;\"><a href=\"#1-2-mlops%EC%9D%98-%ED%95%B5%EC%8B%AC-%EA%B0%80%EC%B9%98\" aria-label=\"1 2 mlops의 핵심 가치 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-2. MLOps의 핵심 가치</h3>\n<ol>\n<li><strong>재현성(Reproducibility)</strong>: 동일한 코드와 데이터로 동일한 모델을 재생성 가능</li>\n<li><strong>협업성(Collaboration)</strong>: 데이터 과학자, ML 엔지니어, DevOps 팀 간 원활한 협업</li>\n<li><strong>자동화(Automation)</strong>: 수동 작업을 최소화하고 파이프라인 자동화</li>\n<li><strong>모니터링(Monitoring)</strong>: 프로덕션 환경에서 모델 성능과 데이터 품질 지속 추적</li>\n<li><strong>확장성(Scalability)</strong>: 수백 개의 모델을 동시에 운영할 수 있는 인프라</li>\n</ol>\n<h3 id=\"1-3-mlops-vs-devops\" style=\"position:relative;\"><a href=\"#1-3-mlops-vs-devops\" aria-label=\"1 3 mlops vs devops permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1-3. MLOps vs DevOps</h3>\n<table>\n<thead>\n<tr>\n<th>구분</th>\n<th>DevOps</th>\n<th>MLOps</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>버전 관리</strong></td>\n<td>코드만 관리</td>\n<td>코드 + 데이터 + 모델 모두 관리</td>\n</tr>\n<tr>\n<td><strong>테스트</strong></td>\n<td>단위/통합 테스트</td>\n<td>데이터 검증, 모델 성능 테스트</td>\n</tr>\n<tr>\n<td><strong>배포</strong></td>\n<td>코드 배포</td>\n<td>모델 + 인퍼런스 서버 배포</td>\n</tr>\n<tr>\n<td><strong>모니터링</strong></td>\n<td>애플리케이션 메트릭</td>\n<td>모델 성능, 데이터 드리프트, 예측 분포</td>\n</tr>\n<tr>\n<td><strong>CI/CD</strong></td>\n<td>코드 변경 시 빌드/배포</td>\n<td>데이터/코드 변경 시 재학습/재배포</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"2-mlops-아키텍처-설계\" style=\"position:relative;\"><a href=\"#2-mlops-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%84%A4%EA%B3%84\" aria-label=\"2 mlops 아키텍처 설계 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. MLOps 아키텍처 설계</h2>\n<h3 id=\"2-1-전체-파이프라인-구조\" style=\"position:relative;\"><a href=\"#2-1-%EC%A0%84%EC%B2%B4-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%A1%B0\" aria-label=\"2 1 전체 파이프라인 구조 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-1. 전체 파이프라인 구조</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">[데이터 수집] → [데이터 검증] → [특성 엔지니어링] → [모델 학습]\n                                                          ↓\n[모델 평가] ← [모델 검증] ← [모델 등록] ← [모델 패키징]\n     ↓\n[모델 배포] → [A/B 테스트] → [프로덕션 서빙] → [모니터링]\n     ↑                                                      ↓\n[자동 재학습] ← [드리프트 감지] ← [성능 저하 알림] ← [로그 수집]</code></pre></div>\n<h3 id=\"2-2-주요-구성-요소\" style=\"position:relative;\"><a href=\"#2-2-%EC%A3%BC%EC%9A%94-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C\" aria-label=\"2 2 주요 구성 요소 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2-2. 주요 구성 요소</h3>\n<h4 id=\"데이터-파이프라인\" style=\"position:relative;\"><a href=\"#%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8\" aria-label=\"데이터 파이프라인 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>데이터 파이프라인</h4>\n<ul>\n<li><strong>데이터 수집</strong>: 실시간 스트리밍(Kafka) 또는 배치 처리</li>\n<li><strong>데이터 검증</strong>: Great Expectations, Pandera를 활용한 스키마/분포 검증</li>\n<li><strong>특성 저장소(Feature Store)</strong>: Feast, Tecton을 활용한 특성 재사용</li>\n</ul>\n<h4 id=\"모델-개발-환경\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%8D%B8-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD\" aria-label=\"모델 개발 환경 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>모델 개발 환경</h4>\n<ul>\n<li><strong>실험 추적</strong>: MLflow, Weights &#x26; Biases(W&#x26;B), Neptune</li>\n<li><strong>모델 레지스트리</strong>: 모델 버전 관리 및 메타데이터 저장</li>\n<li><strong>하이퍼파라미터 튜닝</strong>: Optuna, Ray Tune</li>\n</ul>\n<h4 id=\"모델-서빙\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99\" aria-label=\"모델 서빙 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>모델 서빙</h4>\n<ul>\n<li><strong>온라인 서빙</strong>: REST API, gRPC를 통한 실시간 추론</li>\n<li><strong>배치 추론</strong>: 대량 데이터 처리용 스케줄링</li>\n<li><strong>엣지 배포</strong>: 모바일/IoT 디바이스용 경량화 모델</li>\n</ul>\n<h4 id=\"모니터링-및-관찰-가능성\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EB%B0%8F-%EA%B4%80%EC%B0%B0-%EA%B0%80%EB%8A%A5%EC%84%B1\" aria-label=\"모니터링 및 관찰 가능성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>모니터링 및 관찰 가능성</h4>\n<ul>\n<li><strong>모델 성능 메트릭</strong>: 정확도, 지연 시간, 처리량</li>\n<li><strong>데이터 드리프트 감지</strong>: Evidently AI, Fiddler</li>\n<li><strong>예측 분포 모니터링</strong>: 예측값의 통계적 분포 추적</li>\n</ul>\n<h2 id=\"3-모델-버전-관리---mlflow-실전\" style=\"position:relative;\"><a href=\"#3-%EB%AA%A8%EB%8D%B8-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC---mlflow-%EC%8B%A4%EC%A0%84\" aria-label=\"3 모델 버전 관리   mlflow 실전 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. 모델 버전 관리 - MLflow 실전</h2>\n<h3 id=\"3-1-mlflow-개요\" style=\"position:relative;\"><a href=\"#3-1-mlflow-%EA%B0%9C%EC%9A%94\" aria-label=\"3 1 mlflow 개요 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-1. MLflow 개요</h3>\n<p>MLflow는 Databricks에서 개발한 오픈소스 MLOps 플랫폼으로, 실험 추적, 모델 레지스트리, 모델 서빙을 통합 제공한다.</p>\n<p><strong>핵심 컴포넌트:</strong></p>\n<ul>\n<li><strong>Tracking</strong>: 실험 파라미터, 메트릭, 아티팩트 추적</li>\n<li><strong>Projects</strong>: 재현 가능한 ML 프로젝트 패키징</li>\n<li><strong>Models</strong>: 다양한 플랫폼으로 모델 배포</li>\n<li><strong>Model Registry</strong>: 중앙화된 모델 저장소</li>\n</ul>\n<h3 id=\"3-2-mlflow-실험-추적-구현\" style=\"position:relative;\"><a href=\"#3-2-mlflow-%EC%8B%A4%ED%97%98-%EC%B6%94%EC%A0%81-%EA%B5%AC%ED%98%84\" aria-label=\"3 2 mlflow 실험 추적 구현 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-2. MLflow 실험 추적 구현</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> mlflow\n<span class=\"token keyword\">import</span> mlflow<span class=\"token punctuation\">.</span>sklearn\n<span class=\"token keyword\">from</span> sklearn<span class=\"token punctuation\">.</span>ensemble <span class=\"token keyword\">import</span> RandomForestClassifier\n<span class=\"token keyword\">from</span> sklearn<span class=\"token punctuation\">.</span>model_selection <span class=\"token keyword\">import</span> train_test_split\n<span class=\"token keyword\">from</span> sklearn<span class=\"token punctuation\">.</span>metrics <span class=\"token keyword\">import</span> accuracy_score<span class=\"token punctuation\">,</span> precision_score<span class=\"token punctuation\">,</span> recall_score\n<span class=\"token keyword\">import</span> pandas <span class=\"token keyword\">as</span> pd\n\n<span class=\"token comment\"># MLflow 실험 설정</span>\nmlflow<span class=\"token punctuation\">.</span>set_experiment<span class=\"token punctuation\">(</span><span class=\"token string\">\"customer_churn_prediction\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 실험 시작</span>\n<span class=\"token keyword\">with</span> mlflow<span class=\"token punctuation\">.</span>start_run<span class=\"token punctuation\">(</span>run_name<span class=\"token operator\">=</span><span class=\"token string\">\"rf_baseline_v1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token comment\"># 데이터 로드</span>\n    df <span class=\"token operator\">=</span> pd<span class=\"token punctuation\">.</span>read_csv<span class=\"token punctuation\">(</span><span class=\"token string\">\"data/customer_churn.csv\"</span><span class=\"token punctuation\">)</span>\n    X_train<span class=\"token punctuation\">,</span> X_test<span class=\"token punctuation\">,</span> y_train<span class=\"token punctuation\">,</span> y_test <span class=\"token operator\">=</span> train_test_split<span class=\"token punctuation\">(</span>\n        df<span class=\"token punctuation\">.</span>drop<span class=\"token punctuation\">(</span><span class=\"token string\">\"churn\"</span><span class=\"token punctuation\">,</span> axis<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n        df<span class=\"token punctuation\">[</span><span class=\"token string\">\"churn\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> \n        test_size<span class=\"token operator\">=</span><span class=\"token number\">0.2</span><span class=\"token punctuation\">,</span> \n        random_state<span class=\"token operator\">=</span><span class=\"token number\">42</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 하이퍼파라미터 정의</span>\n    params <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"n_estimators\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">100</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"max_depth\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"min_samples_split\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"random_state\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">42</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token comment\"># 모델 학습</span>\n    model <span class=\"token operator\">=</span> RandomForestClassifier<span class=\"token punctuation\">(</span><span class=\"token operator\">**</span>params<span class=\"token punctuation\">)</span>\n    model<span class=\"token punctuation\">.</span>fit<span class=\"token punctuation\">(</span>X_train<span class=\"token punctuation\">,</span> y_train<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 예측 및 평가</span>\n    y_pred <span class=\"token operator\">=</span> model<span class=\"token punctuation\">.</span>predict<span class=\"token punctuation\">(</span>X_test<span class=\"token punctuation\">)</span>\n    accuracy <span class=\"token operator\">=</span> accuracy_score<span class=\"token punctuation\">(</span>y_test<span class=\"token punctuation\">,</span> y_pred<span class=\"token punctuation\">)</span>\n    precision <span class=\"token operator\">=</span> precision_score<span class=\"token punctuation\">(</span>y_test<span class=\"token punctuation\">,</span> y_pred<span class=\"token punctuation\">)</span>\n    recall <span class=\"token operator\">=</span> recall_score<span class=\"token punctuation\">(</span>y_test<span class=\"token punctuation\">,</span> y_pred<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># MLflow에 로깅</span>\n    mlflow<span class=\"token punctuation\">.</span>log_params<span class=\"token punctuation\">(</span>params<span class=\"token punctuation\">)</span>\n    mlflow<span class=\"token punctuation\">.</span>log_metrics<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"accuracy\"</span><span class=\"token punctuation\">:</span> accuracy<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"precision\"</span><span class=\"token punctuation\">:</span> precision<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"recall\"</span><span class=\"token punctuation\">:</span> recall\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 모델 저장</span>\n    mlflow<span class=\"token punctuation\">.</span>sklearn<span class=\"token punctuation\">.</span>log_model<span class=\"token punctuation\">(</span>\n        model<span class=\"token punctuation\">,</span> \n        <span class=\"token string\">\"model\"</span><span class=\"token punctuation\">,</span>\n        registered_model_name<span class=\"token operator\">=</span><span class=\"token string\">\"ChurnPredictor\"</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 데이터셋 정보 로깅</span>\n    mlflow<span class=\"token punctuation\">.</span>log_artifact<span class=\"token punctuation\">(</span><span class=\"token string\">\"data/customer_churn.csv\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"dataset\"</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Accuracy: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>accuracy<span class=\"token punctuation\">:</span><span class=\"token format-spec\">.4f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Run ID: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>mlflow<span class=\"token punctuation\">.</span>active_run<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">.</span>run_id<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"3-3-모델-레지스트리-활용\" style=\"position:relative;\"><a href=\"#3-3-%EB%AA%A8%EB%8D%B8-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%8A%B8%EB%A6%AC-%ED%99%9C%EC%9A%A9\" aria-label=\"3 3 모델 레지스트리 활용 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-3. 모델 레지스트리 활용</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> mlflow<span class=\"token punctuation\">.</span>tracking <span class=\"token keyword\">import</span> MlflowClient\n\nclient <span class=\"token operator\">=</span> MlflowClient<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 모델 버전 조회</span>\nmodel_versions <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>search_model_versions<span class=\"token punctuation\">(</span><span class=\"token string\">\"name='ChurnPredictor'\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> mv <span class=\"token keyword\">in</span> model_versions<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Version: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>mv<span class=\"token punctuation\">.</span>version<span class=\"token punctuation\">}</span></span><span class=\"token string\">, Stage: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>mv<span class=\"token punctuation\">.</span>current_stage<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 모델을 Staging으로 전환</span>\nclient<span class=\"token punctuation\">.</span>transition_model_version_stage<span class=\"token punctuation\">(</span>\n    name<span class=\"token operator\">=</span><span class=\"token string\">\"ChurnPredictor\"</span><span class=\"token punctuation\">,</span>\n    version<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    stage<span class=\"token operator\">=</span><span class=\"token string\">\"Staging\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># Production으로 승격</span>\nclient<span class=\"token punctuation\">.</span>transition_model_version_stage<span class=\"token punctuation\">(</span>\n    name<span class=\"token operator\">=</span><span class=\"token string\">\"ChurnPredictor\"</span><span class=\"token punctuation\">,</span>\n    version<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    stage<span class=\"token operator\">=</span><span class=\"token string\">\"Production\"</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># Production 모델 로드</span>\n<span class=\"token keyword\">import</span> mlflow<span class=\"token punctuation\">.</span>pyfunc\nmodel <span class=\"token operator\">=</span> mlflow<span class=\"token punctuation\">.</span>pyfunc<span class=\"token punctuation\">.</span>load_model<span class=\"token punctuation\">(</span>\n    model_uri<span class=\"token operator\">=</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"models:/ChurnPredictor/Production\"</span></span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"3-4-mlflow-서빙\" style=\"position:relative;\"><a href=\"#3-4-mlflow-%EC%84%9C%EB%B9%99\" aria-label=\"3 4 mlflow 서빙 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3-4. MLflow 서빙</h3>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># MLflow 모델 서빙 서버 시작</span>\nmlflow models serve <span class=\"token parameter variable\">-m</span> models:/ChurnPredictor/Production <span class=\"token parameter variable\">-p</span> <span class=\"token number\">5000</span>\n\n<span class=\"token comment\"># 예측 요청</span>\n<span class=\"token function\">curl</span> <span class=\"token parameter variable\">-X</span> POST http://localhost:5000/invocations <span class=\"token punctuation\">\\</span>\n  <span class=\"token parameter variable\">-H</span> <span class=\"token string\">'Content-Type: application/json'</span> <span class=\"token punctuation\">\\</span>\n  <span class=\"token parameter variable\">-d</span> <span class=\"token string\">'{\n    \"inputs\": [[25, 50000, 1, 0, 1]]\n  }'</span></code></pre></div>\n<h2 id=\"4-모델-서빙-전략\" style=\"position:relative;\"><a href=\"#4-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99-%EC%A0%84%EB%9E%B5\" aria-label=\"4 모델 서빙 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. 모델 서빙 전략</h2>\n<h3 id=\"4-1-서빙-패턴-비교\" style=\"position:relative;\"><a href=\"#4-1-%EC%84%9C%EB%B9%99-%ED%8C%A8%ED%84%B4-%EB%B9%84%EA%B5%90\" aria-label=\"4 1 서빙 패턴 비교 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-1. 서빙 패턴 비교</h3>\n<h4 id=\"1-실시간-서빙-online-serving\" style=\"position:relative;\"><a href=\"#1-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%84%9C%EB%B9%99-online-serving\" aria-label=\"1 실시간 서빙 online serving permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1) 실시간 서빙 (Online Serving)</h4>\n<ul>\n<li><strong>용도</strong>: 사용자 요청에 즉시 응답 필요</li>\n<li><strong>예시</strong>: 추천 시스템, 사기 탐지, 챗봇</li>\n<li><strong>요구사항</strong>: 낮은 지연 시간(&#x3C;100ms), 높은 가용성</li>\n</ul>\n<h4 id=\"2-배치-서빙-batch-serving\" style=\"position:relative;\"><a href=\"#2-%EB%B0%B0%EC%B9%98-%EC%84%9C%EB%B9%99-batch-serving\" aria-label=\"2 배치 서빙 batch serving permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2) 배치 서빙 (Batch Serving)</h4>\n<ul>\n<li><strong>용도</strong>: 대량 데이터 처리, 주기적 예측</li>\n<li><strong>예시</strong>: 일일 리포트 생성, 주간 예측 배치</li>\n<li><strong>요구사항</strong>: 높은 처리량, 비용 효율성</li>\n</ul>\n<h4 id=\"3-스트리밍-서빙-streaming-serving\" style=\"position:relative;\"><a href=\"#3-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D-%EC%84%9C%EB%B9%99-streaming-serving\" aria-label=\"3 스트리밍 서빙 streaming serving permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3) 스트리밍 서빙 (Streaming Serving)</h4>\n<ul>\n<li><strong>용도</strong>: 실시간 데이터 스트림 처리</li>\n<li><strong>예시</strong>: 실시간 이상 탐지, 실시간 추천</li>\n<li><strong>요구사항</strong>: 낮은 지연 시간, 높은 처리량</li>\n</ul>\n<h3 id=\"4-2-kubernetes-기반-모델-서빙---kserve\" style=\"position:relative;\"><a href=\"#4-2-kubernetes-%EA%B8%B0%EB%B0%98-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99---kserve\" aria-label=\"4 2 kubernetes 기반 모델 서빙   kserve permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-2. Kubernetes 기반 모델 서빙 - KServe</h3>\n<p>KServe는 Kubernetes 네이티브 모델 서빙 플랫폼으로, 자동 스케일링, 카나리 배포, A/B 테스트를 지원한다.</p>\n<h4 id=\"kserve-설치\" style=\"position:relative;\"><a href=\"#kserve-%EC%84%A4%EC%B9%98\" aria-label=\"kserve 설치 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>KServe 설치</h4>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># KServe 설치</span>\nkubectl apply <span class=\"token parameter variable\">-f</span> https://github.com/kserve/kserve/releases/download/v0.11.0/kserve.yaml\n\n<span class=\"token comment\"># InferenceService 생성</span>\nkubectl apply <span class=\"token parameter variable\">-f</span> - <span class=\"token operator\">&lt;&lt;</span><span class=\"token string\">EOF\napiVersion: \"serving.kserve.io/v1beta1\"\nkind: \"InferenceService\"\nmetadata:\n  name: \"churn-predictor\"\nspec:\n  predictor:\n    sklearn:\n      storageUri: \"s3://mlflow-bucket/models/ChurnPredictor/1\"\n      resources:\n        requests:\n          cpu: \"100m\"\n          memory: \"1Gi\"\n        limits:\n          cpu: \"1000m\"\n          memory: \"2Gi\"\nEOF</span></code></pre></div>\n<h4 id=\"python-클라이언트로-예측\" style=\"position:relative;\"><a href=\"#python-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EB%A1%9C-%EC%98%88%EC%B8%A1\" aria-label=\"python 클라이언트로 예측 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Python 클라이언트로 예측</h4>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> kserve <span class=\"token keyword\">import</span> KServeClient\n<span class=\"token keyword\">import</span> requests\n<span class=\"token keyword\">import</span> json\n\n<span class=\"token comment\"># KServe 클라이언트</span>\nkserve_client <span class=\"token operator\">=</span> KServeClient<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># InferenceService 생성</span>\nkserve_client<span class=\"token punctuation\">.</span>set_credentials<span class=\"token punctuation\">(</span>\n    storage_type<span class=\"token operator\">=</span><span class=\"token string\">\"S3\"</span><span class=\"token punctuation\">,</span>\n    s3_endpoint<span class=\"token operator\">=</span><span class=\"token string\">\"s3.amazonaws.com\"</span><span class=\"token punctuation\">,</span>\n    s3_region<span class=\"token operator\">=</span><span class=\"token string\">\"us-east-1\"</span><span class=\"token punctuation\">,</span>\n    s3_use_https<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span>\n    s3_verify_ssl<span class=\"token operator\">=</span><span class=\"token boolean\">True</span>\n<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 예측 요청</span>\nservice_name <span class=\"token operator\">=</span> <span class=\"token string\">\"churn-predictor\"</span>\nnamespace <span class=\"token operator\">=</span> <span class=\"token string\">\"default\"</span>\nheaders <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"Host\"</span><span class=\"token punctuation\">:</span> <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>service_name<span class=\"token punctuation\">}</span></span><span class=\"token string\">.</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>namespace<span class=\"token punctuation\">}</span></span><span class=\"token string\">.example.com\"</span></span><span class=\"token punctuation\">}</span>\n\ndata <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"instances\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token punctuation\">[</span><span class=\"token number\">25</span><span class=\"token punctuation\">,</span> <span class=\"token number\">50000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">[</span><span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token number\">75000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n\nresponse <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>post<span class=\"token punctuation\">(</span>\n    <span class=\"token string-interpolation\"><span class=\"token string\">f\"http://</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>service_name<span class=\"token punctuation\">}</span></span><span class=\"token string\">.</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>namespace<span class=\"token punctuation\">}</span></span><span class=\"token string\">/v1/models/churn-predictor:predict\"</span></span><span class=\"token punctuation\">,</span>\n    headers<span class=\"token operator\">=</span>headers<span class=\"token punctuation\">,</span>\n    json<span class=\"token operator\">=</span>data\n<span class=\"token punctuation\">)</span>\n\npredictions <span class=\"token operator\">=</span> response<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>predictions<span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"4-3-seldon-core를-활용한-고급-서빙\" style=\"position:relative;\"><a href=\"#4-3-seldon-core%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EA%B3%A0%EA%B8%89-%EC%84%9C%EB%B9%99\" aria-label=\"4 3 seldon core를 활용한 고급 서빙 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4-3. Seldon Core를 활용한 고급 서빙</h3>\n<p>Seldon Core는 더 세밀한 트래픽 라우팅과 A/B 테스트를 지원한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">apiVersion</span><span class=\"token punctuation\">:</span> machinelearning.seldon.io/v1\n<span class=\"token key atrule\">kind</span><span class=\"token punctuation\">:</span> SeldonDeployment\n<span class=\"token key atrule\">metadata</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> churn<span class=\"token punctuation\">-</span>predictor\n<span class=\"token key atrule\">spec</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> churn<span class=\"token punctuation\">-</span>ab<span class=\"token punctuation\">-</span>test\n  <span class=\"token key atrule\">predictors</span><span class=\"token punctuation\">:</span>\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> default\n    <span class=\"token key atrule\">replicas</span><span class=\"token punctuation\">:</span> <span class=\"token number\">2</span>\n    <span class=\"token key atrule\">graph</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> model<span class=\"token punctuation\">-</span>a\n      <span class=\"token key atrule\">type</span><span class=\"token punctuation\">:</span> MODEL\n      <span class=\"token key atrule\">modelUri</span><span class=\"token punctuation\">:</span> s3<span class=\"token punctuation\">:</span>//models/model<span class=\"token punctuation\">-</span>a\n      <span class=\"token key atrule\">children</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> model<span class=\"token punctuation\">-</span>b\n        <span class=\"token key atrule\">type</span><span class=\"token punctuation\">:</span> MODEL\n        <span class=\"token key atrule\">modelUri</span><span class=\"token punctuation\">:</span> s3<span class=\"token punctuation\">:</span>//models/model<span class=\"token punctuation\">-</span>b\n        <span class=\"token key atrule\">children</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token key atrule\">traffic</span><span class=\"token punctuation\">:</span> <span class=\"token number\">50</span>\n  <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> canary\n    <span class=\"token key atrule\">replicas</span><span class=\"token punctuation\">:</span> <span class=\"token number\">1</span>\n    <span class=\"token key atrule\">graph</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> model<span class=\"token punctuation\">-</span>c\n      <span class=\"token key atrule\">type</span><span class=\"token punctuation\">:</span> MODEL\n      <span class=\"token key atrule\">modelUri</span><span class=\"token punctuation\">:</span> s3<span class=\"token punctuation\">:</span>//models/model<span class=\"token punctuation\">-</span>c\n    <span class=\"token key atrule\">traffic</span><span class=\"token punctuation\">:</span> <span class=\"token number\">50</span></code></pre></div>\n<h2 id=\"5-ab-테스트와-카나리-배포\" style=\"position:relative;\"><a href=\"#5-ab-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%99%80-%EC%B9%B4%EB%82%98%EB%A6%AC-%EB%B0%B0%ED%8F%AC\" aria-label=\"5 ab 테스트와 카나리 배포 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. A/B 테스트와 카나리 배포</h2>\n<h3 id=\"5-1-ab-테스트-전략\" style=\"position:relative;\"><a href=\"#5-1-ab-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%84%EB%9E%B5\" aria-label=\"5 1 ab 테스트 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-1. A/B 테스트 전략</h3>\n<p>새로운 모델을 배포할 때 기존 모델과 성능을 비교하는 것이 중요하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> numpy <span class=\"token keyword\">as</span> np\n<span class=\"token keyword\">from</span> scipy <span class=\"token keyword\">import</span> stats\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ABTestEvaluator</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> control_metrics<span class=\"token punctuation\">,</span> treatment_metrics<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>control <span class=\"token operator\">=</span> control_metrics\n        self<span class=\"token punctuation\">.</span>treatment <span class=\"token operator\">=</span> treatment_metrics\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">statistical_significance</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> alpha<span class=\"token operator\">=</span><span class=\"token number\">0.05</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"통계적 유의성 검정\"\"\"</span>\n        t_stat<span class=\"token punctuation\">,</span> p_value <span class=\"token operator\">=</span> stats<span class=\"token punctuation\">.</span>ttest_ind<span class=\"token punctuation\">(</span>\n            self<span class=\"token punctuation\">.</span>control<span class=\"token punctuation\">,</span> \n            self<span class=\"token punctuation\">.</span>treatment\n        <span class=\"token punctuation\">)</span>\n        \n        is_significant <span class=\"token operator\">=</span> p_value <span class=\"token operator\">&lt;</span> alpha\n        improvement <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>treatment<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> np<span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>control<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"p_value\"</span><span class=\"token punctuation\">:</span> p_value<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"is_significant\"</span><span class=\"token punctuation\">:</span> is_significant<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"improvement\"</span><span class=\"token punctuation\">:</span> improvement<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"improvement_pct\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">(</span>improvement <span class=\"token operator\">/</span> np<span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>control<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">100</span>\n        <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">confidence_interval</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> confidence<span class=\"token operator\">=</span><span class=\"token number\">0.95</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"신뢰 구간 계산\"\"\"</span>\n        diff <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>treatment<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>control<span class=\"token punctuation\">)</span>\n        mean_diff <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span>diff<span class=\"token punctuation\">)</span>\n        std_diff <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>std<span class=\"token punctuation\">(</span>diff<span class=\"token punctuation\">,</span> ddof<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        n <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>diff<span class=\"token punctuation\">)</span>\n        \n        t_critical <span class=\"token operator\">=</span> stats<span class=\"token punctuation\">.</span>t<span class=\"token punctuation\">.</span>ppf<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">+</span> confidence<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> n <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n        margin <span class=\"token operator\">=</span> t_critical <span class=\"token operator\">*</span> <span class=\"token punctuation\">(</span>std_diff <span class=\"token operator\">/</span> np<span class=\"token punctuation\">.</span>sqrt<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"mean_difference\"</span><span class=\"token punctuation\">:</span> mean_diff<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"lower_bound\"</span><span class=\"token punctuation\">:</span> mean_diff <span class=\"token operator\">-</span> margin<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"upper_bound\"</span><span class=\"token punctuation\">:</span> mean_diff <span class=\"token operator\">+</span> margin<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"confidence\"</span><span class=\"token punctuation\">:</span> confidence\n        <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># 사용 예시</span>\ncontrol_accuracy <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0.85</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.86</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.84</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.87</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.85</span><span class=\"token punctuation\">]</span>\ntreatment_accuracy <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0.88</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.89</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.87</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.90</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.88</span><span class=\"token punctuation\">]</span>\n\nevaluator <span class=\"token operator\">=</span> ABTestEvaluator<span class=\"token punctuation\">(</span>control_accuracy<span class=\"token punctuation\">,</span> treatment_accuracy<span class=\"token punctuation\">)</span>\nresult <span class=\"token operator\">=</span> evaluator<span class=\"token punctuation\">.</span>statistical_significance<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nci <span class=\"token operator\">=</span> evaluator<span class=\"token punctuation\">.</span>confidence_interval<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"P-value: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>result<span class=\"token punctuation\">[</span><span class=\"token string\">'p_value'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.4f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Improvement: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>result<span class=\"token punctuation\">[</span><span class=\"token string\">'improvement_pct'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.2f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">%\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"95% CI: [</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>ci<span class=\"token punctuation\">[</span><span class=\"token string\">'lower_bound'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.4f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">, </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>ci<span class=\"token punctuation\">[</span><span class=\"token string\">'upper_bound'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.4f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">]\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"5-2-트래픽-분할-구현\" style=\"position:relative;\"><a href=\"#5-2-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%B6%84%ED%95%A0-%EA%B5%AC%ED%98%84\" aria-label=\"5 2 트래픽 분할 구현 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5-2. 트래픽 분할 구현</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> random\n<span class=\"token keyword\">from</span> typing <span class=\"token keyword\">import</span> Dict<span class=\"token punctuation\">,</span> Any\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">TrafficSplitter</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> splits<span class=\"token punctuation\">:</span> Dict<span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"\n        splits: {\"model-a\": 0.5, \"model-b\": 0.5}\n        \"\"\"</span>\n        <span class=\"token keyword\">assert</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span>splits<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">1.0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> <span class=\"token number\">1e-6</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Splits must sum to 1.0\"</span>\n        self<span class=\"token punctuation\">.</span>splits <span class=\"token operator\">=</span> splits\n        self<span class=\"token punctuation\">.</span>cumulative <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        cumulative <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token keyword\">for</span> model<span class=\"token punctuation\">,</span> weight <span class=\"token keyword\">in</span> splits<span class=\"token punctuation\">.</span>items<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            cumulative <span class=\"token operator\">+=</span> weight\n            self<span class=\"token punctuation\">.</span>cumulative<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>cumulative<span class=\"token punctuation\">,</span> model<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">route</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> user_id<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">None</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"사용자를 모델로 라우팅\"\"\"</span>\n        <span class=\"token keyword\">if</span> user_id<span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 일관된 라우팅을 위해 해시 사용</span>\n            hash_val <span class=\"token operator\">=</span> <span class=\"token builtin\">hash</span><span class=\"token punctuation\">(</span>user_id<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">10000</span>\n            threshold <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>hash_val <span class=\"token operator\">/</span> <span class=\"token number\">10000.0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token builtin\">sum</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>splits<span class=\"token punctuation\">.</span>values<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            threshold <span class=\"token operator\">=</span> random<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">for</span> cum<span class=\"token punctuation\">,</span> model <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>cumulative<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> threshold <span class=\"token operator\">&lt;=</span> cum<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">return</span> model\n        <span class=\"token keyword\">return</span> self<span class=\"token punctuation\">.</span>cumulative<span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token comment\"># 사용 예시</span>\nsplitter <span class=\"token operator\">=</span> TrafficSplitter<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"model-a\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.7</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\"># 70% 트래픽</span>\n    <span class=\"token string\">\"model-b\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.3</span>   <span class=\"token comment\"># 30% 트래픽</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 사용자별 일관된 라우팅</span>\nuser_model <span class=\"token operator\">=</span> splitter<span class=\"token punctuation\">.</span>route<span class=\"token punctuation\">(</span>user_id<span class=\"token operator\">=</span><span class=\"token string\">\"user123\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"User routed to: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>user_model<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"6-모델-모니터링과-드리프트-감지\" style=\"position:relative;\"><a href=\"#6-%EB%AA%A8%EB%8D%B8-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EB%93%9C%EB%A6%AC%ED%94%84%ED%8A%B8-%EA%B0%90%EC%A7%80\" aria-label=\"6 모델 모니터링과 드리프트 감지 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. 모델 모니터링과 드리프트 감지</h2>\n<h3 id=\"6-1-데이터-드리프트-감지\" style=\"position:relative;\"><a href=\"#6-1-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%93%9C%EB%A6%AC%ED%94%84%ED%8A%B8-%EA%B0%90%EC%A7%80\" aria-label=\"6 1 데이터 드리프트 감지 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-1. 데이터 드리프트 감지</h3>\n<p>데이터 분포가 시간에 따라 변화하는 현상을 감지하는 것이 중요하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> pandas <span class=\"token keyword\">as</span> pd\n<span class=\"token keyword\">import</span> numpy <span class=\"token keyword\">as</span> np\n<span class=\"token keyword\">from</span> scipy <span class=\"token keyword\">import</span> stats\n<span class=\"token keyword\">from</span> typing <span class=\"token keyword\">import</span> Tuple\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">DataDriftDetector</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> reference_data<span class=\"token punctuation\">:</span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>reference <span class=\"token operator\">=</span> reference_data\n        self<span class=\"token punctuation\">.</span>reference_stats <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>_compute_stats<span class=\"token punctuation\">(</span>reference_data<span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">_compute_stats</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">:</span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">dict</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"기준 데이터의 통계량 계산\"\"\"</span>\n        stats <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">for</span> col <span class=\"token keyword\">in</span> data<span class=\"token punctuation\">.</span>columns<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>dtype <span class=\"token keyword\">in</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'int64'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'float64'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                stats<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token string\">\"mean\"</span><span class=\"token punctuation\">:</span> data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"std\"</span><span class=\"token punctuation\">:</span> data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>std<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"min\"</span><span class=\"token punctuation\">:</span> data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token string\">\"max\"</span><span class=\"token punctuation\">:</span> data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">max</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                stats<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token string\">\"value_counts\"</span><span class=\"token punctuation\">:</span> data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>value_counts<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>to_dict<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">return</span> stats\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">detect_drift</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> current_data<span class=\"token punctuation\">:</span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">,</span> \n                    threshold<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span> <span class=\"token operator\">=</span> <span class=\"token number\">0.05</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">dict</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"드리프트 감지\"\"\"</span>\n        drift_report <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"drifted_features\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"drift_scores\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"overall_drift\"</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">False</span>\n        <span class=\"token punctuation\">}</span>\n        \n        <span class=\"token keyword\">for</span> col <span class=\"token keyword\">in</span> self<span class=\"token punctuation\">.</span>reference<span class=\"token punctuation\">.</span>columns<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> col <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> current_data<span class=\"token punctuation\">.</span>columns<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">continue</span>\n            \n            ref_col <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>reference<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span>\n            curr_col <span class=\"token operator\">=</span> current_data<span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span>\n            \n            <span class=\"token keyword\">if</span> ref_col<span class=\"token punctuation\">.</span>dtype <span class=\"token keyword\">in</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'int64'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'float64'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># Kolmogorov-Smirnov 테스트</span>\n                ks_stat<span class=\"token punctuation\">,</span> p_value <span class=\"token operator\">=</span> stats<span class=\"token punctuation\">.</span>ks_2samp<span class=\"token punctuation\">(</span>ref_col<span class=\"token punctuation\">,</span> curr_col<span class=\"token punctuation\">)</span>\n                drift_score <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token operator\">-</span> p_value\n                \n                <span class=\"token keyword\">if</span> drift_score <span class=\"token operator\">></span> threshold<span class=\"token punctuation\">:</span>\n                    drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">\"drifted_features\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span>\n                    drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">\"drift_scores\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token string\">\"score\"</span><span class=\"token punctuation\">:</span> drift_score<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"p_value\"</span><span class=\"token punctuation\">:</span> p_value<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"test\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"KS\"</span>\n                    <span class=\"token punctuation\">}</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 카이제곱 검정</span>\n                ref_counts <span class=\"token operator\">=</span> ref_col<span class=\"token punctuation\">.</span>value_counts<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                curr_counts <span class=\"token operator\">=</span> curr_col<span class=\"token punctuation\">.</span>value_counts<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n                \n                <span class=\"token comment\"># 공통 카테고리만 비교</span>\n                common_cats <span class=\"token operator\">=</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>ref_counts<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token builtin\">set</span><span class=\"token punctuation\">(</span>curr_counts<span class=\"token punctuation\">.</span>index<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>common_cats<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                    ref_vals <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>ref_counts<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>cat<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> cat <span class=\"token keyword\">in</span> common_cats<span class=\"token punctuation\">]</span>\n                    curr_vals <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>curr_counts<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>cat<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> cat <span class=\"token keyword\">in</span> common_cats<span class=\"token punctuation\">]</span>\n                    \n                    chi2<span class=\"token punctuation\">,</span> p_value <span class=\"token operator\">=</span> stats<span class=\"token punctuation\">.</span>chisquare<span class=\"token punctuation\">(</span>curr_vals<span class=\"token punctuation\">,</span> ref_vals<span class=\"token punctuation\">)</span>\n                    drift_score <span class=\"token operator\">=</span> <span class=\"token number\">1</span> <span class=\"token operator\">-</span> p_value\n                    \n                    <span class=\"token keyword\">if</span> drift_score <span class=\"token operator\">></span> threshold<span class=\"token punctuation\">:</span>\n                        drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">\"drifted_features\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>col<span class=\"token punctuation\">)</span>\n                        drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">\"drift_scores\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>col<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token string\">\"score\"</span><span class=\"token punctuation\">:</span> drift_score<span class=\"token punctuation\">,</span>\n                            <span class=\"token string\">\"p_value\"</span><span class=\"token punctuation\">:</span> p_value<span class=\"token punctuation\">,</span>\n                            <span class=\"token string\">\"test\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Chi-square\"</span>\n                        <span class=\"token punctuation\">}</span>\n        \n        drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">\"overall_drift\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">\"drifted_features\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span>\n        <span class=\"token keyword\">return</span> drift_report\n\n<span class=\"token comment\"># 사용 예시</span>\nreference_data <span class=\"token operator\">=</span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"age\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>normal<span class=\"token punctuation\">(</span><span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"income\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>normal<span class=\"token punctuation\">(</span><span class=\"token number\">50000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">15000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"category\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>choice<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"A\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"B\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"C\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 시간이 지나 데이터 분포가 변경됨</span>\ncurrent_data <span class=\"token operator\">=</span> pd<span class=\"token punctuation\">.</span>DataFrame<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"age\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>normal<span class=\"token punctuation\">(</span><span class=\"token number\">40</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\"># 평균이 변경됨</span>\n    <span class=\"token string\">\"income\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>normal<span class=\"token punctuation\">(</span><span class=\"token number\">55000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">18000</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  <span class=\"token comment\"># 분산이 증가</span>\n    <span class=\"token string\">\"category\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>choice<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"A\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"B\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"C\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"D\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">,</span> p<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token number\">0.3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 새로운 카테고리 추가</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\ndetector <span class=\"token operator\">=</span> DataDriftDetector<span class=\"token punctuation\">(</span>reference_data<span class=\"token punctuation\">)</span>\ndrift_report <span class=\"token operator\">=</span> detector<span class=\"token punctuation\">.</span>detect_drift<span class=\"token punctuation\">(</span>current_data<span class=\"token punctuation\">,</span> threshold<span class=\"token operator\">=</span><span class=\"token number\">0.05</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Drifted features: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">'drifted_features'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Overall drift detected: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>drift_report<span class=\"token punctuation\">[</span><span class=\"token string\">'overall_drift'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"6-2-모델-성능-모니터링\" style=\"position:relative;\"><a href=\"#6-2-%EB%AA%A8%EB%8D%B8-%EC%84%B1%EB%8A%A5-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81\" aria-label=\"6 2 모델 성능 모니터링 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6-2. 모델 성능 모니터링</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> time\n<span class=\"token keyword\">from</span> datetime <span class=\"token keyword\">import</span> datetime<span class=\"token punctuation\">,</span> timedelta\n<span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> defaultdict\n<span class=\"token keyword\">import</span> numpy <span class=\"token keyword\">as</span> np\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ModelPerformanceMonitor</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">def</span> <span class=\"token function\">__init__</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> window_size<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span> <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        self<span class=\"token punctuation\">.</span>window_size <span class=\"token operator\">=</span> window_size\n        self<span class=\"token punctuation\">.</span>predictions <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        self<span class=\"token punctuation\">.</span>actuals <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        self<span class=\"token punctuation\">.</span>latencies <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        self<span class=\"token punctuation\">.</span>timestamps <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        self<span class=\"token punctuation\">.</span>metrics_history <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">log_prediction</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> prediction<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">,</span> actual<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">,</span> \n                      latency<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"예측 결과 로깅\"\"\"</span>\n        self<span class=\"token punctuation\">.</span>predictions<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>prediction<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>actuals<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>actual<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>latencies<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>latency<span class=\"token punctuation\">)</span>\n        self<span class=\"token punctuation\">.</span>timestamps<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>datetime<span class=\"token punctuation\">.</span>now<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># 윈도우 크기 제한</span>\n        <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>predictions<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> self<span class=\"token punctuation\">.</span>window_size<span class=\"token punctuation\">:</span>\n            self<span class=\"token punctuation\">.</span>predictions<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>actuals<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>latencies<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            self<span class=\"token punctuation\">.</span>timestamps<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">compute_metrics</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">dict</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"현재 성능 메트릭 계산\"\"\"</span>\n        <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>predictions<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n        \n        predictions <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>predictions<span class=\"token punctuation\">)</span>\n        actuals <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>actuals<span class=\"token punctuation\">)</span>\n        \n        <span class=\"token comment\"># 분류 문제 가정 (이진 분류)</span>\n        <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>np<span class=\"token punctuation\">.</span>unique<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">from</span> sklearn<span class=\"token punctuation\">.</span>metrics <span class=\"token keyword\">import</span> accuracy_score<span class=\"token punctuation\">,</span> precision_score<span class=\"token punctuation\">,</span> recall_score<span class=\"token punctuation\">,</span> f1_score\n            \n            accuracy <span class=\"token operator\">=</span> accuracy_score<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">)</span>\n            precision <span class=\"token operator\">=</span> precision_score<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">,</span> zero_division<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            recall <span class=\"token operator\">=</span> recall_score<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">,</span> zero_division<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            f1 <span class=\"token operator\">=</span> f1_score<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">,</span> zero_division<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n            \n            metrics <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"accuracy\"</span><span class=\"token punctuation\">:</span> accuracy<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"precision\"</span><span class=\"token punctuation\">:</span> precision<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"recall\"</span><span class=\"token punctuation\">:</span> recall<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"f1_score\"</span><span class=\"token punctuation\">:</span> f1\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 회귀 문제</span>\n            <span class=\"token keyword\">from</span> sklearn<span class=\"token punctuation\">.</span>metrics <span class=\"token keyword\">import</span> mean_squared_error<span class=\"token punctuation\">,</span> mean_absolute_error<span class=\"token punctuation\">,</span> r2_score\n            \n            mse <span class=\"token operator\">=</span> mean_squared_error<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">)</span>\n            mae <span class=\"token operator\">=</span> mean_absolute_error<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">)</span>\n            rmse <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>sqrt<span class=\"token punctuation\">(</span>mse<span class=\"token punctuation\">)</span>\n            r2 <span class=\"token operator\">=</span> r2_score<span class=\"token punctuation\">(</span>actuals<span class=\"token punctuation\">,</span> predictions<span class=\"token punctuation\">)</span>\n            \n            metrics <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"mse\"</span><span class=\"token punctuation\">:</span> mse<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"mae\"</span><span class=\"token punctuation\">:</span> mae<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"rmse\"</span><span class=\"token punctuation\">:</span> rmse<span class=\"token punctuation\">,</span>\n                <span class=\"token string\">\"r2_score\"</span><span class=\"token punctuation\">:</span> r2\n            <span class=\"token punctuation\">}</span>\n        \n        <span class=\"token comment\"># 지연 시간 통계</span>\n        metrics<span class=\"token punctuation\">.</span>update<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"avg_latency\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>mean<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>latencies<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"p95_latency\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>percentile<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>latencies<span class=\"token punctuation\">,</span> <span class=\"token number\">95</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"p99_latency\"</span><span class=\"token punctuation\">:</span> np<span class=\"token punctuation\">.</span>percentile<span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>latencies<span class=\"token punctuation\">,</span> <span class=\"token number\">99</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"throughput\"</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>predictions<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span>\n                <span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">.</span>timestamps<span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> self<span class=\"token punctuation\">.</span>timestamps<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>total_seconds<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1e-6</span>\n            <span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> metrics\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">check_performance_degradation</span><span class=\"token punctuation\">(</span>self<span class=\"token punctuation\">,</span> baseline_metrics<span class=\"token punctuation\">:</span> <span class=\"token builtin\">dict</span><span class=\"token punctuation\">,</span> \n                                     threshold<span class=\"token punctuation\">:</span> <span class=\"token builtin\">float</span> <span class=\"token operator\">=</span> <span class=\"token number\">0.05</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">dict</span><span class=\"token punctuation\">:</span>\n        <span class=\"token triple-quoted-string string\">\"\"\"성능 저하 감지\"\"\"</span>\n        current_metrics <span class=\"token operator\">=</span> self<span class=\"token punctuation\">.</span>compute_metrics<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        \n        alerts <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">for</span> metric_name<span class=\"token punctuation\">,</span> baseline_value <span class=\"token keyword\">in</span> baseline_metrics<span class=\"token punctuation\">.</span>items<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> metric_name <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> current_metrics<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">continue</span>\n            \n            current_value <span class=\"token operator\">=</span> current_metrics<span class=\"token punctuation\">[</span>metric_name<span class=\"token punctuation\">]</span>\n            \n            <span class=\"token comment\"># 정확도, F1 등은 높을수록 좋음</span>\n            <span class=\"token keyword\">if</span> metric_name <span class=\"token keyword\">in</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"accuracy\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"precision\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"recall\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"f1_score\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"r2_score\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                degradation <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>baseline_value <span class=\"token operator\">-</span> current_value<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> baseline_value\n                <span class=\"token keyword\">if</span> degradation <span class=\"token operator\">></span> threshold<span class=\"token punctuation\">:</span>\n                    alerts<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n                        <span class=\"token string\">\"metric\"</span><span class=\"token punctuation\">:</span> metric_name<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"baseline\"</span><span class=\"token punctuation\">:</span> baseline_value<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"current\"</span><span class=\"token punctuation\">:</span> current_value<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"degradation\"</span><span class=\"token punctuation\">:</span> degradation<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"severity\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"high\"</span> <span class=\"token keyword\">if</span> degradation <span class=\"token operator\">></span> <span class=\"token number\">0.1</span> <span class=\"token keyword\">else</span> <span class=\"token string\">\"medium\"</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n            <span class=\"token comment\"># MSE, MAE, RMSE는 낮을수록 좋음</span>\n            <span class=\"token keyword\">elif</span> metric_name <span class=\"token keyword\">in</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"mse\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mae\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"rmse\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                degradation <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>current_value <span class=\"token operator\">-</span> baseline_value<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> baseline_value\n                <span class=\"token keyword\">if</span> degradation <span class=\"token operator\">></span> threshold<span class=\"token punctuation\">:</span>\n                    alerts<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n                        <span class=\"token string\">\"metric\"</span><span class=\"token punctuation\">:</span> metric_name<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"baseline\"</span><span class=\"token punctuation\">:</span> baseline_value<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"current\"</span><span class=\"token punctuation\">:</span> current_value<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"degradation\"</span><span class=\"token punctuation\">:</span> degradation<span class=\"token punctuation\">,</span>\n                        <span class=\"token string\">\"severity\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"high\"</span> <span class=\"token keyword\">if</span> degradation <span class=\"token operator\">></span> <span class=\"token number\">0.1</span> <span class=\"token keyword\">else</span> <span class=\"token string\">\"medium\"</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        \n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"has_degradation\"</span><span class=\"token punctuation\">:</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>alerts<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"alerts\"</span><span class=\"token punctuation\">:</span> alerts<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"current_metrics\"</span><span class=\"token punctuation\">:</span> current_metrics\n        <span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\"># 사용 예시</span>\nmonitor <span class=\"token operator\">=</span> ModelPerformanceMonitor<span class=\"token punctuation\">(</span>window_size<span class=\"token operator\">=</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 시뮬레이션: 예측 결과 로깅</span>\n<span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    prediction <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    actual <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>rand<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    latency <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">.</span>uniform<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">,</span> <span class=\"token number\">50</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\"># 10-50ms</span>\n    monitor<span class=\"token punctuation\">.</span>log_prediction<span class=\"token punctuation\">(</span>prediction<span class=\"token punctuation\">,</span> actual<span class=\"token punctuation\">,</span> latency<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 성능 메트릭 확인</span>\nmetrics <span class=\"token operator\">=</span> monitor<span class=\"token punctuation\">.</span>compute_metrics<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Current metrics:\"</span><span class=\"token punctuation\">,</span> metrics<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 성능 저하 감지</span>\nbaseline <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"r2_score\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.85</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"rmse\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.15</span><span class=\"token punctuation\">}</span>\ndegradation_check <span class=\"token operator\">=</span> monitor<span class=\"token punctuation\">.</span>check_performance_degradation<span class=\"token punctuation\">(</span>baseline<span class=\"token punctuation\">,</span> threshold<span class=\"token operator\">=</span><span class=\"token number\">0.05</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Degradation check:\"</span><span class=\"token punctuation\">,</span> degradation_check<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"7-cicd-파이프라인-구축\" style=\"position:relative;\"><a href=\"#7-cicd-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95\" aria-label=\"7 cicd 파이프라인 구축 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. CI/CD 파이프라인 구축</h2>\n<h3 id=\"7-1-github-actions를-활용한-ml-파이프라인\" style=\"position:relative;\"><a href=\"#7-1-github-actions%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-ml-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8\" aria-label=\"7 1 github actions를 활용한 ml 파이프라인 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-1. GitHub Actions를 활용한 ML 파이프라인</h3>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># .github/workflows/ml-pipeline.yml</span>\n<span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> ML Pipeline\n\n<span class=\"token key atrule\">on</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">push</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">branches</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span> main<span class=\"token punctuation\">,</span> develop <span class=\"token punctuation\">]</span>\n  <span class=\"token key atrule\">pull_request</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">branches</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span> main <span class=\"token punctuation\">]</span>\n  <span class=\"token key atrule\">schedule</span><span class=\"token punctuation\">:</span>\n    <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">cron</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'0 2 * * *'</span>  <span class=\"token comment\"># 매일 새벽 2시 재학습</span>\n\n<span class=\"token key atrule\">jobs</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">data-validation</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">runs-on</span><span class=\"token punctuation\">:</span> ubuntu<span class=\"token punctuation\">-</span>latest\n    <span class=\"token key atrule\">steps</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> actions/checkout@v3\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Set up Python\n        <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> actions/setup<span class=\"token punctuation\">-</span>python@v4\n        <span class=\"token key atrule\">with</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">python-version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'3.9'</span>\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Install dependencies\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">|</span><span class=\"token scalar string\">\n          pip install -r requirements.txt\n          pip install great-expectations</span>\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Validate data\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">|</span><span class=\"token scalar string\">\n          python scripts/validate_data.py</span>\n        <span class=\"token key atrule\">env</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">DATA_PATH</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets.DATA_PATH <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n  \n  <span class=\"token key atrule\">train-model</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">needs</span><span class=\"token punctuation\">:</span> data<span class=\"token punctuation\">-</span>validation\n    <span class=\"token key atrule\">runs-on</span><span class=\"token punctuation\">:</span> ubuntu<span class=\"token punctuation\">-</span>latest\n    <span class=\"token key atrule\">steps</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> actions/checkout@v3\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Set up Python\n        <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> actions/setup<span class=\"token punctuation\">-</span>python@v4\n        <span class=\"token key atrule\">with</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">python-version</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'3.9'</span>\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Install dependencies\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> pip install <span class=\"token punctuation\">-</span>r requirements.txt\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Train model\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> python scripts/train.py\n        <span class=\"token key atrule\">env</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">MLFLOW_TRACKING_URI</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets.MLFLOW_TRACKING_URI <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n          <span class=\"token key atrule\">MLFLOW_S3_BUCKET</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets.MLFLOW_S3_BUCKET <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Evaluate model\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> python scripts/evaluate.py\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Check model performance\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">|</span><span class=\"token scalar string\">\n          python scripts/check_performance.py\n          if [ $? -ne 0 ]; then\n            echo \"Model performance below threshold\"\n            exit 1\n          fi</span>\n  \n  <span class=\"token key atrule\">deploy-model</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">needs</span><span class=\"token punctuation\">:</span> train<span class=\"token punctuation\">-</span>model\n    <span class=\"token key atrule\">if</span><span class=\"token punctuation\">:</span> github.ref == 'refs/heads/main'\n    <span class=\"token key atrule\">runs-on</span><span class=\"token punctuation\">:</span> ubuntu<span class=\"token punctuation\">-</span>latest\n    <span class=\"token key atrule\">steps</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> actions/checkout@v3\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Configure AWS credentials\n        <span class=\"token key atrule\">uses</span><span class=\"token punctuation\">:</span> aws<span class=\"token punctuation\">-</span>actions/configure<span class=\"token punctuation\">-</span>aws<span class=\"token punctuation\">-</span>credentials@v2\n        <span class=\"token key atrule\">with</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">aws-access-key-id</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets.AWS_ACCESS_KEY_ID <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n          <span class=\"token key atrule\">aws-secret-access-key</span><span class=\"token punctuation\">:</span> $<span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> secrets.AWS_SECRET_ACCESS_KEY <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n          <span class=\"token key atrule\">aws-region</span><span class=\"token punctuation\">:</span> us<span class=\"token punctuation\">-</span>east<span class=\"token punctuation\">-</span><span class=\"token number\">1</span>\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Deploy to Kubernetes\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">|</span><span class=\"token scalar string\">\n          kubectl set image deployment/churn-predictor \\\n            model=${{ secrets.ECR_REGISTRY }}/churn-predictor:${{ github.sha }}</span>\n      \n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Run smoke tests\n        <span class=\"token key atrule\">run</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">|</span><span class=\"token scalar string\">\n          python scripts/smoke_tests.py</span></code></pre></div>\n<h3 id=\"7-2-모델-성능-검증-스크립트\" style=\"position:relative;\"><a href=\"#7-2-%EB%AA%A8%EB%8D%B8-%EC%84%B1%EB%8A%A5-%EA%B2%80%EC%A6%9D-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8\" aria-label=\"7 2 모델 성능 검증 스크립트 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7-2. 모델 성능 검증 스크립트</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># scripts/check_performance.py</span>\n<span class=\"token keyword\">import</span> mlflow\n<span class=\"token keyword\">import</span> sys\n<span class=\"token keyword\">from</span> mlflow<span class=\"token punctuation\">.</span>tracking <span class=\"token keyword\">import</span> MlflowClient\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">check_model_performance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    client <span class=\"token operator\">=</span> MlflowClient<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 최신 실험 실행 가져오기</span>\n    experiment <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>get_experiment_by_name<span class=\"token punctuation\">(</span><span class=\"token string\">\"customer_churn_prediction\"</span><span class=\"token punctuation\">)</span>\n    runs <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>search_runs<span class=\"token punctuation\">(</span>\n        experiment_ids<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span>experiment<span class=\"token punctuation\">.</span>experiment_id<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        order_by<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"start_time DESC\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        max_results<span class=\"token operator\">=</span><span class=\"token number\">1</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> runs<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"No runs found\"</span><span class=\"token punctuation\">)</span>\n        sys<span class=\"token punctuation\">.</span>exit<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    \n    latest_run <span class=\"token operator\">=</span> runs<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    metrics <span class=\"token operator\">=</span> latest_run<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>metrics\n    \n    <span class=\"token comment\"># 성능 임계값</span>\n    thresholds <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"accuracy\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.85</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"precision\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.80</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"recall\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.75</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"f1_score\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.78</span>\n    <span class=\"token punctuation\">}</span>\n    \n    failed_checks <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">for</span> metric_name<span class=\"token punctuation\">,</span> threshold <span class=\"token keyword\">in</span> thresholds<span class=\"token punctuation\">.</span>items<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> metric_name <span class=\"token keyword\">in</span> metrics<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> metrics<span class=\"token punctuation\">[</span>metric_name<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> threshold<span class=\"token punctuation\">:</span>\n                failed_checks<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>\n                    <span class=\"token string-interpolation\"><span class=\"token string\">f\"</span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>metric_name<span class=\"token punctuation\">}</span></span><span class=\"token string\">: </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>metrics<span class=\"token punctuation\">[</span>metric_name<span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span><span class=\"token format-spec\">.4f</span><span class=\"token punctuation\">}</span></span><span class=\"token string\"> &lt; </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>threshold<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span>\n                <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">if</span> failed_checks<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Model performance below thresholds:\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">for</span> check <span class=\"token keyword\">in</span> failed_checks<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"  - </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>check<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span>\n        sys<span class=\"token punctuation\">.</span>exit<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"All performance checks passed!\"</span><span class=\"token punctuation\">)</span>\n        sys<span class=\"token punctuation\">.</span>exit<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">if</span> __name__ <span class=\"token operator\">==</span> <span class=\"token string\">\"__main__\"</span><span class=\"token punctuation\">:</span>\n    check_model_performance<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"8-실전-운영-사례와-베스트-프랙티스\" style=\"position:relative;\"><a href=\"#8-%EC%8B%A4%EC%A0%84-%EC%9A%B4%EC%98%81-%EC%82%AC%EB%A1%80%EC%99%80-%EB%B2%A0%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%9E%99%ED%8B%B0%EC%8A%A4\" aria-label=\"8 실전 운영 사례와 베스트 프랙티스 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. 실전 운영 사례와 베스트 프랙티스</h2>\n<h3 id=\"8-1-모델-재학습-전략\" style=\"position:relative;\"><a href=\"#8-1-%EB%AA%A8%EB%8D%B8-%EC%9E%AC%ED%95%99%EC%8A%B5-%EC%A0%84%EB%9E%B5\" aria-label=\"8 1 모델 재학습 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-1. 모델 재학습 전략</h3>\n<h4 id=\"시간-기반-재학습\" style=\"position:relative;\"><a href=\"#%EC%8B%9C%EA%B0%84-%EA%B8%B0%EB%B0%98-%EC%9E%AC%ED%95%99%EC%8A%B5\" aria-label=\"시간 기반 재학습 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>시간 기반 재학습</h4>\n<ul>\n<li><strong>일일 재학습</strong>: 빠르게 변화하는 데이터 (예: 주식 예측)</li>\n<li><strong>주간 재학습</strong>: 중간 속도 변화 (예: 고객 이탈 예측)</li>\n<li><strong>월간 재학습</strong>: 느린 변화 (예: 신용 평가)</li>\n</ul>\n<h4 id=\"성능-기반-재학습\" style=\"position:relative;\"><a href=\"#%EC%84%B1%EB%8A%A5-%EA%B8%B0%EB%B0%98-%EC%9E%AC%ED%95%99%EC%8A%B5\" aria-label=\"성능 기반 재학습 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>성능 기반 재학습</h4>\n<ul>\n<li>성능 저하가 임계값을 넘으면 자동 재학습 트리거</li>\n<li>데이터 드리프트가 감지되면 재학습</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># 재학습 트리거 로직</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">should_retrain</span><span class=\"token punctuation\">(</span>monitor<span class=\"token punctuation\">:</span> ModelPerformanceMonitor<span class=\"token punctuation\">,</span> \n                  baseline_metrics<span class=\"token punctuation\">:</span> <span class=\"token builtin\">dict</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token builtin\">bool</span><span class=\"token punctuation\">:</span>\n    degradation_check <span class=\"token operator\">=</span> monitor<span class=\"token punctuation\">.</span>check_performance_degradation<span class=\"token punctuation\">(</span>\n        baseline_metrics<span class=\"token punctuation\">,</span> \n        threshold<span class=\"token operator\">=</span><span class=\"token number\">0.05</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">if</span> degradation_check<span class=\"token punctuation\">[</span><span class=\"token string\">\"has_degradation\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n        high_severity_alerts <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n            a <span class=\"token keyword\">for</span> a <span class=\"token keyword\">in</span> degradation_check<span class=\"token punctuation\">[</span><span class=\"token string\">\"alerts\"</span><span class=\"token punctuation\">]</span> \n            <span class=\"token keyword\">if</span> a<span class=\"token punctuation\">[</span><span class=\"token string\">\"severity\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"high\"</span>\n        <span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>high_severity_alerts<span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">return</span> <span class=\"token boolean\">True</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">False</span></code></pre></div>\n<h3 id=\"8-2-모델-롤백-전략\" style=\"position:relative;\"><a href=\"#8-2-%EB%AA%A8%EB%8D%B8-%EB%A1%A4%EB%B0%B1-%EC%A0%84%EB%9E%B5\" aria-label=\"8 2 모델 롤백 전략 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-2. 모델 롤백 전략</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> mlflow\n<span class=\"token keyword\">from</span> mlflow<span class=\"token punctuation\">.</span>tracking <span class=\"token keyword\">import</span> MlflowClient\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">rollback_model</span><span class=\"token punctuation\">(</span>model_name<span class=\"token punctuation\">:</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">,</span> target_version<span class=\"token punctuation\">:</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token triple-quoted-string string\">\"\"\"모델을 특정 버전으로 롤백\"\"\"</span>\n    client <span class=\"token operator\">=</span> MlflowClient<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 현재 Production 모델 버전 확인</span>\n    current_prod <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>get_latest_versions<span class=\"token punctuation\">(</span>\n        model_name<span class=\"token punctuation\">,</span> \n        stages<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"Production\"</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">if</span> current_prod<span class=\"token punctuation\">:</span>\n        <span class=\"token comment\"># 현재 Production을 Archived로 이동</span>\n        client<span class=\"token punctuation\">.</span>transition_model_version_stage<span class=\"token punctuation\">(</span>\n            name<span class=\"token operator\">=</span>model_name<span class=\"token punctuation\">,</span>\n            version<span class=\"token operator\">=</span>current_prod<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>version<span class=\"token punctuation\">,</span>\n            stage<span class=\"token operator\">=</span><span class=\"token string\">\"Archived\"</span>\n        <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token comment\"># 타겟 버전을 Production으로 승격</span>\n    client<span class=\"token punctuation\">.</span>transition_model_version_stage<span class=\"token punctuation\">(</span>\n        name<span class=\"token operator\">=</span>model_name<span class=\"token punctuation\">,</span>\n        version<span class=\"token operator\">=</span>target_version<span class=\"token punctuation\">,</span>\n        stage<span class=\"token operator\">=</span><span class=\"token string\">\"Production\"</span>\n    <span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string-interpolation\"><span class=\"token string\">f\"Rolled back </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>model_name<span class=\"token punctuation\">}</span></span><span class=\"token string\"> to version </span><span class=\"token interpolation\"><span class=\"token punctuation\">{</span>target_version<span class=\"token punctuation\">}</span></span><span class=\"token string\">\"</span></span><span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"8-3-비용-최적화\" style=\"position:relative;\"><a href=\"#8-3-%EB%B9%84%EC%9A%A9-%EC%B5%9C%EC%A0%81%ED%99%94\" aria-label=\"8 3 비용 최적화 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8-3. 비용 최적화</h3>\n<ol>\n<li><strong>모델 양자화</strong>: FP32 → INT8 변환으로 추론 비용 4배 감소</li>\n<li><strong>배치 처리</strong>: 개별 요청 대신 배치로 처리하여 GPU 활용률 향상</li>\n<li><strong>캐싱</strong>: 자주 요청되는 입력에 대한 예측 결과 캐싱</li>\n<li><strong>오토스케일링</strong>: 트래픽에 따라 자동으로 인스턴스 수 조정</li>\n</ol>\n<h2 id=\"9-결론\" style=\"position:relative;\"><a href=\"#9-%EA%B2%B0%EB%A1%A0\" aria-label=\"9 결론 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>9. 결론</h2>\n<p>MLOps는 ML 모델을 프로덕션 환경에서 안정적으로 운영하기 위한 필수 관행이다. 이 글에서 다룬 핵심 내용을 요약하면:</p>\n<ol>\n<li><strong>모델 버전 관리</strong>: MLflow를 활용한 실험 추적과 모델 레지스트리</li>\n<li><strong>모델 서빙</strong>: Kubernetes 기반 서빙 (KServe, Seldon)으로 확장 가능한 인프라 구축</li>\n<li><strong>A/B 테스트</strong>: 통계적 검정을 통한 모델 성능 비교</li>\n<li><strong>모니터링</strong>: 데이터 드리프트와 모델 성능 지속 추적</li>\n<li><strong>자동화</strong>: CI/CD 파이프라인을 통한 재학습과 배포 자동화</li>\n</ol>\n<p>MLOps를 제대로 구축하면 수백 개의 모델을 동시에 운영하면서도 안정성과 성능을 보장할 수 있다. 시작은 작게, 하지만 확장 가능한 구조로 설계하는 것이 중요하다.</p>\n<h2 id=\"참고-자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\" aria-label=\"참고 자료 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고 자료</h2>\n<ul>\n<li><a href=\"https://mlflow.org/\">MLflow 공식 문서</a></li>\n<li><a href=\"https://github.com/kserve/kserve\">KServe GitHub</a></li>\n<li><a href=\"https://docs.seldon.io/projects/seldon-core/\">Seldon Core 문서</a></li>\n<li><a href=\"https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning\">Google MLOps 가이드</a></li>\n</ul>","tableOfContents":"<ul>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#mlops-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C---ai-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC\">MLOps 실전 가이드 - AI 모델 서빙과 운영 자동화 완벽 정리</a></p>\n<ul>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#1-mlops%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80\">1. MLOps란 무엇인가?</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#1-1-%EC%A0%95%EC%9D%98%EC%99%80-%EB%B0%B0%EA%B2%BD\">1-1. 정의와 배경</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#1-2-mlops%EC%9D%98-%ED%95%B5%EC%8B%AC-%EA%B0%80%EC%B9%98\">1-2. MLOps의 핵심 가치</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#1-3-mlops-vs-devops\">1-3. MLOps vs DevOps</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#2-mlops-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%84%A4%EA%B3%84\">2. MLOps 아키텍처 설계</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#2-1-%EC%A0%84%EC%B2%B4-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%A1%B0\">2-1. 전체 파이프라인 구조</a></li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#2-2-%EC%A3%BC%EC%9A%94-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C\">2-2. 주요 구성 요소</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8\">데이터 파이프라인</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EB%AA%A8%EB%8D%B8-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD\">모델 개발 환경</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99\">모델 서빙</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EB%B0%8F-%EA%B4%80%EC%B0%B0-%EA%B0%80%EB%8A%A5%EC%84%B1\">모니터링 및 관찰 가능성</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#3-%EB%AA%A8%EB%8D%B8-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC---mlflow-%EC%8B%A4%EC%A0%84\">3. 모델 버전 관리 - MLflow 실전</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#3-1-mlflow-%EA%B0%9C%EC%9A%94\">3-1. MLflow 개요</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#3-2-mlflow-%EC%8B%A4%ED%97%98-%EC%B6%94%EC%A0%81-%EA%B5%AC%ED%98%84\">3-2. MLflow 실험 추적 구현</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#3-3-%EB%AA%A8%EB%8D%B8-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%8A%B8%EB%A6%AC-%ED%99%9C%EC%9A%A9\">3-3. 모델 레지스트리 활용</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#3-4-mlflow-%EC%84%9C%EB%B9%99\">3-4. MLflow 서빙</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#4-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99-%EC%A0%84%EB%9E%B5\">4. 모델 서빙 전략</a></p>\n<ul>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#4-1-%EC%84%9C%EB%B9%99-%ED%8C%A8%ED%84%B4-%EB%B9%84%EA%B5%90\">4-1. 서빙 패턴 비교</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#1-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%84%9C%EB%B9%99-online-serving\">1) 실시간 서빙 (Online Serving)</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#2-%EB%B0%B0%EC%B9%98-%EC%84%9C%EB%B9%99-batch-serving\">2) 배치 서빙 (Batch Serving)</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#3-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D-%EC%84%9C%EB%B9%99-streaming-serving\">3) 스트리밍 서빙 (Streaming Serving)</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#4-2-kubernetes-%EA%B8%B0%EB%B0%98-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99---kserve\">4-2. Kubernetes 기반 모델 서빙 - KServe</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#kserve-%EC%84%A4%EC%B9%98\">KServe 설치</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#python-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EB%A1%9C-%EC%98%88%EC%B8%A1\">Python 클라이언트로 예측</a></li>\n</ul>\n</li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#4-3-seldon-core%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EA%B3%A0%EA%B8%89-%EC%84%9C%EB%B9%99\">4-3. Seldon Core를 활용한 고급 서빙</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#5-ab-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%99%80-%EC%B9%B4%EB%82%98%EB%A6%AC-%EB%B0%B0%ED%8F%AC\">5. A/B 테스트와 카나리 배포</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#5-1-ab-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%84%EB%9E%B5\">5-1. A/B 테스트 전략</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#5-2-%ED%8A%B8%EB%9E%98%ED%94%BD-%EB%B6%84%ED%95%A0-%EA%B5%AC%ED%98%84\">5-2. 트래픽 분할 구현</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#6-%EB%AA%A8%EB%8D%B8-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81%EA%B3%BC-%EB%93%9C%EB%A6%AC%ED%94%84%ED%8A%B8-%EA%B0%90%EC%A7%80\">6. 모델 모니터링과 드리프트 감지</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#6-1-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%93%9C%EB%A6%AC%ED%94%84%ED%8A%B8-%EA%B0%90%EC%A7%80\">6-1. 데이터 드리프트 감지</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#6-2-%EB%AA%A8%EB%8D%B8-%EC%84%B1%EB%8A%A5-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81\">6-2. 모델 성능 모니터링</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#7-cicd-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-%EA%B5%AC%EC%B6%95\">7. CI/CD 파이프라인 구축</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#7-1-github-actions%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-ml-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8\">7-1. GitHub Actions를 활용한 ML 파이프라인</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#7-2-%EB%AA%A8%EB%8D%B8-%EC%84%B1%EB%8A%A5-%EA%B2%80%EC%A6%9D-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8\">7-2. 모델 성능 검증 스크립트</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#8-%EC%8B%A4%EC%A0%84-%EC%9A%B4%EC%98%81-%EC%82%AC%EB%A1%80%EC%99%80-%EB%B2%A0%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%9E%99%ED%8B%B0%EC%8A%A4\">8. 실전 운영 사례와 베스트 프랙티스</a></p>\n<ul>\n<li>\n<p><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#8-1-%EB%AA%A8%EB%8D%B8-%EC%9E%AC%ED%95%99%EC%8A%B5-%EC%A0%84%EB%9E%B5\">8-1. 모델 재학습 전략</a></p>\n<ul>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EC%8B%9C%EA%B0%84-%EA%B8%B0%EB%B0%98-%EC%9E%AC%ED%95%99%EC%8A%B5\">시간 기반 재학습</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EC%84%B1%EB%8A%A5-%EA%B8%B0%EB%B0%98-%EC%9E%AC%ED%95%99%EC%8A%B5\">성능 기반 재학습</a></li>\n</ul>\n</li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#8-2-%EB%AA%A8%EB%8D%B8-%EB%A1%A4%EB%B0%B1-%EC%A0%84%EB%9E%B5\">8-2. 모델 롤백 전략</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#8-3-%EB%B9%84%EC%9A%A9-%EC%B5%9C%EC%A0%81%ED%99%94\">8-3. 비용 최적화</a></li>\n</ul>\n</li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#9-%EA%B2%B0%EB%A1%A0\">9. 결론</a></li>\n<li><a href=\"/ai/MLOps-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C-AI-%EB%AA%A8%EB%8D%B8-%EC%84%9C%EB%B9%99%EA%B3%BC-%EC%9A%B4%EC%98%81-%EC%9E%90%EB%8F%99%ED%99%94/#%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C\">참고 자료</a></li>\n</ul>\n</li>\n</ul>","wordCount":{"words":728},"fields":{"slug":"/ai/MLOps-실전-가이드-AI-모델-서빙과-운영-자동화/","image":null,"faq":[]},"frontmatter":{"title":"MLOps 실전 가이드 - AI 모델 서빙과 운영 자동화 완벽 정리","date":"2025년 11월 15일","dateISO":"2025-11-15T00:00:00.000Z","updatedISO":null,"category":"ai","description":"MLOps의 개념부터 실전 구현까지. 모델 버전 관리(MLflow), A/B 테스트, 모델 서빙(KServe, Seldon), 성능 모니터링, 데이터 드리프트 감지까지 프로덕션 환경에서 AI 모델을 운영하는 모든 것을 다룹니다.","tags":["MLOps","머신러닝 운영","모델 서빙","MLflow","Kubernetes","AI 모델 배포","모델 모니터링","데이터 드리프트","A/B 테스트","KServe","Seldon"]}}},"pageContext":{"slug":"/ai/MLOps-실전-가이드-AI-모델-서빙과-운영-자동화/","previous":{"fields":{"slug":"/ai/Responsible-AI-Operations-Part-3-사고-대응과-지속-개선/"},"frontmatter":{"title":"Responsible AI Operations Part 3 사고 대응과 지속 개선","tags":["Responsible AI","인시던트 대응","Runbook","감사","거버넌스","지속 개선"]}},"next":{"fields":{"slug":"/ai/마인드업로드-시리즈-Part-1-연구-목표와-방향성/"},"frontmatter":{"title":"마인드업로드 시리즈 Part 1 - 연구 목표와 방향성, 디지털 불멸을 향한 첫걸음","tags":["마인드업로드","Mind Upload","의식 전송","뇌-컴퓨터 인터페이스","BCI","디지털 불멸","신경 매핑","Connectome","의식의 본질","뇌 시뮬레이션","Whole Brain Emulation"]}}}},"staticQueryHashes":["213619243","3262363727"]}