Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
248 commits
Select commit Hold shift + click to select a range
6ef2cb9
feat(e2e): add per-family end-to-end regression runner
Pfannkuchensack Oct 17, 2026
855ebe2
feat(working-memory): ship VAE working-memory coefficients as data
Pfannkuchensack Oct 17, 2026
92c293e
Merge branch 'main' into feat/family-e2e
Pfannkuchensack Oct 17, 2026
2f8d0c2
fix(e2e): snapshot the template database through the database layer
Pfannkuchensack Oct 17, 2026
4c98e3c
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 17, 2026
470db71
feat(working-memory): measure working memory in admin calibration runs
Pfannkuchensack Oct 17, 2026
ef1bbec
fix(working-memory): reserve VAE working memory per dtype and allocator
Pfannkuchensack Oct 17, 2026
f5859cc
Merge commit '470db713f5' into feat/family-e2e-calibration
Pfannkuchensack Oct 17, 2026
bf8254f
Merge commit 'ef1bbec220' into feat/family-e2e-calibration
Pfannkuchensack Oct 17, 2026
0fd56fe
fix(working-memory): fit VAE lines against the highest reading per size
Pfannkuchensack Oct 17, 2026
6f0544d
Merge commit '0fd56fe092' into feat/family-e2e-calibration
Pfannkuchensack Oct 17, 2026
fab1519
fix(working-memory): record the operating system as a hard calibratio…
Pfannkuchensack Oct 17, 2026
7a75080
feat(e2e): calibrate working memory and build shipped data from probe…
Pfannkuchensack Oct 17, 2026
8d0b78d
Merge commit 'fab1519974' into feat/family-e2e-calibration
Pfannkuchensack Oct 17, 2026
9267c3e
test(working-memory): probe points that would tilt a line do not choo…
Pfannkuchensack Oct 17, 2026
87079a6
feat(models): calibrate VAE working memory per model from the Model M…
Pfannkuchensack Oct 18, 2026
cb91aab
fix(models): keep fragmented and partly resident windows out of user …
Pfannkuchensack Oct 18, 2026
83e3639
Merge branch 'main' into feat/working-memory-estimates
Pfannkuchensack Oct 18, 2026
8946969
Merge branch 'main' into feat/working-memory-calibration-runs
Pfannkuchensack Oct 18, 2026
6fa6a2c
Merge branch 'main' into fix/vae-working-memory-dtype
Pfannkuchensack Oct 18, 2026
ea06b4f
Merge branch 'fix/vae-working-memory-dtype' into feat/family-e2e-cali…
Pfannkuchensack Oct 18, 2026
d1452cf
Merge branch 'feat/working-memory-calibration-runs' into feat/family-…
Pfannkuchensack Oct 18, 2026
7511489
fix(e2e): set the new project settings in exported graphs
Pfannkuchensack Oct 18, 2026
ed43bd9
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 18, 2026
e3c4b92
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 18, 2026
7714be8
chore(perf): record the working-memory locale growth in the route byt…
Pfannkuchensack Oct 18, 2026
46b0f75
feat(models): move working memory to a collapsed section at the end o…
Pfannkuchensack Oct 18, 2026
727cbbd
Merge branch 'main' into feat/family-e2e
Pfannkuchensack Oct 18, 2026
0d96e0a
fix(e2e): set the new project settings in exported graphs
Pfannkuchensack Oct 18, 2026
f11f602
feat(working-memory): reserve Z-Image denoise working memory from mea…
Pfannkuchensack Oct 18, 2026
f0349da
docs(working-memory): name the in-server checks of the Z-Image denois…
Pfannkuchensack Oct 18, 2026
d8b0fc5
Merge branch 'main' into feat/working-memory-calibration-runs
Pfannkuchensack Oct 18, 2026
9f5187a
Merge branch 'main' into fix/vae-working-memory-dtype
Pfannkuchensack Oct 18, 2026
cb6cd56
Merge branch 'fix/vae-working-memory-dtype' into feat/family-e2e-cali…
Pfannkuchensack Oct 18, 2026
4ca9c52
Merge branch 'feat/working-memory-calibration-runs' into feat/family-…
Pfannkuchensack Oct 18, 2026
52dfe1f
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 18, 2026
0969d4e
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 18, 2026
4ba43cd
feat(working-memory): reserve FLUX.2 denoise working memory from meas…
Pfannkuchensack Oct 18, 2026
1f824b6
Merge branch 'main' into feat/working-memory-calibration-runs
Pfannkuchensack Oct 19, 2026
2f62211
Merge branch 'feat/working-memory-calibration-runs' into feat/family-…
Pfannkuchensack Oct 19, 2026
fca8919
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 19, 2026
084741a
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 19, 2026
c224010
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 19, 2026
8d0a855
chore(perf): record the working-memory locale growth in the route byt…
Pfannkuchensack Oct 19, 2026
f908b84
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 19, 2026
f9f3a6a
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 19, 2026
f004b1a
test(working-memory): script the allocator backend in the fingerprint…
Pfannkuchensack Oct 19, 2026
31350ae
test(working-memory): script the allocator backend where a test build…
Pfannkuchensack Oct 19, 2026
9e5bd46
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 19, 2026
65636a7
fix(working-memory): import the VAE facet through the architectures p…
Pfannkuchensack Oct 19, 2026
4c4c258
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 19, 2026
1f53cb9
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 19, 2026
d352d00
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 19, 2026
7e0c7a2
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 19, 2026
89dae23
test(upscale): stop the FLUX.2 entry test where the node prices its w…
Pfannkuchensack Oct 19, 2026
ee3ef93
Merge branch 'main' into feat/working-memory-calibration-runs
Pfannkuchensack Oct 20, 2026
0cf2fee
Merge branch 'main' into fix/vae-working-memory-dtype
Pfannkuchensack Oct 20, 2026
3ebdb7f
fix(working-memory): keep calibration runs and their measurements tru…
Pfannkuchensack Oct 20, 2026
4fbf583
Merge remote-tracking branch 'origin/feat/working-memory-calibration-…
Pfannkuchensack Oct 20, 2026
f65b863
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 20, 2026
251ef4e
Merge remote-tracking branch 'origin/fix/vae-working-memory-dtype' in…
Pfannkuchensack Oct 20, 2026
d11164e
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 20, 2026
5699fee
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 20, 2026
1914435
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 20, 2026
4803b1c
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 20, 2026
4de82a9
Merge remote-tracking branch 'upstream/main' into feat/family-e2e
Pfannkuchensack Oct 20, 2026
1227de3
test(e2e): pick a Z-Image-valid encoder in the graph export test
Pfannkuchensack Oct 20, 2026
6fa29e1
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 20, 2026
8d25d51
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 20, 2026
cf219bf
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 20, 2026
fc43a88
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 20, 2026
afc05b3
feat(e2e): bundle runs as shareable zips and record model identity
Pfannkuchensack Oct 21, 2026
a91a6a8
feat(e2e): describe bundle format and read only same-profile runs
Pfannkuchensack Oct 21, 2026
8b5fe87
test(e2e): place the fake memory peak inside the measured run window
Pfannkuchensack Oct 21, 2026
cbbb998
feat(e2e): mark expected changes and report self-referenced baselines
Pfannkuchensack Oct 21, 2026
b012444
fix(working-memory): wait for session workers on stop and fence calib…
Pfannkuchensack Oct 21, 2026
abff2f5
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 21, 2026
2e7a31e
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 21, 2026
d159929
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 21, 2026
64b51b2
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 21, 2026
eb6f45d
feat(e2e): ship each case's reference metadata in bundles
Pfannkuchensack Oct 21, 2026
213c23b
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 21, 2026
1359cb9
fix(working-memory): use the shared dedicated-VRAM check in the calib…
Pfannkuchensack Oct 21, 2026
5ef313d
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 21, 2026
7ef678e
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 21, 2026
3168365
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 21, 2026
1370b23
fix(working-memory): refuse unwritable stores and duplicate enqueues …
Pfannkuchensack Oct 21, 2026
df8e071
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 21, 2026
38d0d3b
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 21, 2026
5fa9a67
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 21, 2026
0088943
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 21, 2026
a344878
Merge branch 'main' into feat/working-memory-user-calibration
Pfannkuchensack Oct 21, 2026
07bc26b
Merge branch 'main' into feat/family-e2e-calibration
Pfannkuchensack Oct 21, 2026
7efc2d2
Merge branch 'main' into feat/family-e2e
Pfannkuchensack Oct 21, 2026
9f2345c
fix(working-memory): serialize calibration run creation across processes
Pfannkuchensack Oct 21, 2026
f8d0fb7
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 21, 2026
0874b20
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 21, 2026
62d75d8
test(processor): release the wake-up test's gates before a stop that …
Pfannkuchensack Oct 21, 2026
9a0ff66
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 21, 2026
5e17db0
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 21, 2026
2e4a791
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 21, 2026
1027c06
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 21, 2026
3bb86a4
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 22, 2026
cd23115
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 22, 2026
76d5047
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 22, 2026
6c9b69b
Merge branch 'main' into feat/family-e2e
Pfannkuchensack Oct 22, 2026
9f87a27
fix(working-memory): record a calibration item cleared before its que…
Pfannkuchensack Oct 22, 2026
5d21f4f
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 22, 2026
30e6ad3
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 22, 2026
93b50f9
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 22, 2026
23c0ef4
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 22, 2026
4bdbf74
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 22, 2026
c9edbfe
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 22, 2026
515bc31
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 22, 2026
b2a02cc
feat(e2e): sample GPU memory through NVML on Linux NVIDIA
Pfannkuchensack Oct 22, 2026
8d997fc
fix(e2e): count weightless tokenizer loads as resident
Pfannkuchensack Oct 22, 2026
edba0dd
feat(working-memory): mark the Linux NVML reader as verified on hardware
Pfannkuchensack Oct 22, 2026
a3269f7
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 22, 2026
f6db36f
Merge remote-tracking branch 'origin/feat/working-memory-calibration-…
Pfannkuchensack Oct 22, 2026
41898f2
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 22, 2026
ee04529
test(working-memory): expect the Linux NVML reader to be verified
Pfannkuchensack Oct 22, 2026
7ed3a1a
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 22, 2026
e254ca7
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 22, 2026
a7473db
Merge branch 'main' into feat/working-memory-calibration-runs
Pfannkuchensack Oct 22, 2026
e3bb17e
fix(working-memory): price SDNQ VAEs at their compute dtype and resto…
Pfannkuchensack Oct 23, 2026
49d8f8e
fix(working-memory): keep a calibration item's settled outcome and at…
Pfannkuchensack Oct 23, 2026
44dc311
fix(working-memory): keep conservative stand-ins until fresh-process …
Pfannkuchensack Oct 23, 2026
9cc2091
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 23, 2026
e00e817
fix(working-memory): plan calibration at the dtype the FLUX VAE decod…
Pfannkuchensack Oct 23, 2026
c178e02
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 23, 2026
b91e4de
fix(working-memory): refuse calibration plans whose decodes cannot be…
Pfannkuchensack Oct 23, 2026
b80d534
fix(working-memory): settle every terminal calibration outcome and tr…
Pfannkuchensack Oct 23, 2026
bc752a5
Merge branch 'feat/working-memory-data' into feat/family-e2e-calibration
Pfannkuchensack Oct 23, 2026
a3bde33
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 23, 2026
0a42b56
Merge branch 'main' into feat/family-e2e-calibration
Pfannkuchensack Oct 23, 2026
a43c2ba
fix(e2e): redact every credential value and kill orphaned server proc…
Pfannkuchensack Oct 23, 2026
a1d9318
fix(models): re-read the working-memory plan on opening and before a …
Pfannkuchensack Oct 23, 2026
85a4c44
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 23, 2026
fc01541
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 23, 2026
ac37f77
fix(e2e): check server liveness without os.waitid on macOS
Pfannkuchensack Oct 23, 2026
591d190
fix(e2e): treat a refused group kill as done when only zombies remain
Pfannkuchensack Oct 23, 2026
70570ce
fix(working-memory): preserve completion after announcement errors
JPPhoto Oct 23, 2026
61e965d
Merge branch 'main' into feat/working-memory-calibration-runs
JPPhoto Oct 23, 2026
00055ca
Merge branch 'main' into fix/vae-working-memory-dtype
JPPhoto Oct 23, 2026
1603049
Merge branch 'main' into feat/family-e2e-calibration
JPPhoto Oct 23, 2026
4339e78
Merge remote-tracking branch 'origin/feat/family-e2e-calibration' int…
Pfannkuchensack Oct 24, 2026
a2a6e25
fix(e2e): mark stopped runs despite failed store saves and keep same-…
Pfannkuchensack Oct 24, 2026
47eac03
fix(model-cache): return weights cast in place to their counted dtype…
Pfannkuchensack Oct 24, 2026
764aeb2
Merge branch 'main' into fix/vae-working-memory-dtype
JPPhoto Oct 24, 2026
623a5e3
fix(models): keep retried calibration runs out of fits and refuse cal…
Pfannkuchensack Oct 24, 2026
ebcadee
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 24, 2026
00dbc06
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 24, 2026
c56ade1
Merge branch 'main' into feat/family-e2e-calibration
Pfannkuchensack Oct 24, 2026
70150d2
Merge remote-tracking branch 'origin/feat/family-e2e-calibration' int…
Pfannkuchensack Oct 24, 2026
e7a6501
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 24, 2026
5bf307a
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 24, 2026
74be719
Merge branch 'main' into feat/working-memory-denoise
Pfannkuchensack Oct 24, 2026
71d5385
Merge branch 'main' into feat/working-memory-user-calibration
Pfannkuchensack Oct 24, 2026
db7edac
Merge branch 'main' into feat/family-e2e-calibration
Pfannkuchensack Oct 24, 2026
7e645a2
fix(working-memory): keep samples taken before a peak reset out of th…
Pfannkuchensack Oct 24, 2026
cb940f9
Merge remote-tracking branch 'origin/feat/working-memory-calibration-…
Pfannkuchensack Oct 24, 2026
14904ce
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 24, 2026
0776e2d
Merge branch 'main' into feat/working-memory-calibration-runs
JPPhoto Oct 24, 2026
e5ee6bd
fix(models): count only complete calibration attempts and size shared…
Pfannkuchensack Oct 24, 2026
60faaed
fix(working-memory): keep a calibration item canceled when a callback…
Pfannkuchensack Oct 24, 2026
4a8e61c
Merge remote-tracking branch 'refs/remotes/origin/feat/working-memory…
Pfannkuchensack Oct 24, 2026
7237fef
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 24, 2026
0c1caea
Merge remote-tracking branch 'refs/remotes/origin/feat/family-e2e-cal…
Pfannkuchensack Oct 24, 2026
4d94c54
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 24, 2026
d2378f6
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 24, 2026
563abf9
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 24, 2026
b6f94b7
fix(e2e): stop a server a killed runner left before resuming its run
Pfannkuchensack Oct 24, 2026
2664564
chore(api): regenerate the OpenAPI contract for the merged excluded_w…
Pfannkuchensack Oct 24, 2026
14c4026
chore(api): regenerate the OpenAPI contract for the merged excluded_w…
Pfannkuchensack Oct 24, 2026
b06a4a0
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 24, 2026
b5b221c
fix(working-memory): void calibration windows that weights leave and …
Pfannkuchensack Oct 25, 2026
efb4d5a
Merge remote-tracking branch 'refs/remotes/origin/feat/working-memory…
Pfannkuchensack Oct 25, 2026
729043e
Merge remote-tracking branch 'refs/remotes/origin/feat/family-e2e-cal…
Pfannkuchensack Oct 25, 2026
afe44d6
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 25, 2026
4420e9c
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 25, 2026
4a8dea8
Merge branch 'main' into feat/family-e2e
Pfannkuchensack Oct 26, 2026
3022a69
fix(models): calibrate one attempt per GPU against the planned model …
Pfannkuchensack Oct 26, 2026
2694671
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 26, 2026
3d798b4
test(perf): re-record the locale bytes of the browser baselines after…
Pfannkuchensack Oct 26, 2026
ba44a71
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 26, 2026
6608a03
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 26, 2026
548f424
Merge branch 'main' into fix/vae-working-memory-dtype
Pfannkuchensack Oct 26, 2026
7bb00f7
Merge branch 'main' into feat/working-memory-calibration-runs
Pfannkuchensack Oct 27, 2026
190766b
fix(working-memory): void windows a model dropped between scopes free…
Pfannkuchensack Oct 27, 2026
08b8f36
Merge branch 'main' into feat/working-memory-calibration-runs
JPPhoto Oct 27, 2026
4c9206e
Merge branch 'main' into feat/working-memory-calibration-runs
JPPhoto Oct 27, 2026
833edac
fix(models): record retries from their announcement and keep calibrat…
Pfannkuchensack Oct 27, 2026
4c96303
Merge remote-tracking branch 'refs/remotes/origin/feat/working-memory…
Pfannkuchensack Oct 27, 2026
fe849d0
fix(working-memory): scope the unfitted-value exemption to unkeyed es…
Pfannkuchensack Oct 27, 2026
53d190f
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 27, 2026
e70c004
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 27, 2026
71e126a
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 27, 2026
1b18336
Merge branch 'main' into fix/vae-working-memory-dtype
Pfannkuchensack Oct 27, 2026
239f10e
Merge branch 'main' into feat/working-memory-user-calibration
Pfannkuchensack Oct 27, 2026
c3b7533
Merge remote-tracking branch 'upstream/main' into feat/family-e2e
Pfannkuchensack Oct 27, 2026
e558c51
fix(family-e2e): type exported reference images like the Reference Im…
Pfannkuchensack Oct 27, 2026
d492e4b
fix(family-e2e): close the race between start, stop and resume
Pfannkuchensack Oct 27, 2026
47b1b13
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 27, 2026
1611b57
fix(family-e2e): keep a stop when a stopped calibration runner cannot…
Pfannkuchensack Oct 27, 2026
279b062
fix(family-e2e): read the run status under the run lock
Pfannkuchensack Oct 27, 2026
6f1742a
Merge remote-tracking branch 'origin/feat/family-e2e' into feat/famil…
Pfannkuchensack Oct 27, 2026
f1080e2
fix(working-memory): count calibration retries before the queue commi…
Pfannkuchensack Oct 27, 2026
ef7ca0f
Merge remote-tracking branch 'origin/feat/family-e2e-calibration' int…
Pfannkuchensack Oct 27, 2026
35a4589
Merge remote-tracking branch 'origin/feat/working-memory-user-calibra…
Pfannkuchensack Oct 27, 2026
2c400e3
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 27, 2026
71d14b0
fix(model-cache): re-tie weights a cast round trip split before the l…
Pfannkuchensack Oct 27, 2026
5941646
fix(family-e2e): record a starting server and keep a stop's run while…
Pfannkuchensack Oct 27, 2026
5b1c79d
fix(working-memory): keep Z-Image fit-grid points off the fit when th…
Pfannkuchensack Oct 27, 2026
5af47e9
Merge remote-tracking branch 'upstream/main' into fix/vae-working-mem…
Pfannkuchensack Oct 27, 2026
b790a86
fix(working-memory): summarize the Z-Image line from in-fit points only
Pfannkuchensack Oct 27, 2026
16d0d25
fix(working-memory): plan calibration for the VAE a model's default s…
Pfannkuchensack Oct 27, 2026
dcf8ced
fix(working-memory): forget the cached queue outcomes of runs a reset…
Pfannkuchensack Oct 27, 2026
270dc24
test(working-memory): cover a judged failed step whose retry a queue …
Pfannkuchensack Oct 27, 2026
116e505
docs(working-memory): limit discarding a stopped calibration to Model…
Pfannkuchensack Oct 27, 2026
421f172
fix(family-e2e): stop kills a server recorded after its first read an…
Pfannkuchensack Oct 27, 2026
c5dde1e
fix(model-cache): restore casts on every last pin release, not only o…
Pfannkuchensack Oct 27, 2026
272990d
Merge branch 'fix/vae-working-memory-dtype' into feat/family-e2e-cali…
Pfannkuchensack Oct 27, 2026
7787606
fix(working-memory): judge calibration item outcomes per run and unde…
Pfannkuchensack Oct 27, 2026
c2a90f7
refactor(working-memory): read VAE compatibility in the calibration p…
Pfannkuchensack Oct 27, 2026
7e13d1e
test(working-memory): cover default VAEs of FLUX.1 SDNQ and Z-Image p…
Pfannkuchensack Oct 27, 2026
47168bf
docs(working-memory): name the resets for API calibration runs and th…
Pfannkuchensack Oct 27, 2026
7bcbc83
docs(working-memory): state which estimators may carry values off a p…
Pfannkuchensack Oct 27, 2026
d8f0244
Merge branch 'feat/family-e2e-calibration' into feat/working-memory-u…
Pfannkuchensack Oct 27, 2026
ede112e
Merge branch 'feat/working-memory-user-calibration' into feat/working…
Pfannkuchensack Oct 28, 2026
c2a1848
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 28, 2026
d1baa25
docs(working-memory): describe which points ship out of the fit
Pfannkuchensack Oct 28, 2026
a8081ee
Merge branch 'feat/working-memory-denoise' into feat/working-memory-f…
Pfannkuchensack Oct 28, 2026
d581c96
Merge remote-tracking branch 'upstream/main' into feat/family-e2e-cal…
Pfannkuchensack Oct 28, 2026
66f446f
fix(family-e2e): spawn and record the server under the run lock
Pfannkuchensack Oct 28, 2026
f87babb
fix(working-memory): refuse calibration graphs compiled against anoth…
Pfannkuchensack Oct 28, 2026
c016151
Merge commit '66f446f582' into feat/working-memory-user-calibration
Pfannkuchensack Oct 28, 2026
7b8e8c0
Merge commit 'c0161515c6' into feat/working-memory-denoise
Pfannkuchensack Oct 28, 2026
f0dc1da
Merge commit '7b8e8c0854' into feat/working-memory-flux2-denoise
Pfannkuchensack Oct 28, 2026
fc6ea9b
Merge remote-tracking branch 'upstream/main' into feat/family-e2e-cal…
Pfannkuchensack Oct 28, 2026
db6105d
Merge commit 'fc6ea9b60055214ce3dce971bc0b8f1e514f5352' into feat/wor…
Pfannkuchensack Oct 28, 2026
475dd91
Merge commit 'db6105d5cad8019048b8d6744cf3ff3d68536519' into feat/wor…
Pfannkuchensack Oct 28, 2026
1f55613
Merge commit '475dd91a9547aacff64c15978a395cce4ebadf16' into feat/wor…
Pfannkuchensack Oct 28, 2026
032f6ff
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 28, 2026
202794a
Merge branch 'main' into feat/working-memory-denoise
Pfannkuchensack Oct 28, 2026
07f31d8
fix(working-memory): reserve FLUX.2 partial-load and masked-attention…
Pfannkuchensack Oct 28, 2026
823742d
Merge branch 'feat/working-memory-denoise' of https://github.com/Pfan…
Pfannkuchensack Oct 28, 2026
fdc0aab
Merge remote-tracking branch 'upstream/main' into feat/working-memory…
Pfannkuchensack Oct 29, 2026
b5cc74c
Merge remote-tracking branch 'origin/main' into feat/working-memory-f…
lstein Oct 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions docs/src/content/docs/development/Architecture/model-manager.mdx

Large diffs are not rendered by default.

214 changes: 45 additions & 169 deletions invokeai/app/invocations/flux2/flux2_denoise.py

Large diffs are not rendered by default.

286 changes: 286 additions & 0 deletions invokeai/backend/flux2/denoise_working_memory.py

Large diffs are not rendered by default.

6 changes: 2 additions & 4 deletions invokeai/backend/model_manager/load/load_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,10 +261,8 @@ def model_on_device(
f"Working memory for {self._cache_record.key}: {working_memory.estimator} reserves "
f"{working_mem_bytes / 2**20:.0f} MB ({working_memory.source})"
)
scope = probe.current_scope()
if scope is not None and self.compute_device.type != "cpu":
calibration = scope
working_mem_bytes = probe.calibration_reservation(working_mem_bytes)
calibration, working_mem_bytes = probe.lock_reservation(working_mem_bytes, self.compute_device)
if calibration is not None:
message += f"; the calibration lock reserves {working_mem_bytes / 2**20:.0f} MB"
InvokeAILogger.get_logger(__name__).debug(message)
self._lock_on_device(working_mem_bytes, offload_others=calibration is not None)
Expand Down
7 changes: 4 additions & 3 deletions invokeai/backend/util/vae_working_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,10 @@ def _vae_mid_block_score_matrix_bytes(
# for it: a line in the output's pixel count per operation and the dtype it runs in, `k_<operation>_<dtype>`
# bytes per pixel plus `b_<operation>_<dtype>` bytes the process pays whatever the size, shipped per convolution
# backend and allocator (`platform_for`). The values ship in `backend/working_memory/data/vae.json` with the points
# they are fitted on (`backend/working_memory/fit.py`); `scripts/calibrate_flux2_working_memory.py --only vae`
# measures a build against them. Every spec here declares that line (`fit.convolution_line`) and opts in to user
# calibration (`user_calibrated`), so a calibration run's decode windows refit these lines per device.
# they are fitted on (`backend/working_memory/fit.py`): calibration runs in a running server measure them on a card,
# and `scripts/working_memory/build_shipped.py` turns their exports into shipped points. Every spec here declares that
# line (`fit.convolution_line`) and opts in to user calibration (`user_calibrated`), so a calibration run's decode
# windows refit these lines per device.
#
# None of the three scales out of the line. The demand does not follow the element size: on MIOpen fp16 needs about a
# third of what bf16 does, and on both backends fp32 needs less per value byte than bf16. The allocator matters as
Expand Down
14 changes: 11 additions & 3 deletions invokeai/backend/working_memory/bounds.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,20 @@
"vae.sd-miopen,native,windows-encode-fp16-1280x1280-scores-RX9060XT-demand_peak": 1.78,
"vae.flux-miopen,native,windows-decode-bf16-512x512-scores-RX9060XT-demand_peak": 1.33,
"vae.flux2-miopen,native,windows-decode-bf16-512x512-scores-RX9060XT-demand_peak": 1.33,
"denoise.flux2-cudnn,native-denoise-bf16-h3072-8100+77tok-RTX4090-demand_peak": 1.42,
"denoise.flux2-miopen,native,windows-denoise-bf16-h3072-8100+77tok-RX9060XT-demand_peak": 1.40,
}
)
"""In-fit points, by `point_id`, whose envelope sits more than 1.3x above them, with the ratio they are held to
instead. All are MIOpen with the native allocator on Windows, where the demand is concave in the size: first-run driver
spikes at small sizes and a second run reserving up to 1.6x the first at large ones, so a line that covers every point
cannot stay within 1.3x of all of them. Windows ROCm defaults to expandable segments; this is the override's price."""
instead. All are the native allocator, never expandable segments or `cudaMallocAsync`:

- The VAE points are MIOpen on Windows, where the demand is concave in the size: first-run driver spikes at small sizes
and a second run reserving up to 1.6x the first at large ones, so a line that covers every point cannot stay within
1.3x of all of them. Windows ROCm defaults to expandable segments; this is the override's price.
- The FLUX.2 denoise points are the Klein 4B width at 1440px with a 77-token caption, 8177 tokens, on both cards: the
native allocator served them from 1676 MiB (RTX 4090) and 1879 MiB (RX 9060 XT), while the 512-token caption at
8612 tokens took 2382 and 2577 MiB. The line has to cover the latter. Under `cudaMallocAsync` and expandable
segments the two lie on one line."""


def point_id(point: MeasuredPoint, spec: "EstimatorSpec") -> str:
Expand Down
4,059 changes: 4,059 additions & 0 deletions invokeai/backend/working_memory/data/denoise.json

Large diffs are not rendered by default.

27 changes: 23 additions & 4 deletions invokeai/backend/working_memory/fit.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
An estimator's fitted terms price a line per operation and dtype: `k_<suffix>` bytes per unit of the line's size plus
`b_<suffix>` bytes, the base a process pays whatever the size. Its `EstimatorSpec.line` says which line an operation's
features price on, their size on it, and whether a measurement of them can join its fit (`Line`). The AutoencoderKL
estimators price their convolutions on a line in the output's pixels (`convolution_line`); the Z-Image denoise prices
its forward on one in attended tokens. Each carried pair is the upper envelope of the fresh-process points it is
resolved for (see `upper_envelope`), plus `SHIPPED_MARGIN`, raised where the line's other points need it
estimators price their convolutions on a line in the output's pixels (`convolution_line`); the Z-Image and FLUX.2 denoise
price their forwards on ones in attended tokens. Each carried pair is the upper envelope of the fresh-process points it
is resolved for (see `upper_envelope`), plus `SHIPPED_MARGIN`, raised where the line's other points need it
(`raised_pair`). A point joins the fit of the entry its estimator resolves to on its platform -- the lender's, where the
estimator borrows -- when it is `in_fit` (not measured out of regime) and its line admits it.

Expand Down Expand Up @@ -43,7 +43,7 @@
from typing import TYPE_CHECKING, Final, NamedTuple, Optional

from invokeai.backend.working_memory.coefficients import CoefficientEntry, MeasuredPoint, WorkingMemoryData, find_entry
from invokeai.backend.working_memory.estimate import FeatureValue
from invokeai.backend.working_memory.estimate import FeatureValue, WorkingMemoryTerm

if TYPE_CHECKING:
from invokeai.backend.working_memory.spec import EstimatorSpec
Expand Down Expand Up @@ -88,6 +88,25 @@ class Line(NamedTuple):
features that name no line."""


def off_line_reasons(
terms: Callable[[Mapping[str, FeatureValue], Mapping[str, float]], Iterable[WorkingMemoryTerm]],
features: Mapping[str, FeatureValue],
coefficients: Iterable[str],
) -> list[str]:
"""What puts an operation off the line its fitted terms price: an attention mask, which narrows the kernels SDPA can
pick (``has_attention_mask``), and each analytic term of `terms` that is not zero, as ``<name>=<bytes>``. Empty for
an operation whose demand is the line's alone. The terms are priced with every coefficient at zero, so only what
the operation adds on top of the line remains; a term added to an estimator takes the operations it prices out of
the fit by itself. The estimators label their points with the reasons in this order."""
unpriced = dict.fromkeys(coefficients, 0.0)
reasons = ["attention_mask"] if features.get("has_attention_mask") else []
return reasons + [
f"{term.name}={int(term.bytes)}"
for term in terms(features, unpriced)
if term.coefficient is None and term.bytes
]


def convolution_line(features: Mapping[str, FeatureValue]) -> Optional[Line]:
"""The AutoencoderKL convolution line ``<operation>_<dtype>``, in output pixels: every VAE estimator's.

Expand Down
44 changes: 42 additions & 2 deletions invokeai/backend/working_memory/measurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@
Two kinds of window take these definitions. The in-server probe's (`probe`) follow an operation through co-locks, nested
windows and releases, in segments, and have reasons of their own. A *fresh window* (`measure`) is one operation alone:
the calibration scripts measure their points that way, each in a fresh process with the server's runtime
(`invokeai.app.run_app.apply_server_runtime`).
(`invokeai.app.run_app.apply_server_runtime`). Such a point is a cold and a warm window of the same operation
(`measure_cold_and_warm`), and its bytes are the larger of the two (`measured_bytes_and_method`).
"""

import time
from collections.abc import Callable, Iterable
from collections.abc import Callable, Iterable, Sequence
from dataclasses import dataclass
from typing import Final, Literal, Optional

Expand Down Expand Up @@ -181,3 +182,42 @@ def measure(device: torch.device, operation: Callable[[], object]) -> FreshWindo
return fresh_window(first, final, oom=oom, spill=spill)
finally:
device_counters.close()


FreshPointMethod = Literal["demand_peak", "reserved_peak"]
"""The `MeasuredPoint.method` of a fresh-process point."""


def measure_cold_and_warm(device: torch.device, operation: Callable[[], object]) -> tuple[FreshWindow, ...]:
"""A fresh-process point's windows: `operation` measured twice (`measure`), cold and then warm.

The first run after a load is a real peak in a server (kernel modules, library workspaces), and so is a later one,
which can demand more: a warm Z-Image forward under `cudaMallocAsync` read 800 MiB against its cold run's 720. A
cold run that ran out of memory ends the point, whose warm run would measure what the failure left behind.
"""
cold = measure(device, operation)
if "oom" in cold.reasons:
return (cold,)
return (cold, measure(device, operation))


def point_reasons(windows: Sequence[FreshWindow]) -> list[ReadingReason]:
"""Why a fresh-process point is invalid: its windows' reasons, each once, in order. Empty for a valid point."""
return list(dict.fromkeys(reason for window in windows for reason in window.reasons))


def measured_bytes_and_method(windows: Sequence[FreshWindow]) -> tuple[int, FreshPointMethod]:
"""A valid fresh-process point's bytes and `MeasuredPoint.method`, from its windows (`measure_cold_and_warm`).

The largest of each window's figure: its demand where it read the driver, otherwise the growth of torch's counters
alone. A window without the driver's figure does not discard another's, which on ROCm maps a few hundred MiB above
torch's reserve on a first forward. The method names what the largest was read from: `demand_peak` for a demand,
`reserved_peak` for torch's counters.
"""
figures: list[tuple[int, FreshPointMethod]] = []
for window in windows:
if window.driver is not None and window.demand is not None:
figures.append((window.demand, "demand_peak"))
else:
figures += [(delta, "reserved_peak") for delta in (window.reserved, window.allocated) if delta is not None]
return max(figures, key=lambda figure: figure[0])
12 changes: 12 additions & 0 deletions invokeai/backend/working_memory/probe.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
from contextlib import contextmanager
from typing import TYPE_CHECKING, Final, Literal, Optional

import torch
from pydantic import BaseModel, ConfigDict

from invokeai.app.services.session_processor.session_processor_common import CanceledException
Expand Down Expand Up @@ -595,6 +596,17 @@ def current_scope() -> Optional[ProbeScope]:
return _current_scope.get()


def lock_reservation(reservation_bytes: int, device: torch.device) -> tuple[Optional[ProbeScope], int]:
"""What a lock on `device` keeps free for an estimate of `reservation_bytes`, and the calibration scope it locks
under: inside a scope open on this thread and on a GPU, that scope and the calibration reservation
(`calibration_reservation`); otherwise None and the estimate's bytes. The model loader applies it to a measured
lock, and a node to every lock beside one that must not use up the window's headroom."""
scope = current_scope()
if scope is None or device.type == "cpu":
return None, reservation_bytes
return scope, calibration_reservation(reservation_bytes)


class _EmptyCacheObserver:
"""Turns `TorchDevice.empty_cache` into segment boundaries of the open windows."""

Expand Down
3 changes: 2 additions & 1 deletion invokeai/backend/working_memory/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"invokeai.backend.moss_image.working_memory",
"invokeai.backend.util.vae_working_memory",
"invokeai.backend.z_image.denoise_working_memory",
"invokeai.backend.flux2.denoise_working_memory",
)
"""Every module that registers an `EstimatorSpec`. The registry holds only the specs of modules imported so far, so a
caller that needs all of them imports these (`import_estimator_modules`); `tests/backend/working_memory/` fails on a
Expand Down Expand Up @@ -46,7 +47,7 @@ class EstimatorSpec:
line: LineFunction = field(compare=False, repr=False)
"""The line an operation's features price on, their size on it, and whether a measurement of them fits it: the
AutoencoderKL convolution line in output pixels for every VAE estimator (`fit.convolution_line`), one in attended
tokens for the Z-Image denoise. Declared by every estimator, so a new one cannot inherit another's line, and with it
tokens for each denoise estimator. Declared by every estimator, so a new one cannot inherit another's line, and with it
which of its measurements join a fit."""
user_calibrated: bool = False
"""Whether a user's calibration moves this estimator: its windows fit user lines, its estimates read them, the
Expand Down
10 changes: 2 additions & 8 deletions invokeai/backend/z_image/denoise_working_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@
"""

from collections.abc import Mapping
from types import MappingProxyType
from typing import Final, Optional, cast

import torch
Expand All @@ -71,7 +70,7 @@
from invokeai.backend.util.attention import sdpa_score_matrix_bytes
from invokeai.backend.util.fp8 import peak_fp8_cast_transient_bytes
from invokeai.backend.working_memory.estimate import FeatureValue, WorkingMemoryEstimate, WorkingMemoryTerm
from invokeai.backend.working_memory.fit import Line
from invokeai.backend.working_memory.fit import Line, off_line_reasons
from invokeai.backend.working_memory.platform import platform_for
from invokeai.backend.working_memory.spec import EstimatorSpec, register

Expand All @@ -86,9 +85,6 @@
"""The dtypes `TorchDevice.choose_bfloat16_safe_dtype` runs the transformer in."""
_ELEMENT_SIZES: Final[Mapping[str, int]] = {"bf16": 2, "fp16": 2, "fp32": 4}
_COEFFICIENTS: Final = frozenset(f"{part}_denoise_{dtype}" for part in ("k", "b") for dtype in _ELEMENT_SIZES)
_UNPRICED: Final[Mapping[str, float]] = MappingProxyType(dict.fromkeys(_COEFFICIENTS, 0.0))
"""Coefficient values that price the fitted terms at nothing: what remains of a forward's terms is what it adds on top
of its line."""


def padded_tokens(tokens: int) -> int:
Expand Down Expand Up @@ -117,9 +113,7 @@ def _line(features: Mapping[str, FeatureValue]) -> Optional[Line]:
dtype, tokens = features.get("dtype"), features.get("tokens")
if not isinstance(dtype, str) or dtype not in _ELEMENT_SIZES or not isinstance(tokens, int):
return None
on_top = [term for term in _terms(features, _UNPRICED) if term.coefficient is None and term.bytes]
off_line = ["attention_mask"] if features.get("has_attention_mask") else []
off_line += [f"{term.name}={int(term.bytes)}" for term in on_top]
off_line = off_line_reasons(_terms, features, _COEFFICIENTS)
shape = f"{features.get('image_tokens')}+{features.get('text_tokens')}tok"
return Line(f"denoise_{dtype}", tokens, not off_line, "-".join(("denoise", dtype, shape, *off_line)))

Expand Down
Loading
Loading