티스토리 뷰
머신러닝 기초학습 8: 모델 배포와 운영 (MLOps) — 학습된 모델을 서비스로 연결하는 법
“좋은 모델을 만들었다면, 이제 세상에 공개할 차례다.”
모델을 실험실에서만 잘 돌게 만드는 건 ‘연구자’의 일입니다.
하지만 ‘현업’에서는 서비스에 연결되고, 자동으로 업데이트되며, 안정적으로 동작하는 모델이 진짜 가치입니다.
이번 글에서는 머신러닝의 마지막 단계,
모델 배포(Deployment) 와 운영(MLOps) 의 개념, 구조, 실무 예제를 다룹니다.
1. MLOps란 무엇인가?
“Machine Learning + DevOps”
MLOps는 머신러닝 모델의 개발(ML) 과 시스템 운영(Ops) 을 통합한 개념으로,
데이터 수집 → 학습 → 배포 → 모니터링 → 재학습까지의 전 과정 자동화 파이프라인을 의미합니다.
MLOps의 핵심 목표
- 재현성(Reproducibility) – 같은 데이터, 같은 코드로 언제든 재학습 가능
- 자동화(Automation) – 학습/배포/평가를 자동으로 수행
- 지속적 운영(Continuous Integration & Delivery) – 모델의 업데이트가 서비스 중단 없이 이루어짐
- 모니터링(Monitoring) – 예측 품질, 데이터 변화를 실시간 감시
2. MLOps 전체 구조
[데이터 파이프라인]
↓
[모델 학습/튜닝]
↓
[모델 검증/평가]
↓
[모델 배포 (API, Batch)]
↓
[모델 모니터링]
↓
[자동 재학습 (Feedback Loop)]
이 모든 단계를 코드와 자동화 스크립트로 관리하는 것이 MLOps입니다.
3. 모델 배포의 세 가지 방식
배포 형태 설명 예시
| Online Serving (API) | 실시간 요청마다 예측 | Flask, FastAPI, gRPC |
| Batch Inference | 일정 주기로 예측 결과를 파일로 저장 | 스케줄링 (Airflow, Cron) |
| Edge Deployment | IoT, 모바일 등 로컬 장치에 모델 탑재 | TensorFlow Lite, ONNX |
4. 실습: Flask를 이용한 모델 API 배포
간단한 분류 모델을 학습한 뒤,
Flask 서버를 통해 REST API로 배포하는 예제입니다.
# model_deploy.py
from flask import Flask, request, jsonify
import joblib
import numpy as np
app = Flask(__name__)
model = joblib.load("model.pkl") # 학습된 모델 불러오기
@app.route("/predict", methods=["POST"])
def predict():
data = request.get_json()
X = np.array(data["features"]).reshape(1, -1)
prediction = model.predict(X)[0]
return jsonify({"prediction": int(prediction)})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
모델을 학습하고 저장하는 부분은 이렇게 작성합니다.
# train_model.py
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import joblib
X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X, y)
joblib.dump(model, "model.pkl")
이후 실행:
$ python train_model.py
$ python model_deploy.py
요청 테스트:
curl -X POST http://localhost:5000/predict -H "Content-Type: application/json" \
-d '{"features": [5.1, 3.5, 1.4, 0.2]}'
응답
{"prediction": 0}
이렇게 모델을 HTTP API 형태로 서비스에 연결할 수 있습니다.
5. Docker로 컨테이너화하기
“환경이 다르면 결과도 다르다 — Docker는 그 문제를 해결한다.”
# Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY . .
RUN pip install flask scikit-learn joblib
EXPOSE 5000
CMD ["python", "model_deploy.py"]
빌드 및 실행:
docker build -t ml-api .
docker run -p 5000:5000 ml-api
이제 모델은 언제, 어디서나 동일한 환경에서 실행 가능합니다.
6. CI/CD와 자동 배포
자동화 도구 예시
단계 도구
| 코드/모델 버전 관리 | Git, DVC |
| 빌드 & 테스트 | GitHub Actions, Jenkins |
| 배포 자동화 | Docker Hub, ArgoCD, Kubernetes |
| 스케줄링 | Airflow, Prefect |
MLOps의 핵심은 수동 절차를 코드로 전환하는 것입니다.
7. 모델 모니터링 (Monitoring)
모델이 운영 중에도 지속적으로 잘 작동하는지 감시해야 합니다.
모니터링 항목 의미
| Input Drift | 데이터 분포가 변했는가? |
| Prediction Drift | 예측값 분포가 달라졌는가? |
| Concept Drift | 입력-출력 관계 자체가 변했는가? |
| Latency / Error Rate | 응답 속도, 실패율 |
대표 도구: Evidently AI, MLflow, Prometheus, Grafana
8. 모델 버전 관리 (Model Registry)
모델도 소스코드처럼 버전이 필요합니다.
- MLflow Model Registry
- Weights & Biases (W&B)
- DVC (Data Version Control)
각 모델의 버전, 데이터셋, 하이퍼파라미터를 함께 추적하면
“이 모델이 어떤 데이터로 학습되었는가?”를 명확히 알 수 있습니다.
9. 자동 재학습 (Auto Retraining)
“모델은 시간이 지나면 낡는다.”
데이터 분포가 바뀌면 모델의 예측력이 떨어집니다.
이를 해결하기 위해 주기적 재학습 파이프라인을 구성합니다.
Airflow DAG
├── fetch_new_data()
├── preprocess()
├── retrain_model()
├── evaluate()
├── deploy_new_model()
10. MLOps의 철학
원칙 의미
| 모든 단계는 코드로 관리하라 (Infrastructure as Code) | 환경, 설정, 파이프라인을 스크립트로 정의 |
| 작동하는 코드가 최고의 문서다 | 문서보다 reproducibility 우선 |
| 데이터도 버전 관리 대상이다 | 데이터는 코드보다 자주 변한다 |
| 자동화는 신뢰를 만든다 | 사람이 개입하지 않아야 오류가 줄어든다 |
11. 요약 정리
단계 주요 기술
| 데이터 수집 & 전처리 | Airflow, Prefect |
| 모델 학습 | Scikit-learn, PyTorch, TensorFlow |
| 버전 관리 | Git, DVC, MLflow |
| 배포 | Flask, FastAPI, Docker, K8s |
| 모니터링 | Prometheus, Grafana, Evidently |
| 재학습 자동화 | Airflow, Jenkins, AutoML |
📘 다음 글 예고
👉 머신러닝 기초학습 9: AutoML과 파이프라인 자동화 — 모델 학습부터 배포까지 완전 자동화하기
다음 글에서는
AutoML, MLflow, Airflow, Kubeflow 등을 활용해
데이터 수집 → 전처리 → 학습 → 평가 → 배포 → 재학습
전 과정을 완전 자동화하는 실무 파이프라인을 다룹니다.
머신러닝,MLOps,모델배포,Flask,FastAPI,Docker,Airflow,MLflow,모델모니터링,자동재학습
'study > ML' 카테고리의 다른 글
| 머신러닝 기초학습 10 (완결): 머신러닝 프로젝트 A~Z — 기획부터 데이터, 모델링, 배포, 운영까지 ‘완전체 튜토리얼’ (0) | 2025.11.17 |
|---|---|
| 머신러닝 기초학습 9: AutoML과 파이프라인 자동화 — 데이터 → 학습 → 배포까지 ‘완전 자동화’하는 법 (0) | 2025.11.13 |
| 머신러닝 기초학습 7: 피처 중요도와 모델 해석 — 모델이 ‘왜 그렇게 예측했는가’를 이해하기 (0) | 2025.11.04 |
| 머신러닝 기초학습 6: 하이퍼파라미터 튜닝과 모델 최적화 — 모델의 ‘감’을 숫자로 조정하는 기술 (0) | 2025.11.03 |
| 머신러닝 기초학습 5: 모델 평가와 일반화 — 과적합을 피하고 진짜 실력을 확인하는 법 (0) | 2025.10.30 |
- Total
- Today
- Yesterday
- Redis
- Express
- rag
- DevOps
- seo 최적화 10개
- Docker
- LangChain
- SEO최적화
- Python
- flax
- kotlin
- CI/CD
- NestJS
- REACT
- Prisma
- node.js
- 개발블로그
- ai철학
- Next.js
- 웹개발
- fastapi
- 딥러닝
- 쿠버네티스
- 백엔드개발
- nextJS
- 압박면접
- JAX
- JWT
- llm
- PostgreSQL
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |

