File size: 14,825 Bytes
094b8e7 ebc1354 094b8e7 ebc1354 094b8e7 ebc1354 094b8e7 ebc1354 094b8e7 ebc1354 094b8e7 ebc1354 094b8e7 05db690 e829bfc ebc1354 06edf75 ebc1354 96a4177 ebc1354 094b8e7 05db690 094b8e7 05db690 e829bfc 06edf75 e829bfc 05db690 ebc1354 05db690 96a4177 05db690 06edf75 96a4177 094b8e7 96a4177 e829bfc ebc1354 96a4177 094b8e7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 | # -*- 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)
|