minirewrite / predict.py
siddheshrj's picture
Initial release of MiniRewrite 7.6M Transformer
7f90954 verified
Raw History Blame Contribute Delete
4.81 kB
"""Standalone prediction script for MiniRewrite.
Works on any machine with PyTorch and Tokenizers installed (CPU or CUDA).
Usage:
# 1. Single prediction:
python predict.py "send me report asap" --tone professional --style polite
# 2. Friendly direct:
python predict.py "send me report asap" --tone friendly --style direct
# 3. Shorten concise:
python predict.py "In order to complete the project on time, we need more resources." --task shorten --style concise
# 4. Interactive chat mode:
python predict.py --interactive
"""
import argparse
import sys
from pathlib import Path
import torch
# Ensure src is on path
SCRIPT_DIR = Path(__file__).resolve().parent
if str(SCRIPT_DIR / "src") not in sys.path:
sys.path.insert(0, str(SCRIPT_DIR / "src"))
from minirewrite.tokenizer.tokenizer import RewriteTokenizer
from minirewrite.model.transformer import Seq2SeqTransformer, ModelConfig
from minirewrite.inference.generate import rewrite
from minirewrite.training.trainer import load_model_for_inference
def load_model(run_dir: Path, checkpoint_name: str, device: torch.device):
print(f"Loading model and tokenizer from {run_dir} ({checkpoint_name}) to {device}...")
return load_model_for_inference(run_dir, device, checkpoint_name)
def run_interactive(model, tokenizer, device):
print("\n" + "=" * 60)
print("MiniRewrite Interactive Mode (type 'exit' or 'quit' to stop)")
print("=" * 60)
tasks = ["rewrite", "simplify", "shorten"]
tones = ["professional", "friendly", "neutral", "casual"]
styles = ["polite", "direct", "concise", "plain"]
current_task = "rewrite"
current_tone = "professional"
current_style = "polite"
print(f"Current defaults: task={current_task}, tone={current_tone}, style={current_style}")
print("Type '!settings' to change task/tone/style.\n")
while True:
try:
text = input("Input text > ").strip()
except (KeyboardInterrupt, EOFError):
break
if not text:
continue
if text.lower() in ("exit", "quit", "q"):
print("Goodbye!")
break
if text == "!settings":
print(f"Tasks: {', '.join(tasks)}")
t = input(f"Select task [{current_task}]: ").strip()
if t in tasks:
current_task = t
print(f"Tones: {', '.join(tones)}")
to = input(f"Select tone [{current_tone}]: ").strip()
if to in tones:
current_tone = to
print(f"Styles: {', '.join(styles)}")
st = input(f"Select style [{current_style}]: ").strip()
if st in styles:
current_style = st
print(f"Updated: task={current_task}, tone={current_tone}, style={current_style}\n")
continue
req = [{"source": text, "task": current_task, "tone": current_tone, "style": current_style}]
out = rewrite(model, tokenizer, req, max_source_length=128, max_new_tokens=128)[0]
print(f"Rewritten > {out}\n")
def main():
parser = argparse.ArgumentParser(description="Test MiniRewrite on any text.")
parser.add_argument("text", nargs="?", help="Text to rewrite")
parser.add_argument("--interactive", "-i", action="store_true", help="Launch interactive prompt")
parser.add_argument("--task", default="rewrite", choices=["rewrite", "simplify", "shorten"])
parser.add_argument("--tone", default="professional", choices=["professional", "friendly", "neutral", "casual"])
parser.add_argument("--style", default="polite", choices=["polite", "direct", "concise", "plain"])
parser.add_argument("--weights", type=Path, default=Path("runs/rtx4060/best.pt"))
parser.add_argument("--tokenizer", type=Path, default=Path("runs/rtx4060"))
parser.add_argument("--device", default="auto", choices=["auto", "cuda", "cpu"])
args = parser.parse_args()
# Determine device
if args.device == "auto":
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
else:
device = torch.device(args.device)
run_dir = Path("runs/rtx4060") if (Path("runs/rtx4060") / "tokenizer.json").exists() else Path(".")
checkpoint = "best.pt"
model, tokenizer = load_model(run_dir, checkpoint, device)
if args.interactive or not args.text:
run_interactive(model, tokenizer, device)
else:
req = [{"source": args.text, "task": args.task, "tone": args.tone, "style": args.style}]
out = rewrite(model, tokenizer, req, max_source_length=128, max_new_tokens=128)[0]
print(f"\nOriginal : {args.text}")
print(f"Settings : task={args.task}, tone={args.tone}, style={args.style}")
print(f"Rewritten: {out}\n")
if __name__ == "__main__":
main()