Upload 15 files
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 475 |
stage_callback(
|
| 476 |
-
|
| 477 |
len(out_infos),
|
| 478 |
-
|
| 479 |
{
|
| 480 |
-
|
| 481 |
-
"
|
| 482 |
-
"
|
| 483 |
-
"
|
|
|
|
| 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 =
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 813 |
|
| 814 |
if "rate" in ev and "eta" in ev:
|
| 815 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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})")
|