| 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()) |
|
|