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.
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.
- Introdução ao Monitoramento ML
- Data Drift
- Model Drift e performance
- Ferramentas do mercado
- Monitoramento em produção
Configurar os alertas do Prometheus, Slack e PagerDuty
Objetivos pedagógicos
- 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
- 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
┌─────────────────────────────────────────────────────────────┐ │ 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étrica | Ferramentas | Limite típico |
|---|---|---|
| Latência p50/p95/p99 | Prometheus, Datadog, CloudWatch | p99 < 500 ms |
| QPS (Queries Per Second) | Prometheus, ALB metrics | Acompanhar tendência |
| Taxa de erro HTTP (5xx) | Prometheus, CloudWatch | < 0.1 % |
| CPU / Memória | cAdvisor, Datadog | < 80 % |
| Uso de GPU (se aplicável) | NVIDIA DCGM, Prometheus | < 90 % |
| Disk I/O | node_exporter | — |
| Saturação de fila (Kafka, SQS) | Kafka exporter | < 10k mensagens |
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 feature | Métricas |
|---|---|
| Numérica | Min, max, mean, std, mediana, quantis, valores faltantes |
| Categórica | Distribuição das classes, novas classes, NULL |
| Texto | Comprimento médio, vocabulário, idiomas detectados |
| Imagem | Tamanho, proporção, histogramas RGB |
| Timestamp | Intervalos de datas, frequência por hora do dia |
3.2 Detecção de drift
| Teste estatístico | Tipo de feature | Quando usar |
|---|---|---|
| Kolmogorov-Smirnov (KS) | Numérica | Teste contínuo vs distribuição de referência |
| Chi-squared (χ²) | Categórica | Comparação de frequências |
| Population Stability Index (PSI) | Numérica discretizada | Padrão em finanças e bancos |
| Wasserstein distance | Numérica | Mais sensível que KS para grandes distribuições |
| Jensen-Shannon divergence | Categórica | Comparaçã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étrica | Descrição |
|---|---|
| Distribuição das predições | % de cada classe para classificação |
| Score de confiança médio | Indicador de dúvida do modelo |
| Entropia das saídas | Quanto 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)
| Problema | Métricas principais |
|---|---|
| Classificação binária | Accuracy, Precision, Recall, F1, AUC-ROC, AUC-PR |
| Classificação multi-classe | Accuracy, F1-macro, F1-weighted, confusion matrix |
| Regressão | RMSE, MAE, MAPE, R² |
| Ranking / Recomendação | NDCG, MAP, Recall@k, Precision@k |
| Detecção de anomalias | Precision/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.
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 uso | Atraso do feedback |
|---|---|
| Detecção de spam | Alguns minutos (usuário sinaliza) |
| Recomendação | Horas (clique) ou dias (compra) |
| Detecção de fraude bancária | Dias a semanas (chargeback) |
| Score de crédito | 1-3 anos (inadimplência) |
| Predição de churn | 30 a 90 dias |
| Diagnóstico médico | Semanas a anos |
Conceitos e causas do data drift
Capítulo 01 • Lição 01 • Duração : 45 min
- 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.
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
| Tipo | Definição | Exemplo |
|---|---|---|
| Covariate shift | P(X) muda, P(Y|X) constante | Modelo de saúde treinado em adultos, em prod temos idosos. Mas a relação sintomas → doença é a mesma. |
| Label shift | P(Y) muda, P(X|Y) constante | Detecçã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 drift | P(Y|X) muda | Reconhecimento de fraude : os fraudadores se adaptam, portanto mesmo perfil = comportamento diferente. A regra muda. |
3. Esquema visual
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ínio | Exemplo sazonal |
|---|---|
| E-commerce | Black Friday (volumes ×10), período de Natal |
| Meteorologia | Temperature features muito diferentes inverno/verão |
| Tráfego | Fim de semana vs dias úteis, horários de pico |
| Turismo | Verão no hemisfério sul vs norte |
| Energia | Consumo 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)
- 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
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ção | Vantagens | Desvantagens |
|---|---|---|
| Dataset de treinamento | Amostra do que o modelo viu | Pode estar obsoleto (1 ano+) |
| Dataset de validação | Independente do treino | Pequeno, às vezes enviesado |
| Janela deslizante prod (semana passada) | Sempre fresco | Drift progressivo não detectado |
| Mês anterior | Bom equilíbrio | Sazonalidade ignorada |
| Mês anterior N-12 (mesmo mês) | Sazonalidade considerada | Alterações de longo prazo perdidas |
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
| Granularidade | Quando usar |
|---|---|
| Por feature | Identificar precisamente qual variável drifta |
| Multivariada (dataset inteiro) | Detecta drifts sutis (correlações) |
| Por segmento (coorte, geografia) | Detecta drifts localizados |
| Por time window | Tendência temporal (dia, semana, mês) |
8. Frequência de análise
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 CodeFAQ
Quanto tempo para aprender ML Model Monitoring ?
São necessários pré-requisitos ?
Por onde começar concretamente ?
📬 Você quer receber este tipo de guia toda semana ? Inscreva-se gratuitamente — código real, zero blá-blá.