remat / research /ob1b /cost_decomp.py
i64systems's picture
remat: the evidence repository (mirror of github.com/i64systems/remat @ 8860526)
8604228 verified
Raw
History Blame Contribute Delete
5.57 kB
#!/usr/bin/env python3
"""OB-1b: decompose the added cost of leasing per byte and per lease
event, across every K this program has measured.
THE QUESTION THIS ANSWERS. The prereg section 3 says the knee is
predicted to sit below K=4 "UNLESS an unmeasured cost floor (fixed per-lease-
event overhead, not just bytes moved) dominates at very small K". That is a
real possibility and it is testable: if the cost were purely proportional to
bytes moved, then read seconds per byte and verify seconds per byte would be
FLAT across K. If instead there is a fixed charge per lease event, the per-BYTE
figures would climb as K falls, because smaller K means more events for a given
volume... except that in this design every lease event moves exactly the same
13253760 bytes, so per-event and per-byte cost carry the same information and a
per-event floor cannot be separated from a per-byte one by arithmetic alone.
What CAN be separated is whether the observed rate degrades at all as K falls.
Reads the engine's own ob1-stats.txt from OB-1's run directories and this leg's,
so every figure is literal file content, not a transcription from a document.
"""
import os
import sys
PER_EXPERT = 13253760
DIRS = ["/root/ob1/runs", "/root/ob1b/runs"]
def read_stats(path):
d = {}
with open(path) as f:
for line in f:
line = line.strip()
if "=" in line:
k, v = line.split("=", 1)
d[k] = v
return d
def main():
rows = []
for base in DIRS:
if not os.path.isdir(base):
continue
for n in sorted(os.listdir(base)):
sp = os.path.join(base, n, "ob1-stats.txt")
if not os.path.exists(sp) or n.startswith("smoke"):
continue
st = read_stats(sp)
if st.get("ob1_mode") != "lease":
continue
ev = int(st.get("lease_events", 0))
by = int(st.get("lease_bytes_read", 0))
if not ev or not by:
continue
rows.append(dict(
src=os.path.basename(base), name=n, k=int(st.get("ob1_k", -1)),
events=ev, bytes=by,
fadv=int(st.get("ob1_fadvise", 0)),
read_s=int(st.get("lease_read_ns", 0)) / 1e9,
ver_s=int(st.get("lease_verify_ns", 0)) / 1e9,
drop_s=int(st.get("lease_drop_ns", 0)) / 1e9,
))
if not rows:
print("(no leased runs with stats found yet)")
return
print("== BYTES PER LEASE EVENT (must be exactly one expert's share, %d) ==" % PER_EXPERT)
bad = 0
for r in rows:
q = r["bytes"] / float(r["events"])
if abs(q - PER_EXPERT) > 0.5:
bad += 1
print(" %-22s %.1f DIFFERS" % (r["name"], q))
print(" %d of %d runs move exactly %d bytes per lease event" % (
len(rows) - bad, len(rows), PER_EXPERT))
print()
print("== READ AND VERIFY RATE VERSUS K ==")
print(" A fixed per-event overhead that dominates at small K would show up as")
print(" these GB/s columns FALLING sharply as K falls. Flat columns mean cost")
print(" tracks bytes moved, which is the case builder 1's prediction assumed.")
print()
print(" %-6s %-22s %3s %10s %16s %10s %10s %10s %10s %5s" % (
"leg", "run", "K", "events", "bytes", "read_GB/s", "ver_GB/s",
"read_ms/ev", "ver_ms/ev", "fadv"))
for r in sorted(rows, key=lambda x: (-x["k"], x["name"])):
rg = (r["bytes"] / r["read_s"] / 1e9) if r["read_s"] else 0.0
vg = (r["bytes"] / r["ver_s"] / 1e9) if r["ver_s"] else 0.0
print(" %-6s %-22s %3d %10d %16d %10.4f %10.4f %10.4f %10.4f %5d" % (
r["src"], r["name"], r["k"], r["events"], r["bytes"], rg, vg,
r["read_s"] * 1e3 / r["events"], r["ver_s"] * 1e3 / r["events"], r["fadv"]))
print()
print("== RATE AT THE EXTREMES (the floor question, stated as a ratio) ==")
# The page-cache-dropping run (fadv=1) is excluded from these aggregates: it
# deliberately reads from cold storage, so its 1.04 GB/s read rate measures
# the NVMe path, not a per-event overhead, and averaging it into the K=16
# figure would manufacture a false decline.
warm = [r for r in rows if not r["fadv"]]
print(" (page-cache-dropping runs excluded: %d of %d rows)" % (
len(rows) - len(warm), len(rows)))
rows_agg = warm
ks = sorted({r["k"] for r in rows_agg})
if len(ks) >= 2:
hi = [r for r in rows_agg if r["k"] == max(ks)]
lo = [r for r in rows_agg if r["k"] == min(ks)]
def mean(rs, f):
return sum(f(r) for r in rs) / float(len(rs))
rh = mean(hi, lambda r: r["bytes"] / r["read_s"] / 1e9)
rl = mean(lo, lambda r: r["bytes"] / r["read_s"] / 1e9)
vh = mean(hi, lambda r: r["bytes"] / r["ver_s"] / 1e9)
vl = mean(lo, lambda r: r["bytes"] / r["ver_s"] / 1e9)
print(" highest K measured = %d : read %.4f GB/s, verify %.4f GB/s" % (max(ks), rh, vh))
print(" lowest K measured = %d : read %.4f GB/s, verify %.4f GB/s" % (min(ks), rl, vl))
print(" read rate at lowest K is %.4f x the rate at highest K" % (rl / rh if rh else 0))
print(" verify rate at lowest K is %.4f x the rate at highest K" % (vl / vh if vh else 0))
print(" NOTE: runs from different legs used different thread counts and ran")
print(" under different sibling load, so treat cross-leg rows as indicative.")
if __name__ == "__main__":
sys.exit(main())