ML Model Monitoring Explicado Simplesmente (com Diagramas e Código Real)

ML Model Monitoring: o essencial em um artigo — código real, diagramas e etapas concretas, trechos de um curso de 24 lições.

ML Model Monitoring Explicado Simplesmente (com Diagramas e Código Real)

Um guia direto ao ponto: ML Model Monitoring dissecado com diagramas, exemplos concretos e comandos testados. Tudo vem de um curso estruturado de 7 capítulos — aqui está o melhor.

tl;dr
  • Introdução ao Monitoramento ML
  • Data Drift
  • Model Drift e performance
  • Ferramentas do mercado
  • Monitoramento em produção
~$ cat ./parcours.md # ML Model Monitoring — 6 capítulos
01
Introduction ML Monitoring
→ A síndrome do modelo que apodrece→ Os 3 pilares do monitoramento ML+ 1 mais lições
02
Data Drift
→ Conceitos e causas do data drift→ Testes estatísticos : KS, Chi², PSI, Wasserstein+ 1 mais lições
03
Model Drift e performance
→ Concept drift vs Performance drift→ Métricas por tipo de problema ML+ 1 mais lições
04
Ferramentas do mercado
→ Visão geral das ferramentas ML Monitoring→ Stack open-source completa : Evidently + Prometheus + Grafana+ 1 mais lições
05
Monitoramento em produção
→ SLO, SLA e orçamentos de erro para ML→ Continuous Training (CT) com Airflow+ 2 mais lições
06
Projeto final
→ Projeto final : Especificação de requisitos e arquitetura→ Implementação FraudGuard passo a passo+ 1 mais lições
🏁
Projeto final
→ Você sai com um projeto concreto e demonstrável

Configurar os alertas do Prometheus, Slack e PagerDuty

NOTEObjetivo — Transformar suas métricas de monitoramento de ML em alertas acionáveis: escrever regras do Prometheus sobre drift e degradação, rotear as notificações via Alertmanager para Slack e PagerDuty, e evitar a fadiga de alertas.

Objetivos pedagógicos

TIPAo final deste módulo
  • Escrever regras de alerta do Prometheus (alerting_rules.yml) sobre KPIs de ML
  • Configurar o Alertmanager para rotear para Slack e PagerDuty
  • Diferenciar alerta warning e alerta critical por severidade
  • Implementar agrupamento (group_by) e inibição
  • Reduzir a fadiga de alertas com for, thresholds e silences

Da métrica ao alerta: a cadeia completa

Uma métrica exposta em /metrics não serve para nada se ninguém a olha às 3h da manhã. A cadeia de alerting conecta um valor numérico a uma ação humana. Ela possui quatro elos.

1. Exportar a métrica

Seu serviço de ML publica Gauge e Counter: score de drift, latência p95, taxa de erro, accuracy móvel.

2. Avaliar a regra

O Prometheus avalia periodicamente expressões PromQL. Quando a expressão permanece verdadeira durante for, o alerta passa de pending para firing.

3. Rote<|eos|>

Os 3 pilares do monitoramento de ML

Capítulo 00 • Lição 02 • Duração : 45 min

NOTA🎯 Objetivos
  • Identificar as 3 categorias de métricas a monitorar
  • Compreender quais métricas medir de acordo com o tipo de modelo
  • Estabelecer um roadmap progressivo de instrumentação
  • Conhecer as boas práticas de logging de ML

1. Visão geral : os 3 pilares

output
┌─────────────────────────────────────────────────────────────┐
│                  MONITORAMENTO DE ML EM PRODUÇÃO                  │
└─────────────────────────────────────────────────────────────┘

   ┌────────────────┐  ┌────────────────┐  ┌────────────────┐
   │  PILAR 1       │  │  PILAR 2       │  │  PILAR 3       │
   │  Sistema       │  │  Dados         │  │  Modelo        │
   │  (infra)       │  │  (data + drift)│  │  (desempenho)  │
   └────────────────┘  └────────────────┘  └────────────────┘
   - Latência         - Distribuição X    - Acurácia
   - QPS              - Valores faltantes - F1, AUC
   - CPU/Memória      - Outliers          - Calibração
   - Erros 5xx        - Drift KS/PSI      - KPI de negócio

2. Pilar 1 — Monitoramento de sistema (infra)

É o monitoramento clássico de aplicações, idêntico a qualquer API REST.

MétricaFerramentasLimite típico
Latência p50/p95/p99Prometheus, Datadog, CloudWatchp99 < 500 ms
QPS (Queries Per Second)Prometheus, ALB metricsAcompanhar tendência
Taxa de erro HTTP (5xx)Prometheus, CloudWatch< 0.1 %
CPU / MemóriacAdvisor, Datadog< 80 %
Uso de GPU (se aplicável)NVIDIA DCGM, Prometheus< 90 %
Disk I/Onode_exporter
Saturação de fila (Kafka, SQS)Kafka exporter< 10k mensagens
DICA

Especificidade ML : A latência pode explodir em modelos de deep learning devido ao compartilhamento inadequado de GPUs. Sempre medir a latência p99, não apenas a média.

3. Pilar 2 — Monitoramento de dados (entradas)

3.1 Métricas por feature

Tipo de featureMétricas
NuméricaMin, max, mean, std, mediana, quantis, valores faltantes
CategóricaDistribuição das classes, novas classes, NULL
TextoComprimento médio, vocabulário, idiomas detectados
ImagemTamanho, proporção, histogramas RGB
TimestampIntervalos de datas, frequência por hora do dia

3.2 Detecção de drift

Teste estatísticoTipo de featureQuando usar
Kolmogorov-Smirnov (KS)NuméricaTeste contínuo vs distribuição de referência
Chi-squared (χ²)CategóricaComparação de frequências
Population Stability Index (PSI)Numérica discretizadaPadrão em finanças e bancos
Wasserstein distanceNuméricaMais sensível que KS para grandes distribuições
Jensen-Shannon divergenceCategóricaComparação probabilística

Detalhes e código no Capítulo 01 lição 02.

3.3 Qualidade dos dados

4. Pilar 3 — Monitoramento do modelo

4.1 Métricas de predição (sem labels)

MétricaDescrição
Distribuição das predições% de cada classe para classificação
Score de confiança médioIndicador de dúvida do modelo
Entropia das saídasQuanto maior, mais incerto o modelo
Taxa de OOD (Out-of-Distribution)% de inputs fora da distribuição de treinamento
Taxa de fallback / unknown% de predições onde o modelo não sabe

4.2 Desempenho (com labels)

ProblemaMétricas principais
Classificação bináriaAccuracy, Precision, Recall, F1, AUC-ROC, AUC-PR
Classificação multi-classeAccuracy, F1-macro, F1-weighted, confusion matrix
RegressãoRMSE, MAE, MAPE, R²
Ranking / RecomendaçãoNDCG, MAP, Recall@k, Precision@k
Detecção de anomaliasPrecision/Recall na classe rara
Geração (LLM)BLEU, ROUGE, perplexidade, avaliação humana

4.3 Calibração

Um modelo calibrado é um modelo cujas probabilidades preditas correspondem às frequências reais. Ex : em 100 predições com 80 % de confiança, ~80 devem estar corretas.

output
from sklearn.calibration import calibration_curve
import matplotlib.pyplot as plt

prob_pred = model.predict_proba(X_test)[:, 1]
prob_true, prob_pred = calibration_curve(y_test, prob_pred, n_bins=10)

plt.plot([0, 1], [0, 1], 'k--')
plt.plot(prob_pred, prob_true, 'o-')
plt.xlabel('Probabilidade predita')
plt.ylabel('Probabilidade observada')
plt.title('Calibration plot')

5. O problema do "delayed feedback"

Com frequência, só se conhece a verdade (o label) dias/semanas/meses após a predição.

Caso de usoAtraso do feedback
Detecção de spamAlguns minutos (usuário sinaliza)
RecomendaçãoHoras (clique) ou dias (compra)
Detecção de fraude bancáriaDias a semanas (chargeback)
Score de crédito1-3 anos (inadimplência)
Predição de churn30 a 90 dias
Diagnóstico médicoSemanas a anos

Conceitos e causas do data drift

Capítulo 01 • Lição 01 • Duração : 45 min

NOTA🎯 Objetivos
  • Definir precisamente o que é o data drift (e o que não é)
  • Distinguir covariate shift, label shift e concept drift
  • Reconhecer as causas comuns : sazonalidade, eventos, bugs upstream
  • Estabelecer uma estratégia de referência (reference dataset)

1. Definição formal

O data drift ocorre quando a distribuição estatística dos dados em produção difere daquela usada para treinar o modelo.

output
P_train(X) ≠ P_prod(X)

ou mais geralmente :

P_train(X, Y) ≠ P_prod(X, Y)

Matematicamente, fala-se de covariate shift quando apenas a distribuição das features X muda, mas a relação P(Y|X) permanece idêntica.

2. Os 3 tipos de shift

TipoDefiniçãoExemplo
Covariate shiftP(X) muda, P(Y|X) constanteModelo de saúde treinado em adultos, em prod temos idosos. Mas a relação sintomas → doença é a mesma.
Label shiftP(Y) muda, P(X|Y) constanteDetecção de spam : 5 % de spams no treino, 50 % em prod (campanha massiva de phishing). O perfil dos spams é similar mas sua frequência explode.
Concept driftP(Y|X) mudaReconhecimento de fraude : os fraudadores se adaptam, portanto mesmo perfil = comportamento diferente. A regra muda.

3. Esquema visual

output
Distribution training            Distribution production
       
       *  *                              
      ***                                       *
     *****                                     ***
    *******                                   *****
   *********              vs                  ********
  ***********                                **********
 *************                              *************
───────────────────                ──────────────────────────
        Pas de drift                    DRIFT DÉTECTÉ
                                  (la distribution s'est décalée)

4. Principais causas do data drift

4.1 Sazonalidade

DomínioExemplo sazonal
E-commerceBlack Friday (volumes ×10), período de Natal
MeteorologiaTemperature features muito diferentes inverno/verão
TráfegoFim de semana vs dias úteis, horários de pico
TurismoVerão no hemisfério sul vs norte
EnergiaConsumo inverno vs verão (ar condicionado/aquecimento)

4.2 Eventos externos

4.3 Evolução de negócio

4.4 Bugs e mudanças técnicas (frequentemente esquecidos)

WARNING⚠️ As causas mais insidiosas
  • Pipeline ETL upstream que altera um encoding (UTF-8 vs Latin-1)
  • Atualização da API fonte que retorna campos a mais/a menos
  • Correção de bug que modifica valores upstream (ex: arredondamento alterado)
  • Mudança de versão de uma lib (numpy 1.x vs 2.x diferente)
  • Migração de banco de dados que altera os tipos
  • Novo campo opcional : NULL em prod, nunca NULL no treino

5. Exemplo concreto em Python — simular um drift

output
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

np.random.seed(42)
n_train = 5000

train_age = np.random.normal(35, 10, n_train)
train_age = np.clip(train_age, 18, 80)

train_income = train_age * 1000 + np.random.normal(0, 5000, n_train)

prod_age = np.random.normal(50, 12, n_train)
prod_age = np.clip(prod_age, 18, 80)

prod_income = prod_age * 1000 + np.random.normal(0, 5000, n_train)

fig, axes = plt.subplots(1, 2, figsize=(14, 5))

axes[0].hist(train_age, bins=30, alpha=0.5, label='Train', color='blue')
axes[0].hist(prod_age, bins=30, alpha=0.5, label='Production', color='red')
axes[0].axvline(train_age.mean(), color='blue', linestyle='--', label=f'Train moy={train_age.mean():.1f}')
axes[0].axvline(prod_age.mean(), color='red', linestyle='--', label=f'Prod moy={prod_age.mean():.1f}')
axes[0].set_title('Distribution de "age" — covariate shift visible')
axes[0].set_xlabel('Age')
axes[0].legend()

axes[1].hist(train_income, bins=30, alpha=0.5, label='Train', color='blue')
axes[1].hist(prod_income, bins=30, alpha=0.5, label='Production', color='red')
axes[1].set_title('Distribution de "income"')
axes[1].set_xlabel('Income')
axes[1].legend()

plt.tight_layout()
plt.savefig('drift_visualization.png')
plt.show()

6. O conceito de "reference dataset"

Para detectar um drift, é preciso comparar com algo conhecido. É o reference dataset.

OpçãoVantagensDesvantagens
Dataset de treinamentoAmostra do que o modelo viuPode estar obsoleto (1 ano+)
Dataset de validaçãoIndependente do treinoPequeno, às vezes enviesado
Janela deslizante prod (semana passada)Sempre frescoDrift progressivo não detectado
Mês anteriorBom equilíbrioSazonalidade ignorada
Mês anterior N-12 (mesmo mês)Sazonalidade consideradaAlterações de longo prazo perdidas
TIP

Recomendação : Manter 2 referências — (1) dataset de validação inicial para o drift "estrutural" (2) janela deslizante de 30 dias para o drift "comportamental".

7. Granularidade da detecção

GranularidadeQuando usar
Por featureIdentificar precisamente qual variável drifta
Multivariada (dataset inteiro)Detecta drifts sutis (correlações)
Por segmento (coorte, geografia)Detecta drifts localizados
Por time windowTendência temporal (dia, semana, mês)

8. Frequência de análise

va-plus-loin

Este artigo cobre os trechos mais úteis — o curso completo ML Model Monitoring (7 capítulos, 24 lições, exercícios corrigidos e projeto final) leva você até o fim.

./acceder-au-cours-complet curso gratuito : Maîtriser Claude Code

FAQ

Quanto tempo para aprender ML Model Monitoring ?
Com uma progressão estruturada (7 capítulos, 24 lições curtas e práticas), alcança-se um nível operacional em algumas semanas a uma taxa de 30 a 60 minutos por dia. O importante é praticar cada conceito imediatamente.
São necessários pré-requisitos ?
Bases em informática são suficientes. Se você sabe usar um terminal e ler código simples, você está pronto.
Por onde começar concretamente ?
Reproduza os comandos deste artigo, então siga o curso completo ML Model Monitoring : ele encadeia as 24 lições em ordem, com exercícios e projeto final.

📬 Você quer receber este tipo de guia toda semana ? Inscreva-se gratuitamente — código real, zero blá-blá.