File size: 5,181 Bytes
073c9a9
 
 
 
 
 
 
 
 
 
384b440
073c9a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
384b440
073c9a9
 
 
 
 
 
 
 
384b440
073c9a9
 
79f63e4
 
 
 
 
 
073c9a9
79f63e4
073c9a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
384b440
073c9a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/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)