CompressedGemma commited on
Commit
2ba27ca
·
verified ·
1 Parent(s): 3d69b7f

Upload 15 files

Browse files
Files changed (2) hide show
  1. gguf.py +47 -12
  2. gui.py +28 -3
gguf.py CHANGED
@@ -15,6 +15,7 @@ packed by an external GGUF writer.
15
  from __future__ import annotations
16
 
17
  import struct
 
18
  from dataclasses import dataclass
19
  from pathlib import Path
20
 
@@ -422,11 +423,13 @@ def write_quantized_gguf(
422
 
423
  out_infos = []
424
  data_offset = 0
 
425
  for ti, want in zip(reader.tensors, plan):
426
  if want:
427
  n_blocks = ti.n_elements // QK_K
428
  out_type = GGML_TYPE_Q2_K
429
  out_size = n_blocks * 84
 
430
  else:
431
  out_type = ti.type
432
  out_size = ti.n_bytes
@@ -446,6 +449,8 @@ def write_quantized_gguf(
446
  total_rmse = 0.0
447
  total_quantized = 0
448
  total_elements = 0
 
 
449
  with output_path.open("wb") as fout:
450
  fout.write(struct.pack("<IIQQ", GGUF_MAGIC, reader.version, len(out_infos), len(kv_pairs)))
451
  for key, vtype, raw in kv_pairs:
@@ -470,19 +475,52 @@ def write_quantized_gguf(
470
  if target > fout.tell():
471
  fout.write(b"\x00" * (target - fout.tell()))
472
  if plan[idx]:
 
473
  has_imat = imat is not None and lookup_imatrix(imat, ti.name) is not None
474
- if stage_callback is not None:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
475
  stage_callback(
476
- idx + 1,
477
  len(out_infos),
478
- ti,
479
  {
480
- "phase": f"Reading & Dequantizing Source ({ti.type_name})",
481
- "done": 0,
482
- "total": ti.n_elements // QK_K,
483
- "detail": f"dims={ti.dims} elements={ti.n_elements:,} ({ti.n_bytes / 1048576:.2f} MB) imatrix={'yes' if has_imat else 'no'}",
 
484
  },
485
  )
 
 
 
 
 
 
 
 
 
486
  x, row = reader.read_tensor(ti.name)
487
  imp = None
488
  if imat is not None:
@@ -493,13 +531,10 @@ def write_quantized_gguf(
493
  x,
494
  importance=imp,
495
  row_width=row,
496
- status_callback=(
497
- (lambda ev, _i=idx + 1, _ti=ti: stage_callback(_i, len(out_infos), _ti, ev))
498
- if stage_callback is not None
499
- else None
500
- ),
501
  stop_event=stop_event,
502
  )
 
503
  payload = blocks_to_bytes(res.scales, res.qs, res.dm)
504
  if len(payload) != out_size:
505
  raise RuntimeError(f"{ti.name}: Q2_K payload size mismatch")
 
15
  from __future__ import annotations
16
 
17
  import struct
18
+ import time
19
  from dataclasses import dataclass
20
  from pathlib import Path
21
 
 
423
 
424
  out_infos = []
425
  data_offset = 0
426
+ total_planned_blocks = 0
427
  for ti, want in zip(reader.tensors, plan):
428
  if want:
429
  n_blocks = ti.n_elements // QK_K
430
  out_type = GGML_TYPE_Q2_K
431
  out_size = n_blocks * 84
432
+ total_planned_blocks += n_blocks
433
  else:
434
  out_type = ti.type
435
  out_size = ti.n_bytes
 
449
  total_rmse = 0.0
450
  total_quantized = 0
451
  total_elements = 0
452
+ completed_planned_blocks = 0
453
+ model_t0 = time.time()
454
  with output_path.open("wb") as fout:
455
  fout.write(struct.pack("<IIQQ", GGUF_MAGIC, reader.version, len(out_infos), len(kv_pairs)))
456
  for key, vtype, raw in kv_pairs:
 
475
  if target > fout.tell():
476
  fout.write(b"\x00" * (target - fout.tell()))
477
  if plan[idx]:
478
+ t_blocks = ti.n_elements // QK_K
479
  has_imat = imat is not None and lookup_imatrix(imat, ti.name) is not None
480
+
481
+ def _emit_stage(ev: dict, _i=idx + 1, _ti=ti, _base=completed_planned_blocks, _tb=t_blocks):
482
+ if stage_callback is None:
483
+ return
484
+ phase_name = ev.get("phase", "")
485
+ done_b = int(ev.get("done", 0))
486
+ tot_b = max(int(ev.get("total", _tb)), 1)
487
+ if phase_name.startswith("Phase 2b"):
488
+ frac = 0.80 * (done_b / tot_b)
489
+ elif phase_name.startswith("Phase 3"):
490
+ frac = 0.82
491
+ elif phase_name.startswith("Phase 4:"):
492
+ frac = 0.82 + 0.17 * (done_b / tot_b)
493
+ elif phase_name.startswith("Phase 4.8") or phase_name.startswith("Phase 5"):
494
+ frac = 1.0
495
+ else:
496
+ frac = 0.0
497
+ eff_blocks = _base + frac * _tb
498
+ elapsed_model = max(time.time() - model_t0, 1.0e-6)
499
+ model_rate = eff_blocks / elapsed_model
500
+ rem_blocks = max(total_planned_blocks - eff_blocks, 0.0)
501
+ model_eta = rem_blocks / model_rate if model_rate > 1.0e-6 else 0.0
502
+ model_pct = 100.0 * eff_blocks / max(total_planned_blocks, 1)
503
  stage_callback(
504
+ _i,
505
  len(out_infos),
506
+ _ti,
507
  {
508
+ **ev,
509
+ "model_pct": model_pct,
510
+ "model_eta": model_eta,
511
+ "model_done_blocks": int(eff_blocks),
512
+ "model_total_blocks": total_planned_blocks,
513
  },
514
  )
515
+
516
+ _emit_stage(
517
+ {
518
+ "phase": f"Reading & Dequantizing Source ({ti.type_name})",
519
+ "done": 0,
520
+ "total": t_blocks,
521
+ "detail": f"dims={ti.dims} elements={ti.n_elements:,} ({ti.n_bytes / 1048576:.2f} MB) imatrix={'yes' if has_imat else 'no'}",
522
+ }
523
+ )
524
  x, row = reader.read_tensor(ti.name)
525
  imp = None
526
  if imat is not None:
 
531
  x,
532
  importance=imp,
533
  row_width=row,
534
+ status_callback=_emit_stage if stage_callback is not None else None,
 
 
 
 
535
  stop_event=stop_event,
536
  )
537
+ completed_planned_blocks += t_blocks
538
  payload = blocks_to_bytes(res.scales, res.qs, res.dm)
539
  if len(payload) != out_size:
540
  raise RuntimeError(f"{ti.name}: Q2_K payload size mismatch")
gui.py CHANGED
@@ -47,6 +47,19 @@ def _ts() -> str:
47
  return dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
48
 
49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  class HPCQuantizeGUI:
51
  def __init__(self, root: tk.Tk) -> None:
52
  self.root = root
@@ -803,16 +816,28 @@ class HPCQuantizeGUI:
803
  tot_blk = max(int(ev.get("total", 1)), 1)
804
  detail = ev.get("detail", "")
805
  blk_pct = 100.0 * done / tot_blk
806
- overall_pct = 100.0 * ((idx - 1) + (done / tot_blk)) / max(total, 1)
 
 
807
 
808
  self.model_progress_var.set(overall_pct)
809
  self.tensor_progress_var.set(blk_pct)
810
  self.tele_tensor_var.set(f"[{idx}/{total}] {ti.name} ({ti.type_name}, dims={ti.dims})")
811
  self.tele_phase_var.set(phase)
812
- self.tele_blocks_var.set(f"{done:,} / {tot_blk:,} ({blk_pct:.1f}%)")
 
 
 
 
 
 
813
 
814
  if "rate" in ev and "eta" in ev:
815
- self.tele_speed_var.set(f"{ev['rate']:.1f} blk/s (ETA {ev['eta']:.1f}s)")
 
 
 
 
816
  if "rmse" in ev and "sigma" in ev:
817
  r, s = float(ev["rmse"]), float(ev["sigma"])
818
  self.tele_rmse_var.set(f"{r:.6e} (r/σ={r/max(s, 1e-15):.4f})")
 
47
  return dt.datetime.now().strftime("%H:%M:%S.%f")[:-3]
48
 
49
 
50
+ def _fmt_eta(seconds: float) -> str:
51
+ if not np.isfinite(seconds) or seconds <= 0.0:
52
+ return "0s"
53
+ s = int(round(seconds))
54
+ if s < 60:
55
+ return f"{seconds:.1f}s"
56
+ m, sec = divmod(s, 60)
57
+ if m < 60:
58
+ return f"{m}m{sec:02d}s"
59
+ h, m = divmod(m, 60)
60
+ return f"{h}h{m:02d}m{sec:02d}s"
61
+
62
+
63
  class HPCQuantizeGUI:
64
  def __init__(self, root: tk.Tk) -> None:
65
  self.root = root
 
816
  tot_blk = max(int(ev.get("total", 1)), 1)
817
  detail = ev.get("detail", "")
818
  blk_pct = 100.0 * done / tot_blk
819
+ overall_pct = float(
820
+ ev.get("model_pct", 100.0 * ((idx - 1) + (done / tot_blk)) / max(total, 1))
821
+ )
822
 
823
  self.model_progress_var.set(overall_pct)
824
  self.tensor_progress_var.set(blk_pct)
825
  self.tele_tensor_var.set(f"[{idx}/{total}] {ti.name} ({ti.type_name}, dims={ti.dims})")
826
  self.tele_phase_var.set(phase)
827
+ if "model_total_blocks" in ev and ev["model_total_blocks"] > 0:
828
+ self.tele_blocks_var.set(
829
+ f"Tensor: {done:,}/{tot_blk:,} ({blk_pct:.1f}%) | "
830
+ f"Model: {ev['model_done_blocks']:,}/{ev['model_total_blocks']:,} ({overall_pct:.1f}%)"
831
+ )
832
+ else:
833
+ self.tele_blocks_var.set(f"{done:,} / {tot_blk:,} ({blk_pct:.1f}%)")
834
 
835
  if "rate" in ev and "eta" in ev:
836
+ t_eta = _fmt_eta(float(ev["eta"]))
837
+ m_eta = _fmt_eta(float(ev.get("model_eta", ev["eta"])))
838
+ self.tele_speed_var.set(
839
+ f"{ev['rate']:.1f} blk/s | Tensor ETA: {t_eta} | Model ETA: {m_eta}"
840
+ )
841
  if "rmse" in ev and "sigma" in ev:
842
  r, s = float(ev["rmse"]), float(ev["sigma"])
843
  self.tele_rmse_var.set(f"{r:.6e} (r/σ={r/max(s, 1e-15):.4f})")