| """ |
| Minimal standalone inference example for lfm2-quantum-128m-sft. |
| |
| This is the SFT (instruction-tuned) checkpoint -- unlike the base model, it |
| follows a chat format. This example does a single user turn -> assistant |
| response (no multi-turn history) to keep things simple. |
| |
| Setup: |
| pip install torch tiktoken rustbpe filelock kernels |
| |
| Run from the root of this downloaded repo (where model_000849.pt lives): |
| python inference.py --prompt "What is the capital of France?" |
| """ |
| import argparse |
| import torch |
|
|
| from nanochat.checkpoint_manager import build_model |
| from nanochat.tokenizer import RustBPETokenizer |
| from nanochat.common import autodetect_device_type |
|
|
| parser = argparse.ArgumentParser(description="Chat with lfm2-quantum-128m-sft") |
| parser.add_argument("--prompt", type=str, default="What is the capital of France?") |
| parser.add_argument("--max-tokens", type=int, default=256) |
| parser.add_argument("--temperature", type=float, default=0.8, help="0 = greedy decoding") |
| parser.add_argument("--top-k", type=int, default=10) |
| parser.add_argument("--seed", type=int, default=42) |
| parser.add_argument("--device-type", type=str, default="", choices=["cuda", "cpu", "mps"], help="empty = autodetect") |
| args = parser.parse_args() |
|
|
| device_type = args.device_type or autodetect_device_type() |
| device = torch.device(device_type) |
|
|
| |
| model, _, meta = build_model(checkpoint_dir=".", step=849, device=device, phase="eval") |
| tokenizer = RustBPETokenizer.from_directory("tokenizer") |
|
|
| bos = tokenizer.get_bos_token_id() |
| user_start, user_end = tokenizer.encode_special("<|user_start|>"), tokenizer.encode_special("<|user_end|>") |
| assistant_start, assistant_end = tokenizer.encode_special("<|assistant_start|>"), tokenizer.encode_special("<|assistant_end|>") |
|
|
| conversation = [bos, user_start, *tokenizer.encode(args.prompt), user_end, assistant_start] |
|
|
| print(f"User: {args.prompt}\nAssistant: ", end="", flush=True) |
| for token_id in model.generate( |
| conversation, |
| max_tokens=args.max_tokens, |
| temperature=args.temperature, |
| top_k=args.top_k, |
| seed=args.seed, |
| ): |
| if token_id == assistant_end: |
| break |
| print(tokenizer.decode([token_id]), end="", flush=True) |
| print() |
|
|