/teal-sea
teal-sea / zeta-labstate of record · compiled 02 Nov 2026 · revision b09fa4dd · source

Library · hunts/weil_propagation/c4_s2/modal/RUNS.md

RUNS: modal/, the compute log

4,603 words · 469 lines · source

Every run of run_modal.py on Modal, with the estimate written before the spend it covers (AGENTS.md compute discipline, rule 3). Hard cap: 25 USD. Outputs and cost only; nothing here is graded.

1. The tree and the image

2. Rates and resources

Read on 2026-09-24 from modal.com/pricing (not from memory):

Per container: cpu=(4.0, 4.0) (request, hard limit), memory=(16384, 32768) MiB (request, hard limit). Billing takes the larger of reservation and use, and the limits cap use, so the bound rate is 4 x 0.0000131 + 32 x 0.00000222 = 0.00012344 USD/s (0.444 USD/h) per container.

Each unit runs in a single-use container, in a child process with the unit's own timeout; the container's Modal timeout is that plus 600 s. A restarted input (preemption) finds its start marker on the Volume and computes nothing, so no unit can bill more than one container timeout.

3. Before any unit: smoke and calibration bound

callcontainer timeout (s)bound (USD)
smoke (guard, versions, import chains)9000.111
checker_200_2400_32 (unit limit 1800 s)24000.296
gram_80_4800 (unit limit 1200 s)18000.222
total0.63

Laptop times: 246.8 s (checker/ snapshot, unit 200|2400|32) and 107.0 s (two_adic/ ta_gram_probe.json, run 80,4800).

3.1 Calibration result (app ap-0JPiceMca78mFevFf9x2Mv, 2026-09-24 09:22 to 09:30 -0500)

Both units ran with the guard passing before and after (HEAD 284eff6, whole-tree porcelain empty, digest 1dcab230...fb9a). Computed cost of both: 0.055 USD.

unitchild wall (s)CPU (s)peak (MiB)laptop (s)Modal / laptopmax abs differencethreshold
gram_80_4800180.6426.3847107.01.698.2e-15 (dT; every scalar field at most 7.6e-15; Kmax equal)1e-10: met
checker_200_2400_32432.3976.41580246.81.752.28e-7 / 1.98e-7 / 1.93e-7 (c = 2.2 / 2.5 / 2.9)1e-10: not met

The checker unit's differences, spectral norm: 2.3e-7, 2.6e-7, 2.9e-7, on entries up to 3.7 (relative 6e-8). Its diagnostics agree: gram_z_offI equal to 1e-16, cond_Gb 3875494354.4 here against 3875494350.7 locally (relative 1e-9). The gram unit's Gram matrix is well conditioned; this unit's Gb has condition number 3.9e9, and ta_mellin.rho inverts it (np.linalg.inv). A last-digit difference between the two platforms' arithmetic (macOS arm64 Accelerate, Python 3.13, against Linux x86_64 OpenBLAS, Python 3.12) amplified by 3.9e9 is of order 1e-16 x 3.9e9 = 4e-7, the size observed. That is the likely cause; it is not demonstrated.

Per the brief, the run stopped here and the question went to the coordinator before the batch.

4. The batch estimate

Written after the calibration and the coordinator's answer, before any batch unit launches.

4.1 The coordinator's ruling on the calibration miss (2026-09-24)

Option B of the question in s3.1: (1) run one sensitivity probe on Modal, the checker calibration unit again with OPENBLAS_CORETYPE=Sandybridge (OpenBLAS's AVX kernels without FMA, so only last-digit arithmetic changes), compared Modal against Modal; (2) launch the two_adic family now, since its calibration passed at 8.2e-15; (3) launch the four checker units with the calibration threshold set to 1e-6 max abs only if the probe moves the checker unit by about 1e-7; if it moves it by less than 1e-10, hold the checker family and ask again. The threshold in the brief is 1e-10; the measured miss is 2.28e-7 / 1.98e-7 / 1.93e-7 (c = 2.2 / 2.5 / 2.9); Gb's condition number is 3.9e9. A 1e-6 threshold, if adopted, is set after the measurement and is justified by the probe, not by checker/'s band. Until the probe says otherwise, "likely cause" stays the wording. Each checker output carries the calibration's spectral differences as a Weyl bound (meta.calibration.weyl_bound = 2.93e-7), so checker/ can flag any R_S eigenvalue within that distance of its threshold when it re-grades.

4.2 Per-unit estimates, timeouts and the worst case

Modal / laptop speed ratio from s3.1: 1.75 (checker unit) and 1.69 (gram unit); Modal is slower per unit (4 cores, AVX2, no AVX-512, against the laptop's M4). Estimates scale the Modal calibration time by the larger of two work ratios, taken from the grids the code builds (ta_mellin.s_grid, ta_mellin.w_nodes with ta_prolate.kmax_for(nvec)): complex exponentials (s-nodes x w-nodes) and the mode matmul (s-nodes x w-nodes x nvec). The prolate-mode setup in mpmath is not in the model, and checker/ s7.6 records that a scaling model already failed once (the 240-mode unit passed 9.2 CPU-min on the loaded laptop against an estimate of 320 s). The timeouts, not the estimates, hold the cap: each is 3 to 4.6 times its estimate.

Default rule (derived from two_adic/ta_ts.py lines 146 and 147, KernelProvider.delta_T): nvec = max(80, int(8 N / L) + 40), S = max(1200.0, 12.0 * 2 * math.pi * N / L), L = log c; at N = 32 it gives (280, 2266.10) at c = 2.9, (319, 2633.16) at 2.5, (364, 3060.08) at 2.2. S is passed as that float; the unit key uses int(S), as unit_key does. Each unit builds all three cells at its (nvec, S).

unitKmaxestimate (s)unit timeout (s)container timeout (s)bound (USD)
checker_200_2400_32_sandybridge (probe)13605180024000.296
gram_140_480012523240030000.370
gram_160_480012597240030000.370
gram_180_480013969360042000.518
gram_200_4800131077360042000.518
gram_160_9600121921720078000.963
checker_240_2400_3214896360042000.518
checker_280_2266_3214976360042000.518
checker_319_2633_32141329540060000.741
checker_364_3060_3215326014400150001.852
all ten121486.666

4.3 The probe, and the checker threshold (2026-09-24 09:40 -0500)

Estimate committed 09:33:01 (76d13a9); probe and gram units launched 09:33:12 (app ap-JRlZr1RjuHFd8xDrZ9Rz85, the spawned rows in s5).

The probe checker_200_2400_32_sandybridge ran with the guard passing before and after, and its child read OpenBLAS's kernel family as Sandybridge (the override took; the calibration unit predates this readout and records none). Against the Modal calibration unit, same image, same code, same inputs:

cmax abs, Modal vs Modalspectralmax abs, probe vs laptop
2.22.84e-72.97e-72.33e-7
2.53.01e-73.15e-72.32e-7
2.93.29e-73.39e-72.25e-7

Changing only the BLAS kernels moves this unit by 2.8e-7 to 3.3e-7, the same order as the 1.9e-7 to 2.3e-7 cross-platform miss. Shown by this probe: the checker unit reproduces only to about 3e-7 under last-digit changes in arithmetic, consistent with Gb's condition number 3.9e9 inverted in ta_mellin.rho (the probe shows the sensitivity; which step amplifies it is not isolated). cond_Gb itself reads 3875494700.2 in the probe, against 3875494354.4 and 3875494350.7.

The checker calibration threshold is changed from 1e-10 (the brief) to 1e-6 max abs, on 2026-09-24, after the measurement, per the coordinator's option B. The justification is the probe (arithmetic alone moves the unit by up to 3.3e-7), not checker/'s band. At 1e-6 the calibration passes (2.28e-7). The two_adic calibration keeps 1e-10 (8.2e-15). Every checker output carries meta.calibration: the calibration's per-cell differences, its Weyl bound 2.93e-7 (spectral, Modal against laptop) and the probe's 3.39e-7 (arithmetic_floor_bound, Modal against Modal), so checker/ can flag any R_S eigenvalue within that distance of its threshold when it re-grades.

The four checker units launch next, under the timeouts of 4.2.

5. Unit log

Appended by run_modal.py as each unit lands. Wall is the container function's wall time; cost is computed (wall x (4 cores x core rate + max(16 GiB, peak) x GiB rate)), not read from Modal's billing.

unitstatuswall sCPU speak MiBcomputed cost USDCPU modellanded
gram_80_4800ok184.5426.3846.60.0162unknown2026-09-24 09:25:26 -0500
checker_200_2400_32ok438.7976.41580.20.0386unknown2026-09-24 09:29:45 -0500
checker_200_2400_32_sandybridgespawned fc-01M39XBCX93VHSD92T79TANEE42026-09-24 09:33:12 -0500
gram_140_4800spawned fc-01M39XBD8Z0M2TCM9FE3XB6X1D2026-09-24 09:33:13 -0500
gram_160_4800spawned fc-01M39XBDDAEMZRRWS4VBTQCEA62026-09-24 09:33:13 -0500
gram_180_4800spawned fc-01M39XBDS38BQ1KV7WNE8N5THH2026-09-24 09:33:13 -0500
gram_200_4800spawned fc-01M39XBDXT24JNXZDY2RJ562FV2026-09-24 09:33:13 -0500
gram_160_9600spawned fc-01M39XBE9XJEBM3KQCQJCC314T2026-09-24 09:33:14 -0500
gram_140_4800ok278.0643.61281.20.0244unknown2026-09-24 09:38:02 -0500
gram_160_4800ok303.3636.81336.00.0267unknown2026-09-24 09:38:34 -0500
checker_200_2400_32_sandybridgeok397.31017.91578.10.0349unknown2026-09-24 09:40:09 -0500
checker_240_2400_32spawned fc-01M39XT31YB94RK5CGH07ZRAEF2026-09-24 09:41:14 -0500
checker_280_2266_32spawned fc-01M39XT37PFD1FP79RMDFXG5452026-09-24 09:41:14 -0500
checker_319_2633_32spawned fc-01M39XT3N8C1ZRJ2H9JK5ERY8R2026-09-24 09:41:14 -0500
checker_364_3060_32spawned fc-01M39XT42G5YHCQ14G2P9ZVQ092026-09-24 09:41:15 -0500
gram_180_4800ok475.9980.41771.80.0418unknown2026-09-24 09:41:27 -0500
gram_200_4800ok627.91253.71822.10.0552unknown2026-09-24 09:44:00 -0500
gram_160_9600ok797.21858.22064.00.0701unknown2026-09-24 09:46:47 -0500
checker_280_2266_32ok846.61551.82559.10.0744unknown2026-09-24 09:55:26 -0500
checker_240_2400_32ok890.41665.32421.80.0783unknown2026-09-24 09:56:14 -0500
checker_319_2633_32ok1042.42204.92814.80.0916unknown2026-09-24 09:58:49 -0500
checker_364_3060_32ok1786.53697.35142.20.1571unknown2026-09-24 10:11:18 -0500

6. Close-out (2026-09-24 11:12 -0500)

7. Follow-up 2 (2026-09-24): every checker/ unit under the QR rho

BRIEF.md "Follow-up 2". two_adic/ replaced the explicit inverse in ta_mellin.rho by a QR of the Gram factor (c3dca00, eea7eab), so T_S's input digest moved from 1dcab230 to b2e7787b and checker/'s guard refuses every old row. This section rebuilds all eleven checker/ units on Modal. Sections 1 to 6 above are the record of the old route and are not edited; modal/out/ and test_modal_outputs.py are untouched. Driver: run_modal_rho.py (a copy of run_modal.py's machinery; the old file keeps its constants because its pins read them). Outputs: modal/out_rho/. No eigenvalue of T_S or R_S is computed here.

7.1 The tree and the image

7.2 Rates, resources, and the bound before any call

Rates read on 2026-09-24 at 14:05 -0500 with modal billing rates: CPU 0.0473 USD per core-hour (1.314e-5 per core-second), memory 0.008 USD per GiB-hour (2.22e-6 per GiB-second), the same as s2. Per container, as before: cpu=(4.0, 4.0), memory=(16384, 32768) MiB, so the bound rate is 4 x 1.314e-5 + 32 x 2.22e-6 = 1.2367e-4 USD/s (0.445 USD/h). Container timeout = unit timeout + 600 s. A restarted input finds its start marker and computes nothing.

callunit timeout (s)container timeout (s)bound (USD)
smoke (guard, versions, import chain)9000.111
checker_80_1200_8 (calibration, and unit 1 of 11)120018000.223
total before the batch0.334

Remaining cap for both batches of this follow-up: 25 - 0.741 = 24.26 USD.

7.3 Calibration log

Appended by run_modal_rho.py as each call lands. Wall is the container function's wall time; cost is computed (wall x (4 cores x core rate + max(16 GiB, peak) x GiB rate)), not billed. The BLAS column is the OpenBLAS kernel family the child loaded.

unitstatuswall sCPU speak MiBcomputed cost USDBLASlanded
checker_80_1200_8spawned fc-01M3AD6RGP4B31ZSTGQDWBB9GB2026-09-24 14:10:18 -0500
checker_80_1200_8ok39.3100.1471.70.0035SkylakeX2026-09-24 14:11:19 -0500

7.4 Smoke and calibration results (2026-09-24 14:08 to 14:12 -0500)

cellmax abs difference, dps 40dps 60
2.25.8e-155.8e-15
2.54.9e-154.9e-15
2.97.1e-157.1e-15

Max 7.1e-15 against the threshold 1e-10: met. The diagnostics agree: cond_Fz 16.514603709784 both, cond_Fb 16.735960732146 both, cond_Gb 280.0923816279 both (relative 1e-13). Recorded in run_modal_rho.py CHECKER_CALIBRATION and carried in every output's meta.calibration (the calibration file was re-shaped from the Volume with fetch --no-log, app ap-W1DBc8WmUr8jqNdJ9AizI0, no containers). This is the N = 8 unit at cond_F about 17; no platform floor is measured here for the N = 16 and N = 32 units.

7.5 The batch estimate (written before launch)

Speed: the QR route costs about what the inverse did on Modal. The old route has no Modal build of (80, 1200, 8); at the first follow-up's Modal / laptop ratio of 1.75 it would take 20.8 x 1.75 = 36 s, against 34.2 s measured now. two_adic/ regenerated (200, 2400) locally in 302 s under the QR route against 246.8 s for checker/'s old build of the same unit (two SVDs of F added). The estimate takes the old unit times x 1.3: the first follow-up's Modal child times for the N = 32 units, and the laptop times x 1.75 for the N = 16 units. two_adic/ s10.5's estimate for the five N = 32 units (4980 s, 0.45 USD) is this at x 1.0.

unitold time (s)estimate (s)unit timeout (s)container timeout (s)bound (USD)
checker_120_1600_1673.7 laptop168120018000.223
checker_200_2400_32432.3 Modal562240030000.371
checker_80_1600_1628.5 laptop65120018000.223
checker_120_1200_1650.4 laptop115120018000.223
checker_80_1200_1620.8 laptop47120018000.223
checker_160_1600_16107.6 laptop245120018000.223
checker_240_2400_32887.3 Modal1153360042000.519
checker_280_2266_32843.9 Modal1097360042000.519
checker_319_2633_321036.2 Modal1347540060000.742
checker_364_3060_321784.1 Modal231910800114001.410
the ten71184.674

7.6 Unit log

Same columns as s7.3.

unitstatuswall sCPU speak MiBcomputed cost USDBLASlanded
checker_120_1600_16spawned fc-01M3ADC1Q11461A3V2SXW2WEHT2026-09-24 14:13:11 -0500
checker_200_2400_32spawned fc-01M3ADC22VDPC856PTDBRT3WSK2026-09-24 14:13:11 -0500
checker_80_1600_16spawned fc-01M3ADC28MWMEB521C0ZZTYJ0K2026-09-24 14:13:12 -0500
checker_120_1200_16spawned fc-01M3ADC2DSR7BVAMBNJXG6JW122026-09-24 14:13:12 -0500
checker_80_1200_16spawned fc-01M3ADC2KPFJPETGHPAXFT42E52026-09-24 14:13:12 -0500
checker_160_1600_16spawned fc-01M3ADC2RRRGM5NEQ1Y6B7AWPD2026-09-24 14:13:12 -0500
checker_240_2400_32spawned fc-01M3ADC34X549NPD78BTC2Q9GN2026-09-24 14:13:12 -0500
checker_280_2266_32spawned fc-01M3ADC39S21KXZ0W9EKKYGHWP2026-09-24 14:13:13 -0500
checker_319_2633_32spawned fc-01M3ADC3NJG7ANH70K917XHQ792026-09-24 14:13:13 -0500
checker_364_3060_32spawned fc-01M3ADC40Y3B89CS0HE79PTBHV2026-09-24 14:13:13 -0500
checker_80_1200_16ok43.397.6474.90.0038Haswell2026-09-24 14:14:05 -0500
checker_80_1600_16ok63.9144.2530.30.0056Haswell2026-09-24 14:14:38 -0500
checker_120_1200_16ok104.5234.5782.00.0092Haswell2026-09-24 14:15:11 -0500
checker_120_1600_16ok127.5283.4852.50.0112Haswell2026-09-24 14:15:30 -0500
checker_160_1600_16ok154.8345.1935.80.0136Haswell2026-09-24 14:16:03 -0500
checker_200_2400_32ok432.7983.61580.80.0381Haswell2026-09-24 14:20:34 -0500
checker_240_2400_32ok759.11627.72425.10.0669Haswell2026-09-24 14:26:04 -0500
checker_280_2266_32ok756.11454.12562.30.0666Haswell2026-09-24 14:26:06 -0500
checker_319_2633_32ok1382.02354.92812.90.1218Haswell2026-09-24 14:36:36 -0500
checker_364_3060_32ok2124.04234.25149.70.1871Haswell2026-09-24 14:48:46 -0500

7.7 Close-out (2026-09-24 14:50 -0500)