Treinamento e promoção
Contexto operacional
Este fluxo é o pipeline de decisão de modelo da plataforma. Ele define qual versão e estratégia passam a representar a “verdade operacional” para inferência por série.
Caso de uso
train_candidates_and_promote_champion (em application.engine.use_cases).
Entrada:
TrainCandidatesAndPromoteChampionCommand(model_definition_id=...)
Dependências (ports):
ModelingRepositoryPortDemandReadRepositoryPortStrategyRegistryPortExperimentTrackerPortArtifactStorePortModelRegistryPort(opcional, quando a promoção precisa sincronizar com MLflow Registry)DomainToColumnarPort
Saída:
- lista de
PromotionResult(uma por série promovida).
Etapas internas
- Carrega
ModelDefinition. - Busca séries elegíveis via
target_selector. - Congela o
ModelDefinitioncorrente em umModelVersion. - Agrupa o treino por estratégia habilitada.
- Para cada estratégia:
- lê
execution.training_modeemStrategySpec.params_schema; - modo padrão:
series; - modo
batch: exige suporte explícito viatrain_batch(...).
- lê
- Executa o treino:
series: mantém o fluxo atual, umaTrainRequestpor série;batch: monta uma únicaBatchTrainRequestcom todas as séries elegíveis da estratégia.
- Registra parâmetros e tags no tracker:
series: uma run por série;batch: uma run compartilhada por estratégia/lote.
- Resolve artefatos:
- por série (
artifact_uri/artifact_payload) como antes; - ou compartilhados no lote (
shared_artifact_uri/shared_artifact_payload).
- por série (
- Cria uma
ModelInstancecandidata (DRAFT) por série bem-sucedida, vinculada aomodel_versioncongelado do passo 3. - Seleciona campeão por
select_champion(...). - Persiste os candidatos
DRAFTem armazenamento durável. - Quando
ModelRegistryPortestá presente:
- chama
activate_model_instance(...); - cria registro de auditoria (
PromotionAuditRecord); - registra uma versão concreta no MLflow Registry;
- sincroniza o alias operacional
champion; - persiste
ModelDefinitioncom metadados de registry.
- Sem registry configurado, promove campeão localmente para
ACTIVEe persisteModelDefinition.
Modos de treino
Convenção recomendada em StrategySpec.params_schema:
{ "execution": { "training_mode": "series" }}Valores suportados:
seriesbatch
Compatibilidade:
- ausência de
execution.training_modepreserva o comportamento legado; - estratégias sem
train_batch(...)continuam válidas emseries; batchfalha cedo se a estratégia resolvida não suportar batch training.
Lineage de configuração
Antes de iniciar o treino, a engine captura um ModelVersion com snapshot
congelado da definição corrente. Isso garante que:
- todas as
TrainRequestdo fluxo usam params derivados desse snapshot; - cada
ModelInstancecriada no treino aponta para omodel_versionusado; - previsões futuras reconstituem params pela referência da instância, não pelo
StrategySpec.params_schemamutável em memória.
Política de campeão
A decisão usa:
primary_metric(e direçãoMIN/MAX);promotion_thresholdspor métrica.
Regras:
- candidato fora dos thresholds é descartado;
- direção
MIN: menor métrica primária vence; - direção
MAX: maior métrica primária vence.
Ativação explícita
Além do fluxo agregado de treino, a engine agora expõe o caso de uso
activate_model_instance(...).
Ele existe para separar duas responsabilidades que antes ficavam acopladas:
- gerar candidatos;
- tornar uma versão servível em produção.
Entrada:
ActivateModelInstanceCommandmodel_definition_idseries_keyversionactor_idreasonmetric_snapshotserving_alias(default:champion)
Saída:
ActivationResult- versão promovida;
- nome/versionamento do modelo no registry;
- alias de serving;
- id do registro de auditoria.
Esse fluxo é idempotente por desenho: se a instância já tiver referência de registry persistida, um retry reaproveita essa referência e força novamente o alias operacional.
Resiliência do fluxo
Se uma estratégia falhar no treino:
- o run é finalizado como
FAILEDno tracker; - o erro não interrompe as outras estratégias;
- a promoção continua com os candidatos válidos.
No modo batch:
- exceção em
train_batch(...)falha o lote inteiro da estratégia; - resultado misto é aceito;
- séries com
errorexplícito não viramModelInstance; - séries bem-sucedidas do mesmo lote continuam elegíveis para promoção.
Esse comportamento evita indisponibilidade de pipeline por falha pontual de estratégia.
Semântica de artefato e tracking em batch
Quando uma única execução treina várias séries:
- continua existindo uma
ModelInstanceporSeriesKey; - instâncias podem compartilhar o mesmo
artifact_uri; - instâncias podem compartilhar o mesmo
mlflow_run_id; - promoção, ativação e fallback continuam estritamente por série.
Exemplo de integração de estratégia
from application.engine.contracts import TrainResult
class MinhaEstrategia: def train(self, request): return TrainResult( metrics={"mae": 0.64, "rmse": 0.91}, artifact_payload=b"modelo-binario", )
def predict(self, request): raise NotImplementedErrorExemplo batch-capable:
from application.engine.contracts import BatchTrainResult, BatchTrainSeriesResult
class MinhaEstrategiaBatch: def train_batch(self, request): return BatchTrainResult( series_results=tuple( BatchTrainSeriesResult(series_key=item.series_key, metrics={"mae": 0.64}) for item in request.items ), shared_artifact_payload=b"modelo-painel", tags={"engine_family": "nixtla-statsforecast"}, )Checklist de produção
ModelDefinitionpossuiprimary_metriccoerente comevaluator_specs?- Existe ao menos uma estratégia habilitada?
strategy_keydo registro bate comStrategySpec.strategy_key?ArtifactStorePortgera URI estável e auditável?ExperimentTrackerPortregistra params, métricas e artefato?TrainResult.tagscarrega metadados auditáveis como engine family e model name?ModelRegistryPortcria uma versão concreta e sincroniza o aliaschampion?ModelingRepositoryPortpersistePromotionAuditRecordcom ator, motivo e evidência?