khtst-multimodal-ptbr / scripts /09_teste_item_b.py
PowerMachine's picture
KHTST v10 — JANELA PARALELA 256K→128K + CLASSIFICADORES JEV: comprimento_ctx=256/janela_sliding=192; janelas W=192K/E=64K com cross-fade de partição de unidade (Teos 21.1–21.4); classificadores alinhados escolha/escore/noul com metacalibração térmica por entropia, versão PRÓPRIA, inseridos só onde provado vantajoso (Teos 21.6–21.11); nascimento neutro (Teo 21.12); SEM FALLBACK — núcleos Cython/C obrigatórios com auto-build e kernel temperatura_entropia (Teo 21.13); gate APROVADO: ppl_lm 2,58 vs AURORA 17,09 (−84,9%), 9/9 perdas, treino 4,14h ≤ 4h+1h, RAM 3445 ≤ 3580; estado fase-v10 gate-aprovado (sonda δ*=0.0); estados antigos apagados
384b440 verified
Raw History Blame Contribute Delete
5.18 kB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Teste FINAL do item (b) — modelo KHTST TREINADO (checkpoint fase-som).
Verifica, com o modelo pós-treino real:
1. 4 requisições submetidas em série ANTES da 1ª resposta;
2. recebimento (estado RECEBIDA) confirmado para todas antes do processamento;
3. processamento (PROCESSANDO → CONCLUIDA) com tokens gerados;
4. stopping (cancelamento) honrado em ≤ 1 passo durante geração ativa;
5. continue (retomada de pedido pausado).
Saída: telemetria_out/teste_item_b_v10.json
"""
import json
import sys
import threading
import time
sys.path.insert(0, "/home/z/my-project/khtst/src")
import torch
from khtst.config import Config
from khtst.dados.tokenizador import TokenizadorKHTST
from khtst.memoria.orquestrador import OrquestradorSOM
from khtst.nucleo.modelo import KHTSTModel
from khtst.servico import SessaoKHTST
CFG_PATH = "/home/z/my-project/khtst/configs/base.json"
TK_PATH = "/home/z/my-project/khtst/cache_dados/tokenizador.json"
SAIDA = "/home/z/my-project/khtst/telemetria_out/teste_item_b_v10.json"
cfg = Config().de_arquivo(CFG_PATH)
torch.manual_seed(cfg.dados.semente)
modelo = KHTSTModel(cfg, usar_multimodal=True)
tk = TokenizadorKHTST(TK_PATH)
# retoma o estado final (fase-som)
from khtst.dados.checkpoints import GestorCheckpoints
ck = GestorCheckpoints("/home/z/my-project/khtst/estados_local", "estados/fase-v10")
tag = ck.ultima_tag()
if tag:
from khtst.treino.estado_integral import EstadoIntegral
from khtst.memoria.orquestrador import OrquestradorSOM
# v9 — estado integral: roteador S-SOM + orquestrador restaurados
orq = OrquestradorSOM(cfg.modelo.d_modelo, cfg.som)
ck.estado = EstadoIntegral(modelo, {"roteador": getattr(modelo, "roteador_ssom", None),
"orquestrador": orq})
ok = ck.carregar(modelo, tag)
print(f"estado retomado: {tag} (ok={ok}, estado integral)")
modelo.eval()
sessao = SessaoKHTST(modelo, decodificar=tk)
prompts = [
"O KHTST é um modelo multimodal que",
"A previsão do tempo para amanhã indica",
"Para cozinhar arroz, primeiro",
"O melhor time do Brasil é",
]
# ---- 1) 4 requisições EM SÉRIE antes da 1ª resposta ----
pids = [sessao.submeter(p, max_novos=10, tarefa="lm") for p in prompts]
estados_iniciais = [sessao.pedidos[i].estado.value for i in pids]
check_recebimento = all(e == "recebida" for e in estados_iniciais)
print("1) 4 pedidos ANTES da 1ª resposta:", pids, "| estados:", estados_iniciais)
# ---- 2/3) processa todos (a bomba adhoc roda ENTRE tokens) ----
t0 = time.time()
saidas = sessao.executar_todos(max_passos=400)
dur = time.time() - t0
rel = sessao.relatorio()
check_processamento = all(rel[i]["estado"] == "concluida" and rel[i]["n_tokens"] == 10
for i in pids)
print("2) processamento:", [(i, rel[i]["estado"], rel[i]["n_tokens"]) for i in pids],
f"| {dur:.1f}s")
for i in pids:
texto = tk.decodificar(saidas[i])
print(f" pedido {i}: «{prompts[i]}» → {texto[:70]!r}")
# ---- 4) stopping durante processamento ativo (thread externa) ----
sessao2 = SessaoKHTST(modelo, decodificar=tk)
p_st = sessao2.submeter("Escreva uma história longa sobre o mar e as estrelas",
max_novos=60, tarefa="lm")
def para_no_meio():
time.sleep(0.4)
sessao2.stop(p_st, cancelar=True)
threading.Thread(target=para_no_meio, daemon=True).start()
sessao2.executar_todos(max_passos=400)
rel2 = sessao2.relatorio()[p_st]
check_stop = rel2["estado"] == "cancelada" and 0 < rel2["n_tokens"] < 60
print("4) stopping:", rel2["estado"], "| tokens antes do stop:", rel2["n_tokens"],
"| eventos:", rel2["eventos"])
# ---- 5) pause → continue ----
sessao3 = SessaoKHTST(modelo, decodificar=tk)
p_pc = sessao3.submeter("O livro da floresta narra", max_novos=12, tarefa="lm")
sessao3.canal.stop(p_pc, cancelar=False) # pausa no 1º dreno
def retoma():
time.sleep(0.3)
sessao3.continuar(p_pc)
threading.Thread(target=retoma, daemon=True).start()
sessao3.executar_todos(max_passos=400)
rel3 = sessao3.relatorio()[p_pc]
check_continue = rel3["estado"] == "concluida" and "pausada" in rel3["eventos"] \
and "retomada" in rel3["eventos"]
print("5) pause→continue:", rel3["estado"], "| eventos:", rel3["eventos"])
resultado = {
"modelo": "KHTST v10 (checkpoint: " + str(tag) + ")",
"item_b_4_requisicoes_antes_da_1a": bool(check_recebimento),
"item_b_processamento_e_conclusao": bool(check_processamento),
"item_b_stopping_durante_ativa": bool(check_stop),
"item_b_pause_continue": bool(check_continue),
"estados_iniciais": estados_iniciais,
"relatorio_completo": {str(i): rel[i] for i in rel},
"relatorio_stop": rel2,
"relatorio_pause_continue": rel3,
"duracao_s": round(dur, 2),
}
ok_all = all([check_recebimento, check_processamento, check_stop, check_continue])
resultado["item_b_aprovado"] = bool(ok_all)
with open(SAIDA, "w", encoding="utf-8") as f:
json.dump(resultado, f, ensure_ascii=False, indent=2, default=str)
print(f"\nITEM B: {'APROVADO' if ok_all else 'REPROVADO'} → {SAIDA}")
sys.exit(0 if ok_all else 1)