O notebook treina; a produção sustenta

Apostila completa de MLOps: do modelo à produção

Treinar um modelo com boa métrica no conjunto de teste é a parte fácil e conhecida. O que trava a maioria dos projetos de ML é o resto: versionar dados e experimentos, evitar vazamento, servir com latência aceitável, detectar quando o modelo apodrece em produção e re-treinar sem quebrar tudo. Esta apostila percorre o ciclo de vida completo de ML em produção — sempre com o olho no que empresas realmente pedem em vagas de ML Engineer e MLOps.

10 módulosMLflow · DVC · FeastKServe · BentoML · TritonDrift · retraining · CTBoxes de entrevistaExercícios com gabarito
MÓDULO 01 · BÁSICO

O que é MLOps e por que tantos modelos nunca chegam à produção

Objetivo: entender por que ML em produção falha por motivos de engenharia, não de modelagem, e conhecer o ciclo de vida e os níveis de maturidade de MLOps.

1.1 O código do modelo é a menor parte do sistema

Um resultado clássico da literatura de engenharia de ML (o paper "Hidden Technical Debt in Machine Learning Systems", do Google): a caixa que contém o algoritmo de ML é minúscula perto de tudo que a cerca — coleta e validação de dados, infraestrutura de features, gestão de configuração, servir, monitorar, orquestrar. É nesse entorno que os projetos morrem.

        ┌──────────────────────────────────────────────────────────┐
        │  coleta   │ validação │ config │ infra de   │ gestão de   │
        │  de dados │ de dados  │        │ serving    │ recursos    │
        ├───────────┼───────────┼────────┴────────────┼─────────────┤
        │ extração  │  ┌─────┐  │   monitoramento     │  ferramentas│
        │ de feat.  │  │ ML  │  │                     │  de análise │
        │           │  └─────┘  │   orquestração / gerenciamento    │
        └───────────┴───────────┴───────────────────────────────────┘
              a caixa "ML" é ~5% do código de um sistema de ML em produção

MLOps é a aplicação de práticas de DevOps + engenharia de dados + governança ao ciclo de vida de ML: automatizar, versionar, testar, monitorar e reproduzir — para que um modelo saia do notebook, entre em produção e permaneça útil.

1.2 Por que ML quebra diferente de software

Software tradicionalSistema de ML
Comportamento definido por códigoComportamento definido por código + dados + parâmetros aprendidos
Testes determinísticos (passou/falhou)Métricas estatísticas; "correto" é uma distribuição
Degrada só se o código mudaDegrada sozinho quando o mundo muda (drift), sem ninguém tocar em nada
Reproduzir bug = mesmo inputReproduzir = mesmo código + mesmos dados + mesmo ambiente + mesma seed
Deploy = nova versão do binárioDeploy = novo modelo, e o pipeline de dados/features tem que casar treino e produção

1.3 O ciclo de vida de ML

   negócio ▶ dados ▶ features ▶ experimentação ▶ avaliação ▶ registro ▶ deploy ▶ monitorar
                ▲                                                                    │
                └──────────── retraining acionado por drift / novos dados / SLA ─────┘

É um loop, não uma linha. E cada etapa precisa ser versionada e automatizável, senão o loop não fecha de forma confiável.

1.4 Níveis de maturidade (modelo do Google)

NívelComo éSinal de que você está aqui
MLOps 0 — manualNotebooks, deploy manual, sem CI/CD, sem monitoramento; entrega esporádica"Roda no meu Jupyter"; ninguém sabe qual versão está em produção
MLOps 1 — pipeline automatizadoPipeline de treino reproduzível e disparável, validação de dados e modelo, entrega contínua do modelo, monitoramento com trigger de retrainingUm commit ou um alarme de drift re-treina e reavalia sozinho
MLOps 2 — CI/CD de pipelinesO próprio pipeline é versionado e entregue por CI/CD; múltiplos experimentos e modelos em paralelo, com governançaTimes fazem deploy de novos pipelines de ML como fazem deploy de microserviços
💡 Não pule etapas

A maioria das empresas com ML em produção está no nível 0 ou tentando chegar ao 1. O erro comum é comprar uma plataforma de nível 2 antes de ter versionamento de dados e experiment tracking básicos. Suba um degrau por vez: reprodutibilidade → pipeline automatizado → CI/CD do pipeline.

💼 Mercado de trabalho

MLOps Engineer e ML Engineer (com forte componente de produção) são vagas com muito mais demanda que oferta, porque a maioria dos cientistas de dados não domina a parte de engenharia. Perfis vêm de DevOps/SRE, de backend e de data science que "virou de engenharia". Pergunta clássica de abertura: "Por que a maioria dos modelos de ML não chega à produção?" — a resposta cita o débito técnico oculto, o drift, e a lacuna de reprodutibilidade e de pipeline.

✏️ Exercício 1 — Diagnóstico de maturidade

Uma empresa treina modelos em notebooks, salva o .pkl num bucket, e um engenheiro copia o arquivo para o servidor de API quando o cientista pede. Não há monitoramento. Qual o nível de MLOps, quais os três maiores riscos, e qual o primeiro passo?

Gabarito: Nível 0. Riscos: (1) impossível reproduzir um modelo antigo (não se sabe quais dados/código/params geraram aquele .pkl); (2) o modelo pode estar degradando há meses sem ninguém saber (sem monitoramento); (3) deploy manual é propenso a erro e não tem rollback claro. Primeiro passo: reprodutibilidade — experiment tracking (MLflow) registrando dados+código+params+métricas de cada treino, e versionamento de dados (DVC). Só depois automatizar o pipeline e adicionar monitoramento.

MÓDULO 02 · BÁSICO

Dados para ML: versionamento, splits e vazamento

Objetivo: tratar dados como artefato versionado, fazer splits que não mentem, e reconhecer o data leakage — o erro que faz um modelo brilhar no teste e falhar na vida real.

2.1 Versionamento de dados

"Qual dataset gerou este modelo?" tem que ter resposta exata. Git versiona código; para dados grandes, ferramentas dedicadas:

FerramentaAbordagem
DVCPonteiros no git para arquivos/pastas em storage remoto; pipelines reprodutíveis com dvc repro
lakeFSVersionamento estilo git para o data lake inteiro (branch, commit, merge sobre S3)
Delta Lake / Iceberg (time travel)Consultar a tabela "como estava" em um snapshot/timestamp — versionamento implícito
Hash + snapshot imutávelCongelar o dataset de treino como Parquet imutável com um hash registrado no experiment tracker

O mínimo aceitável: cada treino registra um identificador imutável do dataset (hash, versão DVC, snapshot Iceberg) junto com o código e os parâmetros.

2.2 Splits que não mentem

2.3 Data leakage o bug nº 1 de modelos que "iam bem"

Vazamento é quando informação que não estará disponível no momento da predição entra no treino. O modelo aprende a "trapacear", a métrica fica linda, e na produção ele desaba.

TipoExemploComo evitar
Target leakageUsar data_pagamento para prever "vai pagar?" — só existe depois do fatoPara cada feature, perguntar "isso existe no instante t da predição?"
Train-test contaminationNormalizar/imputar com estatísticas do dataset inteiro antes de dividirFit do pré-processamento só no treino; Pipeline do scikit-learn dentro do CV
Temporal leakageFeature agregada com janela que cruza o ponto de prediçãoPoint-in-time correctness (Módulo 4); janelas que só olham para trás
Duplicatas / near-duplicatesMesmo registro (ou quase) em treino e testeDeduplicar antes do split; split por grupo
Leakage de identificadorUm ID que correlaciona com o alvo por acaso de coletaRemover IDs; auditar features com importância suspeitamente alta
⚠️ O sintoma clássico

Métrica de validação quase perfeita, ou uma única feature com importância dominante que "não deveria saber tanto". Antes de comemorar, faça a pergunta do point-in-time: no instante em que eu preciso prever, eu teria mesmo esse valor? Se a resposta é "não" ou "não com esse valor", é vazamento.

💼 Mercado de trabalho

Perguntas: "O que é data leakage e dê três exemplos", "Por que não se deve fazer split aleatório em série temporal?", "Por que o scaler deve ser ajustado só no treino?", "Como você versiona dados?". Contar uma história real de "a métrica estava boa demais e era vazamento" costuma valer mais que a definição decorada.

✏️ Exercício 2 — Ache o vazamento

Modelo para prever churn no próximo mês. Features incluídas: plano, uso_medio_90d, numero_de_tickets_suporte, data_cancelamento (nula se ativo), desconto_retencao_aplicado, meses_como_cliente. Métrica de validação: AUC 0,99. Aponte os problemas.

Gabarito: (1) data_cancelamento é o próprio alvo disfarçado — target leakage grosseiro. (2) desconto_retencao_aplicado normalmente é oferecido porque o cliente sinalizou saída ou já pediu cancelamento — leakage temporal, só existe perto do evento. (3) Possível leakage em numero_de_tickets_suporte se contar tickets abertos durante o processo de cancelamento — precisa ser cortado no instante t. AUC 0,99 é o sintoma. Correção: definir claramente o instante da predição e só usar features com valores conhecidos até ali.

MÓDULO 03 · INTERMEDIÁRIO

Experimentação e reprodutibilidade

Objetivo: registrar cada experimento de forma que qualquer resultado possa ser reproduzido e comparado — a base sobre a qual todo o resto de MLOps se apoia.

3.1 Os quatro pilares da reprodutibilidade

Um resultado de ML só é reproduzível se você fixou e registrou os quatro:

  1. Código — commit hash exato (e do repositório de pipelines, não só do notebook).
  2. Dados — versão/hash do dataset de treino e de validação.
  3. Ambiente — versões de bibliotecas (lockfile), versão de CUDA/driver, container image com digest.
  4. Configuração — hiperparâmetros, seed aleatória, flags, splits.
⚠️ Não determinismo em GPU

Mesmo fixando a seed, operações em GPU podem ser não determinísticas (ordem de redução em paralelo). Para reprodutibilidade estrita: torch.use_deterministic_algorithms(True), cudnn.deterministic=True, variável CUBLAS_WORKSPACE_CONFIG — aceitando alguma perda de performance. Para a maioria dos casos, registrar a seed e aceitar variância pequena entre runs é suficiente; documente qual dos dois você escolheu.

3.2 Experiment tracking

FerramentaNota
MLflowPadrão open source; Tracking + Models + Registry + Projects. Roda local ou como serviço.
Weights & BiasesForte em visualização, sweeps de hiperparâmetro, colaboração; SaaS (tem self-hosted).
DVC / DVCLive, Neptune, Comet, ClearMLAlternativas com ênfases diferentes (git-native, escala, automação).
# MLflow: um treino instrumentado — tudo que você vai precisar para reproduzir e comparar
import mlflow

mlflow.set_experiment("churn-v3")
with mlflow.start_run(run_name="xgb-baseline"):
    mlflow.log_params({"max_depth": 6, "eta": 0.1, "seed": 42})
    mlflow.log_param("dataset_hash", dataset_sha)        # versão dos dados
    mlflow.set_tag("git_sha", git_sha)

    model = train(X_train, y_train, params)
    metrics = evaluate(model, X_val, y_val)                # por segmento também!

    mlflow.log_metrics(metrics)
    mlflow.log_artifact("feature_importance.png")
    mlflow.xgboost.log_model(model, "model",
        signature=infer_signature(X_val, model.predict(X_val)))   # schema de entrada/saída

3.3 Boas práticas

💼 Mercado de trabalho

Perguntas: "O que é preciso para reproduzir um experimento de ML?" (código + dados + ambiente + config, todos versionados), "Para que serve um experiment tracker?", "Como você compara duas abordagens de forma justa?" (mesmo split, mesma métrica por segmento, baseline, e atenção à variância entre seeds). Ter usado MLflow ou W&B em um projeto real é praticamente pré-requisito.

✏️ Exercício 3 — O run que não reproduz

Seis meses depois, você precisa reproduzir um modelo em produção. O MLflow tem os hiperparâmetros e a métrica, mas o retreino dá um resultado bem diferente. Liste quatro causas prováveis e o que faltou registrar.

Gabarito: (1) Os dados mudaram — não foi registrado o hash/versão do dataset, então você está treinando com dados novos. (2) Versões de biblioteca diferentes (sem lockfile / sem imagem com digest) — comportamento de XGBoost/sklearn muda entre versões. (3) Seed não registrada ou não fixada. (4) Código do pré-processamento evoluiu e não há o git_sha do pipeline, só do notebook. Faltou: dataset versionado, ambiente containerizado com digest, seed e git_sha do pipeline completo.

MÓDULO 04 · INTERMEDIÁRIO

Feature Store e training-serving skew

Objetivo: entender o problema que a feature store resolve — features consistentes entre treino e produção, sem vazamento temporal — e quando ela vale a complexidade.

4.1 O problema: treino e produção calculam features diferente

No treino, você calcula gasto_medio_30d com um GROUP BY em SQL sobre dados históricos. Em produção, um engenheiro reimplementa o mesmo cálculo em Java, no caminho da requisição. As duas implementações divergem — arredondamento, fuso, tratamento de nulo, janela — e o modelo recebe em produção valores diferentes dos que viu no treino. Isso é training-serving skew, e degrada silenciosamente a performance.

4.2 O que uma feature store faz

ComponenteFunção
Definição única de featureA lógica de cada feature é escrita uma vez e usada por treino e produção — fim do skew
Offline storeHistórico completo (warehouse/lake) para gerar datasets de treino
Online storeÚltimo valor de cada feature (Redis, DynamoDB) para servir com latência de milissegundos
Point-in-time joinAo montar o dataset de treino, pega o valor da feature como era no instante do rótulo — sem vazamento temporal
MaterializaçãoJob que calcula as features e popula o online store
Catálogo / reusoTimes descobrem e reaproveitam features já prontas

Ferramentas: Feast (open source, o mais comum), Tecton, Hopsworks, Featureform, e as feature stores nativas de SageMaker / Vertex / Databricks.

4.3 Point-in-time correctness a razão de existir da feature store

Rótulo: "cliente X deu churn em 2026-03-15"
Feature: gasto_medio_30d

  ERRADO  → gasto_medio_30d calculado com dados até HOJE (inclui período pós-churn) → vazamento
  CERTO   → gasto_medio_30d como era em 2026-03-15 (só dados até ali) → point-in-time join

Fazer esse join corretamente à mão, para dezenas de features e milhões de rótulos com timestamps diferentes, é difícil e propenso a erro. É o principal valor técnico da feature store.

4.4 Você precisa de uma feature store?

Vale a pena quando…É overkill quando…
Vários modelos/times compartilham featuresUm modelo, um time, features simples
Há serving online de baixa latência com features calculadas de eventosPredição em batch, features vêm de uma tabela pronta
Skew treino-produção já causou incidenteTreino e serving usam o mesmo código Python sobre o mesmo dado
Features com janelas temporais e muitos rótulos com datas diferentesSem componente temporal relevante
💡 Alternativa leve

Antes de adotar uma feature store, o mínimo que resolve 70% do skew: uma única função de transformação (um pacote Python) importada tanto pelo pipeline de treino quanto pelo serviço de serving, com testes. Feature store entra quando reuso entre times, online serving e point-in-time viram dor real.

💼 Mercado de trabalho

Perguntas: "O que é training-serving skew e como evitar?", "O que é point-in-time correctness?", "Diferença entre online e offline store", "Quando você NÃO usaria uma feature store?" (a resposta madura reconhece que é infraestrutura pesada e nem todo projeto precisa). Feast é o nome a conhecer.

✏️ Exercício 4 — Skew na prática

Um modelo de fraude usa num_transacoes_ultima_hora. No treino, essa feature vem de uma query no data warehouse. Em produção, é calculada por um serviço que consulta o Redis. A performance em produção está 15% pior que na validação, sem drift aparente nos dados de entrada. Hipótese e correção.

Gabarito: Provável training-serving skew: a query do warehouse e o serviço Redis definem "última hora" ou contam transações de forma diferente (fuso, transações pendentes vs confirmadas, janela deslizante vs fixa, atraso de materialização no Redis). Correção: uma definição única da feature (ideal: feature store com a mesma lógica alimentando offline e online, ou ao menos a mesma biblioteca de cálculo nos dois lados), mais um teste que compara o valor da feature calculado pelos dois caminhos para os mesmos eventos e alarme se divergir além de um limiar.

MÓDULO 05 · INTERMEDIÁRIO

Model registry, versionamento e empacotamento

Objetivo: dar ao modelo um ciclo de vida gerenciado — registrado, versionado, com estágios de promoção, assinatura de schema e empacotamento portável.

5.1 O model registry

Um catálogo central de modelos treinados, cada um com: versão, métricas de avaliação, linhagem (qual run/dados/código o gerou), assinatura de entrada/saída, model card, e um estágio (None → Staging → Production → Archived). Substitui o "qual .pkl está no servidor?" por uma fonte de verdade consultável e auditável.

5.2 Assinatura e validação de schema

O modelo deve declarar o schema que espera (nomes, tipos, ordem das features) e o que produz. Assim, o serviço rejeita uma requisição malformada com erro claro em vez de gerar uma predição silenciosamente errada. MLflow infere isso com infer_signature; frameworks de serving validam na borda.

5.3 Empacotamento: formatos e portabilidade

Formato / abordagemQuando
Pickle / joblibRápido para sklearn interno; frágil (versão da lib, inseguro para artefato não confiável)
ONNXRuntime único, independente de framework; ótimo para portar PyTorch/sklearn para produção e acelerar inferência
SavedModel / TorchScriptNativo de TensorFlow / PyTorch, sem dependência do código de treino
MLflow "flavor" + pyfuncEmpacota modelo + pré-processamento + dependências; interface uniforme predict()
Container com o modelo dentroImagem OCI com digest: reprodutível, roda igual em qualquer lugar; base do serving moderno
⚠️ O modelo não é só os pesos

O artefato de deploy precisa incluir o pré-processamento (encoders, scalers, imputers ajustados no treino) e as versões exatas das libs. Servir os pesos e reimplementar o pré-processamento "na mão" no serviço é a receita mais comum de skew. Empacote o pipeline inteiro (ex.: sklearn.Pipeline ou um pyfunc), não o estimador sozinho.

💼 Mercado de trabalho

Perguntas: "Para que serve um model registry?", "O que é a assinatura de um modelo e por que importa?", "Quando usaria ONNX?", "O que precisa estar no artefato além dos pesos?" (pré-processamento + dependências). Descrever o fluxo run → registro → staging → produção → rollback mostra que você pensa em ciclo de vida, não em arquivo solto.

✏️ Exercício 5 — Desenhe a promoção

Defina o processo para promover um novo modelo de recomendação de "Staging" para "Production", incluindo os gates automáticos e o que permite rollback em minutos.

Gabarito (exemplo): Gates automáticos antes de permitir a promoção: (1) métrica offline no holdout ≥ baseline em produção, por segmento; (2) testes de schema/assinatura passam; (3) teste de carga: p99 de latência e throughput dentro do SLO; (4) teste de sanidade (predições em casos conhecidos); (5) checagem de fairness/enviesamento se aplicável. Promoção move o ponteiro no registry e dispara deploy canário (5% do tráfego) com monitor de métrica online + guardrails de negócio; sobe gradual se estável. Rollback: mover o ponteiro do registry de volta para a versão anterior (que continua empacotada e pronta) — deploy re-aponta em minutos, sem re-treino.

MÓDULO 06 · AVANÇADO

Servir modelos: batch, online e streaming

Objetivo: escolher o padrão de serving certo para o caso, e conhecer as ferramentas e os trade-offs de latência, throughput e custo.

6.1 Os três padrões

PadrãoComoUse quando
Batch (offline)Job periódico gera predições para todos os registros e grava numa tabela; a aplicação lê a tabelaA predição pode ser pré-calculada e não muda a cada segundo: churn diário, lead scoring, recomendações "do dia", risco de carteira
Online (síncrono)Serviço com endpoint REST/gRPC; a aplicação chama e espera a predição na horaA predição depende de input do momento da requisição: fraude no checkout, precificação, busca, ranking personalizado ao vivo
StreamingConsumidor lê eventos (Kafka/Kinesis), pontua e emite resultado no fluxoDecisão contínua sobre eventos: detecção de anomalia em telemetria, scoring de transações em tempo real
💡 Prefira batch quando puder

Batch é mais simples, mais barato e mais robusto: sem SLA de latência, sem serviço 24/7, fácil de testar e reprocessar. Só vá para online quando a predição realmente depender de dados que só existem no instante da requisição, ou quando o conjunto de entidades a pontuar é grande/imprevisível demais para pré-calcular.

6.2 Ferramentas de serving online

FerramentaNota
FastAPI + o modeloSimples e direto para um modelo leve e baixo volume; você cuida de tudo (batching, métricas, escala)
BentoMLEmpacota modelo + código em um "bento", gera imagem, serve com adaptive batching; bom equilíbrio DX/controle
KServe (Kubernetes)Serving declarativo em K8s: autoscaling (inclusive scale-to-zero), canary, várias runtimes; padrão em plataformas grandes
NVIDIA TritonAlta performance, multi-framework, batching dinâmico, execução em GPU concorrente; para inferência pesada/deep learning
Ray ServeServing escalável em Python, bom para pipelines de inferência com múltiplos passos/modelos
Endpoints gerenciados (SageMaker, Vertex)Menos operação, mais custo e lock-in

6.3 Latência, throughput e custo avançado

💼 Mercado de trabalho

Perguntas: "Batch, online ou streaming para [cenário]?" (saber justificar pela dependência de dados do momento e pelo SLA), "Como reduzir a latência de inferência?" (batching dinâmico, quantização, ONNX/TensorRT, CPU vs GPU, caching), "O que é cold start em serving e como mitigar?". KServe e Triton são os nomes de plataforma; BentoML aparece muito em vagas de startup.

✏️ Exercício 6 — Escolha o padrão

Para cada caso, escolha batch / online / streaming e justifique: (a) recomendação de produtos na home, personalizada, atualizada 1x/dia; (b) aprovação de limite de crédito no clique de "solicitar"; (c) detecção de transação anômala num fluxo de milhões/dia; (d) previsão de demanda por SKU para a semana.

Gabarito: (a) Batch — pré-calcula de noite, grava por usuário, a home lê a tabela. (b) Online — depende dos dados que o usuário acabou de informar e precisa de resposta imediata. (c) Streaming — decisão contínua sobre eventos que chegam num fluxo. (d) Batch — horizonte semanal, roda um job e grava as previsões.

MÓDULO 07 · AVANÇADO

CI/CD/CT: pipelines e testes de ML

Objetivo: automatizar o caminho do commit à produção com pipelines reprodutíveis, testes específicos de ML e treinamento contínuo (CT) acionado por eventos.

7.1 As três siglas

7.2 Orquestradores de pipeline de ML

FerramentaNota
Kubeflow PipelinesPipelines em K8s, cada passo um container; pesado, poderoso, cloud-agnóstico
Vertex AI Pipelines / SageMaker PipelinesGerenciados; menos operação, mais lock-in
MetaflowDX excelente em Python, da máquina local à nuvem; origem Netflix
ZenMLCamada de abstração que conecta seu pipeline a vários backends (orquestrador, tracker, registry)
Airflow / Dagster / PrefectOrquestradores gerais; ótimos para o pipeline de dados que alimenta o de ML (ver apostila de Engenharia de Dados)

7.3 Testes específicos de ML

CategoriaExemplos
Testes de dadosSchema (tipos, colunas), faixas e distribuição esperadas, taxa de nulos, cardinalidade, ausência de duplicatas, detecção de skew treino-produção — Great Expectations, TFDV, pandera
Testes de modeloMétrica ≥ limiar no holdout e por segmento; não regride vs modelo em produção; invariâncias ("mudar o nome não muda a predição de risco"); testes direcionais ("mais renda ⇒ não aumenta risco"); robustez a ruído; comportamento em casos extremos
Testes de infraO pipeline de treino roda ponta a ponta com dados de brinquedo; o artefato carrega e serve; a API responde no formato certo; reprodutibilidade (mesmo input ⇒ mesma saída)
Testes de integraçãoPré-processamento de treino == de serving (mesmo resultado); latência sob carga; contrato da API
# Gate de CI: o modelo novo só passa se não regredir em NENHUM segmento importante
def test_no_regression_by_segment(new_model, prod_model, val):
    for seg in ["br", "latam", "novo_cliente", "alto_valor"]:
        s = val[val.segment == seg]
        auc_new  = roc_auc(s.y, new_model.predict_proba(s.X)[:, 1])
        auc_prod = roc_auc(s.y, prod_model.predict_proba(s.X)[:, 1])
        assert auc_new >= auc_prod - 0.01, f"regressão em {seg}: {auc_new:.3f} < {auc_prod:.3f}"

7.4 Continuous Training

💼 Mercado de trabalho

Perguntas: "O que muda no CI de um projeto de ML em relação a software?" (testes de dados e de modelo, gates por segmento, checagem de regressão), "O que é Continuous Training e o que dispara?", "O que é champion/challenger?", "Dê exemplos de testes de modelo além de acurácia" (invariância, direcional, robustez, por segmento). Citar Great Expectations + um orquestrador (Kubeflow/Metaflow) cobre bem.

✏️ Exercício 7 — Projete o pipeline de CT

Um modelo de previsão de atraso de entrega deve se manter atualizado. Descreva o gatilho, os passos do pipeline de retraining e os gates que impedem um modelo pior de ir para produção.

Gabarito: Gatilho: agenda semanal + gatilho extra se o monitor de MAE em produção subir X% ou se detectar drift nas features de rota/clima. Passos: (1) validar dados novos (schema, distribuição, nulos, skew); (2) montar dataset com point-in-time; (3) treinar com os hiperparâmetros versionados (ou sweep curto); (4) avaliar no holdout temporal mais recente, por região e por faixa de distância; (5) comparar com o champion nos mesmos dados. Gates: MAE ≤ MAE do champion em todos os segmentos-chave; testes direcionais (mais distância ⇒ não reduz previsão de atraso); latência de inferência dentro do SLO; sem aumento de erro na cauda. Passou tudo → registra e vai para canário (champion/challenger por 1 semana); só promove se ganhar em dados reais.

MÓDULO 08 · AVANÇADO

Monitoramento em produção: drift e degradação

Objetivo: detectar que o modelo apodreceu — mesmo quando os rótulos reais só chegam semanas depois — distinguindo os tipos de drift e sabendo o que cada um exige.

8.1 Por que modelos apodrecem sozinhos

O modelo aprendeu uma relação entre features e alvo na distribuição de dados de um certo período. O mundo muda: comportamento de cliente, sazonalidade, concorrência, economia, um bug num sistema upstream. A relação que o modelo capturou deixa de valer, e a performance cai — sem ninguém ter mexido em uma linha de código.

8.2 Os tipos de drift

TipoO que mudaExemploResposta
Data drift (covariate shift)A distribuição das features P(X)Entrou um segmento novo de clientes mais jovensMuitas vezes re-treinar com dados recentes resolve
Concept driftA relação P(Y\|X)Pós-pandemia, o mesmo perfil passou a ter risco de crédito diferenteRe-treinar é obrigatório; pode exigir novas features
Label driftA distribuição do alvo P(Y)A taxa de fraude base triplicouRecalibrar limiar; re-treinar
Upstream data changeUm sistema fonte mudou (unidade, encoding, bug)Campo que vinha em reais passou a vir em centavosCorrigir a fonte / o pipeline; não é "drift do mundo"

8.3 Monitorar com e sem rótulos

O desafio real: em muitos problemas o rótulo verdadeiro só chega semanas depois (o cliente deu churn? a entrega atrasou? o empréstimo tornou-se inadimplente em 90 dias?). Você não pode esperar para saber que o modelo está ruim.

SituaçãoO que monitorar
Sem rótulo (ainda)Drift das features de entrada (PSI, KS, distância de distribuição); drift das predições (a distribuição de scores mudou?); taxa de outliers / fora do domínio de treino; performance estimada sem rótulo (NannyML); métricas de proxy de negócio
Com rótulo (atrasado)Métrica real (AUC, MAE, precisão\@k) numa janela deslizante, por segmento; calibração; matriz de confusão ao longo do tempo
⚠️ Drift de feature ≠ modelo pior

Uma feature pode driftar e o modelo continuar bom (se aquela feature pesa pouco, ou se o drift é compensado). E o modelo pode piorar sem drift óbvio nas entradas (concept drift puro). Drift de entrada é um sinal de alerta para investigar, não uma prova de degradação — confirme com performance (real ou estimada) antes de re-treinar por reflexo.

8.4 O loop de retraining

monitor detecta drift/queda ▶ investiga (é o mundo? é bug upstream?) ▶
   se mundo mudou ▶ dispara CT (Módulo 7) ▶ novo modelo passa nos gates ▶
   canary / champion-challenger ▶ promove ▶ atualiza a referência de monitoramento

Cadência de retraining: alguns sistemas re-treinam diariamente, outros trimestralmente. Deixe os dados decidirem — meça com que velocidade a performance decai e escolha a cadência que mantém dentro do SLO, sem re-treinar à toa (custo, risco de introduzir regressão).

💼 Mercado de trabalho

Tema muito cobrado: "Diferença entre data drift e concept drift", "Como você monitora um modelo cujos rótulos só chegam em 60 dias?" (drift de entrada + drift de predição + estimativa de performance + proxies de negócio), "O que é PSI?", "Drift detectado: você re-treina na hora?" (não — investiga se é mudança real do mundo ou bug upstream; confirma impacto na performance). Evidently e NannyML são os nomes a citar.

✏️ Exercício 8 — Plano de monitoramento

Modelo de risco de inadimplência; o rótulo "inadimpliu" só se confirma 90 dias após a concessão. Liste o que você monitora nos primeiros 90 dias e o que dispara cada ação.

Gabarito: Sem rótulo: (1) PSI/KS das features principais vs distribuição de treino, por semana e por segmento; (2) distribuição do score de risco emitido (deslocou para cima/baixo?); (3) taxa de solicitações fora do domínio de treino / outliers; (4) estimativa de performance sem rótulo (NannyML); (5) proxies: taxa de aprovação, ticket médio, mix de canais. Ações: PSI > 0,25 numa feature importante → investigar fonte (bug upstream vs mudança real); deslocamento forte do score → revisar calibração e limiar; estimativa de AUC caindo → preparar CT. Aos 30/60/90 dias, à medida que rótulos parciais chegam (early defaults), começar a medir performance real por safra e comparar com o esperado.

MÓDULO 09 · MUITO AVANÇADO

Governança, escala e custo

Objetivo: operar ML sob auditoria e regulação — linhagem, model risk management, fairness e explicabilidade — e manter custo de treino e inferência sob controle em escala.

9.1 Linhagem e auditabilidade

Para qualquer predição em produção, você deve conseguir responder: qual versão do modelo a gerou, quais dados e código o treinaram, quem aprovou a promoção, quais features entraram e com que valores. Isso exige amarrar registry + experiment tracker + versionamento de dados + logs de predição. É requisito de auditoria em setores regulados (finanças, saúde, seguros) e a base de qualquer investigação de incidente.

9.2 Model Risk Management

9.3 Fairness e explicabilidade avançado

9.4 Custo em escala

FrenteAlavancas
TreinoSpot/preemptible instances, checkpointing para retomar, early stopping, buscar hiperparâmetro com orçamento, treinar só quando o CT justifica, tamanho de dado vs ganho marginal
InferênciaBatch em vez de online quando possível, CPU em vez de GPU quando cabe, quantização/distilação, batching dinâmico, autoscaling e scale-to-zero, cache de predições, escolher o modelo mais barato que atinge o SLO de métrica
DadosAmostragem inteligente para treino, formatos colunares, não materializar features que ninguém usa
VisibilidadeCusto por modelo / por predição / por time; alarme de anomalia de custo (ver apostila de FinOps)

9.5 Estratégias de deploy (recapitulando com foco em risco)

EstratégiaIdeia
ShadowModelo novo pontua o tráfego real sem servir; compara offline antes de expor
CanaryFração pequena do tráfego; monitora métrica online e de negócio; sobe ou reverte
Blue-greenDuas versões prontas; troca instantânea do tráfego; rollback imediato
Champion/challenger (A/B)Compara em produção com métrica de negócio; promove o vencedor consistente
💼 Mercado de trabalho

Vagas sênior e em setores regulados: "O que é um model card?", "Como garantir auditabilidade de uma predição?" (linhagem completa registry↔dados↔código↔logs), "Como você mede fairness e quais os cuidados?" (métricas por grupo, definições conflitantes, proxies), "Como reduzir o custo de inferência sem perder qualidade?". Conectar com governança (NIST AI RMF, EU AI Act) e com FinOps mostra amplitude.

✏️ Exercício 9 — Prepare para auditoria

Um regulador pede: "mostre como a predição de negativa de crédito do cliente #12345, feita em 2026-02-10, foi produzida e por quê". O que seu sistema precisa ter registrado para responder?

Gabarito: (1) Log da predição com timestamp, versão do modelo e ID do registry. (2) Do registry: o run que gerou o modelo, com hash do dataset de treino, git_sha do pipeline, hiperparâmetros, métricas por segmento e o model card. (3) As features exatas usadas na predição (valores no instante t) e sua origem/linhagem. (4) A explicação local (SHAP) daquela predição, registrada junto. (5) O limiar de decisão vigente e sua justificativa. (6) Trilha de aprovação da promoção do modelo. Sem versionamento de dados e sem log de features por predição, essa pergunta é irrespondível.

MÓDULO 10 · CARREIRA

Mercado de trabalho: roadmap, entrevistas e portfólio

Objetivo: converter o conteúdo dos módulos anteriores em aprovação — perfis, roadmap, banco de perguntas com respostas e projetos que geram entrevista.

10.1 Os perfis que contratam

PerfilFocoVem de
ML EngineerConstrói o sistema de ML fim a fim: dados, treino, serving, monitoramentoData science + engenharia, ou backend + ML
MLOps EngineerPlataforma e automação: pipelines, CI/CD/CT, registry, infra de serving, observabilidadeDevOps/SRE, platform engineering
ML Platform EngineerConstrói a plataforma interna que os times de ML usam (self-service)Infra + ML em escala
Applied Scientist / Research EngineerModelagem forte + capacidade de levar a produçãoPesquisa + engenharia

10.2 Roadmap de estudo (10–12 semanas)

SemanasFocoEntregável
1–2Reprodutibilidade: MLflow, versionamento de dados (DVC), splits corretos, leakage (Módulos 1–3)Um projeto de ML com experiment tracking e dados versionados
3Empacotamento e registry: pipeline sklearn completo, assinatura, model registry, ONNX (Módulo 5)Modelo registrado com estágios e model card
4Feature engineering reproduzível e (opcional) Feast; skew (Módulo 4)Mesma lógica de feature em treino e serving, com teste de igualdade
5–6Serving: FastAPI → BentoML → KServe; batch vs online; latência (Módulo 6)Endpoint de predição com testes de carga e métricas
7–8Pipelines e CI/CD/CT: um orquestrador (Metaflow/Kubeflow) + testes de dados/modelo no CI (Módulo 7)Pipeline que treina, avalia com gates por segmento e registra
9–10Monitoramento: Evidently/NannyML, drift, alarme, loop de retraining (Módulo 8)Dashboard de drift + simulação de drift acionando o CT
11–12Governança e custo (Módulo 9); consolidação e escrita do portfólioRepositório público end-to-end + artigo técnico

Base necessária: Python sólido, SQL, Docker, git, noções de Kubernetes e de uma nuvem (AWS ou GCP). CI (GitHub Actions) e IaC básico (Terraform) ajudam muito.

10.3 Banco de perguntas de entrevista (com a resposta que aprova)

Júnior/pleno — "O que é MLOps e por que ele existe?"

É a aplicação de DevOps + engenharia de dados + governança ao ciclo de vida de ML, para levar modelos do notebook à produção e mantê-los úteis. Existe porque o código do modelo é ~5% do sistema (débito técnico oculto), porque modelos degradam sozinhos quando o mundo muda (drift), e porque reproduzir um resultado de ML exige versionar dados, ambiente e config, não só código.

Pleno — "O que é data leakage? Dê exemplos."

É usar no treino informação que não estará disponível no momento da predição, inflando a métrica. Exemplos: target leakage (feature derivada do alvo, tipo data_pagamento para prever pagamento); contaminação treino-teste (scaler ajustado no dataset inteiro antes do split); leakage temporal (janela de agregação que cruza o instante da predição). Teste: para cada feature, "eu teria esse valor no instante t?".

Pleno — "O que é training-serving skew e como evitar?"

É quando o cálculo de features difere entre treino (ex.: SQL no warehouse) e produção (ex.: código no serviço), fazendo o modelo receber valores inconsistentes com o que viu. Evita-se com uma definição única de feature usada pelos dois caminhos — feature store, ou no mínimo uma biblioteca compartilhada — e um teste que compara os valores calculados pelos dois lados.

Pleno/sênior — "Diferença entre data drift e concept drift"

Data drift: muda a distribuição das features P(X) — ex.: novo perfil de clientes. Concept drift: muda a relação entre features e alvo P(Y|X) — ex.: o mesmo perfil passa a ter risco diferente após um choque econômico. Data drift às vezes se resolve re-treinando com dados recentes; concept drift quase sempre exige re-treino e pode exigir novas features. Ambos podem ocorrer sem nenhuma mudança de código.

Sênior — "Como monitorar um modelo cujos rótulos só chegam meses depois?"

Sem rótulo: drift das features (PSI/KS), drift da distribuição das predições, taxa de outliers/fora de domínio, estimativa de performance sem rótulo (NannyML), e proxies de negócio. Com rótulo parcial/atrasado: métrica real por safra numa janela deslizante, por segmento, e calibração. Alarmes ligados a ações (investigar bug upstream vs mudança real; disparar CT).

Sênior — "Desenhe um pipeline de CI/CD/CT para um modelo"

CI: lint + testes de código + testes de dados (schema, distribuição) + testes de modelo (métrica por segmento, invariância, direcional, regressão vs produção). CD: entrega do pipeline e/ou do serviço até staging, com aprovação para produção. CT: gatilho (agenda, dados novos, alarme de drift) → valida dados → treina → avalia com gates → compara com champion → registra → canary/champion-challenger → promove. Falha de gate para e alerta.

Armadilha — "É só colocar o .pkl atrás de um FastAPI"

Funciona para um protótipo, mas ignora: versionamento (qual modelo/dados/código?), o pré-processamento tem que ir junto (senão skew), assinatura de schema, monitoramento de drift, estratégia de rollback, testes de dados e de modelo, e o loop de retraining. Sem isso, o modelo vai degradar em silêncio e ninguém vai conseguir reproduzir nem corrigir.

10.4 Projetos de portfólio que geram entrevista

  1. Projeto end-to-end (âncora): um problema real (churn, previsão de demanda, fraude) com dados versionados (DVC), experiment tracking (MLflow), pipeline de treino orquestrado com gates por segmento, modelo no registry, serving (BentoML/KServe) com testes de carga, e monitoramento de drift (Evidently) que dispara retraining simulado. README + artigo explicando cada decisão.
  2. Demonstração de leakage: pegue um dataset conhecido, introduza (e depois corrija) três tipos de vazamento, mostrando a métrica inflada e a real. Ótimo para entrevista.
  3. Estudo de serving: o mesmo modelo servido de 4 formas (FastAPI, BentoML, ONNX Runtime, Triton) com benchmark de latência/throughput/custo e recomendação.
  4. Monitor de drift do zero: implementar PSI/KS e detecção de drift de predição sobre um stream simulado, com dashboard e alarme — mostra que você entende o mecanismo, não só a ferramenta.

10.5 Ferramentas e fontes para continuar

🏁 Síntese final da apostila

Quatro ideias sustentam MLOps: (1) o modelo é uma fração pequena do sistema — o entorno é onde os projetos vivem ou morrem; (2) reprodutibilidade primeiro — código + dados + ambiente + config versionados, ou nada mais funciona direito; (3) modelos degradam sozinhos, então monitorar drift e fechar o loop de retraining não é opcional; (4) treino e produção precisam calcular features do mesmo jeito — skew é a degradação silenciosa mais comum. As ferramentas mudam a cada ano; esses princípios, não.