File size: 3,127 Bytes
09a421f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6655304
 
09a421f
 
 
 
 
 
 
 
 
 
 
 
6655304
 
09a421f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
"""Session-shape sweep on free CPU: what the shipped planner actually does at each candidate rate.

The D-018 decision is not only "12,977 tok/s or 9,696 tok/s" -- it is how many billed sessions the run
becomes and whether the remaining weekly quota covers them. Both are computed by the launcher's own `plan()`,
so this runs that function rather than re-deriving the arithmetic in prose: import the pinned launcher, walk
the schedule leg by leg at each rate, and print the legs, the session count, the stepping hours and the
hours the week still owes.

It mutates the module globals between walks, which is exactly what the environment variables do at launch,
so nothing here is a model of the planner -- it is the planner.
"""
import hashlib
import importlib.util
import json
import os
import subprocess
import sys

REV = "c237b478076f68da43dabd3403daa5639286899e"
SHA = "5fb14bc3597d999a21772a66b6f409f01f722019dc78da313feddb2f9c769c48"
os.chdir("/kaggle/working")
url = f"https://huggingface.co/Cion-lab/ounce100m-code/resolve/{REV}/kernels/phase4_session.py"
assert subprocess.run(["curl", "-sfL", url, "-o", "phase4_session.py"]).returncode == 0, "fetch launcher"
got = hashlib.sha256(open("phase4_session.py", "rb").read()).hexdigest()
assert got == SHA, ("LAUNCHER SHA MISMATCH", got[:16], SHA[:16])
print("pinned launcher", got[:12], flush=True)

spec = importlib.util.spec_from_file_location("phase4_session", "phase4_session.py")
S = importlib.util.module_from_spec(spec)
spec.loader.exec_module(S)

RATES = [(9358.0, "checkpointed, the Gate 3 P3 measurement"),
         (12300.0, "D-018's planning rate: sustained across probe 2's two legs"),
         (12977.0, "no checkpointing, the optimistic 20-step progress-bar rate")]
QUOTAS = [26.3, 24.5, 22.0]

for rate, why in RATES:
    S.PLANNING_TOK_PER_S = rate
    sec_per_step = S.TOKENS_PER_STEP / rate
    for quota in QUOTAS:
        S.QUOTA_LEFT_HOURS = quota
        legs, start, guard = [], 0, 0
        while start < S.HORIZON_STEPS and guard < 30:
            guard += 1
            pl = S.plan(start, 19.5)
            n = pl["planned_steps"]
            if not n:
                legs.append((start, "REFUSED", pl["usable_hours"]))
                break
            end = S.HORIZON_STEPS if pl["stop_after_steps"] == 0 else pl["stop_after_steps"]
            legs.append((start, end, end - start))
            start = end
        trained = sum(l[1] - l[0] for l in legs if isinstance(l[1], int))
        hours = trained * sec_per_step / 3600.0
        sessions = len(legs)
        print("RATE %6.0f (%s) QUOTA %5.1f h -> %d sessions, %d/%d steps, %.2f h stepping; %s" % (
            rate, why, quota, sessions, trained, S.HORIZON_STEPS, hours,
            "FITS" if trained == S.HORIZON_STEPS and hours <= quota else "DOES NOT FIT"), flush=True)
        print("   legs", json.dumps(legs), flush=True)
        if trained != S.HORIZON_STEPS:
            print("   shortfall %d steps = %.2f h at this rate" % (
                S.HORIZON_STEPS - trained, (S.HORIZON_STEPS - trained) * sec_per_step / 3600.0), flush=True)
print("PLAN_SWEEP_DONE", flush=True)