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)