
인공지능 모델을 배포하는 것보다 더 중요한 것은 배포 후 모델이 실제 환경에서 어떻게 작동하는지 감시하는 것입니다. 본 가이드는 Python 환경에서 Prometheus와 Grafana를 연동하여 모델의 성능 저하(Drift)와 인프라 리소스를 동시에 모니터링하는 전문적인 아키텍처 설계법을 다룹니다.
1. MLOps의 핵심: 왜 Prometheus와 Grafana인가?
학습 데이터에서는 99%의 정확도를 보였던 모델이 실제 운영 서버에서는 50%의 성능도 내지 못하는 경우가 허다합니다. 이를 해결하기 위해 MLOps(Machine Learning Operations)의 핵심 요소인 '관측 가능성(Observability)'이 필요합니다.
Prometheus는 시계열 데이터 수집에 특화된 오픈소스 모니터링 시스템이며, Grafana는 수집된 데이터를 시각화하는 데 최적화된 도구입니다. 이 두 조합은 단순한 서버 부하 측정을 넘어, 모델의 추론 값 분포, 응답 지연 시간(Latency), 그리고 데이터 편향성까지 실시간으로 추적할 수 있게 해줍니다.
2. 모니터링 방식의 차이점 분석: Push vs Pull
모델 서빙 환경에 따라 지표 수집 전략을 다르게 가져가야 합니다. 다음은 실무에서 가장 많이 고민하는 두 방식의 비교입니다.
| 항목 | Pull 방식 (Prometheus 표준) | Push 방식 (Pushgateway 활용) |
|---|---|---|
| 동작 원리 | Prometheus 서버가 엔드포인트를 호출 | 모델 서버가 직접 지표를 전송 |
| 주요 장점 | 중앙 관리 용이, 서버 부하 감소 | 단기 실행 작업(Batch Job) 모니터링 가능 |
| 네트워크 | 방화벽 내 화이트리스트 설정 필요 | 외부 전송 포트 허용 필요 |
| 추천 환경 | FastAPI, Flask 등 상시 가동 API | CronJob, 데이터 전처리 스크립트 |
3. 실무 적용을 위한 7가지 핵심 모니터링 지표 설정 (Python Code)
아래 예제들은 `prometheus_client` 라이브러리를 사용하여 실제 Python 서빙 코드에 바로 삽입할 수 있도록 최적화되었습니다.
Example 1: 추론 요청 횟수 및 성공률 측정 (Counter)
모델이 얼마나 많은 요청을 처리하고 있는지, 오류율은 얼마인지 파악합니다.
from prometheus_client import Counter, start_http_server
# 지표 정의
INFERENCE_COUNT = Counter('model_inference_total', 'Total number of inference requests', ['model_name', 'status'])
def predict(data):
try:
# 모델 추론 로직
result = model.predict(data)
INFERENCE_COUNT.labels(model_name='v1_resnet', status='success').inc()
return result
except Exception:
INFERENCE_COUNT.labels(model_name='v1_resnet', status='error').inc()
raise
Example 2: 모델 응답 지연 시간 측정 (Histogram)
P99 지연 시간을 추적하여 사용자 경험 저하를 방지합니다.
from prometheus_client import Histogram
import time
LATENCY = Histogram('model_inference_latency_seconds', 'Inference latency in seconds', buckets=[0.1, 0.5, 1.0, 2.0, 5.0])
@LATENCY.time()
def process_request(request):
# 전처리 및 모델 추론 실행
return model.predict(request)
Example 3: 예측 결과 분포 모니터링 (Summary)
모델의 예측값이 특정 방향으로 치우치는지(Drift) 감시합니다.
from prometheus_client import Summary
PREDICTION_SCORE = Summary('model_prediction_score', 'Distribution of model prediction scores')
def log_score(score):
PREDICTION_SCORE.observe(score)
# score가 0.9 이상이면 특정 이벤트 발생 가능
Example 4: 현재 활성 추론 작업 수 (Gauge)
현재 서버에서 동시에 처리 중인 모델 추론 수를 실시간으로 확인합니다.
from prometheus_client import Gauge
IN_PROGRESS = Gauge('model_inference_in_progress', 'Number of inferences in progress')
def heavy_inference():
with IN_PROGRESS.track_inprogress():
# 부하가 큰 딥러닝 연산 수행
return model.infer()
Example 5: FastAPI 미들웨어 연동 방법
실제 프로덕션 환경에서 모든 엔드포인트에 지표를 자동으로 적용하는 해결책입니다.
from fastapi import FastAPI, Request
from prometheus_client import make_asgi_app
app = FastAPI()
metrics_app = make_asgi_app()
app.mount("/metrics", metrics_app)
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
# 여기서 LATENCY.observe(process_time) 등 기록 가능
return response
Example 6: 데이터 입력 값 누락 및 Null 비율 체크
입력 데이터 품질 저하를 수치화하여 경고를 보냅니다.
DATA_QUALITY = Counter('input_data_null_total', 'Count of null values in input features', ['feature_name'])
def check_quality(df):
null_counts = df.isnull().sum()
for feature, count in null_counts.items():
if count > 0:
DATA_QUALITY.labels(feature_name=feature).inc(count)
Example 7: Prometheus 설정 파일 (prometheus.yml) 작성
Python 서버에서 노출한 지표를 Prometheus가 가져가도록 하는 설정입니다.
scrape_configs:
- job_name: 'python-model-server'
static_configs:
- targets: ['localhost:8000'] # FastAPI 서버 주소
scrape_interval: 5s
4. Grafana 대시보드 구성을 위한 전문가 팁
지표를 수집했다면 이제 효과적으로 시각화해야 합니다. 성공적인 모델 모니터링 대시보드는 다음의 요소를 포함해야 합니다.
- Traffic: 분당 요청 수(RPM)를 통해 시스템 부하 확인
- Errors: HTTP 5xx 에러 및 모델 추론 실패 로직 시각화
- Saturation: GPU 메모리 및 CPU 점유율 연동
- Model Health: 예측 값의 평균 및 표준 편차 추이 (Drift 감지용)
Grafana에서 `rate(model_inference_total[1m])` 쿼리를 사용하면 실시간 처리량을 쉽게 계산할 수 있습니다.
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] Triton Inference Server로 구현하는 3가지 멀티 모델 서빙 전략과 병목 현상 해결 방법 (0) | 2026.04.17 |
|---|---|
| [PYTHON] 블랙박스 모델 해결을 위한 SHAP과 LIME 연동 방법 및 3가지 핵심 차이점 분석 (0) | 2026.04.17 |
| [PYTHON] CI/CD 파이프라인 내 CML을 활용한 모델 학습 자동화 3가지 해결 방법과 워크플로우 차이 분석 (0) | 2026.04.16 |
| [PYTHON] 모델 응답 속도 지연 해결을 위한 3가지 프로파일링 기법 및 병목 지점 최적화 방법 (0) | 2026.04.16 |
| [PYTHON] AWS Lambda 서버리스 모델 배포 시 패키지 용량 제한 250MB 해결을 위한 3가지 방법과 차이점 (0) | 2026.04.16 |