| import torch
|
| import torch.nn.functional as F
|
| from hrt import ModelConfig, HierarchicalRadialTransformerV7
|
|
|
| device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
|
|
|
| cfg = ModelConfig(
|
| d_model=768,
|
| d_ff=3072,
|
| n_outer_latents=512,
|
| n_outer_cycles=6,
|
| n_inner_cycles=8,
|
| n_center_latents=16,
|
| routing_k=64,
|
| n_outer_heads=12,
|
| n_inner_heads=12,
|
| n_latent_heads=12,
|
| vocab_size=257,
|
| max_seq_len=131072,
|
| use_qk_norm=True,
|
| use_rezero=True,
|
| use_compaction=True,
|
| use_internalization=True,
|
| use_jfb=True,
|
| use_q_cache=True,
|
| )
|
|
|
|
|
| model = HierarchicalRadialTransformerV7(cfg).to(device)
|
| weights = torch.load("hrt_v7_148m_weights.pt", map_location=device)
|
| model.load_state_dict(weights["model"] if "model" in weights else weights)
|
| model.eval()
|
|
|
|
|
| def generate(prompt: str, max_new_bytes: int = 120, temp: float = 0.5, top_k: int = 5):
|
| prompt_bytes = list(prompt.encode("utf-8"))
|
| prompt_ids = torch.tensor([prompt_bytes], dtype=torch.long, device=device)
|
|
|
| with torch.no_grad():
|
| prompt_emb = model.tok_emb(prompt_ids)
|
| logits, cache = model._init_generation_cache(prompt_emb)
|
| out_bytes = list(prompt_bytes)
|
|
|
| for _ in range(max_new_bytes):
|
| l = logits / max(temp, 1e-5)
|
| if top_k > 0:
|
| v, _ = torch.topk(l, min(top_k, l.size(-1)))
|
| l[l < v[:, [-1]]] = float("-inf")
|
|
|
| nxt = torch.multinomial(F.softmax(l, dim=-1), num_samples=1)
|
| nxt_id = nxt.item()
|
| if nxt_id == 256:
|
| break
|
|
|
| out_bytes.append(nxt_id)
|
| nxt_emb = model.tok_emb(nxt)
|
| logits = model.step_generation(nxt_emb, cache)
|
|
|
| return bytes(out_bytes).decode("utf-8", errors="replace")
|
|
|
|
|
| print(generate("def", max_new_bytes=100))
|
|
|