본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Prometheus와 Grafana를 활용한 실시간 모델 성능 모니터링 7가지 지표 설정 방법 및 해결책

by Papa Martino V 2026. 4. 17.
728x90

Prometheus와 Grafana
Prometheus와 Grafana

 

인공지능 모델을 배포하는 것보다 더 중요한 것은 배포 후 모델이 실제 환경에서 어떻게 작동하는지 감시하는 것입니다. 본 가이드는 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])` 쿼리를 사용하면 실시간 처리량을 쉽게 계산할 수 있습니다.

내용 출처 및 참고 자료

  • Prometheus 공식 문서 
  • Grafana Labs MLOps 가이드 
  • Python Prometheus Client Library Repository 
  • Google SRE Book - Monitoring Distributed Systems
728x90