indigo.tf / generate.py
adyoi's picture
Upload folder using huggingface_hub
47dfda4 verified
Raw
History Blame Contribute Delete
2.39 kB
import sys
import random
import argparse
import numpy as np
import tensorflow as tf
from indigotf.common import build_tokenizer, load_meta
from indigotf.model import build_gpt, generate
CONFIG_KEYS = ("vocab_size", "block_size", "n_layer", "n_head", "n_embd", "dropout")
def load_model(path):
from safetensors.numpy import load_file
meta = load_meta(path)
if meta.get("backend") != "tensorflow":
raise SystemExit(
f"{path} berasal dari backend {meta.get('backend')}, gunakan repo indigo (PyTorch)"
)
state = load_file(path)
by_path = {k.replace("/", "_"): v for k, v in state.items()}
model = build_gpt(**{k: meta["config"][k] for k in CONFIG_KEYS})
missing = [v.path for v in model.weights if v.path.replace("/", "_") not in by_path]
if missing:
raise SystemExit(f"bobot tidak cocok dengan checkpoint: {missing[:5]}")
model.set_weights([by_path[v.path.replace("/", "_")] for v in model.weights])
tokenizer = build_tokenizer(meta.get("tokenizer") or {"type": "char"}, meta.get("vocab"))
return model, meta, tokenizer
def main():
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
parser = argparse.ArgumentParser(description="Generate teks dari checkpoint Indigo-TF")
parser.add_argument("--ckpt", default="out/indigo_best.safetensors")
parser.add_argument("--prompt", default="")
parser.add_argument("--max-new", type=int, default=300)
parser.add_argument("--temperature", type=float, default=0.8)
parser.add_argument("--top-k", type=int, default=40)
parser.add_argument("--seed", type=int, default=None)
parser.add_argument("--device", default="auto", choices=["auto", "cpu", "gpu"])
args = parser.parse_args()
if args.device == "cpu":
tf.config.set_visible_devices([], "GPU")
if args.seed is not None:
random.seed(args.seed)
np.random.seed(args.seed)
tf.random.set_seed(args.seed)
model, meta, tokenizer = load_model(args.ckpt)
ids = tokenizer.encode(args.prompt) or [0]
idx = tf.constant([ids], dtype=tf.int64)
out = generate(
model,
idx,
args.max_new,
block_size=meta["config"]["block_size"],
temperature=args.temperature,
top_k=args.top_k,
)
print(tokenizer.decode(out.numpy()[0].tolist()))
if __name__ == "__main__":
main()