Fluxos principais
Mapa rápido
| Fluxo | Caso de uso / entrypoint | Resultado |
|---|---|---|
| Submissão HTTP de treino | submit_model_training_workflow | snapshot processing e DAG run no Airflow |
| Materialização | infra/jobs/materialize_snapshot.py | snapshot canônico ready ou failed |
| Projeção de séries | infra/jobs/project_training_series.py | artefatos particionados por series_id e manifest atualizado |
| Treino de candidatas | infra/jobs/train_model_candidates.py | instâncias DRAFT, métricas, runs e artefatos |
| Promoção | promote_champions TaskGroup | publish, commit transacional e sync de aliases |
| Predição batch | model_prediction DAG | ForecastRuns persistidos por série ativa |
Fluxo ponta a ponta
1. Comando HTTP e snapshot
- entrada: um
model_definition_idna rota, uminput_pathabsoluto local ous3://, apontando para o arquivo, esource_formatexplícito (csvouparquet); organization_idefetivo vem do JWT;- a API cria um
DemandSnapshotemprocessing; - a API dispara a DAG
model_trainingno Airflow; - se o trigger do Airflow falhar, o snapshot é marcado como
failede a API responde503; - a resposta HTTP inclui
run_id,dag_id,orchestrator,snapshot_idestatus.
O HTTP não executa treino, materialização, retry ou polling.
O model_definition_id é a escolha operacional do forecast que será treinado.
Ele aponta para uma política de treino/projeção/promoção já configurada para a
organização. O request não escolhe séries individuais; a população processada é
derivada depois, pela series_projection_recipe resolvida para essa definição.
2. DAG Airflow
A DAG recebe dag_run.conf com:
organization_idmodel_definition_idsnapshot_idrequested_by
Ela executa materialização, treino e um grupo semântico de promoção:
materialize_snapshot -> project_training_series -> train_model_candidates -> promote_champions.publish_training_champions -> promote_champions.commit_training_champion_promotions -> promote_champions.sync_training_champion_aliasesCada task tem retry explícito na própria DAG:
retries=3retry_delay=2 minutos
3. Materialização de snapshot
O job materialize_snapshot:
- carrega o snapshot criado pelo HTTP;
- valida o input bruto antes de persistir artefatos preparados;
- aplica canonicalização/preparação;
- escreve
data.parquetemanifest.jsonno storage canônico; - marca o snapshot como
readyoufailed.
Garantias:
- somente o materializador promove
input_pathpara snapshot consumível; - tenant scope é validado no frame canônico;
- o restante do treino consome apenas o snapshot preparado.
4. Projeção de séries de treino
O job project_training_series:
- carrega o
ModelDefinitione a revisão ativa congelada para o treino; - valida que
organization_iddo comando, do modelo e do manifest batem; - lê os arquivos canônicos indicados por
DemandSnapshotManifest.data_file_uris; - aplica a
series_projection_recipeem Spark; - deriva o
SeriesKey.series_idusado por treino, artefatos, versionamento e promoção; - grava o dataset particionado por
series_id; - atualiza o
manifest.jsoncomprojected_series_data_urieprojected_series_index_uri.
Essa etapa existe para separar duas responsabilidades que antes ficavam misturadas: materializar o snapshot bruto validado e construir a visão de treino do modelo ativo. O snapshot canônico continua sendo a fonte congelada do ciclo; a projeção é uma visão derivada, específica da configuração de treino.
Essa visão derivada é completa para o ModelDefinition escolhido. Se a receita
alvo for sku_store diária, o job grava todas as séries SKU-loja diárias
presentes no snapshot. Se a receita alvo for category_store semanal, ele grava
todas as séries categoria-loja semanais deriváveis do mesmo snapshot. O fluxo
atual não tem parâmetro de “treinar só esta lista de séries”.
5. Treino de candidatas
O job train_model_candidates:
- carrega
ModelDefinition,manifeste os artefatos projetados por série; - monta um
TrainingRunContextcom a configuração congelada; - resolve
ResolvedStrategyCandidatepara cada estratégia habilitada; - carrega somente as partições necessárias por
series_id; - aplica a
feature_recipeda candidata ao frame da série; - decide a ação de cada série (
SEARCH_CANDIDATESouREFRESH_CHAMPION); - agrupa as decisões em
StrategyTrainingWorkItemexecutáveis; - avalia cada candidata em holdout temporal por série;
- persiste artefatos, métricas, child runs de MLflow e candidatas
DRAFT.
Regras relevantes:
- o use case de treino abre uma sessão lógica de treino quando nenhuma sessão
pai é injetada; cada série cria um run pai de MLflow com nome derivado do
SeriesKey, e cada candidata dessa série recebemlflow.parentRunId; - o conjunto de séries vem do índice projetado pela definição escolhida no trigger; não há roteamento granular adicional entre projeção e treino;
- séries sem campeã ativa rodam busca completa;
- campeãs ativas só passam por refresh quando a política permite e os hashes de configuração resolvida, validação, projeção, features, parâmetros e seleção continuam compatíveis com a configuração atual;
- se a configuração mudou, se o reaproveitamento foi desabilitado ou se a estratégia campeã saiu do catálogo habilitado, a série volta para busca completa;
- falha de estratégia ou treino falha claramente a task, sem falso sucesso terminal;
SeriesKeycontinua sendo a identidade semântica usada para versionamento, promoção, artefatos e auditoria;- paralelismo de treino é configuração de execução (
execution.max_workers), mantendo uma chamada deModelStrategy.train(...)por série.
6. Promoção
O TaskGroup promote_champions:
publish_training_championsrecarrega candidatas duráveis, seleciona campeãs e publica versões imutáveis no registry quando MLflow está configurado;commit_training_champion_promotionspromove todas as campeãs paraACTIVEem uma única gravação ClickHouse com auditoria;sync_training_champion_aliasessincroniza aliases do registry depois do commit local.
Regras relevantes:
- o domínio permite uma única instância ativa por série;
- a promoção usa as métricas retornadas pela estratégia e persistidas nas candidatas;
- a promoção recebe a
model_versioncongelada pelo treino e usa a política persistida noresolved_config_snapshotda candidata, não thresholds ou métrica primária carregados da configuração ativa no momento do retry; - ClickHouse é a fonte de verdade da campeã ativa; aliases do registry são uma projeção externa retryable.
A composição in-process control/modeling/workflows.py também monta um
training_report.json quando ela é usada para treinar e promover no mesmo
processo. O caminho Airflow atual divide treino e promoção em tasks separadas;
ele não depende desse relatório para persistir candidatas, campeãs ou auditoria.
Quando gerado, o relatório consolida:
- perfil de cada série (
n_periods, janela de datas, média/desvio, percentual de zeros, ADI, CV2 e segmento); - candidatas treinadas, métricas, tags, URI do artefato, run ID, versão da instância e configuração resolvida;
- flags de campeã (
is_champion,champion_run_id,champion_strategy_key); - explicação opcional do modelo, como colunas de feature e coeficientes/importâncias quando a estratégia fornece.
O relatório não define uma segunda forma de identidade de série: ele serializa o
SeriesKey completo no campo series_key, incluindo organização, series_id,
granularidade, tipo de série e dimensões.
Esse relatório em MLflow é observabilidade e debugging. Ele não é fonte de verdade para campeãs, auditoria de promoção, referências de serving, fingerprints de configuração, URIs necessários para serving ou métricas usadas em promoções futuras; esses dados continuam no domínio e na persistência command-side.
A classificação de séries (smooth, intermittent, erratic, lumpy,
no_demand) é regra de domínio em domain.demand.training. O cálculo do perfil
numérico do frame passa pela porta profile_training_series(...) de
data-preparation, para que cada runtime use operações nativas e eficientes de
dataframe e entregue as estatísticas ao classificador de domínio.
API HTTP
No caminho HTTP atual:
/v1/*exige JWT bearer;- o
organization_idefetivo vem do token; - a API expõe comandos de configuração e submissão de treino;
- treino e predição são disparados por
model_definition_id; - não há seletor HTTP para atribuir séries individuais a outra definição ou
limitar o treino a uma lista de
SeriesKey; - não há endpoint de previsão online;
- não há endpoint de retry/cancelamento de job interno;
- inferência batch/offline existe como exceção explícita do command side, via
POST /v1/model-definitions/{model_definition_id}/prediction-jobse DAGmodel_prediction.
Falhas esperadas e tratamento
| Cenário | Comportamento esperado |
|---|---|
| Airflow indisponível antes de criar DAG run | snapshot marcado como failed, HTTP responde 503 |
| Materialização falha | task falha no Airflow; snapshot fica failed |
| Estratégia falha no treino | task de treino falha no Airflow; erro aparece no DAG run |
| Sem candidata elegível | job de promoção conclui sem promoção para a série |
| Airflow retry | reexecuta a task conforme política da DAG |
Onde ver detalhes
- Runtime e deploy para operação HTTP, Airflow e jobs.
- Airflow e jobs para DAG, tasks e retry.
- Nixtla para treino e artefatos da integração Nixtla.
- Configuração de model definition para exemplos de
strategy_specs. - Storage e artefatos para path de entrada, snapshot e artifact store.
- Control plane vs data-preparation para a separação entre governança durável e execução frame-first.
- Data-preparation flow para o fluxo técnico detalhado e responsabilidades por componente.
- Projeção de séries de treino para a etapa Spark entre snapshot canônico e treino Polars.
- Predição batch para o fluxo de inferência suportado.
- Modelo de domínio para invariantes dos aggregates.
- Code map para localizar os módulos dos fluxos acima.