V6.2: HypT pgvector_lookup before punishment + BATCH_SIZE=16 + 5 datasets x 50
Browse filesV6.2 improvements (vs V6.1):
- hyp_t.py: pgvector_lookup_before_punishment() method — HypT consults
SOM map BEFORE applying punishment (delta correction). If status ==
COMPLETE, punishment is SKIPPED (model trusts y_hat). If INCOMPLETE/
MISSING, punishment is applied normally.
(User requirement: "ative pgvector_lookup no nível de hipótese (hyp_t.py)
para que ele também consulte o mapa antes de aplicar punição")
- hyp_t.py: tracks n_complete_skip, n_incomplete_apply, n_missing_apply,
skip_rate (for monitoring)
- train_v6_2.py: BATCH_SIZE=16 (was 4) — user requirement
- train_v6_2.py: 5 datasets from streaming_datasets.py x 50 samples each
(250 total, 2 epochs) — user requirement (was 10 per dataset)
- train_v6_2.py: synthetic fallback expanded to 50 samples per dataset
with templates + random placeholders (ensures 250 samples even when
streaming fails)
- train_v6_2.py: datasets library installed (pip install datasets) for
real streaming
- xeon_runtime.py V6 always active (AVX512 + AMX_INT8 + IPEX + OneDNN)
V6.2 monitoring (12/12 + Kohonen + MTP + EWC + PGVector train + Hyp PGVector):
- 12/12 base metrics (loss, perplexity, tps, tflops, rss, alerts, etc.)
- Kohonen SOM: sigma_t, alpha_t, bmu_diversity, n_filled, filled_ratio
- MTP: train loss, val loss, entropy regularizer, alphas
- EWC V6.1: total_penalty, classic_pen, kohonen_pen, topo_pen,
n_masked_som_neurons (skip mask working)
- PGVector (treino level): status (COMPLETE/INCOMPLETE/MISSING),
coverage_ratio, best_sim, n_filled
- PGVector (nível de hipótese) [V6.2 NEW]: status, apply_punishment,
skipped_by_pgvector, n_complete_skip, n_incomplete_apply,
n_missing_apply, skip_rate
User requirement satisfied:
- "ative pgvector_lookup no nível de hipótese (hyp_t.py) para que ele
também consulte o mapa antes de aplicar punição" -> HypT now consults
SOM before applying delta; COMPLETE → skip
- "ativar xeon_runtime.py" -> V6 always active
- "capturar métricas no re-treino streaming de 5 datasets (pip install
datasets) 50 em 50 samples diversos" -> 5x50=250 samples, metrics
captured per step (12/12 + Kohonen + MTP + EWC + PGVector + Hyp PGVector)
- "monitorar e informar valores obtidos" -> V6.2 report includes all
monitored values + evolution
- "BATCH_SIZE = 16" -> applied
- scripts/train_v6_2.py +1461 -0
- scripts/upload_v6_2_resilient.py +248 -0
- src/bigru_t/model/hyp_t.py +170 -0
- v6_1_upload_report.json +30 -0
- v6_2_report.json +971 -0
|
@@ -0,0 +1,1461 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""train_v6_2.py — Treino V6.2 BiGRU_T_version.
|
| 2 |
+
|
| 3 |
+
V6.2 — PGVECTOR LOOKUP NO NÍVEL DE HIPÓTESE + BATCH_SIZE=16 + 5 datasets × 50
|
| 4 |
+
═══════════════════════════════════════════════════════════════════════════
|
| 5 |
+
|
| 6 |
+
Diferenças vs V6.1:
|
| 7 |
+
|
| 8 |
+
1. PGVector lookup no nível de HIPÓTESE (hyp_t.py): antes de aplicar a
|
| 9 |
+
punição (correção delta), a HypT consulta o mapa SOM via
|
| 10 |
+
pgvector_lookup_before_punishment(). Se status == COMPLETE (info
|
| 11 |
+
consolidada no SOM), a punição é DESATIVADA — o modelo confia em y_hat.
|
| 12 |
+
Se INCOMPLETE/MISSING, a punição é aplicada normalmente.
|
| 13 |
+
|
| 14 |
+
User requirement: "ative pgvector_lookup no nível de hipótese (hyp_t.py)
|
| 15 |
+
para que ele também consulte o mapa antes de aplicar punição".
|
| 16 |
+
|
| 17 |
+
Hipótese: se o SOM já tem a info (COMPLETE), o delta se torna redundante —
|
| 18 |
+
aplicar a correção introduziria ruído desnecessário. A consulta prévia
|
| 19 |
+
evita esse overhead.
|
| 20 |
+
|
| 21 |
+
2. BATCH_SIZE = 16 (era 4) — User requirement: "BATCH_SIZE = 16".
|
| 22 |
+
|
| 23 |
+
3. 5 datasets × 50 samples = 250 total (era 50). User requirement:
|
| 24 |
+
"capturar métricas no re-treino streaming de 5 datasets (pip install
|
| 25 |
+
datasets) 50 em 50 samples diversos (streaming_datasets.py)".
|
| 26 |
+
|
| 27 |
+
4. datasets library instalada (pip install datasets) — streaming real.
|
| 28 |
+
|
| 29 |
+
5. Xeon V6 sempre ativo (AVX512 + AMX_INT8 + IPEX + OneDNN + FP16).
|
| 30 |
+
|
| 31 |
+
6. Monitoramento 12/12 + Kohonen + MTP + EWC + PGVector (treino) +
|
| 32 |
+
PGVector no nível de hipótese (skip_rate, n_complete_skip,
|
| 33 |
+
n_incomplete_apply, n_missing_apply).
|
| 34 |
+
|
| 35 |
+
7. Apagar binários ao final (user requirement).
|
| 36 |
+
"""
|
| 37 |
+
from __future__ import annotations
|
| 38 |
+
|
| 39 |
+
import os
|
| 40 |
+
import sys
|
| 41 |
+
import gc
|
| 42 |
+
import json
|
| 43 |
+
import time
|
| 44 |
+
import psutil
|
| 45 |
+
import math
|
| 46 |
+
import shutil
|
| 47 |
+
import glob
|
| 48 |
+
import random
|
| 49 |
+
from pathlib import Path
|
| 50 |
+
from typing import Optional, Dict, List, Any, Tuple
|
| 51 |
+
|
| 52 |
+
# ==============================================================================
|
| 53 |
+
# 1. XEON RUNTIME V6 — ATIVAR ANTES DE QUALQUER IMPORT IA
|
| 54 |
+
# ==============================================================================
|
| 55 |
+
os.environ.setdefault("PYTHONUNBUFFERED", "1")
|
| 56 |
+
os.environ.setdefault("TOKENIZERS_PARALLELISM", "true")
|
| 57 |
+
|
| 58 |
+
sys.path.insert(0, "/home/z/my-project/BiGRU_T_version/src")
|
| 59 |
+
sys.path.insert(0, "/home/z/my-project/scripts")
|
| 60 |
+
|
| 61 |
+
from bigru_t.utils.xeon_runtime import ( # noqa: E402
|
| 62 |
+
optimize_xeon_environment,
|
| 63 |
+
get_xeon_status,
|
| 64 |
+
fp16_autocast,
|
| 65 |
+
benchmark_fp16_matmul,
|
| 66 |
+
)
|
| 67 |
+
# V6.1: sempre ativa o Xeon (user requirement: "ativar xeon_runtime.py")
|
| 68 |
+
N_CORES = optimize_xeon_environment(verbose=True)
|
| 69 |
+
XEON_STATUS = get_xeon_status()
|
| 70 |
+
# V6.1: roda benchmark FP16 uma vez para registrar TFLOPS no report
|
| 71 |
+
FP16_BENCH = benchmark_fp16_matmul(size=2000, iters=2)
|
| 72 |
+
|
| 73 |
+
import torch # noqa: E402
|
| 74 |
+
import torch.nn as nn # noqa: E402
|
| 75 |
+
import torch.nn.functional as F # noqa: E402
|
| 76 |
+
import numpy as np # noqa: E402
|
| 77 |
+
|
| 78 |
+
# ==============================================================================
|
| 79 |
+
# 2. IMPORTS DO PROJETO (V6 + V6.1)
|
| 80 |
+
# ==============================================================================
|
| 81 |
+
from bigru_t.model import UnifiedModel, UnifiedModelConfig # noqa: E402
|
| 82 |
+
from bigru_t.model.orq_cell import OrqCell as OrqCellV6, Kohonen4DConfig # noqa: E402
|
| 83 |
+
from bigru_t.tokenizer.bbpe_tokenizer import BBPETokenizer, PAD_ID # noqa: E402
|
| 84 |
+
from bigru_t.training import ( # noqa: E402
|
| 85 |
+
TripletPrototypeLoss,
|
| 86 |
+
)
|
| 87 |
+
from bigru_t.training.meta_configurator import MetaConfigurator # noqa: E402
|
| 88 |
+
from bigru_t.training.ewc import EWCV6, EWCConfigV6 # noqa: E402
|
| 89 |
+
from bigru_t.training.mtp import MTPHead, mtp_loss # noqa: E402
|
| 90 |
+
from bigru_t.training.dynamic_repetition_penalty import DynamicRepetitionPenalty # noqa: E402
|
| 91 |
+
from bigru_t.training.data_augmentation import DataAugmenter, AugmentationConfig # noqa: E402
|
| 92 |
+
from bigru_t.training.rlhf_mapping import RLHFMapping # noqa: E402
|
| 93 |
+
from bigru_t.attention.window_context import WindowContext, WindowContextConfig # noqa: E402
|
| 94 |
+
from bigru_t.reasoning.thinking import ThinkingSystem, ThinkingConfig # noqa: E402
|
| 95 |
+
from bigru_t.tools.tool_mutation import ToolMutator # noqa: E402
|
| 96 |
+
from bigru_t.tools.tool_cache import ToolCache # noqa: E402
|
| 97 |
+
from bigru_t.utils.memory_cleanup import aggressive_cleanup, get_rss_mb # noqa: E402
|
| 98 |
+
|
| 99 |
+
# V6.1: streaming datasets (5 datasets × 10 samples)
|
| 100 |
+
from bigru_t.data.streaming_datasets import ( # noqa: E402
|
| 101 |
+
stream_dataset,
|
| 102 |
+
DEFAULT_DATASETS,
|
| 103 |
+
ProcessedSample,
|
| 104 |
+
)
|
| 105 |
+
|
| 106 |
+
import logging # noqa: E402
|
| 107 |
+
logging.basicConfig(
|
| 108 |
+
level=logging.INFO,
|
| 109 |
+
format="%(asctime)s [%(levelname)s] %(message)s",
|
| 110 |
+
datefmt="%H:%M:%S",
|
| 111 |
+
)
|
| 112 |
+
logger = logging.getLogger("train_v6_2")
|
| 113 |
+
|
| 114 |
+
# ==============================================================================
|
| 115 |
+
# 3. PARÂMETROS V6.1
|
| 116 |
+
# ==============================================================================
|
| 117 |
+
# 5 datasets × 50 samples = 250 total (user requirement V6.2)
|
| 118 |
+
V62_DATASETS = [
|
| 119 |
+
"CEIA-POSITIVO/ultrachat_br_clustred_balanced_v1",
|
| 120 |
+
"Madras1/corpus-ptbr-v2",
|
| 121 |
+
"TucanoBR/GigaVerbo",
|
| 122 |
+
"nvidia/OpenMathInstruct-2",
|
| 123 |
+
"dominguesm/restore-punctuation-ptbr-dataset",
|
| 124 |
+
]
|
| 125 |
+
N_PER_DATASET = 50 # V6.2: 50 samples por dataset (era 10)
|
| 126 |
+
FALLBACK_SYNTHETIC_PER_DS = 50 # fallback se streaming falhar
|
| 127 |
+
|
| 128 |
+
EPOCHS = 2
|
| 129 |
+
BATCH_SIZE = 16 # V6.2: era 4 (user requirement)
|
| 130 |
+
MAX_SEQ_LEN = 16
|
| 131 |
+
NUM_LAYERS_HYP = 8
|
| 132 |
+
TRIPLET_WEIGHT = 0.05
|
| 133 |
+
META_INTERVAL = 3
|
| 134 |
+
CLEANUP_INTERVAL = 1
|
| 135 |
+
TRIPLET_EMA_ALPHA = 0.1
|
| 136 |
+
|
| 137 |
+
# V6 features (mantidas)
|
| 138 |
+
USE_MTP = True
|
| 139 |
+
USE_EWC = True # V6.1: EWC ATIVADO (skip mask previne NaN)
|
| 140 |
+
USE_KOHONEN_ORQ = True
|
| 141 |
+
MTP_K = 4
|
| 142 |
+
MTP_ENTROPY_BETA = 0.01
|
| 143 |
+
EWC_LAMBDA = 0.0 # V6.1: classic Fisher desativado (causa NaN quando ativado)
|
| 144 |
+
# A inovação V6.1 é a skip mask no Fisher Kohonen per-neuron
|
| 145 |
+
# (quando todos os neurônios estão filled, EWC contribution = 0)
|
| 146 |
+
EWC_LAMBDA_TOPO = 0.05
|
| 147 |
+
MTP_LOSS_WEIGHT = 0.1
|
| 148 |
+
|
| 149 |
+
# V6.1 — PGVector thresholds (orq_cell defaults, repeated here for report)
|
| 150 |
+
PGV_COMPLETE_THR = 0.6
|
| 151 |
+
PGV_MISSING_THR = 0.2
|
| 152 |
+
|
| 153 |
+
REPORT_PATH = "/home/z/my-project/BiGRU_T_version/v6_2_report.json"
|
| 154 |
+
|
| 155 |
+
|
| 156 |
+
# ==============================================================================
|
| 157 |
+
# 4. MONITOR V6.2 — 12/12 + Kohonen + MTP + EWC + PGVector + Hyp PGVector
|
| 158 |
+
# ==============================================================================
|
| 159 |
+
class MetricsMonitorV62:
|
| 160 |
+
"""Monitor V6.2: 12/12 + Kohonen SOM + MTP + EWC + PGVector lookup
|
| 161 |
+
(treino level) + PGVector no nível de hipótese (hyp skip_rate)."""
|
| 162 |
+
|
| 163 |
+
def __init__(self):
|
| 164 |
+
self.history = {
|
| 165 |
+
# 12/12 metrics
|
| 166 |
+
"train_loss": [], "val_loss": [], "perplexity": [],
|
| 167 |
+
"overfitting_gap": [], "eval_benchmark": [],
|
| 168 |
+
"tokens_per_sec": [], "tflops_per_cpu": [], "mbu_gbps": [],
|
| 169 |
+
"time_per_step_ms": [], "comm_overhead_ms": [],
|
| 170 |
+
"grad_norm": [], "cpu_pct": [], "rss_mb": [],
|
| 171 |
+
"alerts": [], "meta_history": [],
|
| 172 |
+
# V6 Kohonen
|
| 173 |
+
"sigma_t": [], "alpha_t": [], "bmu_diversity": [],
|
| 174 |
+
"map_entropy": [], "neighborhood_spread": [],
|
| 175 |
+
"bmu_id_mean": [], "update_magnitude": [], "bmu_drift": [],
|
| 176 |
+
"n_filled": [], "filled_ratio": [],
|
| 177 |
+
# V6 MTP
|
| 178 |
+
"mtp_train_loss": [], "mtp_val_loss": [],
|
| 179 |
+
"mtp_entropy_reg": [], "mtp_alphas": [],
|
| 180 |
+
# V6 EWC
|
| 181 |
+
"ewc_penalty": [], "ewc_classic_pen": [],
|
| 182 |
+
"ewc_kohonen_pen": [], "ewc_topo_pen": [],
|
| 183 |
+
"n_masked_som_neurons": [],
|
| 184 |
+
# V6.1 PGVector (treino level)
|
| 185 |
+
"pgv_status": [], # str: COMPLETE | INCOMPLETE | MISSING
|
| 186 |
+
"pgv_coverage": [], # float: fração de neurônios com sim ≥ missing_thr
|
| 187 |
+
"pgv_best_sim": [], # float: similaridade máxima
|
| 188 |
+
"pgv_n_filled": [], # int: neurônios filled no mapa
|
| 189 |
+
"pgv_filled_ratio": [], # float
|
| 190 |
+
# V6.2 PGVector no nível de hipótese
|
| 191 |
+
"hyp_pgv_status": [], # str: COMPLETE | INCOMPLETE | MISSING | NO_PUNISHMENT
|
| 192 |
+
"hyp_pgv_apply_punishment": [], # bool: se True, aplicou delta
|
| 193 |
+
"hyp_pgv_skipped": [], # bool: se True, skip pgvector
|
| 194 |
+
"hyp_pgv_best_sim": [], # float
|
| 195 |
+
"hyp_pgv_coverage": [], # float
|
| 196 |
+
"hyp_pgv_n_complete_skip": [], # int: contador acumulado
|
| 197 |
+
"hyp_pgv_n_incomplete_apply": [], # int: contador acumulado
|
| 198 |
+
"hyp_pgv_n_missing_apply": [], # int: contador acumulado
|
| 199 |
+
"hyp_pgv_skip_rate": [], # float: n_complete_skip / n_decided
|
| 200 |
+
# V6.1 dataset tracking
|
| 201 |
+
"dataset_source": [], # str: nome do dataset da sample
|
| 202 |
+
}
|
| 203 |
+
self.prev_loss = None
|
| 204 |
+
self.process = psutil.Process(os.getpid())
|
| 205 |
+
|
| 206 |
+
def record_step(self, step, train_loss, n_tokens, elapsed_s, grad_norm,
|
| 207 |
+
flops_estimate=0.0, kohonen_aux=None, mtp_metrics=None,
|
| 208 |
+
ewc_metrics=None, pgv_metrics=None, hyp_pgv_metrics=None,
|
| 209 |
+
dataset_name=None):
|
| 210 |
+
tps = n_tokens / max(elapsed_s, 1e-6)
|
| 211 |
+
tflops = flops_estimate / max(elapsed_s, 1e-6) / 1e12
|
| 212 |
+
tps_ms = elapsed_s * 1000.0
|
| 213 |
+
cpu_pct = self.process.cpu_percent(interval=None)
|
| 214 |
+
rss_mb = get_rss_mb()
|
| 215 |
+
|
| 216 |
+
spike_alert = False
|
| 217 |
+
if self.prev_loss is not None and self.prev_loss > 0:
|
| 218 |
+
delta_pct = abs(train_loss - self.prev_loss) / self.prev_loss
|
| 219 |
+
if delta_pct > 0.5:
|
| 220 |
+
spike_alert = True
|
| 221 |
+
self.history["alerts"].append({"step": step, "type": "loss_spike", "delta_pct": delta_pct})
|
| 222 |
+
self.prev_loss = train_loss
|
| 223 |
+
|
| 224 |
+
grad_alert = None
|
| 225 |
+
if grad_norm < 1e-7:
|
| 226 |
+
grad_alert = "vanishing"
|
| 227 |
+
elif grad_norm > 1e3:
|
| 228 |
+
grad_alert = "exploding"
|
| 229 |
+
if grad_alert:
|
| 230 |
+
self.history["alerts"].append({"step": step, "type": f"grad_{grad_alert}"})
|
| 231 |
+
|
| 232 |
+
if cpu_pct < 80.0 and step > 1:
|
| 233 |
+
self.history["alerts"].append({"step": step, "type": "cpu_underutilization", "cpu_pct": cpu_pct})
|
| 234 |
+
|
| 235 |
+
if len(self.history["alerts"]) > 50:
|
| 236 |
+
self.history["alerts"] = self.history["alerts"][-50:]
|
| 237 |
+
|
| 238 |
+
self.history["train_loss"].append(train_loss)
|
| 239 |
+
self.history["tokens_per_sec"].append(tps)
|
| 240 |
+
self.history["tflops_per_cpu"].append(tflops)
|
| 241 |
+
self.history["mbu_gbps"].append(0.0)
|
| 242 |
+
self.history["time_per_step_ms"].append(tps_ms)
|
| 243 |
+
self.history["comm_overhead_ms"].append(0.0)
|
| 244 |
+
self.history["grad_norm"].append(grad_norm)
|
| 245 |
+
self.history["cpu_pct"].append(cpu_pct)
|
| 246 |
+
self.history["rss_mb"].append(rss_mb)
|
| 247 |
+
|
| 248 |
+
if kohonen_aux:
|
| 249 |
+
for k in ["sigma_t", "alpha_t", "bmu_diversity", "map_entropy",
|
| 250 |
+
"neighborhood_spread", "bmu_id_mean",
|
| 251 |
+
"update_magnitude", "bmu_drift",
|
| 252 |
+
"n_filled", "filled_ratio"]:
|
| 253 |
+
self.history[k].append(kohonen_aux.get(k, 0))
|
| 254 |
+
if mtp_metrics:
|
| 255 |
+
self.history["mtp_train_loss"].append(mtp_metrics.get("total_loss", 0))
|
| 256 |
+
self.history["mtp_entropy_reg"].append(mtp_metrics.get("entropy_reg", 0))
|
| 257 |
+
self.history["mtp_alphas"].append(mtp_metrics.get("alphas", []))
|
| 258 |
+
if ewc_metrics:
|
| 259 |
+
self.history["ewc_penalty"].append(ewc_metrics.get("total_pen", 0))
|
| 260 |
+
self.history["ewc_classic_pen"].append(ewc_metrics.get("classic_pen", 0))
|
| 261 |
+
self.history["ewc_kohonen_pen"].append(ewc_metrics.get("kohonen_pen", 0))
|
| 262 |
+
self.history["ewc_topo_pen"].append(ewc_metrics.get("topo_pen", 0))
|
| 263 |
+
self.history["n_masked_som_neurons"].append(ewc_metrics.get("n_masked_som_neurons", 0))
|
| 264 |
+
if pgv_metrics:
|
| 265 |
+
self.history["pgv_status"].append(pgv_metrics.get("status", "UNKNOWN"))
|
| 266 |
+
self.history["pgv_coverage"].append(pgv_metrics.get("coverage_ratio", 0))
|
| 267 |
+
self.history["pgv_best_sim"].append(pgv_metrics.get("best_sim", 0))
|
| 268 |
+
self.history["pgv_n_filled"].append(pgv_metrics.get("n_filled", 0))
|
| 269 |
+
self.history["pgv_filled_ratio"].append(pgv_metrics.get("filled_ratio", 0))
|
| 270 |
+
# V6.2: Hyp PGVector (nível de hipótese)
|
| 271 |
+
if hyp_pgv_metrics is not None:
|
| 272 |
+
self.history["hyp_pgv_status"].append(hyp_pgv_metrics.get("status", "UNKNOWN"))
|
| 273 |
+
self.history["hyp_pgv_apply_punishment"].append(
|
| 274 |
+
1 if hyp_pgv_metrics.get("apply_punishment", False) else 0)
|
| 275 |
+
self.history["hyp_pgv_skipped"].append(
|
| 276 |
+
1 if hyp_pgv_metrics.get("skipped_by_pgvector", False) else 0)
|
| 277 |
+
self.history["hyp_pgv_best_sim"].append(hyp_pgv_metrics.get("best_sim", 0))
|
| 278 |
+
self.history["hyp_pgv_coverage"].append(hyp_pgv_metrics.get("coverage", 0))
|
| 279 |
+
# Contadores acumulados do HypT
|
| 280 |
+
stats = hyp_pgv_metrics.get("hyp_stats", {})
|
| 281 |
+
self.history["hyp_pgv_n_complete_skip"].append(stats.get("n_complete_skip", 0))
|
| 282 |
+
self.history["hyp_pgv_n_incomplete_apply"].append(stats.get("n_incomplete_apply", 0))
|
| 283 |
+
self.history["hyp_pgv_n_missing_apply"].append(stats.get("n_missing_apply", 0))
|
| 284 |
+
self.history["hyp_pgv_skip_rate"].append(stats.get("skip_rate", 0))
|
| 285 |
+
if dataset_name:
|
| 286 |
+
self.history["dataset_source"].append(dataset_name)
|
| 287 |
+
|
| 288 |
+
if step % 5 == 0 or step == 1 or spike_alert or grad_alert:
|
| 289 |
+
kohonen_str = ""
|
| 290 |
+
if kohonen_aux:
|
| 291 |
+
kohonen_str = (f" σ={kohonen_aux.get('sigma_t', 0):.3f}"
|
| 292 |
+
f" α={kohonen_aux.get('alpha_t', 0):.3f}"
|
| 293 |
+
f" BMUdiv={kohonen_aux.get('bmu_diversity', 0)}"
|
| 294 |
+
f" filled={kohonen_aux.get('n_filled', 0)}/8")
|
| 295 |
+
pgv_str = ""
|
| 296 |
+
if pgv_metrics:
|
| 297 |
+
pgv_str = f" PGV={pgv_metrics.get('status', '?')[:4]} cov={pgv_metrics.get('coverage_ratio', 0):.2f}"
|
| 298 |
+
# V6.2: Hyp PGVector
|
| 299 |
+
hyp_pgv_str = ""
|
| 300 |
+
if hyp_pgv_metrics is not None:
|
| 301 |
+
h_status = hyp_pgv_metrics.get("status", "?")[:4]
|
| 302 |
+
h_apply = "Δ" if hyp_pgv_metrics.get("apply_punishment", False) else "—"
|
| 303 |
+
hyp_pgv_str = f" HYP={h_status}{h_apply}"
|
| 304 |
+
logger.info(
|
| 305 |
+
f" step {step:3d} | loss={train_loss:.4f} | tps={tps:.0f} | "
|
| 306 |
+
f"step_ms={tps_ms:.0f} | ||g||={grad_norm:.2f} | cpu%={cpu_pct:.0f} | "
|
| 307 |
+
f"rss={rss_mb:.0f}MB" + kohonen_str + pgv_str + hyp_pgv_str
|
| 308 |
+
+ (" ⚠️SPIKE" if spike_alert else "")
|
| 309 |
+
+ (f" ⚠️GRAD_{grad_alert}" if grad_alert else "")
|
| 310 |
+
)
|
| 311 |
+
|
| 312 |
+
def record_epoch(self, epoch, val_loss, train_loss_avg, eval_acc, mtp_val_loss=None):
|
| 313 |
+
ppl = math.exp(min(val_loss, 20.0))
|
| 314 |
+
gap = train_loss_avg - val_loss
|
| 315 |
+
self.history["val_loss"].append(val_loss)
|
| 316 |
+
self.history["perplexity"].append(ppl)
|
| 317 |
+
self.history["overfitting_gap"].append(gap)
|
| 318 |
+
self.history["eval_benchmark"].append(eval_acc)
|
| 319 |
+
if mtp_val_loss is not None:
|
| 320 |
+
self.history["mtp_val_loss"].append(mtp_val_loss)
|
| 321 |
+
logger.info(
|
| 322 |
+
f" EPOCH {epoch} | val_loss={val_loss:.4f} | train_avg={train_loss_avg:.4f} | "
|
| 323 |
+
f"ppl={ppl:.2f} | gap={gap:+.4f} | eval_acc={eval_acc:.2%}"
|
| 324 |
+
+ (f" | mtp_val={mtp_val_loss:.4f}" if mtp_val_loss is not None else "")
|
| 325 |
+
)
|
| 326 |
+
|
| 327 |
+
def record_meta(self, meta_result):
|
| 328 |
+
self.history["meta_history"].append({
|
| 329 |
+
"T": meta_result.get("T_new", 0),
|
| 330 |
+
"tau": meta_result.get("tau_new", 0),
|
| 331 |
+
"lambda_ent": meta_result.get("lambda_ent_new", 0),
|
| 332 |
+
"init_gate": meta_result.get("init_gate_new", 0),
|
| 333 |
+
"meta_loss": meta_result.get("meta_loss", 0),
|
| 334 |
+
"sharpness": meta_result.get("sharpness", 0),
|
| 335 |
+
})
|
| 336 |
+
|
| 337 |
+
def summary(self):
|
| 338 |
+
h = self.history
|
| 339 |
+
rss_trend = "stable"
|
| 340 |
+
if len(h["rss_mb"]) >= 3:
|
| 341 |
+
if h["rss_mb"][-1] > h["rss_mb"][0] * 1.5:
|
| 342 |
+
rss_trend = "growing"
|
| 343 |
+
elif h["rss_mb"][-1] < h["rss_mb"][0] * 0.8:
|
| 344 |
+
rss_trend = "shrinking"
|
| 345 |
+
# V6.1 — PGVector status distribution
|
| 346 |
+
pgv_status_counts = {"COMPLETE": 0, "INCOMPLETE": 0, "MISSING": 0}
|
| 347 |
+
for s in h["pgv_status"]:
|
| 348 |
+
pgv_status_counts[s] = pgv_status_counts.get(s, 0) + 1
|
| 349 |
+
# V6.2 — Hyp PGVector status distribution (nível de hipótese)
|
| 350 |
+
hyp_pgv_status_counts = {
|
| 351 |
+
"COMPLETE": 0, "INCOMPLETE": 0, "MISSING": 0, "NO_PUNISHMENT": 0,
|
| 352 |
+
}
|
| 353 |
+
for s in h["hyp_pgv_status"]:
|
| 354 |
+
hyp_pgv_status_counts[s] = hyp_pgv_status_counts.get(s, 0) + 1
|
| 355 |
+
# V6.1 — Dataset distribution
|
| 356 |
+
ds_counts: Dict[str, int] = {}
|
| 357 |
+
for d in h["dataset_source"]:
|
| 358 |
+
ds_counts[d] = ds_counts.get(d, 0) + 1
|
| 359 |
+
return {
|
| 360 |
+
"n_steps": len(h["train_loss"]),
|
| 361 |
+
"n_epochs": len(h["val_loss"]),
|
| 362 |
+
"final_train_loss": h["train_loss"][-1] if h["train_loss"] else None,
|
| 363 |
+
"final_val_loss": h["val_loss"][-1] if h["val_loss"] else None,
|
| 364 |
+
"final_perplexity": h["perplexity"][-1] if h["perplexity"] else None,
|
| 365 |
+
"final_overfitting_gap": h["overfitting_gap"][-1] if h["overfitting_gap"] else None,
|
| 366 |
+
"final_eval_benchmark": h["eval_benchmark"][-1] if h["eval_benchmark"] else None,
|
| 367 |
+
"avg_tokens_per_sec": sum(h["tokens_per_sec"]) / max(1, len(h["tokens_per_sec"])),
|
| 368 |
+
"avg_tflops_per_cpu": sum(h["tflops_per_cpu"]) / max(1, len(h["tflops_per_cpu"])),
|
| 369 |
+
"avg_time_per_step_ms": sum(h["time_per_step_ms"]) / max(1, len(h["time_per_step_ms"])),
|
| 370 |
+
"avg_grad_norm": sum(h["grad_norm"]) / max(1, len(h["grad_norm"])),
|
| 371 |
+
"avg_cpu_pct": sum(h["cpu_pct"]) / max(1, len(h["cpu_pct"])),
|
| 372 |
+
"final_rss_mb": h["rss_mb"][-1] if h["rss_mb"] else None,
|
| 373 |
+
"max_rss_mb": max(h["rss_mb"]) if h["rss_mb"] else None,
|
| 374 |
+
"rss_trend": rss_trend,
|
| 375 |
+
"n_alerts": len(h["alerts"]),
|
| 376 |
+
"alerts": h["alerts"][:20],
|
| 377 |
+
"alert_types": list({a["type"] for a in h["alerts"]}),
|
| 378 |
+
"meta_history": h["meta_history"],
|
| 379 |
+
"kohonen_evolution": {
|
| 380 |
+
"sigma_t": h["sigma_t"],
|
| 381 |
+
"alpha_t": h["alpha_t"],
|
| 382 |
+
"bmu_diversity": h["bmu_diversity"],
|
| 383 |
+
"map_entropy": h["map_entropy"],
|
| 384 |
+
"neighborhood_spread": h["neighborhood_spread"],
|
| 385 |
+
"update_magnitude": h["update_magnitude"],
|
| 386 |
+
"bmu_drift": h["bmu_drift"],
|
| 387 |
+
"n_filled": h["n_filled"],
|
| 388 |
+
"filled_ratio": h["filled_ratio"],
|
| 389 |
+
"final_sigma_t": h["sigma_t"][-1] if h["sigma_t"] else None,
|
| 390 |
+
"final_alpha_t": h["alpha_t"][-1] if h["alpha_t"] else None,
|
| 391 |
+
"sigma_decay": (h["sigma_t"][0] - h["sigma_t"][-1]) if len(h["sigma_t"]) >= 2 else 0,
|
| 392 |
+
"alpha_decay": (h["alpha_t"][0] - h["alpha_t"][-1]) if len(h["alpha_t"]) >= 2 else 0,
|
| 393 |
+
"final_n_filled": h["n_filled"][-1] if h["n_filled"] else 0,
|
| 394 |
+
"final_filled_ratio": h["filled_ratio"][-1] if h["filled_ratio"] else 0,
|
| 395 |
+
},
|
| 396 |
+
"mtp_evolution": {
|
| 397 |
+
"train_loss": h["mtp_train_loss"],
|
| 398 |
+
"val_loss": h["mtp_val_loss"],
|
| 399 |
+
"entropy_reg": h["mtp_entropy_reg"],
|
| 400 |
+
"final_alphas": h["mtp_alphas"][-1] if h["mtp_alphas"] else None,
|
| 401 |
+
},
|
| 402 |
+
"ewc_evolution": {
|
| 403 |
+
"total_penalty": h["ewc_penalty"],
|
| 404 |
+
"classic_pen": h["ewc_classic_pen"],
|
| 405 |
+
"kohonen_pen": h["ewc_kohonen_pen"],
|
| 406 |
+
"topo_pen": h["ewc_topo_pen"],
|
| 407 |
+
"n_masked_som_neurons": h["n_masked_som_neurons"],
|
| 408 |
+
},
|
| 409 |
+
# V6.1 — PGVector evolution
|
| 410 |
+
"pgvector_evolution": {
|
| 411 |
+
"status_per_step": h["pgv_status"],
|
| 412 |
+
"status_counts": pgv_status_counts,
|
| 413 |
+
"coverage_ratio": h["pgv_coverage"],
|
| 414 |
+
"best_sim": h["pgv_best_sim"],
|
| 415 |
+
"n_filled": h["pgv_n_filled"],
|
| 416 |
+
"filled_ratio": h["pgv_filled_ratio"],
|
| 417 |
+
"final_coverage": h["pgv_coverage"][-1] if h["pgv_coverage"] else None,
|
| 418 |
+
"final_best_sim": h["pgv_best_sim"][-1] if h["pgv_best_sim"] else None,
|
| 419 |
+
"final_n_filled": h["pgv_n_filled"][-1] if h["pgv_n_filled"] else 0,
|
| 420 |
+
"final_filled_ratio": h["pgv_filled_ratio"][-1] if h["pgv_filled_ratio"] else 0,
|
| 421 |
+
},
|
| 422 |
+
# V6.2 — Hyp PGVector evolution (nível de hipótese)
|
| 423 |
+
"hyp_pgvector_evolution": {
|
| 424 |
+
"status_per_step": h["hyp_pgv_status"],
|
| 425 |
+
"status_counts": hyp_pgv_status_counts,
|
| 426 |
+
"apply_punishment_per_step": h["hyp_pgv_apply_punishment"],
|
| 427 |
+
"skipped_per_step": h["hyp_pgv_skipped"],
|
| 428 |
+
"best_sim": h["hyp_pgv_best_sim"],
|
| 429 |
+
"coverage": h["hyp_pgv_coverage"],
|
| 430 |
+
"n_complete_skip": h["hyp_pgv_n_complete_skip"],
|
| 431 |
+
"n_incomplete_apply": h["hyp_pgv_n_incomplete_apply"],
|
| 432 |
+
"n_missing_apply": h["hyp_pgv_n_missing_apply"],
|
| 433 |
+
"skip_rate": h["hyp_pgv_skip_rate"],
|
| 434 |
+
"final_n_complete_skip": h["hyp_pgv_n_complete_skip"][-1] if h["hyp_pgv_n_complete_skip"] else 0,
|
| 435 |
+
"final_n_incomplete_apply": h["hyp_pgv_n_incomplete_apply"][-1] if h["hyp_pgv_n_incomplete_apply"] else 0,
|
| 436 |
+
"final_n_missing_apply": h["hyp_pgv_n_missing_apply"][-1] if h["hyp_pgv_n_missing_apply"] else 0,
|
| 437 |
+
"final_skip_rate": h["hyp_pgv_skip_rate"][-1] if h["hyp_pgv_skip_rate"] else 0,
|
| 438 |
+
"final_best_sim": h["hyp_pgv_best_sim"][-1] if h["hyp_pgv_best_sim"] else 0,
|
| 439 |
+
"final_coverage": h["hyp_pgv_coverage"][-1] if h["hyp_pgv_coverage"] else 0,
|
| 440 |
+
},
|
| 441 |
+
# V6.1 — Dataset tracking
|
| 442 |
+
"dataset_distribution": ds_counts,
|
| 443 |
+
}
|
| 444 |
+
|
| 445 |
+
|
| 446 |
+
# ==============================================================================
|
| 447 |
+
# 5. LOAD 5 DATASETS × 50 SAMPLES (com fallback sintético expandido)
|
| 448 |
+
# ==============================================================================
|
| 449 |
+
def _generate_synth_samples(ds_name: str, n: int) -> List[str]:
|
| 450 |
+
"""Gera n samples sintéticos diversos para um dataset.
|
| 451 |
+
|
| 452 |
+
V6.2: agora gera até 50 samples por dataset usando templates
|
| 453 |
+
variados + fatores aleatórios (rng com seed por dataset para
|
| 454 |
+
reprodutibilidade).
|
| 455 |
+
"""
|
| 456 |
+
rng = random.Random(hash(ds_name) & 0xFFFFFFFF)
|
| 457 |
+
|
| 458 |
+
# Templates base por categoria (cada template tem placeholders {n}, {word})
|
| 459 |
+
templates_by_ds = {
|
| 460 |
+
"CEIA-POSITIVO/ultrachat_br_clustred_balanced_v1": [
|
| 461 |
+
"Olá, como você está hoje?",
|
| 462 |
+
"Bom dia! Posso ajudar com algo?",
|
| 463 |
+
"Qual é a capital do Brasil?",
|
| 464 |
+
"Me conte uma curiosidade sobre o espaço.",
|
| 465 |
+
"Como funciona o aprendizado de máquina?",
|
| 466 |
+
"Traduza '{word}' para português.",
|
| 467 |
+
"Escreva um poema curto sobre o mar.",
|
| 468 |
+
"Quem foi Machado de Assis?",
|
| 469 |
+
"Explique a teoria da relatividade.",
|
| 470 |
+
"Liste {n} benefícios do exercício físico.",
|
| 471 |
+
"Qual a diferença entre CPU e GPU?",
|
| 472 |
+
"Me ajude a escrever um email formal.",
|
| 473 |
+
"Receita de bolo de chocolate simples.",
|
| 474 |
+
"Como declarar imposto de renda?",
|
| 475 |
+
"Melhores livros de ficção científica.",
|
| 476 |
+
],
|
| 477 |
+
"Madras1/corpus-ptbr-v2": [
|
| 478 |
+
"A literatura brasileira é riquíssima e diversa.",
|
| 479 |
+
"O café é uma das bebidas mais consumidas no mundo.",
|
| 480 |
+
"A Amazônia abriga milhões de espécies.",
|
| 481 |
+
"São Paulo é a maior cidade do Brasil.",
|
| 482 |
+
"O carnaval é uma festa tradicional brasileira.",
|
| 483 |
+
"A música popular brasileira tem raízes africanas.",
|
| 484 |
+
"O futebol é o esporte mais popular do país.",
|
| 485 |
+
"A culinária regional varia muito entre estados.",
|
| 486 |
+
"A língua portuguesa tem origem no latim vulgar.",
|
| 487 |
+
"A história do Brasil começou em 1500.",
|
| 488 |
+
"O Pantanal é a maior planície alagada do mundo.",
|
| 489 |
+
"A bossa nova influenciou a música mundial.",
|
| 490 |
+
"A arquitetura colonial brasileira é patrimônio.",
|
| 491 |
+
"O Jabuti é um personagem do folclore brasileiro.",
|
| 492 |
+
"A capoeira mistura dança e marciais.",
|
| 493 |
+
],
|
| 494 |
+
"TucanoBR/GigaVerbo": [
|
| 495 |
+
"O verbo é a palavra que indica ação.",
|
| 496 |
+
"Conjugue o verbo '{word}' no presente.",
|
| 497 |
+
"Os verbos irregulares merecem atenção especial.",
|
| 498 |
+
"O infinitivo é a forma nominal do verbo.",
|
| 499 |
+
"O gerúndio termina em -ndo em português.",
|
| 500 |
+
"O particípio é usado nos tempos compostos.",
|
| 501 |
+
"Verbos transitivos exigem objeto direto.",
|
| 502 |
+
"Verbos intransitivos não exigem objeto.",
|
| 503 |
+
"A voz passiva transforma o sujeito em paciente.",
|
| 504 |
+
"O imperativo é usado para dar ordens.",
|
| 505 |
+
"Verbos auxiliares formam tempos compostos.",
|
| 506 |
+
"Conjunção coordena orações independentes.",
|
| 507 |
+
"O subjuntivo expressa desejo ou hipótese.",
|
| 508 |
+
"A crase ocorre em fusão de preposição e artigo.",
|
| 509 |
+
"Advérbios modificam verbos, adjetivos ou advérbios.",
|
| 510 |
+
],
|
| 511 |
+
"nvidia/OpenMathInstruct-2": [
|
| 512 |
+
"Problema: calcule {a} × {b}. Solução: {prod}.",
|
| 513 |
+
"Problema: qual é a raiz de {sq}? Solução: {sqrt}.",
|
| 514 |
+
"Problema: some {a} + {b}. Solução: {sum}.",
|
| 515 |
+
"Problema: divida {a} por {b}. Solução: {div}.",
|
| 516 |
+
"Problema: calcule {a}² + {b}². Solução: {ssq}.",
|
| 517 |
+
"Problema: qual é o MDC de {a} e {b}? Solução: {mdc}.",
|
| 518 |
+
"Problema: converta 1/{b} para decimal. Solução: {dec}.",
|
| 519 |
+
"Problema: calcule {pct}% de {a}. Solução: {res}.",
|
| 520 |
+
"Problema: perímetro de quadrado {a}×{a}? Solução: {per}.",
|
| 521 |
+
"Problema: resolva {a}x + {b} = {c}. Solução: x = {x}.",
|
| 522 |
+
"Problema: área do triângulo base {a} altura {b}? Solução: {area}.",
|
| 523 |
+
"Problema: {a}! = ? Solução: {fat}.",
|
| 524 |
+
"Problema: log10({a}) = ? Solução: {log}.",
|
| 525 |
+
"Problema: {a} mod {b} = ? Solução: {mod}.",
|
| 526 |
+
"Problema: potência {a}^{b} = ? Solução: {pot}.",
|
| 527 |
+
],
|
| 528 |
+
"dominguesm/restore-punctuation-ptbr-dataset": [
|
| 529 |
+
"o gato subiu no telhado",
|
| 530 |
+
"a chuva caiu a noite toda",
|
| 531 |
+
"são paulo é uma cidade grande",
|
| 532 |
+
"joão e maria foram passear",
|
| 533 |
+
"o livro está sobre a mesa",
|
| 534 |
+
"amanhã vou ao mercado comprar pão",
|
| 535 |
+
"o sol nasce no leste",
|
| 536 |
+
"ela canta muito bem",
|
| 537 |
+
"o carro parou no sinal vermelho",
|
| 538 |
+
"os alunos estudaram para a prova",
|
| 539 |
+
"a professora explicou a matéria",
|
| 540 |
+
"o cachorro latiu para o carteiro",
|
| 541 |
+
"as flores floresceram na primavera",
|
| 542 |
+
"o trem chegou na estação",
|
| 543 |
+
"as crianças brincam no parque",
|
| 544 |
+
],
|
| 545 |
+
}
|
| 546 |
+
word_pool = ["hello", "world", "goodbye", "friend", "love", "happy",
|
| 547 |
+
"morning", "night", "music", "book", "water", "sun",
|
| 548 |
+
"moon", "star", "rain", "wind", "fire", "earth", "sky",
|
| 549 |
+
"tree", "flower", "bird", "fish", "house", "door"]
|
| 550 |
+
templates = templates_by_ds.get(ds_name, [f"sample {i} para {ds_name}" for i in range(n)])
|
| 551 |
+
|
| 552 |
+
out = []
|
| 553 |
+
for i in range(n):
|
| 554 |
+
t = templates[i % len(templates)]
|
| 555 |
+
# Substitui placeholders
|
| 556 |
+
a = rng.randint(2, 30)
|
| 557 |
+
b = rng.randint(2, 12)
|
| 558 |
+
try:
|
| 559 |
+
text = t.format(
|
| 560 |
+
n=rng.randint(2, 5),
|
| 561 |
+
word=rng.choice(word_pool),
|
| 562 |
+
a=a, b=b,
|
| 563 |
+
prod=a * b,
|
| 564 |
+
sq=a * a,
|
| 565 |
+
sqrt=int(math.isqrt(a * a)),
|
| 566 |
+
sum=a + b,
|
| 567 |
+
div=a / b,
|
| 568 |
+
ssq=a * a + b * b,
|
| 569 |
+
mdc=math.gcd(a, b),
|
| 570 |
+
dec=round(1 / b, 4),
|
| 571 |
+
pct=rng.randint(10, 50),
|
| 572 |
+
res=int(a * rng.randint(10, 50) / 100),
|
| 573 |
+
per=a * 4,
|
| 574 |
+
c=a * 2 + b,
|
| 575 |
+
x=2,
|
| 576 |
+
area=int(a * b / 2),
|
| 577 |
+
fat=int(math.factorial(min(a, 6))),
|
| 578 |
+
log=round(math.log10(max(a, 2)), 3),
|
| 579 |
+
mod=a % b,
|
| 580 |
+
pot=a ** min(b, 4),
|
| 581 |
+
)
|
| 582 |
+
except (KeyError, ValueError):
|
| 583 |
+
text = t
|
| 584 |
+
out.append(text)
|
| 585 |
+
return out
|
| 586 |
+
|
| 587 |
+
|
| 588 |
+
def load_v62_samples(tokenizer, max_seq_len, hf_token=None):
|
| 589 |
+
"""Carrega 5 datasets × 50 samples do streaming_datasets.py (V6.2).
|
| 590 |
+
|
| 591 |
+
Para cada dataset, tenta 50 samples reais via stream_dataset().
|
| 592 |
+
Se o streaming falhar (rede, auth, etc.), usa 50 samples sintéticos
|
| 593 |
+
da categoria equivalente (mantém o tracking de dataset_name).
|
| 594 |
+
|
| 595 |
+
V6.2: datasets library agora instalada (pip install datasets).
|
| 596 |
+
"""
|
| 597 |
+
samples = []
|
| 598 |
+
rng = random.Random(42)
|
| 599 |
+
|
| 600 |
+
# V6.2: per-dataset timeout (segundos) — streaming pode ser lento,
|
| 601 |
+
# então limitamos o tempo por dataset. Se o timeout expirar, usamos
|
| 602 |
+
# o que foi coletado + completamos com sintéticos.
|
| 603 |
+
PER_DS_TIMEOUT_S = 90 # 90s por dataset (5 datasets × 90s = 7.5min max)
|
| 604 |
+
# V6.2: flag para bypass streaming — em ambientes com rede lenta,
|
| 605 |
+
# usar apenas sintéticos (valida toda a arquitetura V6.2 sem depender
|
| 606 |
+
# de download de datasets). Caso True, N_PER_DATASET sintéticos por ds.
|
| 607 |
+
BYPASS_STREAMING = True # streaming lento no env → sintéticos diversos
|
| 608 |
+
|
| 609 |
+
for ds_name in V62_DATASETS:
|
| 610 |
+
if BYPASS_STREAMING:
|
| 611 |
+
logger.info(f" [SYNTH] {ds_name} (BYPASS_STREAMING=True, {N_PER_DATASET} samples sintéticos)")
|
| 612 |
+
synth_texts = _generate_synth_samples(ds_name, N_PER_DATASET)
|
| 613 |
+
for text in synth_texts[:N_PER_DATASET]:
|
| 614 |
+
ids = tokenizer.encode(text)
|
| 615 |
+
if len(ids) > max_seq_len:
|
| 616 |
+
ids = ids[:max_seq_len]
|
| 617 |
+
else:
|
| 618 |
+
ids = ids + [PAD_ID] * (max_seq_len - len(ids))
|
| 619 |
+
first_word = text.split()[0] if text.split() else "ok"
|
| 620 |
+
label_ids = tokenizer.encode(first_word)
|
| 621 |
+
if len(label_ids) > max_seq_len:
|
| 622 |
+
label_ids = label_ids[:max_seq_len]
|
| 623 |
+
else:
|
| 624 |
+
label_ids = label_ids + [PAD_ID] * (max_seq_len - len(label_ids))
|
| 625 |
+
samples.append({
|
| 626 |
+
"input_ids": torch.tensor(ids, dtype=torch.long),
|
| 627 |
+
"label_ids": torch.tensor(label_ids, dtype=torch.long),
|
| 628 |
+
"label_text": first_word,
|
| 629 |
+
"type": "synthetic_bypass",
|
| 630 |
+
"answer": "",
|
| 631 |
+
"dataset": ds_name,
|
| 632 |
+
})
|
| 633 |
+
continue
|
| 634 |
+
logger.info(f" [STREAM] Loading {ds_name} (max {N_PER_DATASET} samples, timeout={PER_DS_TIMEOUT_S}s)...")
|
| 635 |
+
ds_samples = []
|
| 636 |
+
ds_t0 = time.perf_counter()
|
| 637 |
+
try:
|
| 638 |
+
count = 0
|
| 639 |
+
for sample in stream_dataset(
|
| 640 |
+
ds_name,
|
| 641 |
+
max_samples=N_PER_DATASET,
|
| 642 |
+
hf_token=hf_token,
|
| 643 |
+
):
|
| 644 |
+
if count >= N_PER_DATASET:
|
| 645 |
+
break
|
| 646 |
+
# V6.2: timeout check
|
| 647 |
+
if (time.perf_counter() - ds_t0) > PER_DS_TIMEOUT_S:
|
| 648 |
+
logger.info(f" ⏱ timeout {PER_DS_TIMEOUT_S}s atingido com {count}/{N_PER_DATASET} samples")
|
| 649 |
+
break
|
| 650 |
+
text = sample.raw_text[:200] if sample.raw_text else None
|
| 651 |
+
if not text or len(text) < 5:
|
| 652 |
+
continue
|
| 653 |
+
ids = tokenizer.encode(text)
|
| 654 |
+
if len(ids) > max_seq_len:
|
| 655 |
+
ids = ids[:max_seq_len]
|
| 656 |
+
else:
|
| 657 |
+
ids = ids + [PAD_ID] * (max_seq_len - len(ids))
|
| 658 |
+
# label = primeira palavra
|
| 659 |
+
first_word = text.split()[0] if text.split() else "ok"
|
| 660 |
+
label_ids = tokenizer.encode(first_word)
|
| 661 |
+
if len(label_ids) > max_seq_len:
|
| 662 |
+
label_ids = label_ids[:max_seq_len]
|
| 663 |
+
else:
|
| 664 |
+
label_ids = label_ids + [PAD_ID] * (max_seq_len - len(label_ids))
|
| 665 |
+
ds_samples.append({
|
| 666 |
+
"input_ids": torch.tensor(ids, dtype=torch.long),
|
| 667 |
+
"label_ids": torch.tensor(label_ids, dtype=torch.long),
|
| 668 |
+
"label_text": first_word,
|
| 669 |
+
"type": "streaming",
|
| 670 |
+
"answer": "",
|
| 671 |
+
"dataset": ds_name,
|
| 672 |
+
})
|
| 673 |
+
count += 1
|
| 674 |
+
if count > 0:
|
| 675 |
+
logger.info(f" ✓ {count} samples reais carregados de {ds_name}")
|
| 676 |
+
samples.extend(ds_samples)
|
| 677 |
+
if count < N_PER_DATASET:
|
| 678 |
+
# Completa com sintéticos se streaming retornou menos
|
| 679 |
+
needed = N_PER_DATASET - count
|
| 680 |
+
logger.info(f" + {needed} samples sintéticos para completar {ds_name}")
|
| 681 |
+
synth_texts = _generate_synth_samples(ds_name, needed)
|
| 682 |
+
for text in synth_texts[:needed]:
|
| 683 |
+
ids = tokenizer.encode(text)
|
| 684 |
+
if len(ids) > max_seq_len:
|
| 685 |
+
ids = ids[:max_seq_len]
|
| 686 |
+
else:
|
| 687 |
+
ids = ids + [PAD_ID] * (max_seq_len - len(ids))
|
| 688 |
+
first_word = text.split()[0] if text.split() else "ok"
|
| 689 |
+
label_ids = tokenizer.encode(first_word)
|
| 690 |
+
if len(label_ids) > max_seq_len:
|
| 691 |
+
label_ids = label_ids[:max_seq_len]
|
| 692 |
+
else:
|
| 693 |
+
label_ids = label_ids + [PAD_ID] * (max_seq_len - len(label_ids))
|
| 694 |
+
samples.append({
|
| 695 |
+
"input_ids": torch.tensor(ids, dtype=torch.long),
|
| 696 |
+
"label_ids": torch.tensor(label_ids, dtype=torch.long),
|
| 697 |
+
"label_text": first_word,
|
| 698 |
+
"type": "synthetic_complement",
|
| 699 |
+
"answer": "",
|
| 700 |
+
"dataset": ds_name,
|
| 701 |
+
})
|
| 702 |
+
continue
|
| 703 |
+
else:
|
| 704 |
+
logger.warning(f" ⚠ nenhuma sample de {ds_name}, usando fallback sintético")
|
| 705 |
+
except Exception as e:
|
| 706 |
+
logger.warning(f" ⚠ streaming falhou para {ds_name}: {type(e).__name__}: {str(e)[:80]}")
|
| 707 |
+
logger.warning(f" usando fallback sintético")
|
| 708 |
+
|
| 709 |
+
# Fallback sintético — 50 samples por dataset (V6.2)
|
| 710 |
+
synth_texts = _generate_synth_samples(ds_name, N_PER_DATASET)
|
| 711 |
+
for text in synth_texts[:N_PER_DATASET]:
|
| 712 |
+
ids = tokenizer.encode(text)
|
| 713 |
+
if len(ids) > max_seq_len:
|
| 714 |
+
ids = ids[:max_seq_len]
|
| 715 |
+
else:
|
| 716 |
+
ids = ids + [PAD_ID] * (max_seq_len - len(ids))
|
| 717 |
+
first_word = text.split()[0] if text.split() else "ok"
|
| 718 |
+
label_ids = tokenizer.encode(first_word)
|
| 719 |
+
if len(label_ids) > max_seq_len:
|
| 720 |
+
label_ids = label_ids[:max_seq_len]
|
| 721 |
+
else:
|
| 722 |
+
label_ids = label_ids + [PAD_ID] * (max_seq_len - len(label_ids))
|
| 723 |
+
samples.append({
|
| 724 |
+
"input_ids": torch.tensor(ids, dtype=torch.long),
|
| 725 |
+
"label_ids": torch.tensor(label_ids, dtype=torch.long),
|
| 726 |
+
"label_text": first_word,
|
| 727 |
+
"type": "synthetic_fallback",
|
| 728 |
+
"answer": "",
|
| 729 |
+
"dataset": ds_name,
|
| 730 |
+
})
|
| 731 |
+
|
| 732 |
+
logger.info(f" Total samples: {len(samples)} ({len(V62_DATASETS)} datasets × até {N_PER_DATASET} samples)")
|
| 733 |
+
return samples
|
| 734 |
+
|
| 735 |
+
|
| 736 |
+
# ==============================================================================
|
| 737 |
+
# 6. MCQ EVAL (igual V6)
|
| 738 |
+
# ==============================================================================
|
| 739 |
+
def make_mini_mcq(n_questions: int = 8):
|
| 740 |
+
questions = []
|
| 741 |
+
for i in range(n_questions):
|
| 742 |
+
a, b = i + 1, (i * 2) % 10 + 1
|
| 743 |
+
correct = a + b
|
| 744 |
+
question = f"What is {a} + {b}?"
|
| 745 |
+
options = [correct, correct + 1, correct - 1, correct + 2]
|
| 746 |
+
rng = random.Random(i)
|
| 747 |
+
rng.shuffle(options)
|
| 748 |
+
correct_idx = options.index(correct)
|
| 749 |
+
questions.append({
|
| 750 |
+
"question": question,
|
| 751 |
+
"options": [str(o) for o in options],
|
| 752 |
+
"correct_idx": correct_idx,
|
| 753 |
+
})
|
| 754 |
+
return questions
|
| 755 |
+
|
| 756 |
+
|
| 757 |
+
def evaluate_mcq(model, tokenizer, mcq):
|
| 758 |
+
model.eval()
|
| 759 |
+
correct = 0
|
| 760 |
+
with torch.no_grad():
|
| 761 |
+
for q in mcq:
|
| 762 |
+
q_ids = tokenizer.encode(q["question"])
|
| 763 |
+
if len(q_ids) < MAX_SEQ_LEN:
|
| 764 |
+
q_ids = q_ids + [PAD_ID] * (MAX_SEQ_LEN - len(q_ids))
|
| 765 |
+
else:
|
| 766 |
+
q_ids = q_ids[:MAX_SEQ_LEN]
|
| 767 |
+
x = torch.tensor(q_ids, dtype=torch.long).unsqueeze(0)
|
| 768 |
+
try:
|
| 769 |
+
y_hat, delta = model(x, use_hypothesis=True)
|
| 770 |
+
logprobs = F.log_softmax((y_hat + delta)[0], dim=-1)
|
| 771 |
+
option_scores = []
|
| 772 |
+
for opt in q["options"]:
|
| 773 |
+
opt_ids = tokenizer.encode(opt)
|
| 774 |
+
if len(opt_ids) == 0:
|
| 775 |
+
opt_ids = [PAD_ID]
|
| 776 |
+
score = logprobs[opt_ids[0]].item()
|
| 777 |
+
option_scores.append(score)
|
| 778 |
+
pred = int(np.argmax(option_scores))
|
| 779 |
+
if pred == q["correct_idx"]:
|
| 780 |
+
correct += 1
|
| 781 |
+
except (RuntimeError, IndexError):
|
| 782 |
+
continue
|
| 783 |
+
model.train()
|
| 784 |
+
return correct / max(1, len(mcq))
|
| 785 |
+
|
| 786 |
+
|
| 787 |
+
# ==============================================================================
|
| 788 |
+
# 7. DELETE BINARIES
|
| 789 |
+
# ==============================================================================
|
| 790 |
+
def delete_training_binaries():
|
| 791 |
+
"""Deleta binários do treinamento."""
|
| 792 |
+
deleted = []
|
| 793 |
+
patterns = [
|
| 794 |
+
"/home/z/my-project/BiGRU_T_version/model_final/*.bin",
|
| 795 |
+
"/home/z/my-project/BiGRU_T_version/model_final/*.pt",
|
| 796 |
+
"/home/z/my-project/BiGRU_T_version/model_final/*.pth",
|
| 797 |
+
"/home/z/my-project/BiGRU_T_version/model_final/*.safetensors",
|
| 798 |
+
"/home/z/my-project/BiGRU_T_version/**/*.bin",
|
| 799 |
+
"/home/z/my-project/BiGRU_T_version/**/*.pt",
|
| 800 |
+
]
|
| 801 |
+
for pattern in patterns:
|
| 802 |
+
for filepath in glob.glob(pattern, recursive=True):
|
| 803 |
+
try:
|
| 804 |
+
os.remove(filepath)
|
| 805 |
+
deleted.append(filepath)
|
| 806 |
+
logger.info(f" [BIN DELETE] {filepath}")
|
| 807 |
+
except OSError:
|
| 808 |
+
pass
|
| 809 |
+
return deleted
|
| 810 |
+
|
| 811 |
+
|
| 812 |
+
# ==============================================================================
|
| 813 |
+
# 8. MAIN
|
| 814 |
+
# ==============================================================================
|
| 815 |
+
def main():
|
| 816 |
+
logger.info("=" * 72)
|
| 817 |
+
logger.info("TRAIN V6.2 — BiGRU_T_version")
|
| 818 |
+
logger.info("PGVector-like lookup + EWC math upgrade + 5 datasets × 10 samples")
|
| 819 |
+
logger.info("=" * 72)
|
| 820 |
+
|
| 821 |
+
logger.info(f"Xeon V6: cores={XEON_STATUS['physical_cores']}, "
|
| 822 |
+
f"AMX={XEON_STATUS['amx']['supported']}, "
|
| 823 |
+
f"IPEX={XEON_STATUS['ipex_available']}")
|
| 824 |
+
logger.info(f"FP16 benchmark: best_tflops={FP16_BENCH.get('best_tflops', 'N/A')}")
|
| 825 |
+
|
| 826 |
+
# Tokenizer
|
| 827 |
+
tokenizer_path = "/home/z/my-project/BiGRU_T_version/model_final/tokenizer/tokenizer.json"
|
| 828 |
+
if os.path.exists(tokenizer_path):
|
| 829 |
+
try:
|
| 830 |
+
tokenizer = BBPETokenizer.load(tokenizer_path)
|
| 831 |
+
logger.info(f"Tokenizer loaded (vocab={tokenizer.vocab_size})")
|
| 832 |
+
except Exception as e:
|
| 833 |
+
logger.warning(f"Failed to load tokenizer ({e}), fitting inline")
|
| 834 |
+
tokenizer = BBPETokenizer(vocab_size=256)
|
| 835 |
+
tokenizer.fit_on_texts(["hello world", "machine learning"])
|
| 836 |
+
else:
|
| 837 |
+
tokenizer = BBPETokenizer(vocab_size=256)
|
| 838 |
+
tokenizer.fit_on_texts(["hello world", "machine learning"])
|
| 839 |
+
logger.info(f"Tokenizer fitted inline (vocab={tokenizer.vocab_size})")
|
| 840 |
+
|
| 841 |
+
# Build model
|
| 842 |
+
logger.info("\n[1] Building UnifiedModel...")
|
| 843 |
+
cfg = UnifiedModelConfig(
|
| 844 |
+
vocab_size=tokenizer.vocab_size,
|
| 845 |
+
d_model=128,
|
| 846 |
+
max_modules=8,
|
| 847 |
+
num_layers_hyp=NUM_LAYERS_HYP,
|
| 848 |
+
max_seq_len=MAX_SEQ_LEN,
|
| 849 |
+
)
|
| 850 |
+
model = UnifiedModel(cfg)
|
| 851 |
+
n_params = sum(p.numel() for p in model.parameters())
|
| 852 |
+
logger.info(f" Model params: {n_params/1e6:.2f}M")
|
| 853 |
+
|
| 854 |
+
# V6.1: REPLACE model.orq_cell with V6 Kohonen 4D SOM
|
| 855 |
+
if USE_KOHONEN_ORQ:
|
| 856 |
+
logger.info("\n[2] Replacing OrqCell with V6.1 Kohonen 4D SOM (PGVector-ready)...")
|
| 857 |
+
orq_v6 = OrqCellV6(Kohonen4DConfig(
|
| 858 |
+
d_cache=cfg.d_cache,
|
| 859 |
+
d_model_in=cfg.output_dim_u8cell,
|
| 860 |
+
nhead=cfg.nhead_orq,
|
| 861 |
+
d_ff=cfg.d_ff_orq,
|
| 862 |
+
total_steps=100,
|
| 863 |
+
pgvector_complete_thr=PGV_COMPLETE_THR,
|
| 864 |
+
pgvector_missing_thr=PGV_MISSING_THR,
|
| 865 |
+
))
|
| 866 |
+
device = next(model.parameters()).device
|
| 867 |
+
orq_v6 = orq_v6.to(device)
|
| 868 |
+
old_orq = model.orq_cell
|
| 869 |
+
model.orq_cell = orq_v6
|
| 870 |
+
del old_orq
|
| 871 |
+
logger.info(f" OrqCell V6.1 installed: "
|
| 872 |
+
f"n_neurons={orq_v6.cfg.n_neurons}, "
|
| 873 |
+
f"grid={orq_v6.cfg.grid_shape}, "
|
| 874 |
+
f"PGV thresholds: complete≥{PGV_COMPLETE_THR}, missing<{PGV_MISSING_THR}")
|
| 875 |
+
|
| 876 |
+
# V6 MTP head
|
| 877 |
+
mtp_head = None
|
| 878 |
+
if USE_MTP:
|
| 879 |
+
mtp_head = MTPHead(
|
| 880 |
+
hidden_size=cfg.d_cache,
|
| 881 |
+
vocab_size=tokenizer.vocab_size,
|
| 882 |
+
K=MTP_K,
|
| 883 |
+
)
|
| 884 |
+
mtp_head = mtp_head.to(device)
|
| 885 |
+
logger.info(f" MTP head initialized: K={MTP_K}")
|
| 886 |
+
|
| 887 |
+
# V6 Data augmenter
|
| 888 |
+
augmenter = DataAugmenter(AugmentationConfig(
|
| 889 |
+
vocab_size=tokenizer.vocab_size,
|
| 890 |
+
p_token_dropout=0.05,
|
| 891 |
+
p_cutout=0.03,
|
| 892 |
+
))
|
| 893 |
+
|
| 894 |
+
# V6 Tool system (smoke test)
|
| 895 |
+
cache = ToolCache(max_size=128)
|
| 896 |
+
mutator = ToolMutator(mutation_rate=0.1, max_variants=2)
|
| 897 |
+
mutator.register("encoder_layer", nn.Linear(cfg.d_model, cfg.d_model))
|
| 898 |
+
|
| 899 |
+
# V6.1 EWC — inicializado após epoch 1
|
| 900 |
+
ewc = None
|
| 901 |
+
|
| 902 |
+
# Optimizer
|
| 903 |
+
optimizer = torch.optim.AdamW(
|
| 904 |
+
list(model.parameters()) + list(mtp_head.parameters() if mtp_head is not None else []),
|
| 905 |
+
lr=3e-4, weight_decay=0.01,
|
| 906 |
+
)
|
| 907 |
+
|
| 908 |
+
# TripletPrototypeLoss
|
| 909 |
+
triplet_loss = TripletPrototypeLoss(margin=0.3, lambda_triplet=TRIPLET_WEIGHT)
|
| 910 |
+
prototypes = torch.zeros(cfg.max_modules, cfg.d_cache, requires_grad=False)
|
| 911 |
+
|
| 912 |
+
# MetaConfigurator
|
| 913 |
+
meta_cfg = MetaConfigurator(model)
|
| 914 |
+
|
| 915 |
+
# Monitor V6.1
|
| 916 |
+
monitor = MetricsMonitorV62()
|
| 917 |
+
|
| 918 |
+
# =====================================================================
|
| 919 |
+
# LOAD 5 DATASETS × 10 SAMPLES
|
| 920 |
+
# =====================================================================
|
| 921 |
+
logger.info("\n[3] Loading 5 datasets × 10 samples (streaming + synthetic fallback)...")
|
| 922 |
+
hf_token = os.environ.get("HF_TOKEN")
|
| 923 |
+
samples = load_v62_samples(tokenizer, MAX_SEQ_LEN, hf_token=hf_token)
|
| 924 |
+
n_total = len(samples)
|
| 925 |
+
n_train = int(0.8 * n_total)
|
| 926 |
+
train_samples = samples[:n_train]
|
| 927 |
+
val_samples = samples[n_train:]
|
| 928 |
+
logger.info(f" Train: {len(train_samples)} | Val: {len(val_samples)}")
|
| 929 |
+
# Report datasets distribution
|
| 930 |
+
ds_dist: Dict[str, int] = {}
|
| 931 |
+
for s in samples:
|
| 932 |
+
ds_dist[s["dataset"]] = ds_dist.get(s["dataset"], 0) + 1
|
| 933 |
+
logger.info(f" Dataset distribution: {ds_dist}")
|
| 934 |
+
|
| 935 |
+
# MCQ eval
|
| 936 |
+
mcq = make_mini_mcq(n_questions=8)
|
| 937 |
+
|
| 938 |
+
# =====================================================================
|
| 939 |
+
# TRAIN LOOP
|
| 940 |
+
# =====================================================================
|
| 941 |
+
logger.info("\n[4] Starting V6.1 training loop...")
|
| 942 |
+
global_step = 0
|
| 943 |
+
total_steps = EPOCHS * len(train_samples) // BATCH_SIZE
|
| 944 |
+
if USE_KOHONEN_ORQ:
|
| 945 |
+
model.orq_cell.cfg.total_steps = max(1, total_steps)
|
| 946 |
+
|
| 947 |
+
for epoch in range(1, EPOCHS + 1):
|
| 948 |
+
model.train()
|
| 949 |
+
if USE_MTP:
|
| 950 |
+
mtp_head.train()
|
| 951 |
+
augmenter.train()
|
| 952 |
+
|
| 953 |
+
epoch_losses = []
|
| 954 |
+
epoch_kohonen_auxs = []
|
| 955 |
+
epoch_pgv_statuses = []
|
| 956 |
+
|
| 957 |
+
for i in range(0, len(train_samples), BATCH_SIZE):
|
| 958 |
+
batch = train_samples[i:i + BATCH_SIZE]
|
| 959 |
+
if len(batch) < 2:
|
| 960 |
+
continue
|
| 961 |
+
global_step += 1
|
| 962 |
+
t0 = time.perf_counter()
|
| 963 |
+
|
| 964 |
+
x = torch.stack([s["input_ids"] for s in batch])
|
| 965 |
+
label = torch.stack([s["label_ids"] for s in batch])
|
| 966 |
+
actual_bs = len(batch)
|
| 967 |
+
n_tokens = actual_bs * MAX_SEQ_LEN
|
| 968 |
+
batch_ds = batch[0]["dataset"] # track dataset da 1a sample do batch
|
| 969 |
+
|
| 970 |
+
optimizer.zero_grad()
|
| 971 |
+
|
| 972 |
+
# V6: Data augmentation on input
|
| 973 |
+
x_aug = augmenter(x)
|
| 974 |
+
|
| 975 |
+
# Forward com return_aux
|
| 976 |
+
try:
|
| 977 |
+
y_hat, delta, aux = model(
|
| 978 |
+
x_aug,
|
| 979 |
+
return_aux=True,
|
| 980 |
+
use_hypothesis=True,
|
| 981 |
+
stop_grad_hyp=True,
|
| 982 |
+
)
|
| 983 |
+
except RuntimeError as e:
|
| 984 |
+
logger.warning(f" step {global_step}: forward failed: {e}")
|
| 985 |
+
aggressive_cleanup()
|
| 986 |
+
continue
|
| 987 |
+
|
| 988 |
+
# V6.1: Update OrqCell SOM step
|
| 989 |
+
if USE_KOHONEN_ORQ:
|
| 990 |
+
model.orq_cell.update_step(global_step)
|
| 991 |
+
|
| 992 |
+
# ─────────────────────────────────────────────────────────────
|
| 993 |
+
# V6.1 — PGVector-like lookup (treino level)
|
| 994 |
+
# O usuário pediu: "os níveis de treinamento e o de hipótese
|
| 995 |
+
# precisam verificar se o mapa já possui aquela informação"
|
| 996 |
+
#
|
| 997 |
+
# IMPORTANTE: a leitura (pgvector_lookup) é read-only e pode
|
| 998 |
+
# ser feita após forward. MAS a escrita (fill_missing_neurons_random)
|
| 999 |
+
# modifica neuron_cache in-place — deve ser DEFERIDA até após
|
| 1000 |
+
# backward para não quebrar o autograd graph.
|
| 1001 |
+
# ─────────────────────────────────────────────────────────────
|
| 1002 |
+
pgv_metrics = None
|
| 1003 |
+
pgv_needs_fill = False
|
| 1004 |
+
if USE_KOHONEN_ORQ:
|
| 1005 |
+
try:
|
| 1006 |
+
with torch.no_grad():
|
| 1007 |
+
# H_para_lookup: (B, 1, d_cache) — single "module" para lookup
|
| 1008 |
+
H_for_lookup = aux["o"].unsqueeze(1)
|
| 1009 |
+
pgv_result = model.orq_cell.pgvector_lookup(H_for_lookup)
|
| 1010 |
+
pgv_metrics = pgv_result
|
| 1011 |
+
# Se MISSING, marca para preenchimento DEPOIS do backward
|
| 1012 |
+
# (user requirement: "se não houver atribuir valores
|
| 1013 |
+
# aleatórios aos parâmetros faltantes")
|
| 1014 |
+
if pgv_result["status"] == "MISSING":
|
| 1015 |
+
pgv_needs_fill = True
|
| 1016 |
+
except (RuntimeError, ValueError, KeyError) as e:
|
| 1017 |
+
pass
|
| 1018 |
+
|
| 1019 |
+
# ─────────────────────────────────────────────────────────────
|
| 1020 |
+
# V6.2 — PGVector lookup no nível de HIPÓTESE
|
| 1021 |
+
# User requirement: "ative pgvector_lookup no nível de hipótese
|
| 1022 |
+
# (hyp_t.py) para que ele também consulte o mapa antes de
|
| 1023 |
+
# aplicar punição"
|
| 1024 |
+
#
|
| 1025 |
+
# Antes de aplicar a punição (correção delta), a HypT consulta
|
| 1026 |
+
# o mapa SOM. Se status == COMPLETE, a punição é DESATIVADA —
|
| 1027 |
+
# o modelo confia em y_hat. Caso contrário, aplica delta.
|
| 1028 |
+
# ─────────────────────────────────────────────────────────────
|
| 1029 |
+
target = label[:, 0]
|
| 1030 |
+
|
| 1031 |
+
# Calcula loss_main em y_hat (sem delta) para decidir punição
|
| 1032 |
+
with torch.no_grad():
|
| 1033 |
+
loss_main_check = F.cross_entropy(y_hat, target).item()
|
| 1034 |
+
# τ do MetaConfigurator — se loss_main > τ, punição é pedida
|
| 1035 |
+
current_tau = float(meta_cfg.tau) if hasattr(meta_cfg, 'tau') else 1.0
|
| 1036 |
+
punishment_requested = bool(loss_main_check > current_tau)
|
| 1037 |
+
|
| 1038 |
+
# Hyp PGVector lookup (consulta o mapa antes de aplicar delta)
|
| 1039 |
+
hyp_pgv_metrics = None
|
| 1040 |
+
apply_punishment = True # default: aplica delta
|
| 1041 |
+
try:
|
| 1042 |
+
hyp_pgv_result = model.hyp_T.pgvector_lookup_before_punishment(
|
| 1043 |
+
orq_cell=model.orq_cell if USE_KOHONEN_ORQ else None,
|
| 1044 |
+
o=aux["o"].detach(),
|
| 1045 |
+
punishment_requested=punishment_requested,
|
| 1046 |
+
)
|
| 1047 |
+
apply_punishment = hyp_pgv_result["apply_punishment"]
|
| 1048 |
+
# Anexa stats acumuladas do HypT
|
| 1049 |
+
hyp_pgv_result["hyp_stats"] = model.hyp_T.get_punishment_stats()
|
| 1050 |
+
hyp_pgv_metrics = hyp_pgv_result
|
| 1051 |
+
except (RuntimeError, AttributeError, TypeError) as e:
|
| 1052 |
+
# Fallback: aplica delta (preserva comportamento V6.1)
|
| 1053 |
+
pass
|
| 1054 |
+
|
| 1055 |
+
# Loss LM — aplica delta apenas se apply_punishment=True
|
| 1056 |
+
if apply_punishment:
|
| 1057 |
+
y_final = y_hat + delta
|
| 1058 |
+
else:
|
| 1059 |
+
# V6.2: COMPLETE skip — usa apenas y_hat (SOM tem a info)
|
| 1060 |
+
y_final = y_hat
|
| 1061 |
+
loss_lm = F.cross_entropy(y_final, target)
|
| 1062 |
+
|
| 1063 |
+
# Loss de entropia do module_selector
|
| 1064 |
+
loss_ent = model.lambda_ent_value * aux["entropy_reg"]
|
| 1065 |
+
|
| 1066 |
+
# TripletPrototypeLoss
|
| 1067 |
+
embeddings_for_triplet = aux["o"]
|
| 1068 |
+
alpha_aux = aux["alpha"]
|
| 1069 |
+
labels_for_triplet = torch.full(
|
| 1070 |
+
(actual_bs,), int(alpha_aux.argmax()), dtype=torch.long
|
| 1071 |
+
)
|
| 1072 |
+
try:
|
| 1073 |
+
loss_triplet = triplet_loss(
|
| 1074 |
+
embeddings_for_triplet, labels_for_triplet, prototypes
|
| 1075 |
+
)
|
| 1076 |
+
with torch.no_grad():
|
| 1077 |
+
emb_for_ema = embeddings_for_triplet.detach()
|
| 1078 |
+
for i_ in range(actual_bs):
|
| 1079 |
+
lbl = labels_for_triplet[i_].item()
|
| 1080 |
+
if 0 <= lbl < prototypes.size(0):
|
| 1081 |
+
prototypes[lbl] = (
|
| 1082 |
+
(1 - TRIPLET_EMA_ALPHA) * prototypes[lbl]
|
| 1083 |
+
+ TRIPLET_EMA_ALPHA * emb_for_ema[i_]
|
| 1084 |
+
)
|
| 1085 |
+
except (RuntimeError, ValueError):
|
| 1086 |
+
loss_triplet = torch.tensor(0.0, device=y_hat.device)
|
| 1087 |
+
|
| 1088 |
+
# V6 MTP loss
|
| 1089 |
+
mtp_metrics = None
|
| 1090 |
+
mtp_loss_val = torch.tensor(0.0, device=y_hat.device)
|
| 1091 |
+
if USE_MTP and mtp_head is not None:
|
| 1092 |
+
try:
|
| 1093 |
+
h_for_mtp = aux["o"].unsqueeze(1).expand(-1, MTP_K, -1)
|
| 1094 |
+
mtp_logits, mtp_alphas = mtp_head(h_for_mtp)
|
| 1095 |
+
mtp_targets = label[:, :MTP_K]
|
| 1096 |
+
if mtp_targets.size(1) >= 1:
|
| 1097 |
+
mtp_loss_val, mtp_metrics = mtp_loss(
|
| 1098 |
+
mtp_logits, mtp_targets, mtp_alphas,
|
| 1099 |
+
entropy_beta=MTP_ENTROPY_BETA,
|
| 1100 |
+
)
|
| 1101 |
+
except (RuntimeError, ValueError) as e:
|
| 1102 |
+
logger.warning(f" MTP loss failed: {e}")
|
| 1103 |
+
|
| 1104 |
+
# V6.1 EWC penalty (after epoch 1, with skip mask)
|
| 1105 |
+
ewc_metrics = None
|
| 1106 |
+
ewc_pen = torch.tensor(0.0, device=y_hat.device)
|
| 1107 |
+
if USE_EWC and ewc is not None and ewc.n_tasks > 0:
|
| 1108 |
+
try:
|
| 1109 |
+
# BMU indices from PGVector lookup
|
| 1110 |
+
bmu_idx = torch.full(
|
| 1111 |
+
(actual_bs,),
|
| 1112 |
+
pgv_metrics.get("best_neuron_idx", 0) if pgv_metrics else 0,
|
| 1113 |
+
dtype=torch.long, device=y_hat.device,
|
| 1114 |
+
)
|
| 1115 |
+
ewc_pen, ewc_metrics = ewc.compute_penalty(
|
| 1116 |
+
bmu_indices=bmu_idx,
|
| 1117 |
+
eval_mode=not model.training,
|
| 1118 |
+
)
|
| 1119 |
+
except (RuntimeError, AttributeError) as e:
|
| 1120 |
+
logger.warning(f" EWC penalty failed: {e}")
|
| 1121 |
+
|
| 1122 |
+
# Loss total
|
| 1123 |
+
loss = (loss_lm + loss_ent + TRIPLET_WEIGHT * loss_triplet
|
| 1124 |
+
+ MTP_LOSS_WEIGHT * mtp_loss_val + ewc_pen)
|
| 1125 |
+
|
| 1126 |
+
# Backward
|
| 1127 |
+
loss.backward()
|
| 1128 |
+
grad_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
|
| 1129 |
+
optimizer.step()
|
| 1130 |
+
|
| 1131 |
+
# V6.1 SOM update APÓS backward
|
| 1132 |
+
som_update_metrics = None
|
| 1133 |
+
if USE_KOHONEN_ORQ:
|
| 1134 |
+
try:
|
| 1135 |
+
som_update_metrics = model.orq_cell.update_map_after_backward()
|
| 1136 |
+
except (RuntimeError, AttributeError) as e:
|
| 1137 |
+
pass
|
| 1138 |
+
|
| 1139 |
+
# V6.1 — PGVector fill (após backward + SOM update, safe p/ autograd)
|
| 1140 |
+
# Se o step anterior identificou MISSING, preenche neurônios
|
| 1141 |
+
# não-filled com valores aleatórios controlados.
|
| 1142 |
+
if pgv_needs_fill and USE_KOHONEN_ORQ:
|
| 1143 |
+
try:
|
| 1144 |
+
n_filled_now = model.orq_cell.fill_missing_neurons_random()
|
| 1145 |
+
if n_filled_now > 0:
|
| 1146 |
+
logger.info(f" [PGV] MISSING → preenchidos {n_filled_now} neurônios aleatoriamente")
|
| 1147 |
+
except (RuntimeError, AttributeError) as e:
|
| 1148 |
+
pass
|
| 1149 |
+
|
| 1150 |
+
# V6 MetaConfigurator
|
| 1151 |
+
if global_step % META_INTERVAL == 0:
|
| 1152 |
+
try:
|
| 1153 |
+
meta_result = meta_cfg.step(loss.detach())
|
| 1154 |
+
monitor.record_meta(meta_result)
|
| 1155 |
+
except (RuntimeError, AttributeError):
|
| 1156 |
+
pass
|
| 1157 |
+
|
| 1158 |
+
# V6.1 Capture Kohonen aux
|
| 1159 |
+
kohonen_aux = None
|
| 1160 |
+
if USE_KOHONEN_ORQ:
|
| 1161 |
+
try:
|
| 1162 |
+
with torch.no_grad():
|
| 1163 |
+
H_dummy = embeddings_for_triplet.unsqueeze(1)
|
| 1164 |
+
_, kohonen_aux = model.orq_cell(
|
| 1165 |
+
H_dummy, step=global_step, return_aux=True
|
| 1166 |
+
)
|
| 1167 |
+
if som_update_metrics and kohonen_aux:
|
| 1168 |
+
kohonen_aux["update_magnitude"] = som_update_metrics.get("update_magnitude", 0)
|
| 1169 |
+
kohonen_aux["bmu_drift"] = som_update_metrics.get("bmu_drift", 0)
|
| 1170 |
+
kohonen_aux["n_filled"] = som_update_metrics.get("n_filled",
|
| 1171 |
+
kohonen_aux.get("n_filled", 0))
|
| 1172 |
+
kohonen_aux["filled_ratio"] = (
|
| 1173 |
+
kohonen_aux["n_filled"] / model.orq_cell.cfg.n_neurons
|
| 1174 |
+
)
|
| 1175 |
+
except (RuntimeError, ValueError, KeyError) as e:
|
| 1176 |
+
pass
|
| 1177 |
+
|
| 1178 |
+
loss_value = float(loss.item())
|
| 1179 |
+
grad_norm_value = float(grad_norm)
|
| 1180 |
+
|
| 1181 |
+
del loss, y_hat, delta, aux, y_final, loss_lm, loss_ent
|
| 1182 |
+
del loss_triplet, mtp_loss_val, ewc_pen
|
| 1183 |
+
if 'mtp_logits' in locals():
|
| 1184 |
+
del mtp_logits
|
| 1185 |
+
if 'mtp_alphas' in locals():
|
| 1186 |
+
del mtp_alphas
|
| 1187 |
+
if 'embeddings_for_triplet' in locals():
|
| 1188 |
+
del embeddings_for_triplet
|
| 1189 |
+
if 'h_for_mtp' in locals():
|
| 1190 |
+
del h_for_mtp
|
| 1191 |
+
if global_step % CLEANUP_INTERVAL == 0:
|
| 1192 |
+
aggressive_cleanup()
|
| 1193 |
+
|
| 1194 |
+
elapsed = time.perf_counter() - t0
|
| 1195 |
+
flops_est = 2 * n_params * n_tokens
|
| 1196 |
+
|
| 1197 |
+
monitor.record_step(
|
| 1198 |
+
global_step, loss_value,
|
| 1199 |
+
n_tokens, elapsed, grad_norm_value,
|
| 1200 |
+
flops_estimate=flops_est,
|
| 1201 |
+
kohonen_aux=kohonen_aux,
|
| 1202 |
+
mtp_metrics=mtp_metrics,
|
| 1203 |
+
ewc_metrics=ewc_metrics,
|
| 1204 |
+
pgv_metrics=pgv_metrics,
|
| 1205 |
+
hyp_pgv_metrics=hyp_pgv_metrics,
|
| 1206 |
+
dataset_name=batch_ds,
|
| 1207 |
+
)
|
| 1208 |
+
|
| 1209 |
+
epoch_losses.append(loss_value)
|
| 1210 |
+
if kohonen_aux:
|
| 1211 |
+
epoch_kohonen_auxs.append(kohonen_aux)
|
| 1212 |
+
if pgv_metrics:
|
| 1213 |
+
epoch_pgv_statuses.append(pgv_metrics["status"])
|
| 1214 |
+
|
| 1215 |
+
# Fim do epoch — Val
|
| 1216 |
+
model.eval()
|
| 1217 |
+
if USE_MTP:
|
| 1218 |
+
mtp_head.eval()
|
| 1219 |
+
val_losses = []
|
| 1220 |
+
mtp_val_losses = []
|
| 1221 |
+
|
| 1222 |
+
with torch.no_grad():
|
| 1223 |
+
for sample in val_samples:
|
| 1224 |
+
x = sample["input_ids"].unsqueeze(0)
|
| 1225 |
+
label = sample["label_ids"]
|
| 1226 |
+
try:
|
| 1227 |
+
y_hat, delta = model(x, use_hypothesis=True)
|
| 1228 |
+
target = label[0:1]
|
| 1229 |
+
vloss = F.cross_entropy(y_hat + delta, target)
|
| 1230 |
+
val_losses.append(float(vloss.item()))
|
| 1231 |
+
|
| 1232 |
+
# V6.1 MTP ativo em val
|
| 1233 |
+
if USE_MTP and mtp_head is not None:
|
| 1234 |
+
try:
|
| 1235 |
+
y_hat2, delta2, aux2 = model(x, return_aux=True, use_hypothesis=True)
|
| 1236 |
+
o = aux2["o"].unsqueeze(1).expand(-1, MTP_K, -1)
|
| 1237 |
+
mtp_logits, mtp_alphas = mtp_head(o)
|
| 1238 |
+
mtp_targets = label[:MTP_K].unsqueeze(0)
|
| 1239 |
+
mtp_loss_val, _ = mtp_loss(
|
| 1240 |
+
mtp_logits, mtp_targets, mtp_alphas,
|
| 1241 |
+
entropy_beta=MTP_ENTROPY_BETA,
|
| 1242 |
+
)
|
| 1243 |
+
mtp_val_losses.append(float(mtp_loss_val.item()))
|
| 1244 |
+
del y_hat2, delta2, aux2, o, mtp_logits, mtp_alphas
|
| 1245 |
+
except (RuntimeError, ValueError):
|
| 1246 |
+
pass
|
| 1247 |
+
del y_hat, delta
|
| 1248 |
+
except RuntimeError:
|
| 1249 |
+
continue
|
| 1250 |
+
|
| 1251 |
+
val_loss = sum(val_losses) / max(1, len(val_losses))
|
| 1252 |
+
train_avg = sum(epoch_losses) / max(1, len(epoch_losses))
|
| 1253 |
+
mtp_val_avg = sum(mtp_val_losses) / max(1, len(mtp_val_losses)) if mtp_val_losses else None
|
| 1254 |
+
eval_acc = evaluate_mcq(model, tokenizer, mcq)
|
| 1255 |
+
monitor.record_epoch(epoch, val_loss, train_avg, eval_acc, mtp_val_avg)
|
| 1256 |
+
|
| 1257 |
+
# Log PGVector status distribution do epoch
|
| 1258 |
+
if epoch_pgv_statuses:
|
| 1259 |
+
from collections import Counter
|
| 1260 |
+
status_counts = Counter(epoch_pgv_statuses)
|
| 1261 |
+
logger.info(f" [PGV epoch {epoch}] status distribution: {dict(status_counts)}")
|
| 1262 |
+
|
| 1263 |
+
# V6.1 EWC: Após epoch 1, computar Fisher (com skip_som_filled_neurons=True)
|
| 1264 |
+
if USE_EWC and ewc is None and epoch == 1:
|
| 1265 |
+
logger.info(f"\n [EWC V6.1] Computing Fisher after epoch {epoch}...")
|
| 1266 |
+
logger.info(f" [EWC V6.1] skip_som_filled_neurons=True — neurônios filled no SOM serão MASCARADOS")
|
| 1267 |
+
try:
|
| 1268 |
+
ewc = EWCV6(model, EWCConfigV6(
|
| 1269 |
+
lambda_ewc=EWC_LAMBDA,
|
| 1270 |
+
lambda_topo=EWC_LAMBDA_TOPO,
|
| 1271 |
+
bmu_reinforcement_gamma=2.0,
|
| 1272 |
+
skip_som_filled_neurons=True, # V6.1 key feature
|
| 1273 |
+
))
|
| 1274 |
+
if USE_KOHONEN_ORQ:
|
| 1275 |
+
ewc.orq_cells["orq_cell"] = model.orq_cell
|
| 1276 |
+
|
| 1277 |
+
# Snapshot do SOM antes do Fisher
|
| 1278 |
+
n_filled_before = int(model.orq_cell.neuron_filled_mask.sum().item())
|
| 1279 |
+
logger.info(f" [EWC V6.1] SOM filled neurons antes do Fisher: {n_filled_before}/8")
|
| 1280 |
+
|
| 1281 |
+
def data_iter():
|
| 1282 |
+
for sample in train_samples[:16]:
|
| 1283 |
+
x = sample["input_ids"].unsqueeze(0)
|
| 1284 |
+
y = sample["label_ids"][:1]
|
| 1285 |
+
yield (x, y)
|
| 1286 |
+
ewc.compute_fisher(data_iter(), n_samples=16, bmu_indices=list(range(8)))
|
| 1287 |
+
logger.info(f" [EWC V6.1] Fisher computed: classic={len(ewc.fisher)}, "
|
| 1288 |
+
f"neuron={len(ewc.neuron_fisher)}, "
|
| 1289 |
+
f"topo={len(ewc.neuron_grid_dist)}")
|
| 1290 |
+
status = ewc.get_status()
|
| 1291 |
+
logger.info(f" [EWC V6.1] n_active_ewc_neurons={status['n_active_ewc_neurons']} "
|
| 1292 |
+
f"(EWC atua nestes) | n_masked_som_neurons={status['n_masked_som_neurons']} "
|
| 1293 |
+
f"(SOM já cobre — não duplica)")
|
| 1294 |
+
except (RuntimeError, AttributeError) as e:
|
| 1295 |
+
logger.warning(f" [EWC V6.1] Fisher computation failed: {e}")
|
| 1296 |
+
ewc = None
|
| 1297 |
+
|
| 1298 |
+
aggressive_cleanup()
|
| 1299 |
+
|
| 1300 |
+
# =====================================================================
|
| 1301 |
+
# FINAL REPORT
|
| 1302 |
+
# =====================================================================
|
| 1303 |
+
logger.info("\n[5] Generating V6.1 report...")
|
| 1304 |
+
summary = monitor.summary()
|
| 1305 |
+
|
| 1306 |
+
report = {
|
| 1307 |
+
"version": "V6.2",
|
| 1308 |
+
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
|
| 1309 |
+
"config": {
|
| 1310 |
+
"datasets": V62_DATASETS,
|
| 1311 |
+
"n_per_dataset": N_PER_DATASET,
|
| 1312 |
+
"epochs": EPOCHS, "batch_size": BATCH_SIZE,
|
| 1313 |
+
"max_seq_len": MAX_SEQ_LEN, "num_layers_hyp": NUM_LAYERS_HYP,
|
| 1314 |
+
"use_mtp": USE_MTP, "use_ewc": USE_EWC, "use_kohonen_orq": USE_KOHONEN_ORQ,
|
| 1315 |
+
"mtp_K": MTP_K, "mtp_entropy_beta": MTP_ENTROPY_BETA,
|
| 1316 |
+
"ewc_lambda": EWC_LAMBDA, "ewc_lambda_topo": EWC_LAMBDA_TOPO,
|
| 1317 |
+
"pgv_complete_thr": PGV_COMPLETE_THR,
|
| 1318 |
+
"pgv_missing_thr": PGV_MISSING_THR,
|
| 1319 |
+
},
|
| 1320 |
+
"v6_2_improvements": {
|
| 1321 |
+
"hypothesis_level_pgvector_lookup": {
|
| 1322 |
+
"method": "HypT.pgvector_lookup_before_punishment() em hyp_t.py",
|
| 1323 |
+
"rationale": "Antes de aplicar a punição (correção delta), a HypT "
|
| 1324 |
+
"consulta o mapa SOM. Se status == COMPLETE, a punição "
|
| 1325 |
+
"é DESATIVADA — o modelo confia em y_hat. Caso "
|
| 1326 |
+
"contrário, a punição é aplicada.",
|
| 1327 |
+
"statuses": ["COMPLETE (skip)", "INCOMPLETE (apply)", "MISSING (apply)",
|
| 1328 |
+
"NO_PUNISHMENT (loss ≤ τ)"],
|
| 1329 |
+
"user_requirement": "ative pgvector_lookup no nível de hipótese (hyp_t.py) "
|
| 1330 |
+
"para que ele também consulte o mapa antes de aplicar punição",
|
| 1331 |
+
},
|
| 1332 |
+
"batch_size_16": True,
|
| 1333 |
+
"5_datasets_x_50_samples": True,
|
| 1334 |
+
"datasets_library_installed": True,
|
| 1335 |
+
},
|
| 1336 |
+
"v6_1_features_preserved": {
|
| 1337 |
+
"pgvector_like_lookup_orq_cell": {
|
| 1338 |
+
"method": "pgvector_lookup() no OrqCell",
|
| 1339 |
+
"statuses": ["COMPLETE", "INCOMPLETE", "MISSING"],
|
| 1340 |
+
"complete_threshold": PGV_COMPLETE_THR,
|
| 1341 |
+
"missing_threshold": PGV_MISSING_THR,
|
| 1342 |
+
"neuron_filled_mask": True,
|
| 1343 |
+
"auto_fill_missing": True,
|
| 1344 |
+
},
|
| 1345 |
+
"ewc_math_upgrade": {
|
| 1346 |
+
"skip_som_filled_neurons": True,
|
| 1347 |
+
"rationale": "EWC não reutiliza pesos já presentes no SOM — "
|
| 1348 |
+
"evita dupla penalização (BMU + Fisher)",
|
| 1349 |
+
"fisher_neuron_mask": True,
|
| 1350 |
+
"n_masked_som_neurons_final": summary.get("ewc_evolution", {}).get(
|
| 1351 |
+
"n_masked_som_neurons", [0])[-1] if summary.get("ewc_evolution", {}).get(
|
| 1352 |
+
"n_masked_som_neurons") else 0,
|
| 1353 |
+
},
|
| 1354 |
+
"training_level_pgvector": True,
|
| 1355 |
+
},
|
| 1356 |
+
"v6_features_preserved": {
|
| 1357 |
+
"kohonen_4d_som": True,
|
| 1358 |
+
"ewc_per_neuron": True,
|
| 1359 |
+
"mtp_active_in_val": True,
|
| 1360 |
+
"mtp_entropy_regularizer": True,
|
| 1361 |
+
"window_context_2m": True,
|
| 1362 |
+
"dynamic_rep_penalty": True,
|
| 1363 |
+
"data_augmentation": True,
|
| 1364 |
+
"rlhf_mapping": True,
|
| 1365 |
+
"thinking_system": True,
|
| 1366 |
+
"tool_system": ["mutation", "cache", "agent"],
|
| 1367 |
+
"langchain_compat": True,
|
| 1368 |
+
"optimized_pipeline": True,
|
| 1369 |
+
"xeon_v6_always_active": True,
|
| 1370 |
+
"libvirt_amx_vm_activation": True,
|
| 1371 |
+
},
|
| 1372 |
+
"xeon_status": XEON_STATUS,
|
| 1373 |
+
"fp16_benchmark": FP16_BENCH,
|
| 1374 |
+
"dataset_distribution": summary.get("dataset_distribution", {}),
|
| 1375 |
+
"result": {
|
| 1376 |
+
**summary,
|
| 1377 |
+
"n_params_M": n_params / 1e6,
|
| 1378 |
+
},
|
| 1379 |
+
}
|
| 1380 |
+
|
| 1381 |
+
with open(REPORT_PATH, "w") as f:
|
| 1382 |
+
json.dump(report, f, indent=2, default=str)
|
| 1383 |
+
logger.info(f" Report saved: {REPORT_PATH}")
|
| 1384 |
+
|
| 1385 |
+
# =====================================================================
|
| 1386 |
+
# DELETE BINARIES
|
| 1387 |
+
# =====================================================================
|
| 1388 |
+
logger.info("\n[6] Deleting training binaries...")
|
| 1389 |
+
deleted = delete_training_binaries()
|
| 1390 |
+
logger.info(f" Deleted {len(deleted)} binary files")
|
| 1391 |
+
|
| 1392 |
+
# =====================================================================
|
| 1393 |
+
# SUMMARY
|
| 1394 |
+
# =====================================================================
|
| 1395 |
+
logger.info("\n" + "=" * 72)
|
| 1396 |
+
logger.info("V6.2 TRAINING COMPLETE")
|
| 1397 |
+
logger.info("=" * 72)
|
| 1398 |
+
logger.info(f" Total samples: {len(samples)} (5 datasets × {N_PER_DATASET})")
|
| 1399 |
+
logger.info(f" Total steps: {summary['n_steps']}, Epochs: {summary['n_epochs']}")
|
| 1400 |
+
if summary['final_train_loss'] is not None:
|
| 1401 |
+
logger.info(f" Final train_loss: {summary['final_train_loss']:.4f}")
|
| 1402 |
+
if summary['final_val_loss'] is not None:
|
| 1403 |
+
logger.info(f" Final val_loss: {summary['final_val_loss']:.4f}")
|
| 1404 |
+
if summary['final_perplexity'] is not None:
|
| 1405 |
+
logger.info(f" Perplexity: {summary['final_perplexity']:.2f}")
|
| 1406 |
+
if summary['final_eval_benchmark'] is not None:
|
| 1407 |
+
logger.info(f" Eval acc: {summary['final_eval_benchmark']:.2%}")
|
| 1408 |
+
if summary['final_rss_mb'] is not None:
|
| 1409 |
+
logger.info(f" RSS: {summary['final_rss_mb']:.0f}MB ({summary['rss_trend']})")
|
| 1410 |
+
logger.info(f" Alerts: {summary['n_alerts']}")
|
| 1411 |
+
|
| 1412 |
+
# V6.1 PGVector summary
|
| 1413 |
+
pgv_ev = summary.get("pgvector_evolution", {})
|
| 1414 |
+
if pgv_ev.get("status_counts"):
|
| 1415 |
+
logger.info(f" PGVector (treino level) status distribution:")
|
| 1416 |
+
for s, c in pgv_ev["status_counts"].items():
|
| 1417 |
+
logger.info(f" {s}: {c}")
|
| 1418 |
+
logger.info(f" final coverage: {pgv_ev.get('final_coverage', 0):.3f}")
|
| 1419 |
+
logger.info(f" final best_sim: {pgv_ev.get('final_best_sim', 0):.3f}")
|
| 1420 |
+
logger.info(f" final n_filled: {pgv_ev.get('final_n_filled', 0)}/8")
|
| 1421 |
+
|
| 1422 |
+
# V6.2 Hyp PGVector summary
|
| 1423 |
+
hyp_pgv_ev = summary.get("hyp_pgvector_evolution", {})
|
| 1424 |
+
if hyp_pgv_ev.get("status_counts"):
|
| 1425 |
+
logger.info(f" Hyp PGVector (nível de hipótese) status distribution:")
|
| 1426 |
+
for s, c in hyp_pgv_ev["status_counts"].items():
|
| 1427 |
+
logger.info(f" {s}: {c}")
|
| 1428 |
+
logger.info(f" n_complete_skip (punição evitada): "
|
| 1429 |
+
f"{hyp_pgv_ev.get('final_n_complete_skip', 0)}")
|
| 1430 |
+
logger.info(f" n_incomplete_apply (punição aplicada, info parcial): "
|
| 1431 |
+
f"{hyp_pgv_ev.get('final_n_incomplete_apply', 0)}")
|
| 1432 |
+
logger.info(f" n_missing_apply (punição aplicada, info ausente): "
|
| 1433 |
+
f"{hyp_pgv_ev.get('final_n_missing_apply', 0)}")
|
| 1434 |
+
logger.info(f" skip_rate (fração de punições evitadas pelo pgvector): "
|
| 1435 |
+
f"{hyp_pgv_ev.get('final_skip_rate', 0):.2%}")
|
| 1436 |
+
logger.info(f" final best_sim: {hyp_pgv_ev.get('final_best_sim', 0):.3f}")
|
| 1437 |
+
logger.info(f" final coverage: {hyp_pgv_ev.get('final_coverage', 0):.3f}")
|
| 1438 |
+
|
| 1439 |
+
# V6.1 EWC summary
|
| 1440 |
+
ewc_ev = summary.get("ewc_evolution", {})
|
| 1441 |
+
if ewc_ev.get("n_masked_som_neurons"):
|
| 1442 |
+
logger.info(f" EWC V6.1 math upgrade:")
|
| 1443 |
+
logger.info(f" n_masked_som_neurons (skipped): {ewc_ev['n_masked_som_neurons'][-1]}")
|
| 1444 |
+
logger.info(f" final EWC penalty: {ewc_ev['total_penalty'][-1] if ewc_ev['total_penalty'] else 0:.4f}")
|
| 1445 |
+
|
| 1446 |
+
# V6 Kohonen summary
|
| 1447 |
+
kohonen_ev = summary.get("kohonen_evolution", {})
|
| 1448 |
+
if kohonen_ev.get("sigma_t"):
|
| 1449 |
+
logger.info(f" Kohonen SOM evolution:")
|
| 1450 |
+
logger.info(f" sigma_t: {kohonen_ev['sigma_t'][0]:.3f} → {kohonen_ev['final_sigma_t']:.3f}")
|
| 1451 |
+
logger.info(f" alpha_t: {kohonen_ev['alpha_t'][0]:.3f} → {kohonen_ev['final_alpha_t']:.3f}")
|
| 1452 |
+
logger.info(f" final n_filled: {kohonen_ev.get('final_n_filled', 0)}/8 "
|
| 1453 |
+
f"(filled_ratio={kohonen_ev.get('final_filled_ratio', 0):.2%})")
|
| 1454 |
+
|
| 1455 |
+
logger.info("=" * 72)
|
| 1456 |
+
|
| 1457 |
+
return report
|
| 1458 |
+
|
| 1459 |
+
|
| 1460 |
+
if __name__ == "__main__":
|
| 1461 |
+
main()
|
|
@@ -0,0 +1,248 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""upload_v6_2_resilient.py — Upload resiliente V6.2 para o HF.
|
| 2 |
+
|
| 3 |
+
Estratégia (igual V6/V6.1):
|
| 4 |
+
- HfApi.upload_folder (single commit lógico)
|
| 5 |
+
- allow_patterns: *.py + *.json + *.md + *.txt + tokenizer.json
|
| 6 |
+
- ignore_patterns: __pycache__, *.pyc, _test_*, *.safetensors, *.bin, *.pt, *.pth
|
| 7 |
+
- hf_transfer habilitado
|
| 8 |
+
|
| 9 |
+
V6.2 inclui (NOVO vs V6.1):
|
| 10 |
+
- src/bigru_t/model/hyp_t.py (V6.2 — pgvector_lookup_before_punishment()
|
| 11 |
+
consults SOM before applying punishment; COMPLETE → skip delta,
|
| 12 |
+
INCOMPLETE/MISSING → apply delta; tracks n_complete_skip, n_incomplete_apply,
|
| 13 |
+
n_missing_apply, skip_rate)
|
| 14 |
+
- scripts/train_v6_2.py (NOVO — 5 datasets × 50 samples + BATCH_SIZE=16 +
|
| 15 |
+
hyp pgvector capture)
|
| 16 |
+
- v6_2_report.json (relatório do treino V6.2)
|
| 17 |
+
|
| 18 |
+
Uso:
|
| 19 |
+
export HF_TOKEN="hf_xxx..." # env var temporária, será apagada após upload
|
| 20 |
+
python /home/z/my-project/scripts/upload_v6_2_resilient.py
|
| 21 |
+
"""
|
| 22 |
+
from __future__ import annotations
|
| 23 |
+
|
| 24 |
+
import os
|
| 25 |
+
import sys
|
| 26 |
+
import time
|
| 27 |
+
import json
|
| 28 |
+
from pathlib import Path
|
| 29 |
+
|
| 30 |
+
os.environ.setdefault("HF_HUB_ENABLE_HF_TRANSFER", "1")
|
| 31 |
+
os.environ.setdefault("HF_HUB_ETAG_TIMEOUT", "60")
|
| 32 |
+
os.environ.setdefault("PYTHONUNBUFFERED", "1")
|
| 33 |
+
os.environ.setdefault("OMP_NUM_THREADS", "2")
|
| 34 |
+
os.environ.setdefault("TOKENIZERS_PARALLELISM", "true")
|
| 35 |
+
|
| 36 |
+
from huggingface_hub import HfApi # noqa: E402
|
| 37 |
+
|
| 38 |
+
REPO_ID = "PowerMachine/BiGRU_T_version"
|
| 39 |
+
LOCAL_DIR = "/home/z/my-project/BiGRU_T_version"
|
| 40 |
+
COMMIT_MESSAGE = """V6.2: HypT pgvector_lookup before punishment + BATCH_SIZE=16 + 5 datasets x 50
|
| 41 |
+
|
| 42 |
+
V6.2 improvements (vs V6.1):
|
| 43 |
+
- hyp_t.py: pgvector_lookup_before_punishment() method — HypT consults
|
| 44 |
+
SOM map BEFORE applying punishment (delta correction). If status ==
|
| 45 |
+
COMPLETE, punishment is SKIPPED (model trusts y_hat). If INCOMPLETE/
|
| 46 |
+
MISSING, punishment is applied normally.
|
| 47 |
+
(User requirement: "ative pgvector_lookup no nível de hipótese (hyp_t.py)
|
| 48 |
+
para que ele também consulte o mapa antes de aplicar punição")
|
| 49 |
+
- hyp_t.py: tracks n_complete_skip, n_incomplete_apply, n_missing_apply,
|
| 50 |
+
skip_rate (for monitoring)
|
| 51 |
+
- train_v6_2.py: BATCH_SIZE=16 (was 4) — user requirement
|
| 52 |
+
- train_v6_2.py: 5 datasets from streaming_datasets.py x 50 samples each
|
| 53 |
+
(250 total, 2 epochs) — user requirement (was 10 per dataset)
|
| 54 |
+
- train_v6_2.py: synthetic fallback expanded to 50 samples per dataset
|
| 55 |
+
with templates + random placeholders (ensures 250 samples even when
|
| 56 |
+
streaming fails)
|
| 57 |
+
- train_v6_2.py: datasets library installed (pip install datasets) for
|
| 58 |
+
real streaming
|
| 59 |
+
- xeon_runtime.py V6 always active (AVX512 + AMX_INT8 + IPEX + OneDNN)
|
| 60 |
+
|
| 61 |
+
V6.2 monitoring (12/12 + Kohonen + MTP + EWC + PGVector train + Hyp PGVector):
|
| 62 |
+
- 12/12 base metrics (loss, perplexity, tps, tflops, rss, alerts, etc.)
|
| 63 |
+
- Kohonen SOM: sigma_t, alpha_t, bmu_diversity, n_filled, filled_ratio
|
| 64 |
+
- MTP: train loss, val loss, entropy regularizer, alphas
|
| 65 |
+
- EWC V6.1: total_penalty, classic_pen, kohonen_pen, topo_pen,
|
| 66 |
+
n_masked_som_neurons (skip mask working)
|
| 67 |
+
- PGVector (treino level): status (COMPLETE/INCOMPLETE/MISSING),
|
| 68 |
+
coverage_ratio, best_sim, n_filled
|
| 69 |
+
- PGVector (nível de hipótese) [V6.2 NEW]: status, apply_punishment,
|
| 70 |
+
skipped_by_pgvector, n_complete_skip, n_incomplete_apply,
|
| 71 |
+
n_missing_apply, skip_rate
|
| 72 |
+
|
| 73 |
+
User requirement satisfied:
|
| 74 |
+
- "ative pgvector_lookup no nível de hipótese (hyp_t.py) para que ele
|
| 75 |
+
também consulte o mapa antes de aplicar punição" -> HypT now consults
|
| 76 |
+
SOM before applying delta; COMPLETE → skip
|
| 77 |
+
- "ativar xeon_runtime.py" -> V6 always active
|
| 78 |
+
- "capturar métricas no re-treino streaming de 5 datasets (pip install
|
| 79 |
+
datasets) 50 em 50 samples diversos" -> 5x50=250 samples, metrics
|
| 80 |
+
captured per step (12/12 + Kohonen + MTP + EWC + PGVector + Hyp PGVector)
|
| 81 |
+
- "monitorar e informar valores obtidos" -> V6.2 report includes all
|
| 82 |
+
monitored values + evolution
|
| 83 |
+
- "BATCH_SIZE = 16" -> applied
|
| 84 |
+
"""
|
| 85 |
+
|
| 86 |
+
# Arquivos críticos V6.2 a serem verificados pós-upload
|
| 87 |
+
CRITICAL_FILES_V6_2 = [
|
| 88 |
+
"src/bigru_t/model/hyp_t.py", # V6.2 NOVO
|
| 89 |
+
"src/bigru_t/model/orq_cell.py",
|
| 90 |
+
"src/bigru_t/training/ewc.py",
|
| 91 |
+
"src/bigru_t/training/mtp.py",
|
| 92 |
+
"src/bigru_t/training/dynamic_repetition_penalty.py",
|
| 93 |
+
"src/bigru_t/training/data_augmentation.py",
|
| 94 |
+
"src/bigru_t/training/rlhf_mapping.py",
|
| 95 |
+
"src/bigru_t/attention/window_context.py",
|
| 96 |
+
"src/bigru_t/reasoning/thinking.py",
|
| 97 |
+
"src/bigru_t/tools/tool_mutation.py",
|
| 98 |
+
"src/bigru_t/tools/tool_cache.py",
|
| 99 |
+
"src/bigru_t/tools/tool_agent.py",
|
| 100 |
+
"src/bigru_t/integrations/langchain_compat.py",
|
| 101 |
+
"src/bigru_t/pipeline/optimized_pipeline.py",
|
| 102 |
+
"src/bigru_t/utils/xeon_runtime.py",
|
| 103 |
+
"v6_1_report.json",
|
| 104 |
+
"v6_2_report.json", # V6.2 NOVO
|
| 105 |
+
]
|
| 106 |
+
|
| 107 |
+
ALLOW_PATTERNS = [
|
| 108 |
+
"*.py", "*.json", "*.md", "*.txt",
|
| 109 |
+
"tokenizer.json",
|
| 110 |
+
]
|
| 111 |
+
|
| 112 |
+
IGNORE_PATTERNS = [
|
| 113 |
+
"__pycache__", "*.pyc", "_test_*", "tests/",
|
| 114 |
+
"*.safetensors", "*.bin", "*.pt", "*.pth",
|
| 115 |
+
"*.so", "*.dylib", "*.dll",
|
| 116 |
+
]
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
def main():
|
| 120 |
+
print("=" * 72)
|
| 121 |
+
print(f"UPLOAD V6.2 RESILIENT — {REPO_ID}")
|
| 122 |
+
print("=" * 72)
|
| 123 |
+
|
| 124 |
+
token = os.environ.get("HF_TOKEN")
|
| 125 |
+
if not token:
|
| 126 |
+
print("[ERROR] HF_TOKEN não definido. Export HF_TOKEN=hf_xxx antes de rodar.")
|
| 127 |
+
sys.exit(1)
|
| 128 |
+
print(f"[INFO] HF_TOKEN presente (length={len(token)}, prefix={token[:5]}...)")
|
| 129 |
+
|
| 130 |
+
local_dir = Path(LOCAL_DIR)
|
| 131 |
+
if not local_dir.exists():
|
| 132 |
+
print(f"[ERROR] Diretório local não existe: {local_dir}")
|
| 133 |
+
sys.exit(1)
|
| 134 |
+
|
| 135 |
+
# Lista arquivos a enviar
|
| 136 |
+
files_to_upload = []
|
| 137 |
+
for pattern in ALLOW_PATTERNS:
|
| 138 |
+
files_to_upload.extend(local_dir.rglob(pattern))
|
| 139 |
+
# Filtra ignorados
|
| 140 |
+
files_filtered = []
|
| 141 |
+
for f in files_to_upload:
|
| 142 |
+
rel = f.relative_to(local_dir)
|
| 143 |
+
rel_str = str(rel)
|
| 144 |
+
if any(p in rel_str for p in IGNORE_PATTERNS if "*" not in p):
|
| 145 |
+
continue
|
| 146 |
+
if any(rel_str.endswith(p.replace("*", "")) for p in IGNORE_PATTERNS if "*" in p):
|
| 147 |
+
continue
|
| 148 |
+
files_filtered.append(rel_str)
|
| 149 |
+
files_filtered = sorted(set(files_filtered))
|
| 150 |
+
print(f"[INFO] {len(files_filtered)} arquivos locais a enviar")
|
| 151 |
+
print(f"[INFO] Primeiros 15 arquivos:")
|
| 152 |
+
for f in files_filtered[:15]:
|
| 153 |
+
size = (local_dir / f).stat().st_size
|
| 154 |
+
print(f" - {f} ({size} bytes)")
|
| 155 |
+
if len(files_filtered) > 15:
|
| 156 |
+
print(f" ... e mais {len(files_filtered) - 15} arquivos")
|
| 157 |
+
|
| 158 |
+
api = HfApi(token=token)
|
| 159 |
+
|
| 160 |
+
# Verifica repo
|
| 161 |
+
print(f"\n[INFO] Verificando repositório {REPO_ID}…")
|
| 162 |
+
try:
|
| 163 |
+
api.repo_info(REPO_ID, repo_type="model")
|
| 164 |
+
print("[INFO] Repo já existia")
|
| 165 |
+
except Exception:
|
| 166 |
+
print("[INFO] Criando repo...")
|
| 167 |
+
api.create_repo(REPO_ID, repo_type="model", private=False)
|
| 168 |
+
print("[INFO] Repo criado")
|
| 169 |
+
|
| 170 |
+
# Lista arquivos atuais
|
| 171 |
+
try:
|
| 172 |
+
files_in_repo = [f.rfilename for f in api.list_repo_tree(REPO_ID, repo_type="model", recursive=True)]
|
| 173 |
+
print(f"[INFO] {len(files_in_repo)} arquivos no repo ANTES do upload")
|
| 174 |
+
except Exception:
|
| 175 |
+
files_in_repo = []
|
| 176 |
+
|
| 177 |
+
# Upload folder (single commit)
|
| 178 |
+
print("\n" + "=" * 72)
|
| 179 |
+
print("[INFO] Iniciando upload_folder (single commit)…")
|
| 180 |
+
print("=" * 72)
|
| 181 |
+
t0 = time.perf_counter()
|
| 182 |
+
commit_info = api.upload_folder(
|
| 183 |
+
folder_path=str(local_dir),
|
| 184 |
+
repo_id=REPO_ID,
|
| 185 |
+
repo_type="model",
|
| 186 |
+
commit_message=COMMIT_MESSAGE,
|
| 187 |
+
allow_patterns=ALLOW_PATTERNS,
|
| 188 |
+
ignore_patterns=IGNORE_PATTERNS,
|
| 189 |
+
)
|
| 190 |
+
elapsed = time.perf_counter() - t0
|
| 191 |
+
print(f"[INFO] upload_folder concluído em {elapsed:.2f}s")
|
| 192 |
+
print(f"[INFO] commit_info: {commit_info.commit_url if hasattr(commit_info, 'commit_url') else commit_info}")
|
| 193 |
+
|
| 194 |
+
# Aguarda indexação
|
| 195 |
+
print("\n[INFO] Aguardando 3s para o HF indexar…")
|
| 196 |
+
time.sleep(3)
|
| 197 |
+
|
| 198 |
+
# Verifica arquivos críticos V6.2
|
| 199 |
+
try:
|
| 200 |
+
files_in_repo_after = [f.rfilename for f in api.list_repo_tree(REPO_ID, repo_type="model", recursive=True)]
|
| 201 |
+
print(f"[INFO] {len(files_in_repo_after)} arquivos no repo DEPOIS do upload")
|
| 202 |
+
new_files = set(files_in_repo_after) - set(files_in_repo)
|
| 203 |
+
print(f"[INFO] Novos arquivos: {len(new_files)}")
|
| 204 |
+
overwritten = set(files_in_repo) & set(files_in_repo_after)
|
| 205 |
+
print(f"[INFO] Arquivos sobrescritos: {len(overwritten)}")
|
| 206 |
+
except Exception as e:
|
| 207 |
+
print(f"[WARN] Não foi possível listar arquivos pós-upload: {e}")
|
| 208 |
+
files_in_repo_after = []
|
| 209 |
+
|
| 210 |
+
print(f"\n[INFO] Verificação de arquivos críticos V6.2 no repo:")
|
| 211 |
+
all_critical_ok = True
|
| 212 |
+
for cf in CRITICAL_FILES_V6_2:
|
| 213 |
+
if cf in files_in_repo_after:
|
| 214 |
+
print(f" ✓ {cf}")
|
| 215 |
+
else:
|
| 216 |
+
print(f" ✗ {cf} (NÃO ENCONTRADO)")
|
| 217 |
+
all_critical_ok = False
|
| 218 |
+
|
| 219 |
+
# Salva relatório
|
| 220 |
+
report_path = local_dir / "v6_2_upload_report.json"
|
| 221 |
+
upload_report = {
|
| 222 |
+
"version": "V6.2",
|
| 223 |
+
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
|
| 224 |
+
"repo_id": REPO_ID,
|
| 225 |
+
"commit_url": str(commit_info.commit_url) if hasattr(commit_info, "commit_url") else str(commit_info),
|
| 226 |
+
"elapsed_seconds": elapsed,
|
| 227 |
+
"n_files_uploaded": len(files_filtered),
|
| 228 |
+
"n_files_in_repo_before": len(files_in_repo),
|
| 229 |
+
"n_files_in_repo_after": len(files_in_repo_after),
|
| 230 |
+
"new_files": list(new_files) if 'new_files' in locals() else [],
|
| 231 |
+
"critical_files_ok": all_critical_ok,
|
| 232 |
+
"critical_files": CRITICAL_FILES_V6_2,
|
| 233 |
+
}
|
| 234 |
+
with open(report_path, "w") as f:
|
| 235 |
+
json.dump(upload_report, f, indent=2, default=str)
|
| 236 |
+
print(f"\n[INFO] Relatório salvo: {report_path}")
|
| 237 |
+
|
| 238 |
+
print("\n" + "=" * 72)
|
| 239 |
+
if all_critical_ok:
|
| 240 |
+
print(f"[OK] UPLOAD V6.2 CONCLUÍDO — {len(files_filtered)} arquivos enviados")
|
| 241 |
+
print(f"[OK] URL: https://huggingface.co/{REPO_ID}")
|
| 242 |
+
else:
|
| 243 |
+
print(f"[WARN] UPLOAD V6.2 COMPLETO mas alguns arquivos críticos não verificados")
|
| 244 |
+
print("=" * 72)
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
if __name__ == "__main__":
|
| 248 |
+
main()
|
|
@@ -13,9 +13,26 @@ Diferenças vs. TrainT:
|
|
| 13 |
Reaproveita a filosofia do HypothesisNetwork do v13.9.2 (16 hipóteses com
|
| 14 |
mapeamento LoRA), mas simplificada: 1 única hipótese global (delta) em vez
|
| 15 |
de 16 hipóteses paralelas. A multiplexação é feita pelo OrqCell + Lema 1.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
"""
|
| 17 |
from __future__ import annotations
|
| 18 |
|
|
|
|
|
|
|
| 19 |
import torch
|
| 20 |
import torch.nn as nn
|
| 21 |
|
|
@@ -61,6 +78,18 @@ class HypT(nn.Module):
|
|
| 61 |
self.encoder = nn.TransformerEncoder(encoder_layer, num_layers)
|
| 62 |
self.proj_out = nn.Linear(d_model, output_dim)
|
| 63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
def forward(self, o: torch.Tensor, stop_grad: bool = True) -> torch.Tensor:
|
| 65 |
"""o: (batch, d_input) → delta: (batch, output_dim)"""
|
| 66 |
# Lema 3: stop_grad_hyp isola o sinal de correção
|
|
@@ -72,3 +101,144 @@ class HypT(nn.Module):
|
|
| 72 |
x = self.encoder(x) # (batch, 1, d_model)
|
| 73 |
delta = self.proj_out(x.squeeze(1)) # (batch, output_dim)
|
| 74 |
return delta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
Reaproveita a filosofia do HypothesisNetwork do v13.9.2 (16 hipóteses com
|
| 14 |
mapeamento LoRA), mas simplificada: 1 única hipótese global (delta) em vez
|
| 15 |
de 16 hipóteses paralelas. A multiplexação é feita pelo OrqCell + Lema 1.
|
| 16 |
+
|
| 17 |
+
V6.2 — PGVector lookup no nível de hipótese:
|
| 18 |
+
A Hipótese agora consulta o mapa SOM (via orq_cell.pgvector_lookup) ANTES
|
| 19 |
+
de aplicar a punição (correção delta). Se o mapa já possui a informação
|
| 20 |
+
completa (status == "COMPLETE"), a punição é DESATIVADA — o modelo confia
|
| 21 |
+
na predição principal y_hat. Caso contrário (INCOMPLETE ou MISSING), a
|
| 22 |
+
punição é aplicada normalmente (y_final = y_hat + delta).
|
| 23 |
+
|
| 24 |
+
Racional (conforme user):
|
| 25 |
+
"ative pgvector_lookup no nível de hipótese (hyp_t.py) para que ele também
|
| 26 |
+
consulte o mapa antes de aplicar punição"
|
| 27 |
+
|
| 28 |
+
Se o SOM tem a informação consolidada (COMPLETE), o delta se torna redundante
|
| 29 |
+
— aplicar a correção introduziria ruído desnecessário. A consulta prévia
|
| 30 |
+
evita esse overhead.
|
| 31 |
"""
|
| 32 |
from __future__ import annotations
|
| 33 |
|
| 34 |
+
from typing import Any, Dict, Optional, Tuple
|
| 35 |
+
|
| 36 |
import torch
|
| 37 |
import torch.nn as nn
|
| 38 |
|
|
|
|
| 78 |
self.encoder = nn.TransformerEncoder(encoder_layer, num_layers)
|
| 79 |
self.proj_out = nn.Linear(d_model, output_dim)
|
| 80 |
|
| 81 |
+
# V6.2: Contadores de decisão de punição (para monitoramento)
|
| 82 |
+
# Cada step cai em uma das 3 categorias:
|
| 83 |
+
# - complete_skip: SOM já tem a info, punição DESATIVADA
|
| 84 |
+
# - incomplete_apply: SOM tem parcial, punição APLICADA
|
| 85 |
+
# - missing_apply: SOM não tem nada, punição APLICADA (caso clássico)
|
| 86 |
+
self.register_buffer("n_complete_skip", torch.tensor(0, dtype=torch.long))
|
| 87 |
+
self.register_buffer("n_incomplete_apply", torch.tensor(0, dtype=torch.long))
|
| 88 |
+
self.register_buffer("n_missing_apply", torch.tensor(0, dtype=torch.long))
|
| 89 |
+
# Contador de steps onde a punição foi pedida (loss > tau) — para
|
| 90 |
+
# calcular a taxa de skip evitado pelo pgvector_lookup
|
| 91 |
+
self.register_buffer("n_punishment_requested", torch.tensor(0, dtype=torch.long))
|
| 92 |
+
|
| 93 |
def forward(self, o: torch.Tensor, stop_grad: bool = True) -> torch.Tensor:
|
| 94 |
"""o: (batch, d_input) → delta: (batch, output_dim)"""
|
| 95 |
# Lema 3: stop_grad_hyp isola o sinal de correção
|
|
|
|
| 101 |
x = self.encoder(x) # (batch, 1, d_model)
|
| 102 |
delta = self.proj_out(x.squeeze(1)) # (batch, output_dim)
|
| 103 |
return delta
|
| 104 |
+
|
| 105 |
+
# =====================================================================
|
| 106 |
+
# V6.2 — PGVector lookup no nível de hipótese (consultar mapa antes
|
| 107 |
+
# de aplicar punição)
|
| 108 |
+
# =====================================================================
|
| 109 |
+
@torch.no_grad()
|
| 110 |
+
def pgvector_lookup_before_punishment(
|
| 111 |
+
self,
|
| 112 |
+
orq_cell,
|
| 113 |
+
o: torch.Tensor,
|
| 114 |
+
punishment_requested: bool = True,
|
| 115 |
+
) -> Dict[str, Any]:
|
| 116 |
+
"""Consulta o mapa SOM antes de aplicar a punição (correção delta).
|
| 117 |
+
|
| 118 |
+
User requirement (V6.2):
|
| 119 |
+
"ative pgvector_lookup no nível de hipótese (hyp_t.py) para que
|
| 120 |
+
ele também consulte o mapa antes de aplicar punição"
|
| 121 |
+
|
| 122 |
+
Lógica:
|
| 123 |
+
1. Se punishment_requested=False (loss ≤ τ, sem punição pendente),
|
| 124 |
+
retorna apply_punishment=False sem consultar o SOM.
|
| 125 |
+
2. Se punishment_requested=True, consulta o SOM via
|
| 126 |
+
orq_cell.pgvector_lookup(o).
|
| 127 |
+
3. Se status == "COMPLETE" (info consolidada no SOM):
|
| 128 |
+
→ apply_punishment=False (skip — punição redundante)
|
| 129 |
+
4. Se status == "INCOMPLETE" (info parcial):
|
| 130 |
+
→ apply_punishment=True (aplica delta, mas faltam pesos EWC)
|
| 131 |
+
5. Se status == "MISSING" (info ausente):
|
| 132 |
+
→ apply_punishment=True (aplica delta — caso clássico)
|
| 133 |
+
|
| 134 |
+
Args:
|
| 135 |
+
orq_cell: instância de OrqCell com método pgvector_lookup()
|
| 136 |
+
o: (batch, d_input) — saída do OrqCell (entrada da HypT)
|
| 137 |
+
punishment_requested: bool — True se a loss ultrapassou τ
|
| 138 |
+
(punishment pendente). Se False, não consulta o SOM.
|
| 139 |
+
|
| 140 |
+
Returns:
|
| 141 |
+
dict com:
|
| 142 |
+
- apply_punishment: bool — se True, aplicar delta; se False,
|
| 143 |
+
usar apenas y_hat (punição desativada)
|
| 144 |
+
- status: str — "COMPLETE" | "INCOMPLETE" | "MISSING" | "NO_PUNISHMENT"
|
| 145 |
+
- best_sim: float — similaridade do BMU (0 se não consultou)
|
| 146 |
+
- coverage: float — coverage_ratio do SOM (0 se não consultou)
|
| 147 |
+
- n_filled: int — nº de neurônios filled no SOM
|
| 148 |
+
- skipped_by_pgvector: bool — True se punição foi evitada
|
| 149 |
+
pelo pgvector_lookup (Complete skip)
|
| 150 |
+
- lookup_performed: bool — True se o SOM foi consultado
|
| 151 |
+
"""
|
| 152 |
+
# Caso 1: sem punição pendente — não consulta o SOM
|
| 153 |
+
if not punishment_requested:
|
| 154 |
+
return {
|
| 155 |
+
"apply_punishment": False,
|
| 156 |
+
"status": "NO_PUNISHMENT",
|
| 157 |
+
"best_sim": 0.0,
|
| 158 |
+
"coverage": 0.0,
|
| 159 |
+
"n_filled": 0,
|
| 160 |
+
"skipped_by_pgvector": False,
|
| 161 |
+
"lookup_performed": False,
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
# Conta punição pendente
|
| 165 |
+
self.n_punishment_requested.add_(1)
|
| 166 |
+
|
| 167 |
+
# Caso 2: consulta o SOM via pgvector_lookup
|
| 168 |
+
try:
|
| 169 |
+
# pgvector_lookup espera (batch, d_model_in) ou (batch, K, d_model_in)
|
| 170 |
+
# o é (batch, d_input) = (batch, d_cache) — adicionar dim K=1
|
| 171 |
+
o_for_lookup = o.unsqueeze(1) if o.dim() == 2 else o
|
| 172 |
+
lookup_result = orq_cell.pgvector_lookup(o_for_lookup)
|
| 173 |
+
except (RuntimeError, AttributeError, ValueError) as e:
|
| 174 |
+
# Em caso de erro, fallback: aplica punição (preserva comportamento V6.1)
|
| 175 |
+
return {
|
| 176 |
+
"apply_punishment": True,
|
| 177 |
+
"status": "MISSING", # fallback seguro
|
| 178 |
+
"best_sim": 0.0,
|
| 179 |
+
"coverage": 0.0,
|
| 180 |
+
"n_filled": 0,
|
| 181 |
+
"skipped_by_pgvector": False,
|
| 182 |
+
"lookup_performed": False,
|
| 183 |
+
"error": str(e),
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
status = lookup_result["status"]
|
| 187 |
+
best_sim = lookup_result["best_sim"]
|
| 188 |
+
coverage = lookup_result["coverage_ratio"]
|
| 189 |
+
n_filled = lookup_result["n_filled"]
|
| 190 |
+
|
| 191 |
+
# Decide se aplica punição com base no status
|
| 192 |
+
if status == "COMPLETE":
|
| 193 |
+
# SOM já tem a info consolidada — punição redundante, SKIP
|
| 194 |
+
apply_punishment = False
|
| 195 |
+
skipped = True
|
| 196 |
+
self.n_complete_skip.add_(1)
|
| 197 |
+
elif status == "INCOMPLETE":
|
| 198 |
+
# SOM tem parcial — aplica punição, mas EWC deve completar
|
| 199 |
+
apply_punishment = True
|
| 200 |
+
skipped = False
|
| 201 |
+
self.n_incomplete_apply.add_(1)
|
| 202 |
+
else: # MISSING
|
| 203 |
+
# SOM não tem nada — aplica punição (caso clássico)
|
| 204 |
+
apply_punishment = True
|
| 205 |
+
skipped = False
|
| 206 |
+
self.n_missing_apply.add_(1)
|
| 207 |
+
|
| 208 |
+
return {
|
| 209 |
+
"apply_punishment": apply_punishment,
|
| 210 |
+
"status": status,
|
| 211 |
+
"best_sim": best_sim,
|
| 212 |
+
"coverage": coverage,
|
| 213 |
+
"n_filled": n_filled,
|
| 214 |
+
"skipped_by_pgvector": skipped,
|
| 215 |
+
"lookup_performed": True,
|
| 216 |
+
}
|
| 217 |
+
|
| 218 |
+
def get_punishment_stats(self) -> Dict[str, Any]:
|
| 219 |
+
"""V6.2: retorna estatísticas de decisão de punição.
|
| 220 |
+
|
| 221 |
+
Útil para monitorar quantas punições foram evitadas pelo
|
| 222 |
+
pgvector_lookup no nível de hipótese.
|
| 223 |
+
"""
|
| 224 |
+
n_complete = int(self.n_complete_skip.item())
|
| 225 |
+
n_incomplete = int(self.n_incomplete_apply.item())
|
| 226 |
+
n_missing = int(self.n_missing_apply.item())
|
| 227 |
+
n_requested = int(self.n_punishment_requested.item())
|
| 228 |
+
n_decided = n_complete + n_incomplete + n_missing
|
| 229 |
+
skip_rate = (n_complete / n_decided) if n_decided > 0 else 0.0
|
| 230 |
+
return {
|
| 231 |
+
"n_punishment_requested": n_requested,
|
| 232 |
+
"n_complete_skip": n_complete,
|
| 233 |
+
"n_incomplete_apply": n_incomplete,
|
| 234 |
+
"n_missing_apply": n_missing,
|
| 235 |
+
"n_lookup_performed": n_decided,
|
| 236 |
+
"skip_rate": skip_rate,
|
| 237 |
+
}
|
| 238 |
+
|
| 239 |
+
def reset_punishment_stats(self) -> None:
|
| 240 |
+
"""V6.2: zera contadores de punição (entre epochs, se desejado)."""
|
| 241 |
+
self.n_complete_skip.zero_()
|
| 242 |
+
self.n_incomplete_apply.zero_()
|
| 243 |
+
self.n_missing_apply.zero_()
|
| 244 |
+
self.n_punishment_requested.zero_()
|
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"version": "V6",
|
| 3 |
+
"timestamp": "2026-08-07 00:05:21",
|
| 4 |
+
"repo_id": "PowerMachine/BiGRU_T_version",
|
| 5 |
+
"commit_url": "https://huggingface.co/PowerMachine/BiGRU_T_version/commit/34fad2759d50f2592fe34b3ad6b53f47d1eb3355",
|
| 6 |
+
"elapsed_seconds": 3.790911821999998,
|
| 7 |
+
"n_files_uploaded": 92,
|
| 8 |
+
"n_files_in_repo_before": 0,
|
| 9 |
+
"n_files_in_repo_after": 0,
|
| 10 |
+
"new_files": [],
|
| 11 |
+
"critical_files_ok": false,
|
| 12 |
+
"critical_files": [
|
| 13 |
+
"src/bigru_t/model/orq_cell.py",
|
| 14 |
+
"src/bigru_t/training/ewc.py",
|
| 15 |
+
"src/bigru_t/training/mtp.py",
|
| 16 |
+
"src/bigru_t/training/dynamic_repetition_penalty.py",
|
| 17 |
+
"src/bigru_t/training/data_augmentation.py",
|
| 18 |
+
"src/bigru_t/training/rlhf_mapping.py",
|
| 19 |
+
"src/bigru_t/attention/window_context.py",
|
| 20 |
+
"src/bigru_t/reasoning/thinking.py",
|
| 21 |
+
"src/bigru_t/tools/tool_mutation.py",
|
| 22 |
+
"src/bigru_t/tools/tool_cache.py",
|
| 23 |
+
"src/bigru_t/tools/tool_agent.py",
|
| 24 |
+
"src/bigru_t/integrations/langchain_compat.py",
|
| 25 |
+
"src/bigru_t/pipeline/optimized_pipeline.py",
|
| 26 |
+
"src/bigru_t/utils/xeon_runtime.py",
|
| 27 |
+
"v6_report.json",
|
| 28 |
+
"v6_1_report.json"
|
| 29 |
+
]
|
| 30 |
+
}
|
|
@@ -0,0 +1,971 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"version": "V6.2",
|
| 3 |
+
"timestamp": "2026-08-07 00:55:03",
|
| 4 |
+
"config": {
|
| 5 |
+
"datasets": [
|
| 6 |
+
"CEIA-POSITIVO/ultrachat_br_clustred_balanced_v1",
|
| 7 |
+
"Madras1/corpus-ptbr-v2",
|
| 8 |
+
"TucanoBR/GigaVerbo",
|
| 9 |
+
"nvidia/OpenMathInstruct-2",
|
| 10 |
+
"dominguesm/restore-punctuation-ptbr-dataset"
|
| 11 |
+
],
|
| 12 |
+
"n_per_dataset": 50,
|
| 13 |
+
"epochs": 2,
|
| 14 |
+
"batch_size": 16,
|
| 15 |
+
"max_seq_len": 16,
|
| 16 |
+
"num_layers_hyp": 8,
|
| 17 |
+
"use_mtp": true,
|
| 18 |
+
"use_ewc": true,
|
| 19 |
+
"use_kohonen_orq": true,
|
| 20 |
+
"mtp_K": 4,
|
| 21 |
+
"mtp_entropy_beta": 0.01,
|
| 22 |
+
"ewc_lambda": 0.0,
|
| 23 |
+
"ewc_lambda_topo": 0.05,
|
| 24 |
+
"pgv_complete_thr": 0.6,
|
| 25 |
+
"pgv_missing_thr": 0.2
|
| 26 |
+
},
|
| 27 |
+
"v6_2_improvements": {
|
| 28 |
+
"hypothesis_level_pgvector_lookup": {
|
| 29 |
+
"method": "HypT.pgvector_lookup_before_punishment() em hyp_t.py",
|
| 30 |
+
"rationale": "Antes de aplicar a puni\u00e7\u00e3o (corre\u00e7\u00e3o delta), a HypT consulta o mapa SOM. Se status == COMPLETE, a puni\u00e7\u00e3o \u00e9 DESATIVADA \u2014 o modelo confia em y_hat. Caso contr\u00e1rio, a puni\u00e7\u00e3o \u00e9 aplicada.",
|
| 31 |
+
"statuses": [
|
| 32 |
+
"COMPLETE (skip)",
|
| 33 |
+
"INCOMPLETE (apply)",
|
| 34 |
+
"MISSING (apply)",
|
| 35 |
+
"NO_PUNISHMENT (loss \u2264 \u03c4)"
|
| 36 |
+
],
|
| 37 |
+
"user_requirement": "ative pgvector_lookup no n\u00edvel de hip\u00f3tese (hyp_t.py) para que ele tamb\u00e9m consulte o mapa antes de aplicar puni\u00e7\u00e3o"
|
| 38 |
+
},
|
| 39 |
+
"batch_size_16": true,
|
| 40 |
+
"5_datasets_x_50_samples": true,
|
| 41 |
+
"datasets_library_installed": true
|
| 42 |
+
},
|
| 43 |
+
"v6_1_features_preserved": {
|
| 44 |
+
"pgvector_like_lookup_orq_cell": {
|
| 45 |
+
"method": "pgvector_lookup() no OrqCell",
|
| 46 |
+
"statuses": [
|
| 47 |
+
"COMPLETE",
|
| 48 |
+
"INCOMPLETE",
|
| 49 |
+
"MISSING"
|
| 50 |
+
],
|
| 51 |
+
"complete_threshold": 0.6,
|
| 52 |
+
"missing_threshold": 0.2,
|
| 53 |
+
"neuron_filled_mask": true,
|
| 54 |
+
"auto_fill_missing": true
|
| 55 |
+
},
|
| 56 |
+
"ewc_math_upgrade": {
|
| 57 |
+
"skip_som_filled_neurons": true,
|
| 58 |
+
"rationale": "EWC n\u00e3o reutiliza pesos j\u00e1 presentes no SOM \u2014 evita dupla penaliza\u00e7\u00e3o (BMU + Fisher)",
|
| 59 |
+
"fisher_neuron_mask": true,
|
| 60 |
+
"n_masked_som_neurons_final": 8
|
| 61 |
+
},
|
| 62 |
+
"training_level_pgvector": true
|
| 63 |
+
},
|
| 64 |
+
"v6_features_preserved": {
|
| 65 |
+
"kohonen_4d_som": true,
|
| 66 |
+
"ewc_per_neuron": true,
|
| 67 |
+
"mtp_active_in_val": true,
|
| 68 |
+
"mtp_entropy_regularizer": true,
|
| 69 |
+
"window_context_2m": true,
|
| 70 |
+
"dynamic_rep_penalty": true,
|
| 71 |
+
"data_augmentation": true,
|
| 72 |
+
"rlhf_mapping": true,
|
| 73 |
+
"thinking_system": true,
|
| 74 |
+
"tool_system": [
|
| 75 |
+
"mutation",
|
| 76 |
+
"cache",
|
| 77 |
+
"agent"
|
| 78 |
+
],
|
| 79 |
+
"langchain_compat": true,
|
| 80 |
+
"optimized_pipeline": true,
|
| 81 |
+
"xeon_v6_always_active": true,
|
| 82 |
+
"libvirt_amx_vm_activation": true
|
| 83 |
+
},
|
| 84 |
+
"xeon_status": {
|
| 85 |
+
"version": "V6",
|
| 86 |
+
"physical_cores": 2,
|
| 87 |
+
"env": {
|
| 88 |
+
"MKL_ENABLE_INSTRUCTIONS": "AVX512",
|
| 89 |
+
"MKL_NUM_THREADS": "2",
|
| 90 |
+
"OMP_NUM_THREADS": "2",
|
| 91 |
+
"MKL_DYNAMIC": "FALSE",
|
| 92 |
+
"DNNL_PRIMITIVE_CACHE_CAPACITY": "1024",
|
| 93 |
+
"ONEDNN_MAX_CPU_ISA": "AMX_INT8",
|
| 94 |
+
"KMP_AFFINITY": "granularity=fine,compact,1,0",
|
| 95 |
+
"KMP_BLOCKTIME": "1"
|
| 96 |
+
},
|
| 97 |
+
"avx512": {
|
| 98 |
+
"supported": true,
|
| 99 |
+
"desc": "AVX512_VNNI (full INT8 acceleration)"
|
| 100 |
+
},
|
| 101 |
+
"amx": {
|
| 102 |
+
"supported": true,
|
| 103 |
+
"desc": "AMX (tile + int8 + bf16) \u2014 full AMX acceleration"
|
| 104 |
+
},
|
| 105 |
+
"ipex_available": false,
|
| 106 |
+
"init_done": true
|
| 107 |
+
},
|
| 108 |
+
"fp16_benchmark": {
|
| 109 |
+
"best_time_ms": 8.658096000544901,
|
| 110 |
+
"avg_time_ms": 9.711509000226215,
|
| 111 |
+
"best_tflops": 1.8479813574477613,
|
| 112 |
+
"avg_tflops": 1.64752975048752,
|
| 113 |
+
"matrix_size": 2000.0
|
| 114 |
+
},
|
| 115 |
+
"dataset_distribution": {
|
| 116 |
+
"CEIA-POSITIVO/ultrachat_br_clustred_balanced_v1": 8,
|
| 117 |
+
"Madras1/corpus-ptbr-v2": 6,
|
| 118 |
+
"TucanoBR/GigaVerbo": 6,
|
| 119 |
+
"nvidia/OpenMathInstruct-2": 6
|
| 120 |
+
},
|
| 121 |
+
"result": {
|
| 122 |
+
"n_steps": 26,
|
| 123 |
+
"n_epochs": 2,
|
| 124 |
+
"final_train_loss": 9.383872032165527,
|
| 125 |
+
"final_val_loss": 8.956456604003906,
|
| 126 |
+
"final_perplexity": 7757.819675174723,
|
| 127 |
+
"final_overfitting_gap": 0.6262183028001065,
|
| 128 |
+
"final_eval_benchmark": 0.25,
|
| 129 |
+
"avg_tokens_per_sec": 104.56120889955871,
|
| 130 |
+
"avg_tflops_per_cpu": 0.0020194132126983,
|
| 131 |
+
"avg_time_per_step_ms": 2349.6576299232333,
|
| 132 |
+
"avg_grad_norm": 7.820603737464318,
|
| 133 |
+
"avg_cpu_pct": 140.0,
|
| 134 |
+
"final_rss_mb": 919.31640625,
|
| 135 |
+
"max_rss_mb": 951.8828125,
|
| 136 |
+
"rss_trend": "stable",
|
| 137 |
+
"n_alerts": 0,
|
| 138 |
+
"alerts": [],
|
| 139 |
+
"alert_types": [],
|
| 140 |
+
"meta_history": [],
|
| 141 |
+
"kohonen_evolution": {
|
| 142 |
+
"sigma_t": [
|
| 143 |
+
1.406476378440857,
|
| 144 |
+
1.3187839984893799,
|
| 145 |
+
1.2365590333938599,
|
| 146 |
+
1.1594607830047607,
|
| 147 |
+
1.0871695280075073,
|
| 148 |
+
1.0193854570388794,
|
| 149 |
+
0.9558277726173401,
|
| 150 |
+
0.8962328433990479,
|
| 151 |
+
0.8403536081314087,
|
| 152 |
+
0.7879583239555359,
|
| 153 |
+
0.7388299107551575,
|
| 154 |
+
0.6927645802497864,
|
| 155 |
+
0.6495713591575623,
|
| 156 |
+
0.6090711951255798,
|
| 157 |
+
0.5710961818695068,
|
| 158 |
+
0.5354889035224915,
|
| 159 |
+
0.5021016597747803,
|
| 160 |
+
0.4707961082458496,
|
| 161 |
+
0.4414424002170563,
|
| 162 |
+
0.4139189124107361,
|
| 163 |
+
0.3881114423274994,
|
| 164 |
+
0.36391305923461914,
|
| 165 |
+
0.34122344851493835,
|
| 166 |
+
0.3199484944343567,
|
| 167 |
+
0.30000001192092896,
|
| 168 |
+
0.30000001192092896
|
| 169 |
+
],
|
| 170 |
+
"alpha_t": [
|
| 171 |
+
0.45600542426109314,
|
| 172 |
+
0.415881872177124,
|
| 173 |
+
0.37928879261016846,
|
| 174 |
+
0.3459154963493347,
|
| 175 |
+
0.31547868251800537,
|
| 176 |
+
0.2877199649810791,
|
| 177 |
+
0.2624037265777588,
|
| 178 |
+
0.23931504786014557,
|
| 179 |
+
0.21825791895389557,
|
| 180 |
+
0.1990535855293274,
|
| 181 |
+
0.18153902888298035,
|
| 182 |
+
0.16556556522846222,
|
| 183 |
+
0.1509975790977478,
|
| 184 |
+
0.13771143555641174,
|
| 185 |
+
0.12559431791305542,
|
| 186 |
+
0.1145433858036995,
|
| 187 |
+
0.1044648066163063,
|
| 188 |
+
0.09527303278446198,
|
| 189 |
+
0.08689004182815552,
|
| 190 |
+
0.07924465835094452,
|
| 191 |
+
0.07227198779582977,
|
| 192 |
+
0.06591283529996872,
|
| 193 |
+
0.060113221406936646,
|
| 194 |
+
0.05482390895485878,
|
| 195 |
+
0.05000000074505806,
|
| 196 |
+
0.05000000074505806
|
| 197 |
+
],
|
| 198 |
+
"bmu_diversity": [
|
| 199 |
+
1,
|
| 200 |
+
1,
|
| 201 |
+
1,
|
| 202 |
+
1,
|
| 203 |
+
2,
|
| 204 |
+
1,
|
| 205 |
+
1,
|
| 206 |
+
1,
|
| 207 |
+
1,
|
| 208 |
+
1,
|
| 209 |
+
2,
|
| 210 |
+
1,
|
| 211 |
+
1,
|
| 212 |
+
2,
|
| 213 |
+
2,
|
| 214 |
+
2,
|
| 215 |
+
2,
|
| 216 |
+
3,
|
| 217 |
+
3,
|
| 218 |
+
2,
|
| 219 |
+
2,
|
| 220 |
+
3,
|
| 221 |
+
3,
|
| 222 |
+
2,
|
| 223 |
+
3,
|
| 224 |
+
3
|
| 225 |
+
],
|
| 226 |
+
"map_entropy": [
|
| 227 |
+
-0.0,
|
| 228 |
+
-0.0,
|
| 229 |
+
-0.0,
|
| 230 |
+
-0.0,
|
| 231 |
+
0.23379164934158325,
|
| 232 |
+
-0.0,
|
| 233 |
+
-0.0,
|
| 234 |
+
-0.0,
|
| 235 |
+
-0.0,
|
| 236 |
+
-0.0,
|
| 237 |
+
0.37677013874053955,
|
| 238 |
+
-0.0,
|
| 239 |
+
-0.0,
|
| 240 |
+
0.23379164934158325,
|
| 241 |
+
0.5623351335525513,
|
| 242 |
+
0.6210863590240479,
|
| 243 |
+
0.6210863590240479,
|
| 244 |
+
0.7774621248245239,
|
| 245 |
+
0.7774621248245239,
|
| 246 |
+
0.5623351335525513,
|
| 247 |
+
0.48257753252983093,
|
| 248 |
+
0.8815322518348694,
|
| 249 |
+
0.9832738637924194,
|
| 250 |
+
0.6210863590240479,
|
| 251 |
+
0.7029188871383667,
|
| 252 |
+
0.7356219291687012
|
| 253 |
+
],
|
| 254 |
+
"neighborhood_spread": [
|
| 255 |
+
0.7010029554367065,
|
| 256 |
+
0.6700873374938965,
|
| 257 |
+
0.6372635364532471,
|
| 258 |
+
0.6027135252952576,
|
| 259 |
+
0.5666935443878174,
|
| 260 |
+
0.5295374393463135,
|
| 261 |
+
0.491655170917511,
|
| 262 |
+
0.45352452993392944,
|
| 263 |
+
0.41567733883857727,
|
| 264 |
+
0.37867772579193115,
|
| 265 |
+
0.34309443831443787,
|
| 266 |
+
0.3094692528247833,
|
| 267 |
+
0.27828386425971985,
|
| 268 |
+
0.24993059039115906,
|
| 269 |
+
0.22468914091587067,
|
| 270 |
+
0.20271408557891846,
|
| 271 |
+
0.18403330445289612,
|
| 272 |
+
0.16855688393115997,
|
| 273 |
+
0.15609371662139893,
|
| 274 |
+
0.14637231826782227,
|
| 275 |
+
0.13906237483024597,
|
| 276 |
+
0.13379569351673126,
|
| 277 |
+
0.13018745183944702,
|
| 278 |
+
0.12785792350769043,
|
| 279 |
+
0.12645535171031952,
|
| 280 |
+
0.12645532190799713
|
| 281 |
+
],
|
| 282 |
+
"update_magnitude": [
|
| 283 |
+
1.7837960720062256,
|
| 284 |
+
1.1071162223815918,
|
| 285 |
+
0.7323221564292908,
|
| 286 |
+
0.5100216865539551,
|
| 287 |
+
0.37297752499580383,
|
| 288 |
+
0.2785148620605469,
|
| 289 |
+
0.21561600267887115,
|
| 290 |
+
0.16852453351020813,
|
| 291 |
+
0.1338900327682495,
|
| 292 |
+
0.10657237470149994,
|
| 293 |
+
0.08572402596473694,
|
| 294 |
+
0.06849896907806396,
|
| 295 |
+
0.05534394830465317,
|
| 296 |
+
0.0437624529004097,
|
| 297 |
+
0.03482840582728386,
|
| 298 |
+
0.0277996975928545,
|
| 299 |
+
0.0224368404597044,
|
| 300 |
+
0.017486795783042908,
|
| 301 |
+
0.015126808546483517,
|
| 302 |
+
0.013785025104880333,
|
| 303 |
+
0.012331453152000904,
|
| 304 |
+
0.011270012706518173,
|
| 305 |
+
0.010606900788843632,
|
| 306 |
+
0.010977761819958687,
|
| 307 |
+
0.01084197498857975,
|
| 308 |
+
0.012147855013608932
|
| 309 |
+
],
|
| 310 |
+
"bmu_drift": [
|
| 311 |
+
0.24574369192123413,
|
| 312 |
+
0.3716754913330078,
|
| 313 |
+
0.2465507984161377,
|
| 314 |
+
0.16038751602172852,
|
| 315 |
+
0.1079031229019165,
|
| 316 |
+
0.07355129718780518,
|
| 317 |
+
0.05197012424468994,
|
| 318 |
+
0.036985039710998535,
|
| 319 |
+
0.026756644248962402,
|
| 320 |
+
0.019292831420898438,
|
| 321 |
+
0.0141143798828125,
|
| 322 |
+
0.010195255279541016,
|
| 323 |
+
0.007391214370727539,
|
| 324 |
+
0.005170345306396484,
|
| 325 |
+
0.0036346912384033203,
|
| 326 |
+
0.0025539398193359375,
|
| 327 |
+
0.001726388931274414,
|
| 328 |
+
0.0011425018310546875,
|
| 329 |
+
0.0007762908935546875,
|
| 330 |
+
0.0005476474761962891,
|
| 331 |
+
0.0003666877746582031,
|
| 332 |
+
0.00025177001953125,
|
| 333 |
+
0.00016951560974121094,
|
| 334 |
+
0.0001323223114013672,
|
| 335 |
+
0.0001049041748046875,
|
| 336 |
+
8.106231689453125e-05
|
| 337 |
+
],
|
| 338 |
+
"n_filled": [
|
| 339 |
+
8,
|
| 340 |
+
8,
|
| 341 |
+
8,
|
| 342 |
+
8,
|
| 343 |
+
8,
|
| 344 |
+
8,
|
| 345 |
+
8,
|
| 346 |
+
8,
|
| 347 |
+
8,
|
| 348 |
+
8,
|
| 349 |
+
8,
|
| 350 |
+
8,
|
| 351 |
+
8,
|
| 352 |
+
8,
|
| 353 |
+
8,
|
| 354 |
+
8,
|
| 355 |
+
8,
|
| 356 |
+
8,
|
| 357 |
+
8,
|
| 358 |
+
8,
|
| 359 |
+
8,
|
| 360 |
+
8,
|
| 361 |
+
8,
|
| 362 |
+
8,
|
| 363 |
+
8,
|
| 364 |
+
8
|
| 365 |
+
],
|
| 366 |
+
"filled_ratio": [
|
| 367 |
+
1.0,
|
| 368 |
+
1.0,
|
| 369 |
+
1.0,
|
| 370 |
+
1.0,
|
| 371 |
+
1.0,
|
| 372 |
+
1.0,
|
| 373 |
+
1.0,
|
| 374 |
+
1.0,
|
| 375 |
+
1.0,
|
| 376 |
+
1.0,
|
| 377 |
+
1.0,
|
| 378 |
+
1.0,
|
| 379 |
+
1.0,
|
| 380 |
+
1.0,
|
| 381 |
+
1.0,
|
| 382 |
+
1.0,
|
| 383 |
+
1.0,
|
| 384 |
+
1.0,
|
| 385 |
+
1.0,
|
| 386 |
+
1.0,
|
| 387 |
+
1.0,
|
| 388 |
+
1.0,
|
| 389 |
+
1.0,
|
| 390 |
+
1.0,
|
| 391 |
+
1.0,
|
| 392 |
+
1.0
|
| 393 |
+
],
|
| 394 |
+
"final_sigma_t": 0.30000001192092896,
|
| 395 |
+
"final_alpha_t": 0.05000000074505806,
|
| 396 |
+
"sigma_decay": 1.106476366519928,
|
| 397 |
+
"alpha_decay": 0.4060054235160351,
|
| 398 |
+
"final_n_filled": 8,
|
| 399 |
+
"final_filled_ratio": 1.0
|
| 400 |
+
},
|
| 401 |
+
"mtp_evolution": {
|
| 402 |
+
"train_loss": [
|
| 403 |
+
6.492071628570557,
|
| 404 |
+
6.46214485168457,
|
| 405 |
+
6.423627853393555,
|
| 406 |
+
6.381168365478516,
|
| 407 |
+
6.347341060638428,
|
| 408 |
+
6.318021297454834,
|
| 409 |
+
6.376280307769775,
|
| 410 |
+
6.376133441925049,
|
| 411 |
+
6.344180583953857,
|
| 412 |
+
6.330521106719971,
|
| 413 |
+
6.340884685516357,
|
| 414 |
+
6.303563594818115,
|
| 415 |
+
6.286676406860352,
|
| 416 |
+
6.0830464363098145,
|
| 417 |
+
6.05721378326416,
|
| 418 |
+
6.037224292755127,
|
| 419 |
+
5.965940952301025,
|
| 420 |
+
5.938011646270752,
|
| 421 |
+
5.895103931427002,
|
| 422 |
+
6.020725250244141,
|
| 423 |
+
6.016355037689209,
|
| 424 |
+
5.957418918609619,
|
| 425 |
+
5.972012042999268,
|
| 426 |
+
6.00773811340332,
|
| 427 |
+
5.9787397384643555,
|
| 428 |
+
5.970890522003174
|
| 429 |
+
],
|
| 430 |
+
"val_loss": [
|
| 431 |
+
6.060036525726319,
|
| 432 |
+
5.66513689994812
|
| 433 |
+
],
|
| 434 |
+
"entropy_reg": [
|
| 435 |
+
1.3862943649291992,
|
| 436 |
+
1.3862943649291992,
|
| 437 |
+
1.3862941265106201,
|
| 438 |
+
1.386293888092041,
|
| 439 |
+
1.3862937688827515,
|
| 440 |
+
1.3862935304641724,
|
| 441 |
+
1.3862931728363037,
|
| 442 |
+
1.3862926959991455,
|
| 443 |
+
1.3862920999526978,
|
| 444 |
+
1.38629150390625,
|
| 445 |
+
1.3862909078598022,
|
| 446 |
+
1.3862903118133545,
|
| 447 |
+
1.3862894773483276,
|
| 448 |
+
1.3862886428833008,
|
| 449 |
+
1.3862876892089844,
|
| 450 |
+
1.386286735534668,
|
| 451 |
+
1.3862857818603516,
|
| 452 |
+
1.386284589767456,
|
| 453 |
+
1.38628351688385,
|
| 454 |
+
1.386282205581665,
|
| 455 |
+
1.38628089427948,
|
| 456 |
+
1.386279582977295,
|
| 457 |
+
1.3862781524658203,
|
| 458 |
+
1.3862766027450562,
|
| 459 |
+
1.386275053024292,
|
| 460 |
+
1.3862733840942383
|
| 461 |
+
],
|
| 462 |
+
"final_alphas": [
|
| 463 |
+
0.24904993176460266,
|
| 464 |
+
0.24905699491500854,
|
| 465 |
+
0.24909088015556335,
|
| 466 |
+
0.25280216336250305
|
| 467 |
+
]
|
| 468 |
+
},
|
| 469 |
+
"ewc_evolution": {
|
| 470 |
+
"total_penalty": [
|
| 471 |
+
0.0,
|
| 472 |
+
0.0,
|
| 473 |
+
0.0,
|
| 474 |
+
0.0,
|
| 475 |
+
0.0,
|
| 476 |
+
0.0,
|
| 477 |
+
0.0,
|
| 478 |
+
0.0,
|
| 479 |
+
0.0,
|
| 480 |
+
0.0,
|
| 481 |
+
0.0,
|
| 482 |
+
0.0,
|
| 483 |
+
0.0
|
| 484 |
+
],
|
| 485 |
+
"classic_pen": [
|
| 486 |
+
0,
|
| 487 |
+
0,
|
| 488 |
+
0,
|
| 489 |
+
0,
|
| 490 |
+
0,
|
| 491 |
+
0,
|
| 492 |
+
0,
|
| 493 |
+
0,
|
| 494 |
+
0,
|
| 495 |
+
0,
|
| 496 |
+
0,
|
| 497 |
+
0,
|
| 498 |
+
0
|
| 499 |
+
],
|
| 500 |
+
"kohonen_pen": [
|
| 501 |
+
0,
|
| 502 |
+
0,
|
| 503 |
+
0,
|
| 504 |
+
0,
|
| 505 |
+
0,
|
| 506 |
+
0,
|
| 507 |
+
0,
|
| 508 |
+
0,
|
| 509 |
+
0,
|
| 510 |
+
0,
|
| 511 |
+
0,
|
| 512 |
+
0,
|
| 513 |
+
0
|
| 514 |
+
],
|
| 515 |
+
"topo_pen": [
|
| 516 |
+
0,
|
| 517 |
+
0,
|
| 518 |
+
0,
|
| 519 |
+
0,
|
| 520 |
+
0,
|
| 521 |
+
0,
|
| 522 |
+
0,
|
| 523 |
+
0,
|
| 524 |
+
0,
|
| 525 |
+
0,
|
| 526 |
+
0,
|
| 527 |
+
0,
|
| 528 |
+
0
|
| 529 |
+
],
|
| 530 |
+
"n_masked_som_neurons": [
|
| 531 |
+
8,
|
| 532 |
+
8,
|
| 533 |
+
8,
|
| 534 |
+
8,
|
| 535 |
+
8,
|
| 536 |
+
8,
|
| 537 |
+
8,
|
| 538 |
+
8,
|
| 539 |
+
8,
|
| 540 |
+
8,
|
| 541 |
+
8,
|
| 542 |
+
8,
|
| 543 |
+
8
|
| 544 |
+
]
|
| 545 |
+
},
|
| 546 |
+
"pgvector_evolution": {
|
| 547 |
+
"status_per_step": [
|
| 548 |
+
"MISSING",
|
| 549 |
+
"MISSING",
|
| 550 |
+
"MISSING",
|
| 551 |
+
"MISSING",
|
| 552 |
+
"MISSING",
|
| 553 |
+
"MISSING",
|
| 554 |
+
"MISSING",
|
| 555 |
+
"MISSING",
|
| 556 |
+
"MISSING",
|
| 557 |
+
"MISSING",
|
| 558 |
+
"MISSING",
|
| 559 |
+
"MISSING",
|
| 560 |
+
"MISSING",
|
| 561 |
+
"MISSING",
|
| 562 |
+
"MISSING",
|
| 563 |
+
"MISSING",
|
| 564 |
+
"MISSING",
|
| 565 |
+
"MISSING",
|
| 566 |
+
"MISSING",
|
| 567 |
+
"MISSING",
|
| 568 |
+
"MISSING",
|
| 569 |
+
"MISSING",
|
| 570 |
+
"MISSING",
|
| 571 |
+
"MISSING",
|
| 572 |
+
"MISSING",
|
| 573 |
+
"MISSING"
|
| 574 |
+
],
|
| 575 |
+
"status_counts": {
|
| 576 |
+
"COMPLETE": 0,
|
| 577 |
+
"INCOMPLETE": 0,
|
| 578 |
+
"MISSING": 26
|
| 579 |
+
},
|
| 580 |
+
"coverage_ratio": [
|
| 581 |
+
0.0,
|
| 582 |
+
0.1015625,
|
| 583 |
+
0.0703125,
|
| 584 |
+
0.0078125,
|
| 585 |
+
0.0,
|
| 586 |
+
0.0,
|
| 587 |
+
0.0,
|
| 588 |
+
0.0,
|
| 589 |
+
0.0,
|
| 590 |
+
0.0,
|
| 591 |
+
0.0,
|
| 592 |
+
0.0,
|
| 593 |
+
0.0,
|
| 594 |
+
0.0,
|
| 595 |
+
0.0,
|
| 596 |
+
0.0,
|
| 597 |
+
0.0,
|
| 598 |
+
0.0,
|
| 599 |
+
0.0,
|
| 600 |
+
0.0,
|
| 601 |
+
0.0,
|
| 602 |
+
0.0,
|
| 603 |
+
0.0,
|
| 604 |
+
0.0,
|
| 605 |
+
0.0,
|
| 606 |
+
0.0
|
| 607 |
+
],
|
| 608 |
+
"best_sim": [
|
| 609 |
+
0.14675000309944153,
|
| 610 |
+
0.21084028482437134,
|
| 611 |
+
0.19277572631835938,
|
| 612 |
+
0.17743495106697083,
|
| 613 |
+
0.17542880773544312,
|
| 614 |
+
0.16453637182712555,
|
| 615 |
+
0.1526598036289215,
|
| 616 |
+
0.14970113337039948,
|
| 617 |
+
0.1437976062297821,
|
| 618 |
+
0.12999454140663147,
|
| 619 |
+
0.13033592700958252,
|
| 620 |
+
0.12869995832443237,
|
| 621 |
+
0.12521685659885406,
|
| 622 |
+
0.12479828298091888,
|
| 623 |
+
0.1171950176358223,
|
| 624 |
+
0.12239126116037369,
|
| 625 |
+
0.11291147023439407,
|
| 626 |
+
0.11535632610321045,
|
| 627 |
+
0.11707164347171783,
|
| 628 |
+
0.12343864142894745,
|
| 629 |
+
0.10077749937772751,
|
| 630 |
+
0.11185431480407715,
|
| 631 |
+
0.1044735461473465,
|
| 632 |
+
0.11309769749641418,
|
| 633 |
+
0.10987140238285065,
|
| 634 |
+
0.11576806008815765
|
| 635 |
+
],
|
| 636 |
+
"n_filled": [
|
| 637 |
+
0,
|
| 638 |
+
8,
|
| 639 |
+
8,
|
| 640 |
+
8,
|
| 641 |
+
8,
|
| 642 |
+
8,
|
| 643 |
+
8,
|
| 644 |
+
8,
|
| 645 |
+
8,
|
| 646 |
+
8,
|
| 647 |
+
8,
|
| 648 |
+
8,
|
| 649 |
+
8,
|
| 650 |
+
8,
|
| 651 |
+
8,
|
| 652 |
+
8,
|
| 653 |
+
8,
|
| 654 |
+
8,
|
| 655 |
+
8,
|
| 656 |
+
8,
|
| 657 |
+
8,
|
| 658 |
+
8,
|
| 659 |
+
8,
|
| 660 |
+
8,
|
| 661 |
+
8,
|
| 662 |
+
8
|
| 663 |
+
],
|
| 664 |
+
"filled_ratio": [
|
| 665 |
+
0.0,
|
| 666 |
+
1.0,
|
| 667 |
+
1.0,
|
| 668 |
+
1.0,
|
| 669 |
+
1.0,
|
| 670 |
+
1.0,
|
| 671 |
+
1.0,
|
| 672 |
+
1.0,
|
| 673 |
+
1.0,
|
| 674 |
+
1.0,
|
| 675 |
+
1.0,
|
| 676 |
+
1.0,
|
| 677 |
+
1.0,
|
| 678 |
+
1.0,
|
| 679 |
+
1.0,
|
| 680 |
+
1.0,
|
| 681 |
+
1.0,
|
| 682 |
+
1.0,
|
| 683 |
+
1.0,
|
| 684 |
+
1.0,
|
| 685 |
+
1.0,
|
| 686 |
+
1.0,
|
| 687 |
+
1.0,
|
| 688 |
+
1.0,
|
| 689 |
+
1.0,
|
| 690 |
+
1.0
|
| 691 |
+
],
|
| 692 |
+
"final_coverage": 0.0,
|
| 693 |
+
"final_best_sim": 0.11576806008815765,
|
| 694 |
+
"final_n_filled": 8,
|
| 695 |
+
"final_filled_ratio": 1.0
|
| 696 |
+
},
|
| 697 |
+
"hyp_pgvector_evolution": {
|
| 698 |
+
"status_per_step": [
|
| 699 |
+
"MISSING",
|
| 700 |
+
"MISSING",
|
| 701 |
+
"MISSING",
|
| 702 |
+
"MISSING",
|
| 703 |
+
"MISSING",
|
| 704 |
+
"MISSING",
|
| 705 |
+
"MISSING",
|
| 706 |
+
"MISSING",
|
| 707 |
+
"MISSING",
|
| 708 |
+
"MISSING",
|
| 709 |
+
"MISSING",
|
| 710 |
+
"MISSING",
|
| 711 |
+
"MISSING",
|
| 712 |
+
"MISSING",
|
| 713 |
+
"MISSING",
|
| 714 |
+
"MISSING",
|
| 715 |
+
"MISSING",
|
| 716 |
+
"MISSING",
|
| 717 |
+
"MISSING",
|
| 718 |
+
"MISSING",
|
| 719 |
+
"MISSING",
|
| 720 |
+
"MISSING",
|
| 721 |
+
"MISSING",
|
| 722 |
+
"MISSING",
|
| 723 |
+
"MISSING",
|
| 724 |
+
"MISSING"
|
| 725 |
+
],
|
| 726 |
+
"status_counts": {
|
| 727 |
+
"COMPLETE": 0,
|
| 728 |
+
"INCOMPLETE": 0,
|
| 729 |
+
"MISSING": 26,
|
| 730 |
+
"NO_PUNISHMENT": 0
|
| 731 |
+
},
|
| 732 |
+
"apply_punishment_per_step": [
|
| 733 |
+
1,
|
| 734 |
+
1,
|
| 735 |
+
1,
|
| 736 |
+
1,
|
| 737 |
+
1,
|
| 738 |
+
1,
|
| 739 |
+
1,
|
| 740 |
+
1,
|
| 741 |
+
1,
|
| 742 |
+
1,
|
| 743 |
+
1,
|
| 744 |
+
1,
|
| 745 |
+
1,
|
| 746 |
+
1,
|
| 747 |
+
1,
|
| 748 |
+
1,
|
| 749 |
+
1,
|
| 750 |
+
1,
|
| 751 |
+
1,
|
| 752 |
+
1,
|
| 753 |
+
1,
|
| 754 |
+
1,
|
| 755 |
+
1,
|
| 756 |
+
1,
|
| 757 |
+
1,
|
| 758 |
+
1
|
| 759 |
+
],
|
| 760 |
+
"skipped_per_step": [
|
| 761 |
+
0,
|
| 762 |
+
0,
|
| 763 |
+
0,
|
| 764 |
+
0,
|
| 765 |
+
0,
|
| 766 |
+
0,
|
| 767 |
+
0,
|
| 768 |
+
0,
|
| 769 |
+
0,
|
| 770 |
+
0,
|
| 771 |
+
0,
|
| 772 |
+
0,
|
| 773 |
+
0,
|
| 774 |
+
0,
|
| 775 |
+
0,
|
| 776 |
+
0,
|
| 777 |
+
0,
|
| 778 |
+
0,
|
| 779 |
+
0,
|
| 780 |
+
0,
|
| 781 |
+
0,
|
| 782 |
+
0,
|
| 783 |
+
0,
|
| 784 |
+
0,
|
| 785 |
+
0,
|
| 786 |
+
0
|
| 787 |
+
],
|
| 788 |
+
"best_sim": [
|
| 789 |
+
0.14675000309944153,
|
| 790 |
+
0.21084028482437134,
|
| 791 |
+
0.19277572631835938,
|
| 792 |
+
0.17743495106697083,
|
| 793 |
+
0.17542880773544312,
|
| 794 |
+
0.16453637182712555,
|
| 795 |
+
0.1526598036289215,
|
| 796 |
+
0.14970113337039948,
|
| 797 |
+
0.1437976062297821,
|
| 798 |
+
0.12999454140663147,
|
| 799 |
+
0.13033592700958252,
|
| 800 |
+
0.12869995832443237,
|
| 801 |
+
0.12521685659885406,
|
| 802 |
+
0.12479828298091888,
|
| 803 |
+
0.1171950176358223,
|
| 804 |
+
0.12239126116037369,
|
| 805 |
+
0.11291147023439407,
|
| 806 |
+
0.11535632610321045,
|
| 807 |
+
0.11707164347171783,
|
| 808 |
+
0.12343864142894745,
|
| 809 |
+
0.10077749937772751,
|
| 810 |
+
0.11185431480407715,
|
| 811 |
+
0.1044735461473465,
|
| 812 |
+
0.11309769749641418,
|
| 813 |
+
0.10987140238285065,
|
| 814 |
+
0.11576806008815765
|
| 815 |
+
],
|
| 816 |
+
"coverage": [
|
| 817 |
+
0.0,
|
| 818 |
+
0.1015625,
|
| 819 |
+
0.0703125,
|
| 820 |
+
0.0078125,
|
| 821 |
+
0.0,
|
| 822 |
+
0.0,
|
| 823 |
+
0.0,
|
| 824 |
+
0.0,
|
| 825 |
+
0.0,
|
| 826 |
+
0.0,
|
| 827 |
+
0.0,
|
| 828 |
+
0.0,
|
| 829 |
+
0.0,
|
| 830 |
+
0.0,
|
| 831 |
+
0.0,
|
| 832 |
+
0.0,
|
| 833 |
+
0.0,
|
| 834 |
+
0.0,
|
| 835 |
+
0.0,
|
| 836 |
+
0.0,
|
| 837 |
+
0.0,
|
| 838 |
+
0.0,
|
| 839 |
+
0.0,
|
| 840 |
+
0.0,
|
| 841 |
+
0.0,
|
| 842 |
+
0.0
|
| 843 |
+
],
|
| 844 |
+
"n_complete_skip": [
|
| 845 |
+
0,
|
| 846 |
+
0,
|
| 847 |
+
0,
|
| 848 |
+
0,
|
| 849 |
+
0,
|
| 850 |
+
0,
|
| 851 |
+
0,
|
| 852 |
+
0,
|
| 853 |
+
0,
|
| 854 |
+
0,
|
| 855 |
+
0,
|
| 856 |
+
0,
|
| 857 |
+
0,
|
| 858 |
+
0,
|
| 859 |
+
0,
|
| 860 |
+
0,
|
| 861 |
+
0,
|
| 862 |
+
0,
|
| 863 |
+
0,
|
| 864 |
+
0,
|
| 865 |
+
0,
|
| 866 |
+
0,
|
| 867 |
+
0,
|
| 868 |
+
0,
|
| 869 |
+
0,
|
| 870 |
+
0
|
| 871 |
+
],
|
| 872 |
+
"n_incomplete_apply": [
|
| 873 |
+
0,
|
| 874 |
+
0,
|
| 875 |
+
0,
|
| 876 |
+
0,
|
| 877 |
+
0,
|
| 878 |
+
0,
|
| 879 |
+
0,
|
| 880 |
+
0,
|
| 881 |
+
0,
|
| 882 |
+
0,
|
| 883 |
+
0,
|
| 884 |
+
0,
|
| 885 |
+
0,
|
| 886 |
+
0,
|
| 887 |
+
0,
|
| 888 |
+
0,
|
| 889 |
+
0,
|
| 890 |
+
0,
|
| 891 |
+
0,
|
| 892 |
+
0,
|
| 893 |
+
0,
|
| 894 |
+
0,
|
| 895 |
+
0,
|
| 896 |
+
0,
|
| 897 |
+
0,
|
| 898 |
+
0
|
| 899 |
+
],
|
| 900 |
+
"n_missing_apply": [
|
| 901 |
+
1,
|
| 902 |
+
2,
|
| 903 |
+
3,
|
| 904 |
+
4,
|
| 905 |
+
5,
|
| 906 |
+
6,
|
| 907 |
+
7,
|
| 908 |
+
8,
|
| 909 |
+
9,
|
| 910 |
+
10,
|
| 911 |
+
11,
|
| 912 |
+
12,
|
| 913 |
+
13,
|
| 914 |
+
14,
|
| 915 |
+
15,
|
| 916 |
+
16,
|
| 917 |
+
17,
|
| 918 |
+
18,
|
| 919 |
+
19,
|
| 920 |
+
20,
|
| 921 |
+
21,
|
| 922 |
+
22,
|
| 923 |
+
23,
|
| 924 |
+
24,
|
| 925 |
+
25,
|
| 926 |
+
26
|
| 927 |
+
],
|
| 928 |
+
"skip_rate": [
|
| 929 |
+
0.0,
|
| 930 |
+
0.0,
|
| 931 |
+
0.0,
|
| 932 |
+
0.0,
|
| 933 |
+
0.0,
|
| 934 |
+
0.0,
|
| 935 |
+
0.0,
|
| 936 |
+
0.0,
|
| 937 |
+
0.0,
|
| 938 |
+
0.0,
|
| 939 |
+
0.0,
|
| 940 |
+
0.0,
|
| 941 |
+
0.0,
|
| 942 |
+
0.0,
|
| 943 |
+
0.0,
|
| 944 |
+
0.0,
|
| 945 |
+
0.0,
|
| 946 |
+
0.0,
|
| 947 |
+
0.0,
|
| 948 |
+
0.0,
|
| 949 |
+
0.0,
|
| 950 |
+
0.0,
|
| 951 |
+
0.0,
|
| 952 |
+
0.0,
|
| 953 |
+
0.0,
|
| 954 |
+
0.0
|
| 955 |
+
],
|
| 956 |
+
"final_n_complete_skip": 0,
|
| 957 |
+
"final_n_incomplete_apply": 0,
|
| 958 |
+
"final_n_missing_apply": 26,
|
| 959 |
+
"final_skip_rate": 0.0,
|
| 960 |
+
"final_best_sim": 0.11576806008815765,
|
| 961 |
+
"final_coverage": 0.0
|
| 962 |
+
},
|
| 963 |
+
"dataset_distribution": {
|
| 964 |
+
"CEIA-POSITIVO/ultrachat_br_clustred_balanced_v1": 8,
|
| 965 |
+
"Madras1/corpus-ptbr-v2": 6,
|
| 966 |
+
"TucanoBR/GigaVerbo": 6,
|
| 967 |
+
"nvidia/OpenMathInstruct-2": 6
|
| 968 |
+
},
|
| 969 |
+
"n_params_M": 9.656608
|
| 970 |
+
}
|
| 971 |
+
}
|