from __future__ import annotations import argparse from pathlib import Path def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--model_id", "--base_model", dest="model_id", required=True) parser.add_argument("--adapter_dir", "--lora_path", dest="adapter_dir", type=Path, required=True) parser.add_argument("--output_dir", type=Path, required=True) args = parser.parse_args() import torch from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(args.model_id, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( args.model_id, torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True, ) model = PeftModel.from_pretrained(model, str(args.adapter_dir)) merged = model.merge_and_unload() args.output_dir.mkdir(parents=True, exist_ok=True) merged.save_pretrained(str(args.output_dir), safe_serialization=True) tokenizer.save_pretrained(str(args.output_dir)) print(f"Saved merged model to {args.output_dir}") return 0 if __name__ == "__main__": raise SystemExit(main())