"""Load the exported rurtech.ai MoE and generate text. python generate.py --prompt "The rurtech.ai runtime" """ from __future__ import annotations import argparse import json from pathlib import Path import torch from safetensors.torch import load_model from modeling_ecoaco import EcoacoConfig, EcoacoForCausalLM from tokenizer import ByteBPETokenizer HERE = Path(__file__).resolve().parent def load(artifacts: Path): cfg_d = json.loads((artifacts / "config.json").read_text()) for _k in ("model_type","architectures","name"): cfg_d.pop(_k, None) cfg = EcoacoConfig(**cfg_d) model = EcoacoForCausalLM(cfg) load_model(model, str(artifacts / "model.safetensors")) model.eval() tok = ByteBPETokenizer.load(artifacts / "tokenizer.json") return model, tok def main(): ap = argparse.ArgumentParser() ap.add_argument("--prompt", default="The rurtech.ai runtime") ap.add_argument("--max-new-tokens", type=int, default=60) ap.add_argument("--temperature", type=float, default=0.7) ap.add_argument("--artifacts", default=str(HERE / "artifacts")) args = ap.parse_args() device = "cuda" if torch.cuda.is_available() else "cpu" model, tok = load(Path(args.artifacts)) model = model.to(device) ctx = torch.tensor([tok.encode(args.prompt, add_bos=True)], device=device) out = model.generate(ctx, max_new_tokens=args.max_new_tokens, temperature=args.temperature, eos_id=tok.eos_id) print(tok.decode(out[0].tolist())) if __name__ == "__main__": main()