lovegpt / training /predict.py
Crownelius's picture
Add matchmaker 1B training pipeline
2646a31 verified
Raw
History Blame Contribute Delete
2.55 kB
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()