khalidFlex commited on
Commit
32ab603
·
verified ·
1 Parent(s): 8387666

Upload merge_adapter.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. merge_adapter.py +56 -0
merge_adapter.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # /// script
2
+ # dependencies = [
3
+ # "transformers>=5.14.0",
4
+ # "peft>=0.19.0",
5
+ # "torch>=2.5",
6
+ # "torchvision>=0.20",
7
+ # "accelerate>=1.0",
8
+ # "num2words",
9
+ # ]
10
+ # ///
11
+ """Merge a trained LoRA adapter into base Gemma 4 and push the merged model.
12
+
13
+ The MLX runtime (gemma4/server.py) can't load PEFT adapters directly, so after
14
+ training we bake the adapter into the base weights and push a standalone model.
15
+ The Mac then converts that to a quantized MLX build:
16
+
17
+ # on HF Jobs (this script):
18
+ merged = base ⊕ adapter → push to --merged-repo
19
+
20
+ # locally on the Mac afterwards:
21
+ venus/.venv/bin/python -m mlx_vlm convert \
22
+ --hf-path khalidFlex/gemma4-gui-agent-merged \
23
+ --mlx-path ~/.cache/gemma4-gui-agent-mlx-8bit -q --q-bits 8
24
+ """
25
+
26
+ import argparse
27
+
28
+ import torch
29
+ from peft import PeftModel
30
+ from transformers import AutoModelForImageTextToText, AutoProcessor
31
+
32
+
33
+ def main():
34
+ ap = argparse.ArgumentParser()
35
+ ap.add_argument("--base", default="google/gemma-4-E4B-it")
36
+ ap.add_argument("--adapter", required=True, help="PEFT adapter repo")
37
+ ap.add_argument("--merged-repo", required=True, help="where to push the merged model")
38
+ ap.add_argument("--public", action="store_true")
39
+ args = ap.parse_args()
40
+
41
+ print(f"[merge] loading base {args.base} (bf16, CPU is fine)")
42
+ model = AutoModelForImageTextToText.from_pretrained(args.base, dtype=torch.bfloat16)
43
+ processor = AutoProcessor.from_pretrained(args.base)
44
+
45
+ print(f"[merge] applying adapter {args.adapter}")
46
+ model = PeftModel.from_pretrained(model, args.adapter)
47
+ model = model.merge_and_unload()
48
+
49
+ print(f"[merge] pushing merged model to {args.merged_repo}")
50
+ model.push_to_hub(args.merged_repo, private=not args.public, max_shard_size="4GB")
51
+ processor.push_to_hub(args.merged_repo, private=not args.public)
52
+ print("[merge] done.")
53
+
54
+
55
+ if __name__ == "__main__":
56
+ main()