PowerMachine's picture
AURORA v6 COMPLETO: roteamento por S-SOM (doc 18 §1, Teoremas 18.1–18.3), Reward/Punishment/Penalty (doc 18 §2), SGDR T_mult, pacote integral de métricas (CLIP/ITM/PPL-mm, CIDEr/BLEU/ROUGE/METEOR, MMMU/MME/MathVista proxies PT-BR, QE/TE/distorção/σ/α/drift/freq/U-Matrix), estados antigos apagados — treino do zero
06edf75 verified
Raw History Blame Contribute Delete
14.8 kB
# -*- coding: utf-8 -*-
"""Configuração central do AURORA — PT-BR total nos textos, identificadores em inglês.
Toda constante de projeto vive aqui; scripts e módulos nunca fixam números soltos.
Carregamento: ConfigPadrao() → sobrescreve com JSON via Config.de_arquivo(caminho).
"""
from __future__ import annotations
import json
from dataclasses import asdict, dataclass, field
@dataclass
class ConfigDados:
"""Streaming dos datasets HF (item 4) — carregamento INDIVIDUAL (um por vez,
requisito do usuário) com orçamento de RAM (item 1). v4: +10 datasets novos."""
datasets: list = field(default_factory=lambda: [
# --- corpus original (8) ---
{"id": "dominguesm/restore-punctuation-ptbr-dataset", "tarefa": "pontuacao_tags", "max_exemplos": 400},
{"id": "CEIA-POSITIVO/ultrachat_br_clustred_balanced_v1", "tarefa": "instrucao", "max_exemplos": 500},
{"id": "dominguesm/Canarim-Instruct-PTBR-Dataset", "tarefa": "instrucao", "max_exemplos": 500},
{"id": "adalbertojunior/punctuation-ptbr", "tarefa": "pontuacao_par", "max_exemplos": 400,
"via_parquet": True},
{"id": "iara-project/news-articles-ptbr-dataset", "tarefa": "noticia", "max_exemplos": 350},
{"id": "manoela/noticias_ptbr", "tarefa": "noticia", "max_exemplos": 350},
{"id": "carolina-c4ai/corpus-carolina", "tarefa": "lm", "max_exemplos": 350},
{"id": "BrunoN-Dev/corpus-ptbr-v1", "tarefa": "lm", "max_exemplos": 300},
# --- v4: datasets NOVOS (requisito do usuário, streaming individual) ---
{"id": "marcelohaps/verbovision-oracle-facts-pt", "tarefa": "vqa", "max_exemplos": 200},
{"id": "amalia-llm/MMMU-PT", "tarefa": "vqa", "max_exemplos": 200},
{"id": "amalia-llm/MMMU-Pro-PT", "tarefa": "vqa", "max_exemplos": 200},
{"id": "amalia-llm/OCRBench-PT", "tarefa": "ocr", "max_exemplos": 200},
{"id": "amalia-llm/COCO-Caption2017-PT", "tarefa": "imagem_caption", "max_exemplos": 200},
{"id": "weikaih/imaginative-perception-token-pt-eval-real", "tarefa": "vqa", "max_exemplos": 200},
{"id": "opedromartins/asr-leaderboard-datasets-ptbr", "tarefa": "asr", "max_exemplos": 200},
{"id": "marcosremar2/pt-br-tts-synth", "tarefa": "tts", "max_exemplos": 200},
{"id": "leeaandrob/neurogrid-tts-synth-ptbr", "tarefa": "tts", "max_exemplos": 200},
])
carregar_individual: bool = True # um dataset por vez; falha → registra e segue
comprimento_max: int = 192 # tokens por janela
semente: int = 2026
buffer_max_ram_mb: float = 256.0 # cache em RAM limitado
cache_disco_dir: str = "/home/z/my-project/aurora/cache_dados"
@dataclass
class ConfigModelo:
"""Modelo unificado multimodal. v4: vocab 16384, n_experts_fusao=4
(requisitos explícitos), NLP/NLG como unidades de primeira classe."""
vocab: int = 16384 # v4 — requisito do usuário
d_modelo: int = 192
n_camadas: int = 3
n_cabecas: int = 4
d_ff: int = 512
comprimento_ctx: int = 192
janela_sliding: int = 32 # atenção em janela deslizante
n_experts_fusao: int = 4 # v4 — requisito do usuário (era 2)
dropout: float = 0.0
kv_cache_max: int = 512 # recorte do KV-cache (RAM)
# v2 — MoE agrupável com foco na tarefa (doc 10 §1)
moe: dict = field(default_factory=lambda: {
"ativo": True, "n_camadas_moe": 2, "n_grupos": 3, "experts_por_grupo": 2,
"d_ff_expert": 160, "top_k": 2, "margem_foco": 1.0, "n_tarefas": 9})
# v2 — predição multi-token com α aprendíveis (doc 10 §3)
mtp: dict = field(default_factory=lambda: {
"ativo": True, "k_cabecas": 2, "beta_entropia": 0.01,
"k_adaptativo": True})
# v3 — microunidades escaláveis (doc 11 §§0–5): serial/paralela/isolada/recursiva
microunidades: dict = field(default_factory=lambda: {
"d_gru": 96, "d_ramo": 96, "d_refino": 128, "kernel1": 3, "kernel2": 5,
"gamma_rec": 0.5, "k_rec_max": 2, "eps_stop": 1e-2,
"tau0": 0.8, "kappa_conf": 1.0, "delta_explora": 0.15})
# v4 — AUTO-ESCALA por computo (doc 12): capacidade segue o ambiente
escalacao: dict = field(default_factory=lambda: {
"ativo": True, "d0": 64, "n_max_ramos": 6, "k_rec_max": 3,
"alpha": 0.5, "reavaliar_a_cada": 100}) # passos entre reavaliações
# v6 — ROTEADOR S-SOM (doc 18 §1): roteamento de MoE supervisionado
roteador: dict = field(default_factory=lambda: {
"ativo": True, "k": 24, "lambda_rota": 0.35, "gamma_empate": 0.15,
"conf_min": 0.25, "min_amostras": 200})
# v4 — unidades NLP (processar) e NLG (gerar) de primeira classe (doc 15 §1)
nlp: dict = field(default_factory=lambda: {"ativo": True, "n_intencoes": 10})
# v5 — atenção ENTRE camadas MoE (doc 16 §§1–2): nasce neutra (α=β=0)
atencao_moe: dict = field(default_factory=lambda: {"ativo": True, "alpha0": 0.0})
nlg: dict = field(default_factory=lambda: {"ativo": True, "n_estilos": 8,
"peso_rerank": 0.35})
# encoders multimodais "completo pesado" com escala configurável:
imagem: dict = field(default_factory=lambda: {
"tam_patch": 16, "resolucao": 96, "d": 192, "n_camadas": 3, "n_cabecas": 4})
audio: dict = field(default_factory=lambda: {
"n_mels": 80, "d": 192, "n_camadas": 2, "n_cabecas": 4})
video: dict = field(default_factory=lambda: {
"n_frames": 4, "tam_patch": 16, "resolucao": 96, "d": 128, "n_camadas": 2})
@dataclass
class ConfigSOM:
"""Mapas auto-organizáveis (item 2) — todas as variantes + orquestrador."""
dim_entrada: int = 192 # = d_modelo (espaço latente compartilhado)
gg: dict = field(default_factory=lambda: {"lado": 8, "lambda_insercao": 400, "beta": 0.9995, "kmax": 64})
gcs: dict = field(default_factory=lambda: {"kmax": 48, "lambda_insercao": 300, "beta": 0.9995})
gsom: dict = field(default_factory=lambda: {"sf": 0.35, "lambda_vizinhos": 0.3, "max_unidades": 96})
hsom: dict = field(default_factory=lambda: {"k_nivel1": 12, "k_filho": 10})
tkm: dict = field(default_factory=lambda: {"k": 32, "lambda_janela": 0.5, "janela": 8})
rsom: dict = field(default_factory=lambda: {"k": 32, "alpha": 0.3})
cpn: dict = field(default_factory=lambda: {"k": 24, "d_saida": 64, "eta0": 0.05})
ssom: dict = field(default_factory=lambda: {"k": 24, "lambda_sup": 0.5, "n_classes": 8})
orquestrador: dict = field(default_factory=lambda: {"atualizacao_por_epoca": 1})
@dataclass
class ConfigTreino:
"""Treino extenso multi-época (item 6) com punição/retreino e W8A8 (item 9).
v2 (doc 10): fases DENSA (máx conexões) → FOCO (top-k) → DPO → SOM (máx
neurônios ativos); PCGrad entre CE e auxiliares; barreira ABMO no lr.
"""
epocas: int = 4
lote: int = 8
lr_max: float = 3e-3
lr_min: float = 3e-4
warmup: int = 60
clip_grad: float = 1.0
janela_estagnacao: int = 120 # passos por janela (eq. 9.3)
epsilon_estagnacao: float = 0.01
max_punicoes_por_epoca: int = 3
checkpoint_a_cada: int = 150 # passos
avaliar_a_cada: int = 100
qat_ultimos_passos: int = 80 # ativa STE-W8A8 no fim (item 9)
mistura_tarefas: dict = field(default_factory=lambda: {
"instrucao": 0.22, "lm": 0.14, "noticia": 0.1, "pontuacao": 0.1,
"imagem_caption": 0.1, "vqa": 0.1, "ocr": 0.07, "asr": 0.09, "tts": 0.08})
# v2 — pipeline denso→SOM (item d do escopo)
fase_densa_ate_epoca: int = 3 # épocas 0..2 densas; última = foco+QAT
pcgrad: bool = True # cirurgia de gradiente CE × auxiliares
lambda_moe_lb: float = 0.01 # peso da perda de balanceamento
lambda_moe_ort: float = 0.01 # peso da penalidade ortogonal intra-grupo
lambda_mtp: float = 0.3 # peso da perda multi-token
lambda_som: float = 0.05 # peso do alinhamento SOM
# v2 — barreira analítica de LR (ABMO corrigido, doc 10 §6)
abmo: dict = field(default_factory=lambda: {
"ativo": True, "margem": 0.25, "cap_min": 0.05, "cap_max": 500.0})
# v2 — DPO pós-SFT (doc 10 §4)
dpo: dict = field(default_factory=lambda: {
"ativo": True, "passos": 150, "beta": 0.1, "lr": 5e-5, "lr_beta": 1e-3,
"kl_alvo": 0.2, "lote": 4})
# v2 — fase SOM com máximo de neurônios ativos (doc 10 §2.3)
fase_som: dict = field(default_factory=lambda: {
"ativo": True, "epocas": 2, "alvo_ativos": 0.90, "gamma_empate": 0.15,
"lambda_novidade": 0.25, "dim_lote": 64})
# v3 — PRS V8 (doc 11 §7): histerese, SGDR+piso↓, clip-percentil, 2 regimes
prs_v8: dict = field(default_factory=lambda: {
"ativo": True, "eta_up": 0.05, "eta_down": 0.02, "T_ciclo": 400,
"decay_piso": 0.5, "percentil": 0.75, "janela_clip": 50,
"coef_streak": 0.3, "vel_alvo": 0.01, "boost_max": 1.5})
# v3 — AgenteConfiança (doc 11 §8): Beta+Bernstein+PAC-Bayes, κ assimétrico
confianca: dict = field(default_factory=lambda: {
"ativo": True, "kappa_punicao": 0.3, "kappa_premio": 0.1,
"janela_tau": 50, "quantil_tau": 0.25, "h_escrita_memoria": 0.5})
# v3 — GestorCrescimento (doc 11 §5): Hutchinson diag-H → expandir/podar
crescimento: dict = field(default_factory=lambda: {
"ativo": True, "a_cada": 200, "tau_expand": 0.10, "tau_prune": 0.01,
"eps_gate": 0.05, "janela_uso": 8, "n_max_ramos": 5, "n_sondas": 2})
# v6 — RPP (doc 18 §2): Reward/Punishment/Penalty (Teoremas 18.4–18.7)
rpp: dict = field(default_factory=lambda: {
"ativo": True, "rho_max": 0.15, "rho_step": 0.05, "rho_decaimento": 0.5,
"janela": 30, "kappa_rotas_mortas": 0.01, "alvo_ativos": 0.90})
# v6 — SGDR com T_mult (Teorema 18.5): ciclos T_i = T_0·T_mult^i
sgdr_t_mult: int = 2
@dataclass
class ConfigMemoriaInterna:
"""Memória interna multimodal (v3, doc 11 §9): slots conficientes, evicção
por utilidade, compressão VQ e índice SOM + contratos de acesso."""
ativo: bool = True
n_slots: int = 64
h_escrita: float = 0.5
idade_compressao_s: float = 900.0
n_codigos: int = 64
lambda_utilidade: float = 0.1
meia_vida_s: float = 1800.0
replay_a_cada: int = 40 # passos entre replays de memória como contexto
@dataclass
class ConfigJanela1M:
"""Janela de contexto 1M tokens com compressão INDEXADA (v4, doc 13)."""
ativo: bool = True
n_max_tokens: int = 1_000_000
l_fino: int = 4096 # janela fina (atenção normal)
w_segmento: int = 256 # tamanho do segmento/resumo
s_passo: int = 128 # passo com overlap 50%
k_recall: int = 4 # resumos recuperados por consulta
viz_r: int = 2 # anel da busca coarse (Teorema 13.1)
m_max: int = 7813 # orçamento de resumos (eq. 13.1)
@dataclass
class ConfigCheckpoints:
"""Checkpoints LOCAIS do treino (item c — doc 16 §8).
v5: nenhum upload parcial no Hub durante o treino (o Hub bloqueia
envios parciais em sequência curta). O snapshot final entra no commit
único de publicação (GestorCheckpoints.preparar_para_publicacao)."""
dir_local: str = "/home/z/my-project/aurora/estados_local"
pasta_publicacao: str = "estados/fase-v6"
@dataclass
class ConfigSOMAtencao:
"""Atenção ENTRE variantes Kohonen (v5, doc 16 §§3–5): recall atencional
sobre TODAS as variantes + invariante ZERO neurônios isolados."""
ativo: bool = True
tau: float = 0.5 # temperatura do softmax de variantes
gamma_novidade: float = 0.15 # bônus a variantes com órfãos (Teo. 16.5)
@dataclass
class ConfigDifusao:
"""Difusão multimodal (v5, doc 17): SD txt2img/img2img/inpaint com ciclo
fechado de compreensão geracional. Default: repositório TINY (testes);
produção: stabilityai/stable-diffusion-2-1-base (GPU ≥ 8GB)."""
ativo: bool = True
repo_id: str = "hf-internal-testing/tiny-stable-diffusion-torch"
altura: int = 128
largura: int = 128
passos_inferencia: int = 8
guia_escala: float = 7.5
@dataclass
class ConfigAgenteEngenheiro:
"""Agente Engenheiro (v5, doc 16 §9): revisão pré-modificação +
observação de TODAS as métricas fundamentais por módulo (treino+inferência)."""
ativo: bool = True
intervalo: int = 50 # passos entre observações completas
tolerancia_regressao: float = 0.05
@dataclass
class ConfigTelemetria:
"""Telemetria/indicadores (item 5)."""
arquivo_jsonl: str = "/home/z/my-project/aurora/telemetria_out/telemetria.jsonl"
ema_beta: float = 0.98
psi_limite: float = 0.25
rank_efectivo_min: float = 4.0
grad_faixa: tuple = field(default_factory=lambda: (1e-7, 1e2))
@dataclass
class ConfigCiclo:
"""Raciocínio cíclico PDCA (item 3) + ferramentas com cache (item 10)."""
tau_escalada: float = 0.35 # p abaixo disso → humano (Teorema 9.5)
entropia_limite: float = 0.85
orcamento_passos: int = 6
cache_ferramentas_ttl: int = 600 # s
cache_ferramentas_max: int = 64
@dataclass
class Config:
dados: ConfigDados = field(default_factory=ConfigDados)
modelo: ConfigModelo = field(default_factory=ConfigModelo)
som: ConfigSOM = field(default_factory=ConfigSOM)
treino: ConfigTreino = field(default_factory=ConfigTreino)
telemetria: ConfigTelemetria = field(default_factory=ConfigTelemetria)
ciclo: ConfigCiclo = field(default_factory=ConfigCiclo)
checkpoints: ConfigCheckpoints = field(default_factory=ConfigCheckpoints)
memoria_interna: ConfigMemoriaInterna = field(default_factory=ConfigMemoriaInterna)
janela_1m: ConfigJanela1M = field(default_factory=ConfigJanela1M)
som_atencao: ConfigSOMAtencao = field(default_factory=ConfigSOMAtencao)
difusao: ConfigDifusao = field(default_factory=ConfigDifusao)
agente_engenheiro: ConfigAgenteEngenheiro = field(
default_factory=ConfigAgenteEngenheiro)
def de_arquivo(self, caminho: str) -> "Config":
"""Sobrescreve campos recursivamente a partir de JSON."""
with open(caminho, "r", encoding="utf-8") as f:
sobrescrita = json.load(f)
for nome_secao, valores in sobrescrita.items():
secao = getattr(self, nome_secao, None)
if secao is None:
setattr(self, nome_secao, valores)
continue
for k, v in valores.items():
setattr(secao, k, v)
return self
def para_dict(self) -> dict:
return asdict(self)