Upload 2 files
Browse files- slimshard_gui.py +73 -7
slimshard_gui.py
CHANGED
|
@@ -107,6 +107,8 @@ class SlimShardGUI:
|
|
| 107 |
self.device_var = tk.StringVar(value="auto")
|
| 108 |
self.quant_format_var = tk.StringVar(value="mixed")
|
| 109 |
self.expert_keep_var = tk.DoubleVar(value=1.0)
|
|
|
|
|
|
|
| 110 |
|
| 111 |
self.filter_action_var = tk.StringVar(value="ALL")
|
| 112 |
self.search_var = tk.StringVar()
|
|
@@ -144,6 +146,8 @@ class SlimShardGUI:
|
|
| 144 |
self.device_var,
|
| 145 |
self.quant_format_var,
|
| 146 |
self.expert_keep_var,
|
|
|
|
|
|
|
| 147 |
):
|
| 148 |
v.trace_add("write", lambda *_: self._update_cli_preview())
|
| 149 |
|
|
@@ -339,7 +343,31 @@ class SlimShardGUI:
|
|
| 339 |
state="readonly",
|
| 340 |
).pack(side=tk.LEFT, padx=(0, 16))
|
| 341 |
|
| 342 |
-
ttk.Label(row_opt, text="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 343 |
side=tk.LEFT, padx=(0, 6)
|
| 344 |
)
|
| 345 |
ttk.Spinbox(
|
|
@@ -349,13 +377,13 @@ class SlimShardGUI:
|
|
| 349 |
increment=0.05,
|
| 350 |
textvariable=self.expert_keep_var,
|
| 351 |
width=6,
|
| 352 |
-
).pack(side=tk.LEFT, padx=(0,
|
| 353 |
|
| 354 |
ttk.Checkbutton(
|
| 355 |
row_opt,
|
| 356 |
-
text="Export
|
| 357 |
variable=self.auto_bundle_var,
|
| 358 |
-
).pack(side=tk.LEFT, padx=(0,
|
| 359 |
|
| 360 |
btn_bar = ttk.Frame(opt_frame)
|
| 361 |
btn_bar.pack(fill=tk.X, pady=(8, 0))
|
|
@@ -665,6 +693,18 @@ class SlimShardGUI:
|
|
| 665 |
cmd += ["--output", self.output_var.get()]
|
| 666 |
if self.auto_bundle_var.get() and self.export_dir_var.get():
|
| 667 |
cmd += ["--export-hf-dir", self.export_dir_var.get()]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 668 |
cmd += ["--device", self.device_var.get()]
|
| 669 |
elif mode == "build":
|
| 670 |
if self.model_dir_var.get():
|
|
@@ -695,21 +735,37 @@ class SlimShardGUI:
|
|
| 695 |
if not shard or not Path(shard).exists():
|
| 696 |
messagebox.showwarning("SlimShard", "Please select a valid .safetensors shard first.")
|
| 697 |
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 698 |
try:
|
| 699 |
plan = inspect_recovery_plan(
|
| 700 |
shard,
|
| 701 |
index=self.index_var.get().strip() or None,
|
| 702 |
config=self.config_var.get().strip() or None,
|
|
|
|
|
|
|
| 703 |
)
|
| 704 |
except Exception as exc:
|
| 705 |
messagebox.showerror("Inspect Failed", str(exc))
|
| 706 |
return
|
| 707 |
|
| 708 |
archs = ",".join(plan["architectures"]) or plan["model_type"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 709 |
self.arch_summary_var.set(
|
| 710 |
-
f"{archs} (
|
| 711 |
-
f"
|
| 712 |
-
f"vocab={plan['vocab_size']},
|
| 713 |
)
|
| 714 |
surv = plan["surviving_layers"]
|
| 715 |
miss = plan["missing_layers"]
|
|
@@ -787,6 +843,14 @@ class SlimShardGUI:
|
|
| 787 |
if self.auto_bundle_var.get() and self.export_dir_var.get().strip()
|
| 788 |
else None
|
| 789 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 790 |
res = recover_from_shard(
|
| 791 |
shard,
|
| 792 |
idx,
|
|
@@ -797,6 +861,8 @@ class SlimShardGUI:
|
|
| 797 |
progress_cb=progress_cb,
|
| 798 |
stop_event=self._stop_event,
|
| 799 |
export_hf_dir=exp_dir,
|
|
|
|
|
|
|
| 800 |
)
|
| 801 |
if exp_dir:
|
| 802 |
self._queue.put(("set_test_dir", exp_dir))
|
|
|
|
| 107 |
self.device_var = tk.StringVar(value="auto")
|
| 108 |
self.quant_format_var = tk.StringVar(value="mixed")
|
| 109 |
self.expert_keep_var = tk.DoubleVar(value=1.0)
|
| 110 |
+
self.target_params_b_var = tk.DoubleVar(value=30.0)
|
| 111 |
+
self.max_experts_var = tk.IntVar(value=0)
|
| 112 |
|
| 113 |
self.filter_action_var = tk.StringVar(value="ALL")
|
| 114 |
self.search_var = tk.StringVar()
|
|
|
|
| 146 |
self.device_var,
|
| 147 |
self.quant_format_var,
|
| 148 |
self.expert_keep_var,
|
| 149 |
+
self.target_params_b_var,
|
| 150 |
+
self.max_experts_var,
|
| 151 |
):
|
| 152 |
v.trace_add("write", lambda *_: self._update_cli_preview())
|
| 153 |
|
|
|
|
| 343 |
state="readonly",
|
| 344 |
).pack(side=tk.LEFT, padx=(0, 16))
|
| 345 |
|
| 346 |
+
ttk.Label(row_opt, text="Target Params (B, 0=full):").pack(
|
| 347 |
+
side=tk.LEFT, padx=(0, 6)
|
| 348 |
+
)
|
| 349 |
+
ttk.Spinbox(
|
| 350 |
+
row_opt,
|
| 351 |
+
from_=0.0,
|
| 352 |
+
to=600.0,
|
| 353 |
+
increment=1.0,
|
| 354 |
+
textvariable=self.target_params_b_var,
|
| 355 |
+
width=6,
|
| 356 |
+
).pack(side=tk.LEFT, padx=(0, 14))
|
| 357 |
+
|
| 358 |
+
ttk.Label(row_opt, text="Max Experts/Layer (0=auto):").pack(
|
| 359 |
+
side=tk.LEFT, padx=(0, 6)
|
| 360 |
+
)
|
| 361 |
+
ttk.Spinbox(
|
| 362 |
+
row_opt,
|
| 363 |
+
from_=0,
|
| 364 |
+
to=512,
|
| 365 |
+
increment=1,
|
| 366 |
+
textvariable=self.max_experts_var,
|
| 367 |
+
width=5,
|
| 368 |
+
).pack(side=tk.LEFT, padx=(0, 14))
|
| 369 |
+
|
| 370 |
+
ttk.Label(row_opt, text="SlimMoE Keep Ratio:").pack(
|
| 371 |
side=tk.LEFT, padx=(0, 6)
|
| 372 |
)
|
| 373 |
ttk.Spinbox(
|
|
|
|
| 377 |
increment=0.05,
|
| 378 |
textvariable=self.expert_keep_var,
|
| 379 |
width=6,
|
| 380 |
+
).pack(side=tk.LEFT, padx=(0, 14))
|
| 381 |
|
| 382 |
ttk.Checkbutton(
|
| 383 |
row_opt,
|
| 384 |
+
text="Export HF Bundle Dir",
|
| 385 |
variable=self.auto_bundle_var,
|
| 386 |
+
).pack(side=tk.LEFT, padx=(0, 8))
|
| 387 |
|
| 388 |
btn_bar = ttk.Frame(opt_frame)
|
| 389 |
btn_bar.pack(fill=tk.X, pady=(8, 0))
|
|
|
|
| 693 |
cmd += ["--output", self.output_var.get()]
|
| 694 |
if self.auto_bundle_var.get() and self.export_dir_var.get():
|
| 695 |
cmd += ["--export-hf-dir", self.export_dir_var.get()]
|
| 696 |
+
try:
|
| 697 |
+
tp = float(self.target_params_b_var.get())
|
| 698 |
+
if tp > 0.0:
|
| 699 |
+
cmd += ["--target-params-b", f"{tp:g}"]
|
| 700 |
+
except Exception:
|
| 701 |
+
pass
|
| 702 |
+
try:
|
| 703 |
+
me = int(self.max_experts_var.get())
|
| 704 |
+
if me > 0:
|
| 705 |
+
cmd += ["--max-experts", str(me)]
|
| 706 |
+
except Exception:
|
| 707 |
+
pass
|
| 708 |
cmd += ["--device", self.device_var.get()]
|
| 709 |
elif mode == "build":
|
| 710 |
if self.model_dir_var.get():
|
|
|
|
| 735 |
if not shard or not Path(shard).exists():
|
| 736 |
messagebox.showwarning("SlimShard", "Please select a valid .safetensors shard first.")
|
| 737 |
return
|
| 738 |
+
try:
|
| 739 |
+
tp = float(self.target_params_b_var.get())
|
| 740 |
+
except Exception:
|
| 741 |
+
tp = 0.0
|
| 742 |
+
try:
|
| 743 |
+
me = int(self.max_experts_var.get())
|
| 744 |
+
except Exception:
|
| 745 |
+
me = 0
|
| 746 |
try:
|
| 747 |
plan = inspect_recovery_plan(
|
| 748 |
shard,
|
| 749 |
index=self.index_var.get().strip() or None,
|
| 750 |
config=self.config_var.get().strip() or None,
|
| 751 |
+
target_params_b=tp if tp > 0.0 else None,
|
| 752 |
+
max_experts=me if me > 0 else None,
|
| 753 |
)
|
| 754 |
except Exception as exc:
|
| 755 |
messagebox.showerror("Inspect Failed", str(exc))
|
| 756 |
return
|
| 757 |
|
| 758 |
archs = ",".join(plan["architectures"]) or plan["model_type"]
|
| 759 |
+
orig_e = plan.get("orig_num_experts", plan["num_experts"])
|
| 760 |
+
exp_str = (
|
| 761 |
+
f"{plan['num_experts']}/{orig_e}"
|
| 762 |
+
if plan["num_experts"] != orig_e
|
| 763 |
+
else str(plan["num_experts"])
|
| 764 |
+
)
|
| 765 |
self.arch_summary_var.set(
|
| 766 |
+
f"{archs} (~{plan.get('estimated_params_b', 0)}B params | type={plan['model_type']}, "
|
| 767 |
+
f"hidden={plan['hidden_size']}, layers={plan['num_hidden_layers']}, "
|
| 768 |
+
f"experts={exp_str}, vocab={plan['vocab_size']}, tensors={plan['total_tensors']})"
|
| 769 |
)
|
| 770 |
surv = plan["surviving_layers"]
|
| 771 |
miss = plan["missing_layers"]
|
|
|
|
| 843 |
if self.auto_bundle_var.get() and self.export_dir_var.get().strip()
|
| 844 |
else None
|
| 845 |
)
|
| 846 |
+
try:
|
| 847 |
+
tp = float(self.target_params_b_var.get())
|
| 848 |
+
except Exception:
|
| 849 |
+
tp = 0.0
|
| 850 |
+
try:
|
| 851 |
+
me = int(self.max_experts_var.get())
|
| 852 |
+
except Exception:
|
| 853 |
+
me = 0
|
| 854 |
res = recover_from_shard(
|
| 855 |
shard,
|
| 856 |
idx,
|
|
|
|
| 861 |
progress_cb=progress_cb,
|
| 862 |
stop_event=self._stop_event,
|
| 863 |
export_hf_dir=exp_dir,
|
| 864 |
+
target_params_b=tp if tp > 0.0 else None,
|
| 865 |
+
max_experts=me if me > 0 else None,
|
| 866 |
)
|
| 867 |
if exp_dir:
|
| 868 |
self._queue.put(("set_test_dir", exp_dir))
|