from __future__ import annotations import argparse import json from pathlib import Path def load_jsonl(path: Path) -> list[dict]: return [json.loads(line) for line in path.read_text(encoding="utf-8").splitlines() if line.strip()] def main() -> None: parser = argparse.ArgumentParser(description="Generate matchmaker predictions from a trained adapter.") parser.add_argument("--model", required=True, help="Base model id or merged model path.") parser.add_argument("--adapter", default="", help="Optional PEFT adapter path.") parser.add_argument("--input", type=Path, required=True) parser.add_argument("--output", type=Path, required=True) parser.add_argument("--max-new-tokens", type=int, default=512) args = parser.parse_args() import torch from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(args.adapter or args.model, trust_remote_code=True) if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained( args.model, device_map="auto", torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32, trust_remote_code=True, ) if args.adapter: model = PeftModel.from_pretrained(model, args.adapter) model.eval() rows = load_jsonl(args.input) args.output.parent.mkdir(parents=True, exist_ok=True) with args.output.open("w", encoding="utf-8") as handle: for row in rows: messages = row["messages"][:2] prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) if getattr(tokenizer, "chat_template", None) else "\n\n".join(f"{m['role'].upper()}: {m['content']}" for m in messages) inputs = tokenizer(prompt, return_tensors="pt").to(model.device) with torch.no_grad(): output = model.generate( **inputs, max_new_tokens=args.max_new_tokens, temperature=0.0, do_sample=False, pad_token_id=tokenizer.eos_token_id, ) text = tokenizer.decode(output[0][inputs["input_ids"].shape[1] :], skip_special_tokens=True) handle.write(json.dumps({"pairHash": row["pairHash"], "target": row["target"], "predictionText": text}, ensure_ascii=False, sort_keys=True)) handle.write("\n") if __name__ == "__main__": main()