# -*- 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)