From 056d53d5c5d34cd11f63462f08894fb3c8085d47 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 03:49:37 -0500 Subject: [PATCH 01/27] =?UTF-8?q?chore(k3):=20bump=20llama.cpp=20submodule?= =?UTF-8?q?=20to=20eee635ba2=20=E2=80=94=20K3=20serving=20stack=20onto=20c?= =?UTF-8?q?anary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Advances the vendored llama.cpp fork 30 commits (clean FF over canary's stale 66594cc3f): container-serve resident-override (LLAMA_RESIDENT_OVERRIDE), the rung-2 ResidencyCache plan-file consumer, the score-hint/generation-bias actuator, PagerCaptureEvent emit, fit-device --reserve-gb. Makes canary USE the K3 misfit-serving stack (measured 0.33 tok/s WASTE-parity on a 32GB card). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index 66594cc3f2..eee635ba2c 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit 66594cc3f2ed97a451cd9dc28ee0a81748d35704 +Subproject commit eee635ba2ceeb56d26d8f4c21864c006a8fd9872 From 2cffc807dc44e5996bd1429b2389615ec70d958f Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 00:07:13 -0500 Subject: [PATCH 02/27] docs(pager): RUN-1 K3 trace fixture + tkey->(layer,matrix) table for M5's replay Live GGML_MOE_TRACE_FILE slice (12B records: u64 tkey + u32 e) + the reverse table so BanditPlanController recovers (layer,expert): tkey=FNV-1a of blk.{layer}.ffn_{gate,up,down}_exps.weight, e=within-layer expert idx, expert identity=(layer,e) deduped across the 3 matrices. RUN-1 static-pin datum input. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../expert-pager/fixtures/README.md | 13 +++++++++++++ .../fixtures/k3-routed-access.trace | Bin 0 -> 1007616 bytes .../fixtures/tkey-to-layer-matrix.json | 1 + 3 files changed, 14 insertions(+) create mode 100644 docs/architecture/prototypes/expert-pager/fixtures/README.md create mode 100644 docs/architecture/prototypes/expert-pager/fixtures/k3-routed-access.trace create mode 100644 docs/architecture/prototypes/expert-pager/fixtures/tkey-to-layer-matrix.json diff --git a/docs/architecture/prototypes/expert-pager/fixtures/README.md b/docs/architecture/prototypes/expert-pager/fixtures/README.md new file mode 100644 index 0000000000..e4442e314e --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/fixtures/README.md @@ -0,0 +1,13 @@ +# RUN-1 trace fixture (for BanditPlanController replay → pin doc) + +- **`k3-routed-access.trace`** — live K3 GGML_MOE_TRACE_FILE slice. Binary, 12-byte + records in access order: `tkey` (u64 LE) + `e` (u32 LE). ~84k records (~19 decode + tokens; short — a longer slice can follow for the real datum). + - `tkey` = FNV-1a of the canonical tensor name `blk.{layer}.ffn_{gate,up,down}_exps.weight`. + - `e` = within-layer expert index. + - **An expert = `(layer, e)`**; its 3 matrices (gate/up/down) share `e` but have 3 + distinct `tkey`s — dedup to (layer, e) for the pin_list. +- **`tkey-to-layer-matrix.json`** — reverse table `{ "": {"layer":L,"matrix":"gate|up|down"} }` + for blk 0..95. Maps each record's `tkey` → layer; `e` is the expert. No v2 record needed. + +Emit self-check: `blk.5.ffn_up_exps.weight` → tkey `16542725649459479844`. diff --git a/docs/architecture/prototypes/expert-pager/fixtures/k3-routed-access.trace b/docs/architecture/prototypes/expert-pager/fixtures/k3-routed-access.trace new file mode 100644 index 0000000000000000000000000000000000000000..fba9d000f6dc39fd2f531970d37a572aa0a3524d GIT binary patch literal 1007616 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%0D^2?D+EIpB-O&?7m-*^K;{Sj2}3D@c7rpPapsG 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 literal 0 HcmV?d00001 diff --git a/docs/architecture/prototypes/expert-pager/fixtures/tkey-to-layer-matrix.json b/docs/architecture/prototypes/expert-pager/fixtures/tkey-to-layer-matrix.json new file mode 100644 index 0000000000..f37a66dcc1 --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/fixtures/tkey-to-layer-matrix.json @@ -0,0 +1 @@ +{"12718692288975307491": {"layer": 0, "matrix": "gate"}, "5850092159351821861": {"layer": 0, "matrix": "up"}, "8010271377723774476": {"layer": 0, "matrix": "down"}, "12815730709382331342": {"layer": 1, "matrix": "gate"}, "10833939323572182256": {"layer": 1, "matrix": "up"}, "8159583352718758557": {"layer": 1, "matrix": "down"}, "16235312745619135633": {"layer": 2, "matrix": "gate"}, "394445438703992719": {"layer": 2, "matrix": "up"}, "6047694541810317146": {"layer": 2, "matrix": "down"}, "2373852112892788620": {"layer": 3, "matrix": "gate"}, "14939617919330398402": {"layer": 3, "matrix": "up"}, "9341893991928316803": {"layer": 3, "matrix": "down"}, "5566871579019064263": {"layer": 4, "matrix": "gate"}, "2189520295401771497": {"layer": 4, "matrix": "up"}, "2362256804171128216": {"layer": 4, "matrix": "down"}, "801194725423308674": {"layer": 5, "matrix": "gate"}, "16542725649459479844": {"layer": 5, "matrix": "up"}, "9753576375971800697": {"layer": 5, "matrix": "down"}, "7924419790633405765": {"layer": 6, "matrix": "gate"}, "5332234556058427139": {"layer": 6, "matrix": "up"}, "2751906580383357622": {"layer": 6, "matrix": "down"}, "7935375635595193104": {"layer": 7, "matrix": "gate"}, "12457746053365817590": {"layer": 7, "matrix": "up"}, "12065554575766856287": {"layer": 7, "matrix": "down"}, "13875349774639401195": {"layer": 8, "matrix": "gate"}, "9186438895206602221": {"layer": 8, "matrix": "up"}, "15436263173992066964": {"layer": 8, "matrix": "down"}, "5858330437342675094": {"layer": 9, "matrix": "gate"}, "7815305910333800664": {"layer": 9, "matrix": "up"}, "3298912122773323173": {"layer": 9, "matrix": "down"}, "3842769157339008724": {"layer": 10, "matrix": "gate"}, "17120325551609730378": {"layer": 10, "matrix": "up"}, "11123220736901514603": {"layer": 10, "matrix": "down"}, "278842855929195737": {"layer": 11, "matrix": "gate"}, "7869120235621970583": {"layer": 11, "matrix": "up"}, "17775761953051175074": {"layer": 11, "matrix": "down"}, "7458480160361013334": {"layer": 12, "matrix": "gate"}, "12483910915017997976": {"layer": 12, "matrix": "up"}, "5937284486031730021": {"layer": 12, "matrix": "down"}, "17969212568230230187": {"layer": 13, "matrix": "gate"}, "11501842537423503021": {"layer": 13, "matrix": "up"}, "10508431175488579156": {"layer": 13, "matrix": "down"}, "3021162410982045240": {"layer": 14, "matrix": "gate"}, "6193593308530486974": {"layer": 14, "matrix": "up"}, "13113979904149584423": {"layer": 14, "matrix": "down"}, "16000335656672404045": {"layer": 15, "matrix": "gate"}, "9247552203556477003": {"layer": 15, "matrix": "up"}, "6627609424482825022": {"layer": 15, "matrix": "down"}, "2448011632643739978": {"layer": 16, "matrix": "gate"}, "13744005725733671404": {"layer": 16, "matrix": "up"}, "3171557273859451937": {"layer": 16, "matrix": "down"}, "2287639539740650159": {"layer": 17, "matrix": "gate"}, "4565628687703301425": {"layer": 17, "matrix": "up"}, "2939274808137463008": {"layer": 17, "matrix": "down"}, "624874040331450956": {"layer": 18, "matrix": "gate"}, "5574986631262328706": {"layer": 18, "matrix": "up"}, "10952851255958519875": {"layer": 18, "matrix": "down"}, "16780108568189794385": {"layer": 19, "matrix": "gate"}, "3022504202625128271": {"layer": 19, "matrix": "up"}, "12562678558123408154": {"layer": 19, "matrix": "down"}, "13163896481055935045": {"layer": 20, "matrix": "gate"}, "4462420701077083139": {"layer": 20, "matrix": "up"}, "7991383270805886902": {"layer": 20, "matrix": "down"}, "13174852326017722384": {"layer": 21, "matrix": "gate"}, "11587932198384473590": {"layer": 21, "matrix": "up"}, "17305031266189385567": {"layer": 21, "matrix": "down"}, "10806348269441593543": {"layer": 22, "matrix": "gate"}, "1319706440420427497": {"layer": 22, "matrix": "up"}, "7601733494593657496": {"layer": 22, "matrix": "down"}, "6040671415845837954": {"layer": 23, "matrix": "gate"}, "15672911794478135844": {"layer": 23, "matrix": "up"}, "14993053066394329977": {"layer": 23, "matrix": "down"}, "3028045362332113297": {"layer": 24, "matrix": "gate"}, "17971375657432200335": {"layer": 24, "matrix": "up"}, "11287171232232846426": {"layer": 24, "matrix": "down"}, "7613328803315317900": {"layer": 25, "matrix": "gate"}, "14069804064349054402": {"layer": 25, "matrix": "up"}, "14581370682350846083": {"layer": 25, "matrix": "down"}, "17958168979397836771": {"layer": 26, "matrix": "gate"}, "4980278304370477861": {"layer": 26, "matrix": "up"}, "13249748068146303756": {"layer": 26, "matrix": "down"}, "18055207399804860622": {"layer": 27, "matrix": "gate"}, "9964125468590838256": {"layer": 27, "matrix": "up"}, "13399060043141287837": {"layer": 27, "matrix": "down"}, "7357456938484260749": {"layer": 28, "matrix": "gate"}, "3250023213896142987": {"layer": 28, "matrix": "up"}, "14606297417755230846": {"layer": 28, "matrix": "down"}, "12425452458931825784": {"layer": 29, "matrix": "gate"}, "6968122418576990206": {"layer": 29, "matrix": "up"}, "2735704507261038183": {"layer": 29, "matrix": "down"}, "5196808140667320350": {"layer": 30, "matrix": "gate"}, "6262112351184760352": {"layer": 30, "matrix": "up"}, "12250534899502999085": {"layer": 30, "matrix": "down"}, "18061731047010371763": {"layer": 31, "matrix": "gate"}, "14841232909752460629": {"layer": 31, "matrix": "up"}, "2486160503407781276": {"layer": 31, "matrix": "down"}, "15649644041324489308": {"layer": 32, "matrix": "gate"}, "9457371938556532594": {"layer": 32, "matrix": "up"}, "4427000853369702355": {"layer": 32, "matrix": "down"}, "5985095897980119201": {"layer": 33, "matrix": "gate"}, "17509065149136280319": {"layer": 33, "matrix": "up"}, "5706338674667869738": {"layer": 33, "matrix": "down"}, "13545356615098927954": {"layer": 34, "matrix": "gate"}, "10243353994747051668": {"layer": 34, "matrix": "up"}, "9759327822825955465": {"layer": 34, "matrix": "down"}, "12858781007495853079": {"layer": 35, "matrix": "gate"}, "14734296278316018969": {"layer": 35, "matrix": "up"}, "10270628186595958632": {"layer": 35, "matrix": "down"}, "17632482478574960864": {"layer": 36, "matrix": "gate"}, "12503189964090755622": {"layer": 36, "matrix": "up"}, "5394869446165249135": {"layer": 36, "matrix": "down"}, "7542363458761905877": {"layer": 37, "matrix": "gate"}, "5624839375368032435": {"layer": 37, "matrix": "up"}, "18045040231258840646": {"layer": 37, "matrix": "down"}, "11871670799615360486": {"layer": 38, "matrix": "gate"}, "3626232080660254536": {"layer": 38, "matrix": "up"}, "403038805986683061": {"layer": 38, "matrix": "down"}, "10940466264586324859": {"layer": 39, "matrix": "gate"}, "8028289471401542173": {"layer": 39, "matrix": "up"}, "4166934695886349028": {"layer": 39, "matrix": "down"}, "14369992684352235831": {"layer": 40, "matrix": "gate"}, "8208795779690979257": {"layer": 40, "matrix": "up"}, "16016452519340699016": {"layer": 40, "matrix": "down"}, "14508549024734354930": {"layer": 41, "matrix": "gate"}, "5131542045921971892": {"layer": 41, "matrix": "up"}, "656954335471856425": {"layer": 41, "matrix": "down"}, "8436788853083979381": {"layer": 42, "matrix": "gate"}, "17644747839261068883": {"layer": 42, "matrix": "up"}, "6655995929249883238": {"layer": 42, "matrix": "down"}, "6842911374667809536": {"layer": 43, "matrix": "gate"}, "3867070010031575366": {"layer": 43, "matrix": "up"}, "12332826014738730255": {"layer": 43, "matrix": "down"}, "10979792231095395283": {"layer": 44, "matrix": "gate"}, "15221691312605609077": {"layer": 44, "matrix": "up"}, "3827588895147118524": {"layer": 44, "matrix": "down"}, "4320544689129190590": {"layer": 45, "matrix": "gate"}, "13026998108299641280": {"layer": 45, "matrix": "up"}, "4914953953069830861": {"layer": 45, "matrix": "down"}, "14016695988866996673": {"layer": 46, "matrix": "gate"}, "12302571192092666143": {"layer": 46, "matrix": "up"}, "1775593963058642890": {"layer": 46, "matrix": "down"}, "3694082950569131516": {"layer": 47, "matrix": "gate"}, "15546220243029102482": {"layer": 47, "matrix": "up"}, "17558858874778111347": {"layer": 47, "matrix": "down"}, "5135789346529314335": {"layer": 48, "matrix": "gate"}, "5361967781021394049": {"layer": 48, "matrix": "up"}, "7936187407618598992": {"layer": 48, "matrix": "down"}, "11887508391980646330": {"layer": 49, "matrix": "gate"}, "6965302714294463228": {"layer": 49, "matrix": "up"}, "6648356379831414737": {"layer": 49, "matrix": "down"}, "8764550802188133264": {"layer": 50, "matrix": "gate"}, "1096489733992850806": {"layer": 50, "matrix": "up"}, "12894729742359796447": {"layer": 50, "matrix": "down"}, "8753594957226345925": {"layer": 51, "matrix": "gate"}, "12417722310395011971": {"layer": 51, "matrix": "up"}, "3581081746976297782": {"layer": 51, "matrix": "down"}, "1630369892016248834": {"layer": 52, "matrix": "gate"}, "5181469330086513060": {"layer": 52, "matrix": "up"}, "10582751542564740857": {"layer": 52, "matrix": "down"}, "6396046745612004423": {"layer": 53, "matrix": "gate"}, "9275008049738356329": {"layer": 53, "matrix": "up"}, "3191431970764068376": {"layer": 53, "matrix": "down"}, "3203027279485728780": {"layer": 54, "matrix": "gate"}, "3578361599957431618": {"layer": 54, "matrix": "up"}, "10171069158521256963": {"layer": 54, "matrix": "down"}, "17064487912212075793": {"layer": 55, "matrix": "gate"}, "7479933193040577551": {"layer": 55, "matrix": "up"}, "6876869708403257306": {"layer": 55, "matrix": "down"}, "13644905875975271502": {"layer": 56, "matrix": "gate"}, "17919427077908767088": {"layer": 56, "matrix": "up"}, "8988758519311698717": {"layer": 56, "matrix": "down"}, "13547867455568247651": {"layer": 57, "matrix": "gate"}, "12935579913688406693": {"layer": 57, "matrix": "up"}, "8839446544316714636": {"layer": 57, "matrix": "down"}, "8015150935102236664": {"layer": 58, "matrix": "gate"}, "14923424027894919038": {"layer": 58, "matrix": "up"}, "16772147057141000679": {"layer": 58, "matrix": "down"}, "2947155414654671629": {"layer": 59, "matrix": "gate"}, "11205324823214071819": {"layer": 59, "matrix": "up"}, "10195995893925641726": {"layer": 59, "matrix": "down"}, "1574794374150530081": {"layer": 60, "matrix": "gate"}, "7017622684744657535": {"layer": 60, "matrix": "up"}, "1296037150838280618": {"layer": 60, "matrix": "down"}, "11239342517494900188": {"layer": 61, "matrix": "gate"}, "17412673547874461426": {"layer": 61, "matrix": "up"}, "16699329540113235": {"layer": 61, "matrix": "down"}, "13651429523180782643": {"layer": 62, "matrix": "gate"}, "4349790445360837845": {"layer": 62, "matrix": "up"}, "16522603053287743772": {"layer": 62, "matrix": "down"}, "786506616837731230": {"layer": 63, "matrix": "gate"}, "14217413960502689184": {"layer": 63, "matrix": "up"}, "7840233375673409965": {"layer": 63, "matrix": "down"}, "3132061934932316757": {"layer": 64, "matrix": "gate"}, "13580140984685961267": {"layer": 64, "matrix": "up"}, "13634738707429251526": {"layer": 64, "matrix": "down"}, "13222180954745371744": {"layer": 65, "matrix": "gate"}, "2011747499699132838": {"layer": 65, "matrix": "up"}, "984567922335660015": {"layer": 65, "matrix": "down"}, "8448479483666263959": {"layer": 66, "matrix": "gate"}, "4242853813924396185": {"layer": 66, "matrix": "up"}, "5860326662766369512": {"layer": 66, "matrix": "down"}, "9135055091269338834": {"layer": 67, "matrix": "gate"}, "18198655604064980500": {"layer": 67, "matrix": "up"}, "5349026298996366345": {"layer": 67, "matrix": "down"}, "8487492471866593001": {"layer": 68, "matrix": "gate"}, "9053424470911086663": {"layer": 68, "matrix": "up"}, "10740176992110575090": {"layer": 68, "matrix": "down"}, "13704599744334035044": {"layer": 69, "matrix": "gate"}, "12927025485472551034": {"layer": 69, "matrix": "up"}, "15065831476227540283": {"layer": 69, "matrix": "down"}, "10747550890754990186": {"layer": 70, "matrix": "gate"}, "6326009257252623372": {"layer": 70, "matrix": "up"}, "7983457240137156545": {"layer": 70, "matrix": "down"}, "18302044552542910031": {"layer": 71, "matrix": "gate"}, "12893137777166647121": {"layer": 71, "matrix": "up"}, "1063428527675512320": {"layer": 71, "matrix": "down"}, "8564723691790864344": {"layer": 72, "matrix": "gate"}, "6767135316065848798": {"layer": 72, "matrix": "up"}, "16085634296592407495": {"layer": 72, "matrix": "down"}, "8132189655448484205": {"layer": 73, "matrix": "gate"}, "3695802143603228523": {"layer": 73, "matrix": "up"}, "1912059264531900254": {"layer": 73, "matrix": "down"}, "6367797748470527606": {"layer": 74, "matrix": "gate"}, "18130694850557306808": {"layer": 74, "matrix": "up"}, "14336683315717093509": {"layer": 74, "matrix": "down"}, "5981302661696491979": {"layer": 75, "matrix": "gate"}, "2463471208790831309": {"layer": 75, "matrix": "up"}, "4969211382801716980": {"layer": 75, "matrix": "down"}, "3120911967544526964": {"layer": 76, "matrix": "gate"}, "7584947852931069930": {"layer": 76, "matrix": "up"}, "10378443494477101195": {"layer": 76, "matrix": "down"}, "8330248285662437497": {"layer": 77, "matrix": "gate"}, "4183286475951044535": {"layer": 77, "matrix": "up"}, "3091529228869638722": {"layer": 77, "matrix": "down"}, "13888105296976430690": {"layer": 78, "matrix": "gate"}, "17476360848225813124": {"layer": 78, "matrix": "up"}, "985738892316803673": {"layer": 78, "matrix": "down"}, "3157074428064212647": {"layer": 79, "matrix": "gate"}, "1267979659572699721": {"layer": 79, "matrix": "up"}, "5335610473452669560": {"layer": 79, "matrix": "down"}, "4025288497130409267": {"layer": 80, "matrix": "gate"}, "6885931300434531797": {"layer": 80, "matrix": "up"}, "6896462027237370396": {"layer": 80, "matrix": "down"}, "9607109664496909470": {"layer": 81, "matrix": "gate"}, "16753554815576383136": {"layer": 81, "matrix": "up"}, "16660836423332588205": {"layer": 81, "matrix": "down"}, "10395397421809708321": {"layer": 82, "matrix": "gate"}, "9553763539818351487": {"layer": 82, "matrix": "up"}, "10116640198497458858": {"layer": 82, "matrix": "down"}, "1613201491444526812": {"layer": 83, "matrix": "gate"}, "1502070329238603762": {"layer": 83, "matrix": "up"}, "8837302377199291475": {"layer": 83, "matrix": "down"}, "17269082531325442199": {"layer": 84, "matrix": "gate"}, "6778994668998090137": {"layer": 84, "matrix": "up"}, "14680929710425547752": {"layer": 84, "matrix": "down"}, "17955658138928517074": {"layer": 85, "matrix": "gate"}, "2288052385429122836": {"layer": 85, "matrix": "up"}, "14169629346655544585": {"layer": 85, "matrix": "down"}, "11952664982591494997": {"layer": 86, "matrix": "gate"}, "16116281839759655219": {"layer": 86, "matrix": "up"}, "4008597681378878150": {"layer": 86, "matrix": "down"}, "3596039928694998368": {"layer": 87, "matrix": "gate"}, "4547888354772826790": {"layer": 87, "matrix": "up"}, "9805170969994838255": {"layer": 87, "matrix": "down"}, "15350767788415913979": {"layer": 88, "matrix": "gate"}, "72987862083613341": {"layer": 88, "matrix": "up"}, "8577236219715938148": {"layer": 88, "matrix": "down"}, "16281972323444949606": {"layer": 89, "matrix": "gate"}, "14117674545051877320": {"layer": 89, "matrix": "up"}, "4813340329816272181": {"layer": 89, "matrix": "down"}, "7196847904768803436": {"layer": 90, "matrix": "gate"}, "13156700387618077474": {"layer": 90, "matrix": "up"}, "10896597615919211491": {"layer": 90, "matrix": "down"}, "12933718725107368689": {"layer": 91, "matrix": "gate"}, "1491756510404402287": {"layer": 91, "matrix": "up"}, "14958455356915878074": {"layer": 91, "matrix": "down"}, "13393727417108149422": {"layer": 92, "matrix": "gate"}, "10264856615866254800": {"layer": 92, "matrix": "up"}, "14238984085144373885": {"layer": 92, "matrix": "down"}, "11531878613401574979": {"layer": 93, "matrix": "gate"}, "3855139109013438725": {"layer": 93, "matrix": "up"}, "13682975342132335852": {"layer": 93, "matrix": "down"}, "11572265296366784880": {"layer": 94, "matrix": "gate"}, "2806842104711361622": {"layer": 94, "matrix": "up"}, "14326141603460171327": {"layer": 94, "matrix": "down"}, "17397243526867109157": {"layer": 95, "matrix": "gate"}, "8518118348108455011": {"layer": 95, "matrix": "up"}, "1390404471848498838": {"layer": 95, "matrix": "down"}} \ No newline at end of file From c19830a70ced055a55bb468a7234176d13693494 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Fri, 31 Jul 2026 23:25:07 -0500 Subject: [PATCH 03/27] docs(pager): reference RL-policy prototypes for M5's TierPolicy port MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The actual std-only Rust prototypes written against live K3 traces this session: trace_replay (recency beats LFU 3-4x), predictor (offline learned-decay +5pts held-out), online_predictor (bandit 49.8 vs 47.8 best-fixed on non-stationary), self_optimize (joint speed×quality). These are the faithful-port source for the learned policy behind TierPolicy (continuum-core expert_tier_policy.rs, #276). Numbers are properties of these exact constants + reward math — reproduce before improving. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../prototypes/expert-pager/README.md | 18 ++ .../expert-pager/online_predictor.rs | 121 ++++++++++++ .../prototypes/expert-pager/predictor.rs | 117 +++++++++++ .../prototypes/expert-pager/self_optimize.rs | 90 +++++++++ .../prototypes/expert-pager/trace_replay.rs | 184 ++++++++++++++++++ 5 files changed, 530 insertions(+) create mode 100644 docs/architecture/prototypes/expert-pager/README.md create mode 100644 docs/architecture/prototypes/expert-pager/online_predictor.rs create mode 100644 docs/architecture/prototypes/expert-pager/predictor.rs create mode 100644 docs/architecture/prototypes/expert-pager/self_optimize.rs create mode 100644 docs/architecture/prototypes/expert-pager/trace_replay.rs diff --git a/docs/architecture/prototypes/expert-pager/README.md b/docs/architecture/prototypes/expert-pager/README.md new file mode 100644 index 0000000000..0c86857fac --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/README.md @@ -0,0 +1,18 @@ +# Expert-Pager Policy Prototypes (reference for the TierPolicy port) + +Std-only Rust reference implementations of the MoE residency policy, written on +BigMama against live K3 traces. **These are the source of truth for M5's port of +the learned policy behind `TierPolicy`** (`core/continuum-core/src/capacity/expert_tier_policy.rs`). +Port faithfully first — the measured numbers below are properties of these exact +constants + reward math — then improve. + +| File | What it is | Measured | +|---|---|---| +| `trace_replay.rs` | Replays an ordered expert-access trace (`GGML_MOE_TRACE_FILE`), scores residency policies | recency window beats LFU 3-4x; reuse compounds with gen length | +| `predictor.rs` | Offline learned-decay predictor (recency↔frequency EMA) | +5 pts held-out over pure recency | +| `online_predictor.rs` | Online bandit over decay candidates (the v2 `TierPolicy` body) | beats best-fixed on non-stationary: 49.8% vs 47.8% | +| `self_optimize.rs` | Joint speed×quality objective sweep (cruft-fraction ↔ tok/s ↔ quality) | ~1.2 tok/s @ 88% quality balanced (modelled) | + +Reward signal = the live per-token `PagerCaptureEvent` (fetched_bytes / fault_ms / tok_s). +Actuator knobs the policy emits (v1 control-file `GGML_MOE_PLAN_FILE`): `budget_bytes`, +`window_k`, `pin_list[{layer,expert}]`. See `docs/architecture/EXPERT-PAGING-CONTROL-LAW.md`. diff --git a/docs/architecture/prototypes/expert-pager/online_predictor.rs b/docs/architecture/prototypes/expert-pager/online_predictor.rs new file mode 100644 index 0000000000..40c9e483aa --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/online_predictor.rs @@ -0,0 +1,121 @@ +// online_predictor — the pager LEARNS FROM RUNNING IN THE SYSTEM (Joel). Offline sim is the warm start; +// this reinforcement-optimizes ONLINE. "Only requires scoring everything": the system emits the reward +// (realized hit-rate per token — a proxy for -fault_wait / +tok/s), and a bandit over the policy adapts +// to maximize it. Policy = per-expert EMA activation score; the ACTION is the decay (recency<->frequency +// dial). We run N decay candidates in parallel, each scored by its realized hit each token (a contextual +// multi-armed bandit); the running SYSTEM uses the current best-scoring arm, and the arm weights track +// the workload — so when locality shifts (non-stationary), the online learner follows where a fixed decay +// can't. std-only Rust; this is the ServingExpertPager's online-adaptation loop in miniature. +use std::collections::{HashMap, HashSet}; + +fn load(path: &str) -> (Vec, Vec) { + let d = std::fs::read(path).expect("trace"); + let n = d.len() / 12; + let (mut uid, mut tk) = (Vec::with_capacity(n), Vec::with_capacity(n)); + for i in 0..n { + let o = i * 12; + let mut k = [0u8; 8]; k.copy_from_slice(&d[o..o + 8]); + let mut e = [0u8; 4]; e.copy_from_slice(&d[o + 8..o + 12]); + let key = u64::from_le_bytes(k); let eid = u32::from_le_bytes(e) as u64; + uid.push(key.rotate_left(9) ^ (eid.wrapping_mul(0x9E3779B97F4A7C15))); tk.push(key); + } + (uid, tk) +} +fn decode_tokens(uid: &[u64], tk: &[u64]) -> Vec> { + let mut b = vec![0usize]; let mut cur = HashSet::new(); let mut prev: Option = None; + for (i, &k) in tk.iter().enumerate() { + if prev != Some(k) { if cur.contains(&k) { b.push(i); cur.clear(); } cur.insert(k); prev = Some(k); } + } + b.push(tk.len()); + let mut sets: Vec> = b.windows(2).map(|w| uid[w[0]..w[1]].iter().copied().collect()).collect(); + let mut sz: Vec = sets.iter().map(|s| s.len()).collect(); sz.sort(); + let med = if sz.is_empty() { 0 } else { sz[sz.len()/2] }; + sets.retain(|s| s.len() >= med/2 && s.len() <= med*3/2); sets +} + +// one policy arm: its own EMA score map at a fixed decay +struct Arm { decay: f64, score: HashMap, reward: f64 } +impl Arm { + fn new(decay: f64) -> Self { Arm { decay, score: HashMap::new(), reward: 0.0 } } + fn predict(&self, budget: usize) -> HashSet { + let mut v: Vec<(f64, u64)> = self.score.iter().map(|(&k,&s)|(s,k)).collect(); + let b = budget.min(v.len()); if b == 0 { return HashSet::new(); } + let idx = (b-1).min(v.len()-1); + v.select_nth_unstable_by(idx, |a,c| c.0.partial_cmp(&a.0).unwrap()); + v[..b].iter().map(|x| x.1).collect() + } + fn update(&mut self, tok: &HashSet) { + for s in self.score.values_mut() { *s *= self.decay; } + for &e in tok { *self.score.entry(e).or_insert(0.0) += 1.0; } + } +} + +// run: for each token predict (each arm), reward = realized hit; SYSTEM uses best-reward arm. +// returns (online-adaptive avg hit%, per-arm fixed avg hit%). +fn run(tokens: &[HashSet], budget: usize) -> (f64, Vec<(f64, f64)>) { + let decays = [0.0f64, 0.3, 0.6, 0.85, 0.95, 0.99]; + let mut arms: Vec = decays.iter().map(|&d| Arm::new(d)).collect(); + let alpha = 0.3; // reward-EMA rate (how fast the bandit adapts) + let (mut online_hit, mut cnt) = (0.0f64, 0usize); + let mut fixed_hit = vec![0.0f64; arms.len()]; + for (t, tok) in tokens.iter().enumerate() { + if t > 0 { + // pick the SYSTEM arm = current best realized reward (argmax; ties -> first) + let best = arms.iter().enumerate().max_by(|a,b| a.1.reward.partial_cmp(&b.1.reward).unwrap()).unwrap().0; + for (i, arm) in arms.iter_mut().enumerate() { + let resident = arm.predict(budget); + let h = tok.iter().filter(|e| resident.contains(e)).count() as f64 / tok.len() as f64; + arm.reward = (1.0 - alpha) * arm.reward + alpha * h; // SCORE EVERYTHING: realized hit is the reward + fixed_hit[i] += h; + if i == best { online_hit += h; } + } + cnt += 1; + } else { + for arm in arms.iter_mut() { let _ = arm.predict(budget); } // warm + } + for arm in arms.iter_mut() { arm.update(tok); } + } + let per_arm = decays.iter().zip(fixed_hit.iter()).map(|(&d,&h)| (d, if cnt>0 { h/cnt as f64*100.0 } else {0.0})).collect(); + (if cnt>0 { online_hit/cnt as f64*100.0 } else {0.0}, per_arm) +} + +// synthetic NON-STATIONARY trace: phase A strong recency (walk), phase B strong frequency (fixed hot set). +fn synth_nonstationary() -> Vec> { + let mut rng = 0x9E3779B97F4A7C15u64; + let mut r = || { rng = rng.wrapping_mul(6364136223846793005).wrapping_add(1); rng >> 20 }; + let per = 4000usize; + let mut toks = Vec::new(); + // phase A: each token = 70% of previous token's experts + 30% fresh (recency dominates) + let mut prev: Vec = (0..per as u64).collect(); + for _ in 0..15 { + let mut s: HashSet = prev.iter().take(per*7/10).copied().collect(); + while s.len() < per { s.insert(1_000_000 + (r() % 2_000_000)); } + prev = s.iter().copied().collect(); toks.push(s); + } + // phase B: 60% from a FIXED hot pool of 2*per + 40% random tail (frequency dominates) + let hot: Vec = (5_000_000..5_000_000 + (per as u64*2)).collect(); + for _ in 0..15 { + let mut s: HashSet = HashSet::new(); + while s.len() < per*6/10 { s.insert(hot[(r() as usize) % hot.len()]); } + while s.len() < per { s.insert(9_000_000 + (r() % 5_000_000)); } + toks.push(s); + } + toks +} + +fn main() { + let args: Vec = std::env::args().collect(); + let (tokens, label) = if args.len() > 1 { + let (uid, tk) = load(&args[1]); (decode_tokens(&uid, &tk), format!("real K3 trace ({})", args[1])) + } else { (synth_nonstationary(), "synthetic NON-STATIONARY (recency->frequency shift)".to_string()) }; + let n = tokens.len(); + let budget = tokens.get(1).map(|s| s.len()).unwrap_or(4000) * 3 / 2; + println!("== {} ==\ntokens: {} budget: {} experts\n", label, n, budget); + let (online, per_arm) = run(&tokens, budget); + println!("{:>10} {:>10}", "decay", "fixed hit%"); + for (d, h) in &per_arm { println!("{:>10.2} {:>9.1}%", d, h); } + let best_fixed = per_arm.iter().map(|x| x.1).fold(0.0, f64::max); + println!("\n ONLINE-ADAPTIVE (bandit) : {:.1}%", online); + println!(" best FIXED decay : {:.1}%", best_fixed); + println!(" => online {} best-fixed by {:.1} pts", if online >= best_fixed {"MATCHES/beats"} else {"trails"}, (online-best_fixed).abs()); +} diff --git a/docs/architecture/prototypes/expert-pager/predictor.rs b/docs/architecture/prototypes/expert-pager/predictor.rs new file mode 100644 index 0000000000..681d6b3986 --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/predictor.rs @@ -0,0 +1,117 @@ +// predictor — v2 policy: a LEARNED residency predictor trained on the real K3 access trace ("train from +// the simulation"). Per-expert EMA activation score with a LEARNED decay (decay->0 = pure recency / +// last-token; decay->1 = pure frequency / LFU; the sweet spot in between is what we learn). Each token +// the resident set = the top-B experts by score. We TRAIN the decay on the early tokens and REPORT the +// hit-rate on held-out later tokens, vs the recency-window (last-K) and LFU and Belady-OPT baselines. +// std-only Rust; this is the ServingExpertPager v2 policy in miniature (the seam's swappable body). +use std::collections::{HashMap, HashSet}; + +fn load(path: &str) -> (Vec, Vec) { + let d = std::fs::read(path).expect("trace"); + let n = d.len() / 12; + let (mut uid, mut tk) = (Vec::with_capacity(n), Vec::with_capacity(n)); + for i in 0..n { + let o = i * 12; + let mut k = [0u8; 8]; k.copy_from_slice(&d[o..o + 8]); + let key = u64::from_le_bytes(k); + let mut e = [0u8; 4]; e.copy_from_slice(&d[o + 8..o + 12]); + let eid = u32::from_le_bytes(e) as u64; + uid.push(key.rotate_left(9) ^ (eid.wrapping_mul(0x9E3779B97F4A7C15))); + tk.push(key); + } + (uid, tk) +} + +// token boundaries: a tensor key repeats 16x within its group; a boundary is when a key ALREADY seen +// this token reappears (cycle wrapped). Then keep only DECODE tokens (modal size band). +fn decode_tokens(uid: &[u64], tk: &[u64]) -> Vec> { + let mut bounds = vec![0usize]; + let mut cur: HashSet = HashSet::new(); + let mut prev: Option = None; + for (i, &k) in tk.iter().enumerate() { + if prev != Some(k) { + if cur.contains(&k) { bounds.push(i); cur.clear(); } + cur.insert(k); prev = Some(k); + } + } + bounds.push(tk.len()); + let mut sets: Vec> = Vec::new(); + for w in bounds.windows(2) { sets.push(uid[w[0]..w[1]].to_vec()); } + let mut sizes: Vec = sets.iter().map(|s| s.len()).collect(); sizes.sort(); + let med = sizes[sizes.len() / 2]; + sets.into_iter().filter(|s| s.len() >= med / 2 && s.len() <= med * 3 / 2).collect() +} + +// EMA predictor: hit-rate over a token RANGE at a given decay + budget B. Predicts token t (t in range) +// from scores accumulated over tokens < t; then updates scores with token t. +fn ema_hitrate(tokens: &[HashSet], decay: f64, budget: usize, range: std::ops::Range) -> f64 { + let mut score: HashMap = HashMap::new(); + let (mut hit, mut cnt) = (0.0f64, 0usize); + for (t, tok) in tokens.iter().enumerate() { + if range.contains(&t) && t > 0 { + // resident = top-B by score + let mut v: Vec<(f64, u64)> = score.iter().map(|(&k, &s)| (s, k)).collect(); + let b = budget.min(v.len()); + if b == 0 { continue; } + let idx = (b - 1).min(v.len() - 1); + v.select_nth_unstable_by(idx, |a, c| c.0.partial_cmp(&a.0).unwrap()); + let resident: HashSet = v[..b].iter().map(|x| x.1).collect(); + let h = tok.iter().filter(|e| resident.contains(e)).count(); + hit += h as f64 / tok.len() as f64; cnt += 1; + } + for s in score.values_mut() { *s *= decay; } + for &e in tok { *score.entry(e).or_insert(0.0) += 1.0; } + } + if cnt > 0 { hit / cnt as f64 * 100.0 } else { 0.0 } +} + +fn persistence(tokens: &[HashSet], k: usize, range: std::ops::Range) -> (f64, f64) { + let (mut hit, mut cnt, mut usz) = (0.0f64, 0usize, 0.0f64); + for t in range { + if t < k { continue; } + let mut u: HashSet = HashSet::new(); + for j in 1..=k { u.extend(tokens[t - j].iter().copied()); } + let h = tokens[t].iter().filter(|e| u.contains(e)).count(); + hit += h as f64 / tokens[t].len() as f64; usz += u.len() as f64; cnt += 1; + } + if cnt > 0 { (hit / cnt as f64 * 100.0, usz / cnt as f64) } else { (0.0, 0.0) } +} + +fn main() { + let path = std::env::args().nth(1).expect("usage: predictor "); + let (uid, tk) = load(&path); + let toks_v = decode_tokens(&uid, &tk); + let tokens: Vec> = toks_v.iter().map(|s| s.iter().copied().collect()).collect(); + let tokens = &tokens[..]; + let n = tokens.len(); + println!("decode tokens: {} (modal size ~{})", n, tokens.get(0).map(|s| s.len()).unwrap_or(0)); + if n < 4 { println!("too few decode tokens to train/test"); return; } + let split = n / 2; // train on [1,split), test on [split,n) + let budget = tokens[1.min(n-1)].len() * 3 / 2; // ~1.5 tokens' worth of experts resident + println!("train tokens 1..{}, TEST {}..{}, budget {} experts (~1.5 tokens)\n", split, split, n, budget); + + // TRAIN: sweep decay on the train range, pick the best + let decays = [0.0, 0.3, 0.5, 0.7, 0.85, 0.9, 0.95, 0.99]; + let mut best = (-1.0f64, 0.0f64); + println!("{:>7} {:>12}", "decay", "train hit%"); + for &d in &decays { + let h = ema_hitrate(tokens, d, budget, 1..split); + println!("{:>7.2} {:>11.1}%", d, h); + if h > best.0 { best = (h, d); } + } + let learned_decay = best.1; + println!("\n=> learned decay = {:.2} (train {:.1}%)\n", learned_decay, best.0); + + // TEST (held-out): learned predictor vs baselines + let ema_test = ema_hitrate(tokens, learned_decay, budget, split..n); + let (p1, _) = persistence(tokens, 1, split..n); + let (p2, _) = persistence(tokens, 2, split..n); + let lfu_test = ema_hitrate(tokens, 0.99, budget, split..n); // decay~1 = frequency = LFU-ish + let rec_test = ema_hitrate(tokens, 0.0, budget, split..n); // decay=0 = pure last-token recency + println!("HELD-OUT hit-rate (test tokens {}..{}, budget {} experts):", split, n, budget); + println!(" LEARNED EMA (decay {:.2}) : {:.1}%", learned_decay, ema_test); + println!(" pure recency (decay 0) : {:.1}%", rec_test); + println!(" pure frequency (decay .99): {:.1}%", lfu_test); + println!(" persistence last-1 token : {:.1}%", p1); + println!(" persistence last-2 tokens: {:.1}%", p2); +} diff --git a/docs/architecture/prototypes/expert-pager/self_optimize.rs b/docs/architecture/prototypes/expert-pager/self_optimize.rs new file mode 100644 index 0000000000..b80727eae4 --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/self_optimize.rs @@ -0,0 +1,90 @@ +// self_optimize — K3 self-optimizing the JOINT objective: best TOKEN RATE *and* QUALITY (Joel). +// The full control law scoring both. The lever is the tier allocation (all-star sharp vs cruft low): +// more cruft -> smaller resident footprint -> more experts fit -> higher hit-rate -> faster tok/s, +// BUT lower quality (distortion from the low-bit cruft). Less cruft -> higher quality, slower. +// The self-optimizer searches the policy (residency budget-use via cruft_fraction, + the recency decay +// that sets hit-rate) to maximize w*norm(tok/s) + (1-w)*quality , online. Grounded in EVERY measured +// constant from this session; the trace supplies the real hit-rate-vs-residency curve. Swap the modelled +// tok/s / quality for the LIVE serving timing + perplexity-delta and this same loop optimizes for real. +use std::collections::HashSet; + +// ---- MEASURED constants (BigMama, this session) ---- +const WS_EXPERTS: f64 = 4416.0; // activated matrix-experts / token (16 routed x 3 mat x 92 layers) +const FULL_MB: f64 = 2.44; // avg full expert record (IQ2) MB +const CRUFT_MB: f64 = 1.10; // cruft tier (~IQ1 / RVQ stage-0) MB (~0.45x) +const BW_GBs: f64 = 3.0; // aligned NVMe GB/s (proven) +const COMPUTE_S: f64 = 0.12; // GPU compute floor / token when fetch is hidden (generous) +const RAM_GB: f64 = 20.0; // residency budget freed after the fitted-K3 structural fix + +// ---- trace: hit-rate as a function of how many experts are resident (real K3 persistence curve) ---- +fn load_tokens(path: &str) -> Vec> { + let d = std::fs::read(path).expect("trace"); let n = d.len()/12; + let (mut uid, mut tk) = (Vec::with_capacity(n), Vec::with_capacity(n)); + for i in 0..n { let o=i*12; + let mut k=[0u8;8]; k.copy_from_slice(&d[o..o+8]); let mut e=[0u8;4]; e.copy_from_slice(&d[o+8..o+12]); + let key=u64::from_le_bytes(k); let eid=u32::from_le_bytes(e) as u64; + uid.push(key.rotate_left(9)^(eid.wrapping_mul(0x9E3779B97F4A7C15))); tk.push(key); } + let mut b=vec![0usize]; let mut cur=HashSet::new(); let mut prev:Option=None; + for (i,&k) in tk.iter().enumerate(){ if prev!=Some(k){ if cur.contains(&k){b.push(i);cur.clear();} cur.insert(k); prev=Some(k);}} + b.push(tk.len()); + let mut s:Vec>=b.windows(2).map(|w| uid[w[0]..w[1]].iter().copied().collect()).collect(); + let mut z:Vec=s.iter().map(|x|x.len()).collect(); z.sort(); let med=if z.is_empty(){0}else{z[z.len()/2]}; + s.retain(|x| x.len()>=med/2 && x.len()<=med*3/2); s +} +// hit-rate at a residency of `cap` experts, LRU-by-recency over the trace (matches the measured curve) +fn hit_at(tokens: &[HashSet], cap: usize) -> f64 { + if tokens.len()<2 { return 0.0; } + let (mut hit,mut cnt)=(0.0f64,0usize); + for t in 1..tokens.len() { + // resident = union of most-recent tokens until cap filled (recency window) + let mut res:HashSet=HashSet::new(); let mut k=1; + while res.len() (tok_s, quality 0..1) +fn eval(tokens:&[HashSet], c:f64) -> (f64,f64) { + // resident experts that fit RAM at avg tier size (mix of full + cruft) + let avg_mb = (1.0-c)*FULL_MB + c*CRUFT_MB; + let cap = ((RAM_GB*1024.0)/avg_mb) as usize; + let hit = hit_at(tokens, cap); + // misses fetched at the CRUFT tier (cold experts served low-bit to go fast); bytes/token: + let miss_experts = WS_EXPERTS*(1.0-hit); + let miss_gb = miss_experts*CRUFT_MB/1024.0; + let tok_s = 1.0/(miss_gb/BW_GBs + COMPUTE_S); + // quality: 1 - (fraction of the WORKING SET served at cruft) * per-cruft distortion. + // resident all-stars are full-fidelity; the cruft-tier resident + all misses cost quality. + let served_cruft = c*hit + (1.0-hit); // resident-cruft (c of hits) + all misses + let quality = 1.0 - served_cruft*0.22; // ~0.22 rel. distortion IQ2->IQ1 (before compensation-LoRA) + (tok_s, quality) +} + +fn main() { + let path = std::env::args().nth(1).expect("usage: self_optimize "); + let tokens = load_tokens(&path); + println!("K3 SELF-OPTIMIZE (measured: {} experts/token, {:.2}MB full / {:.2}MB cruft, {} GB/s, {} GB residency)", + WS_EXPERTS as u64, FULL_MB, CRUFT_MB, BW_GBs, RAM_GB as u64); + println!("decode tokens in trace: {}\n", tokens.len()); + + // frontier: sweep cruft_fraction, show the speed<->quality trade + println!("{:>8} {:>8} {:>9} {:>8}", "cruft%", "tok/s", "quality", "residentK"); + let mut pts=vec![]; + for i in 0..=10 { let c=i as f64/10.0; let (ts,q)=eval(&tokens,c); + let cap=((RAM_GB*1024.0)/((1.0-c)*FULL_MB+c*CRUFT_MB)) as usize; + println!("{:>7.0}% {:>8.2} {:>8.1}% {:>7}", c*100.0, ts, q*100.0, cap/1000); + pts.push((c,ts,q)); } + + // self-optimize for 3 operator preferences w = weight on SPEED (rest on quality). Normalize tok/s to a ceiling. + let ts_max = pts.iter().map(|p|p.1).fold(0.0,f64::max); + println!("\nself-optimized operating point per preference (reward = w*tok/s_norm + (1-w)*quality):"); + for &(name,w) in &[("quality-first",0.25f64),("balanced",0.5),("speed-first",0.8)] { + let best = pts.iter().cloned().max_by(|a,b| + (w*a.1/ts_max+(1.0-w)*a.2).partial_cmp(&(w*b.1/ts_max+(1.0-w)*b.2)).unwrap()).unwrap(); + println!(" {:>13} (w={:.2}): cruft {:>3.0}% -> {:.2} tok/s, {:.1}% quality", + name, w, best.0*100.0, best.1, best.2*100.0); + } + println!("\n(LIVE: swap modelled tok/s for serving timing + quality for perplexity-delta; the online\n bandit then reinforcement-optimizes this SAME reward, per workload, adapting the operating point.)"); +} diff --git a/docs/architecture/prototypes/expert-pager/trace_replay.rs b/docs/architecture/prototypes/expert-pager/trace_replay.rs new file mode 100644 index 0000000000..628e2e12e1 --- /dev/null +++ b/docs/architecture/prototypes/expert-pager/trace_replay.rs @@ -0,0 +1,184 @@ +// trace_replay — replay a real MoE expert-access trace against residency policies to measure the +// achievable hit-rate and activation skew. Decides whether a residency PREDICTOR can win (skewed reuse) +// or the box is working-set-bound (near-uniform => needs regional quant / grid). std-only Rust; the same +// replay+policy logic is what the production predictor in continuum-core's pager will run — no Python. +// +// Trace format: repeated (u64 tensor_key LE, u32 expert_id LE) — one record per activated expert, in +// access order (from GGML_MOE_TRACE_FILE). Unique expert identity = (tensor_key, expert_id). +use std::collections::{HashMap, HashSet, BinaryHeap}; +use std::cmp::Reverse; + +const AVG_BYTES: f64 = 2.6 * 1024.0 * 1024.0; + +fn load(path: &str) -> (Vec, Vec) { + let data = std::fs::read(path).expect("read trace"); + let rec = 12usize; // u64 + u32 + let n = data.len() / rec; + let mut uid = Vec::with_capacity(n); + let mut tkey = Vec::with_capacity(n); + for i in 0..n { + let o = i * rec; + let mut k = [0u8; 8]; k.copy_from_slice(&data[o..o + 8]); + let key = u64::from_le_bytes(k); + let mut e = [0u8; 4]; e.copy_from_slice(&data[o + 8..o + 12]); + let eid = u32::from_le_bytes(e) as u64; + // combine to a single stable id (key is already a 64-bit hash; expert_id < 2^20) + uid.push(key.rotate_left(9) ^ (eid.wrapping_mul(0x9E3779B97F4A7C15))); + tkey.push(key); + } + (uid, tkey) +} + +// token boundaries: each MoE tensor fires once per token but writes ONE record per selected expert, so a +// tensor_key repeats consecutively (16x) within its group. Collapse consecutive dups to the tensor +// sequence; a boundary is when a tensor key ALREADY seen this token reappears (the cycle wrapped). +fn token_boundaries(tkey: &[u64]) -> Vec { + let mut b = vec![0usize]; + let mut cur: HashSet = HashSet::new(); + let mut prev: Option = None; + for (i, &k) in tkey.iter().enumerate() { + if prev != Some(k) { // new tensor group + if cur.contains(&k) { b.push(i); cur.clear(); } + cur.insert(k); + prev = Some(k); + } + } + b.push(tkey.len()); + b +} + +fn sim_lru(seq: &[u64], cap: usize) -> f64 { + let mut pos: HashMap = HashMap::new(); // id -> last tick + let mut order: std::collections::BTreeMap = std::collections::BTreeMap::new(); // tick -> id + let mut tick = 0u64; let mut hits = 0u64; + for &x in seq { + tick += 1; + if let Some(&old) = pos.get(&x) { order.remove(&old); hits += 1; } + else if pos.len() >= cap { + if let Some((&t, &vid)) = order.iter().next() { order.remove(&t); pos.remove(&vid); } + } + pos.insert(x, tick); order.insert(tick, x); + } + hits as f64 / seq.len() as f64 +} + +fn sim_lfu(seq: &[u64], cap: usize) -> f64 { + let mut freq: HashMap = HashMap::new(); + let mut resident: HashSet = HashSet::new(); + let mut heap: BinaryHeap> = BinaryHeap::new(); // (freq, id) min-heap + let mut hits = 0u64; + for &x in seq { + let f = freq.entry(x).or_insert(0); *f += 1; let nf = *f; + if resident.contains(&x) { hits += 1; } + else { + if resident.len() >= cap { + while let Some(Reverse((hf, hid))) = heap.pop() { + if resident.contains(&hid) && freq[&hid] == hf { resident.remove(&hid); break; } + } + } + resident.insert(x); + } + heap.push(Reverse((nf, x))); + } + hits as f64 / seq.len() as f64 +} + +fn sim_opt(seq: &[u64], cap: usize) -> f64 { + let n = seq.len(); + let mut next = vec![n; n]; + let mut last: HashMap = HashMap::new(); + for i in (0..n).rev() { next[i] = *last.get(&seq[i]).unwrap_or(&n); last.insert(seq[i], i); } + let mut resident: HashSet = HashSet::new(); + let mut heap: BinaryHeap<(usize, u64)> = BinaryHeap::new(); // (next_use, id) max-heap + let mut hits = 0u64; + for i in 0..n { + let x = seq[i]; + if resident.contains(&x) { hits += 1; } + else { + if resident.len() >= cap { + while let Some((nu, hid)) = heap.pop() { + if resident.contains(&hid) && nu >= i { resident.remove(&hid); break; } + } + } + resident.insert(x); + } + heap.push((next[i], x)); + } + hits as f64 / n as f64 +} + +fn main() { + let path = std::env::args().nth(1).expect("usage: trace_replay "); + let (uid, tkey) = load(&path); + let n = uid.len(); + let uniq: HashSet = uid.iter().copied().collect(); + let u = uniq.len(); + println!("accesses={} unique_experts={} ({:.1} GB if all resident)", n, u, u as f64 * AVG_BYTES / 1e9); + + // reuse vs horizon (does cross-token reuse climb with more tokens?) + let b = token_boundaries(&tkey); + let ntok = b.len() - 1; + println!("\ntokens detected: {}", ntok); + println!("{:>7} {:>10} {:>9} {:>18}", "tokens", "accesses", "unique", "repeat%(OPT ceil)"); + let mut probes: Vec = vec![2,4,8,12,16,24,32,48,ntok]; + probes.sort(); probes.dedup(); + for t in probes { if t < 1 || t > ntok { continue; } + let pref = &uid[..b[t]]; + let uu: HashSet = pref.iter().copied().collect(); + let rep = (pref.len() - uu.len()) as f64 / pref.len() as f64 * 100.0; + println!("{:>7} {:>10} {:>9} {:>17.1}%", t, pref.len(), uu.len(), rep); + } + + // PERSISTENCE PREDICTOR: predict this token's active experts = last token's active set. Measures the + // token-to-token overlap = recall of a trivial "keep last token resident" predictor. If high, a cheap + // predictor beats LFU and enables prefetch (overlap I/O with compute). Reported per-token-pair, decode + // only (skip the prefill union at token 0). Also last-K-token UNION recall (keep a rolling window). + { + let mut sets: Vec> = Vec::new(); + for t in 0..ntok { sets.push(uid[b[t]..b[t+1]].iter().copied().collect()); } + // DECODE tokens only: a single-token compute has ~4416 experts; prefill unions are much larger and + // batched-imperfectly-segmented. Filter to the modal decode size band to measure clean persistence. + let med = { let mut v: Vec = sets.iter().map(|s| s.len()).collect(); v.sort(); v[v.len()/2] }; + let decode: Vec<&HashSet> = sets.iter().filter(|s| s.len() <= med*3/2 && s.len() >= med/2).collect(); + println!("(decode tokens: {} of {} groups, modal size ~{})", decode.len(), ntok, med); + if decode.len() >= 2 { + for k in [1usize, 2, 4, 8] { + if k >= decode.len() { continue; } + let (mut rec, mut cnt) = (0.0f64, 0usize); + for t in k..decode.len() { + let mut union: HashSet = HashSet::new(); + for j in 1..=k { union.extend(decode[t-j].iter().copied()); } + let hit = decode[t].iter().filter(|e| union.contains(e)).count(); + rec += hit as f64 / decode[t].len() as f64; cnt += 1; + let _ = union.len(); + } + let avg = if cnt>0 { rec/cnt as f64*100.0 } else {0.0}; + let usz: f64 = { let mut s=0.0; for t in k..decode.len(){ let mut u=HashSet::new(); for j in 1..=k{u.extend(decode[t-j].iter().copied());} s+=u.len() as f64;} s/(decode.len()-k) as f64 }; + println!("persistence: keep last {:>1} token(s) ({:>6.0} experts, {:>4.1} GB) -> {:.1}% of next token already resident", + k, usz, usz*AVG_BYTES/1e9, avg); + } + } + } + + // skew + let mut freq: HashMap = HashMap::new(); + for &x in &uid { *freq.entry(x).or_insert(0) += 1; } + let mut fs: Vec = freq.values().copied().collect(); + fs.sort_unstable_by(|a, b| b.cmp(a)); + println!("\nskew (full trace):"); + for pct in [0.01, 0.05, 0.10, 0.25, 0.50] { + let k = ((u as f64 * pct) as usize).max(1); + let cov: u64 = fs[..k].iter().sum(); + println!(" top {:>4.0}% experts ({:>6}) cover {:>5.1}% of accesses", pct*100.0, k, cov as f64 / n as f64 * 100.0); + } + + // policy hit-rate vs residency budget + println!("\n{:>16} {:>6} {:>9} | {:>6} {:>6} {:>6}", "budget(experts)", "GB", "%resident", "LRU", "LFU", "OPT"); + for f in [0.02, 0.05, 0.10, 0.20, 0.35, 0.50, 0.75] { + let cap = (u as f64 * f) as usize; + if cap < 1 { continue; } + println!("{:>16} {:>6.1} {:>8.0}% | {:>5.1}% {:>5.1}% {:>5.1}%", + cap, cap as f64 * AVG_BYTES / 1e9, cap as f64 / u as f64 * 100.0, + sim_lru(&uid, cap)*100.0, sim_lfu(&uid, cap)*100.0, sim_opt(&uid, cap)*100.0); + } +} From a7c17305c283c072893f975242ac2c2543d54184 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 03:46:25 -0500 Subject: [PATCH 04/27] docs(k3): GPU-resident hot experts design (task #23 'trend to full GPU') The major GPU speedup: promote hot experts to persistent VRAM so decode's hot path is GPU-native (zero fetch, zero copy). 3 increments (copy-skip -> VRAM hot cache -> pipeline), the 32GB rate-distortion constraint (imatrix-enabled resident shrink frees VRAM for the hot set), measured per-increment via k3-bench. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md diff --git a/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md b/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md new file mode 100644 index 0000000000..edff38d339 --- /dev/null +++ b/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md @@ -0,0 +1,56 @@ +# GPU-Resident Hot Experts — "trend to full GPU only" (task #23) + +**Goal (Joel):** the biggest single speedup — the residency system should *trend itself toward full-GPU*: +keep the hot expert working set resident in VRAM so decode's hot path computes fully on GPU with **zero +per-token NVMe fetch and zero host→VRAM copy**. As the pager identifies the stable hot set, it promotes +hot→VRAM / evicts cold, and the working set self-organizes toward VRAM residency. + +## Where the time actually goes (measured, top-8, ~1.9 s/token = 0.53 tok/s) + +The op-offload MoE path (`ggml-backend.cpp` ~1648-1824) does, per layer, per token: +1. **NVMe fetch** of missed experts into the pinned host cache (recency ~62% hit → ~38% miss). ~0.53 s. +2. **host→VRAM copy** of the *used* experts into `input_cpy` (the VRAM tensor the `MUL_MAT_ID` reads), + via `ggml_backend_tensor_set_async`. ~0.2 s. +3. **GPU compute** (the expert matmuls — already GPU-native). The rest. + +Two structural inefficiencies, independent of the fetch: +- **Redundant copies:** `input_cpy` persists across tokens (it's the split's VRAM buffer), but every token + re-copies *all* used experts — including the ~62% that were already resident from last token. +- **Serialization:** `ggml_backend_synchronize` (lines 1660, 1679) forces fetch→copy→compute to run + serially per layer instead of pipelining. + +## Design — three increments, lowest-risk first + +### Increment 1 — copy-skip (VRAM residency tracking on `input_cpy`) +Per split's `input_cpy` VRAM buffer, track the **set of expert ids currently resident** (last copied). Each +token, copy only the experts NOT already resident (the misses vs last token); skip the rest. At ~62% +token-to-token overlap this eliminates ~62% of the host→VRAM copies. No new VRAM — `input_cpy` already +holds them. Care: the sched double-buffers (`sched->cur_copy`) → keep a resident-set **per buffer id**. +Correctness: `MUL_MAT_ID` only reads the selected `ids`, so a skipped-but-still-resident expert is valid. + +### Increment 2 — persistent hot-expert VRAM cache +A device-side residency cache (VRAM analog of the pinned-host `ResidencyCache`): promote the hottest +experts (recency + the plan-file pin list) into a **persistent VRAM region** that survives across layers +and tokens. On expert access the seam checks VRAM-residency first: **hit ⇒ GPU-native, no fetch, no copy**; +miss ⇒ current fetch→copy path. Evict cold by the same score-hint/generation logic as the host cache. +This is where "trend to full GPU" lives: the promotion loop grows the VRAM-resident fraction as the hot +set stabilizes. + +### Increment 3 — pipeline (de-serialize) +Overlap the copy/fetch of the next layer's experts with the current layer's compute (double-buffer + +drop the hard syncs where the dependency allows). Bounded by sequential routing (layer N+1's experts +depend on N's output), but the copy of already-known experts can overlap. + +## The 32 GB constraint — the rate-distortion knob +On a 32 GB card the resident attention (~28-33 GB) fills VRAM, leaving little for expert residency. So the +"trend" is bounded here and becomes a **rate-distortion allocation**: VRAM spent on hot experts vs +high-fidelity attention. The **imatrix** (running now) is what makes that tradeoff intelligent — it lets us +down-quant the resident attention *and* the cold experts by measured importance, freeing VRAM the hot set +promotes into. On a bigger card (or smaller MoE) the trend approaches genuine full-GPU. This is the +misfit-moat fractal: same code, the governor spends the VRAM budget differently per device +([[device-fit-repeatable-primitive]], [[dynamic-precision-tiers-and-diversity]]). + +## Sequence +imatrix keystone (async now) → increment 1 (copy-skip, low-risk, measurable alone) → increment 2 +(VRAM hot cache, the "full-GPU trend") → increment 3 (pipeline). Each increment is measured on its own via +the `k3-bench` harness before stacking. Ref: [[k3-beats-waste-decisively]] (compute/copy-bound at top-8). From 6695bf785f0ba07448b91f0b5a55833f5666c981 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 05:13:27 -0500 Subject: [PATCH 05/27] docs(k3): flag the input_cpy-persistence question gating increment 1 vs 2 Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md b/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md index edff38d339..9ce8b21cf2 100644 --- a/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md +++ b/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md @@ -54,3 +54,12 @@ misfit-moat fractal: same code, the governor spends the VRAM budget differently imatrix keystone (async now) → increment 1 (copy-skip, low-risk, measurable alone) → increment 2 (VRAM hot cache, the "full-GPU trend") → increment 3 (pipeline). Each increment is measured on its own via the `k3-bench` harness before stacking. Ref: [[k3-beats-waste-decisively]] (compute/copy-bound at top-8). + +## CRITICAL open question (verify before building Increment 1) +Increment 1 (copy-skip on `input_cpy`) only works if `input_cpy` **persists per (layer,matrix) tensor +across tokens**. But a per-tensor `input_cpy` = 92×3×~2 GB ≫ VRAM, so the sched almost certainly **reuses +a shared scratch `input_cpy`** across all MoE splits — meaning its contents churn *within* one token and +retain nothing tensor-specific for the next. **If shared-scratch (likely), copy-skip is a no-op and +Increment 2 is the real mechanism:** a SEPARATE persistent VRAM hot-expert region (not the scratch buffer), +keyed by stable ExpertId, that the matmul reads from on a hit. VERIFY the `input_cpy` allocation lifetime +(`ggml_backend_sched` reuse) first — it decides whether increment 1 exists or we go straight to increment 2. From 65bca8afb52c4788abfd8012fc7df137205327b1 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 05:23:14 -0500 Subject: [PATCH 06/27] =?UTF-8?q?docs(k3):=20modular=20rework-proof=20impl?= =?UTF-8?q?=20for=20#23=20=E2=80=94=20reuse=20ResidencyCache=20+=20DeviceU?= =?UTF-8?q?ploadFetcher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanism is the existing (buft,fetcher)-generic ResidencyCache; a VRAM cache = same class + device buft + host->device fetcher. 3 small parameterized pieces (DeviceUploadFetcher, instantiate w/ GGML_MOE_VRAM_CACHE_GB, seam hook). Stats only tune params -> zero mechanism rework. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md b/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md index 9ce8b21cf2..e19374505a 100644 --- a/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md +++ b/docs/architecture/GPU-RESIDENT-HOT-EXPERTS.md @@ -63,3 +63,23 @@ retain nothing tensor-specific for the next. **If shared-scratch (likely), copy- Increment 2 is the real mechanism:** a SEPARATE persistent VRAM hot-expert region (not the scratch buffer), keyed by stable ExpertId, that the matmul reads from on a hit. VERIFY the `input_cpy` allocation lifetime (`ggml_backend_sched` reuse) first — it decides whether increment 1 exists or we go straight to increment 2. + +## Modular implementation (rework-proof — mechanism built once, policy injected) +Key: `ResidencyCache` is ALREADY generic over `(ggml_backend_buffer_type_t buft, ExpertFetcher& fetcher)`. +A VRAM hot-expert cache = the SAME class, instantiated with a DEVICE buft + a host→device fetcher. No new +cache class, no hardcoded constants — budget/window/pin arrive on the existing plan-file wire. + +Three small, parameterized pieces (each measured alone via `k3-bench`): +1. **`DeviceUploadFetcher : ExpertFetcher`** — the only genuinely new code. `fetch(dst_dev, host_src, n)` + does a host→device copy via the split backend's buffer-set API (not memcpy). ~15 lines. +2. **Instantiate** `k3_device_cache(budget = GGML_MOE_VRAM_CACHE_GB, device_buft = split backend's buft, + DeviceUploadFetcher)` — parameter-driven; `0` (unset) ⇒ disabled ⇒ current behavior, zero risk. + `get()`'s `memset(pad)` must be guarded for device slots (cudaMemset or skip; padding is CUDA-MMQ NaN + guard — handle once). +3. **Seam hook** (in the copy loop): before the host→VRAM copy, ask `k3_device_cache` for the expert's + device slot. **HIT ⇒ device→`input_cpy` VRAM→VRAM copy** (no NVMe, no host round-trip). MISS ⇒ current + host-cache path, then upload into the device cache. Same score-hint/generation eviction as the host + cache — the plan-file policy drives BOTH tiers with one wire. + +When stats land (imatrix, live hit-rates) NOTHING here reworks: the numbers only set `GGML_MOE_VRAM_CACHE_GB` +and the plan's pin/window — the mechanism is fixed. That is the point of the modular split. From bb4bd23e5ec1882ddf9b21f7c2599d1ae4dec591 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 13:32:30 -0500 Subject: [PATCH 07/27] docs(arch): MoE serving on a governed budget (draft; M5 owns the governor seam) Diagnoses the hardcoded-cache overcommit that collapsed K3 fetch bandwidth (40GB pinned + mmap = 95.9GB on 63GB -> pagefile thrash -> 205 MB/s -> 0.027 tok/s) and lays out the clean architecture: governor owns the residency budget net of the model's mmap footprint, plan-file is the one wire, ResidencyCache is pure mechanism. Governor-interface sections marked [M5 OWNS] for her to edit. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../MOE-SERVING-GOVERNED-BUDGET.md | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md diff --git a/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md b/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md new file mode 100644 index 0000000000..cc73d3234e --- /dev/null +++ b/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md @@ -0,0 +1,101 @@ +# MoE Serving on a Governed Budget + +**Status:** draft (BigMama). The governor-interface sections are marked **[M5 OWNS]** — edit +them directly; they describe her lane and I've only sketched the seam I need from it. + +**Precedence:** this defers to [CONCURRENCY-STYLE-GUIDE](CONCURRENCY-STYLE-GUIDE.md), +[GENOME-FOUNDRY-SENTINEL](GENOME-FOUNDRY-SENTINEL.md) (`SubstrateGovernor`), and +[INFERENCE-LANES-REALISTIC](INFERENCE-LANES-REALISTIC.md). If it disagrees with those on a +substrate question, they win and this gets reconciled. + +## What is proven (keep) + +K3 (2.8T MoE, IQ2) serves coherent tokens on a 32 GB card by streaming experts from NVMe through a +bounded resident cache. The mechanism is real and model-agnostic: + +- The op-offload seam (`ggml-backend.cpp`) copies only the router-selected experts per token. +- `ResidencyCache` (`ggml-moe-residency.hpp`) is pure mechanism: size-classed pinned pools, recency + eviction, fed by an `ExpertFetcher` adapter (`DirectReadFetcher` on Windows NVMe, `MmapFaultFetcher` + portable). Keyed on `ExpertId` = `canonical_name_key(blk.N.ffn_{gate,up,down}_exps)` + index. +- That key is the **universal MoE naming** every one of the 140 `src/models/*.cpp` adapters shares + (glm4-moe, deepseek2, qwen3moe, kimi-k3, ...). Model-specific differences (K3's KDA attention, SITU) + live in the per-model graph adapter, not the paging path. **K3 is one model; the pager serves all.** +- top-k override (`--override-kv .expert_used_count`) cuts fetch + compute; measured `res_exp` + halves as expected. + +## The failure this fixes (the reason for the doc) + +Measured on BigMama, 2026-08-01, with the prototype serve script: + +``` +GGML_MOE_HOST_CACHE_GB=40 (hardcoded in a scratchpad .bat) +-> llama-server private commit 95.9 GB on a 63 GB box (40 GB pinned + model mmap working set) +-> 33 GB overcommitted to the pagefile -> thrash +-> DirectRead bandwidth collapses 3 GB/s -> ~205 MB/s ([FETCH] unbuf_ok, resolve_fail=0: not a fallback, real collapse) +-> [RETAIN] pool 5943/5943, evict=25/token, resident=2 (cache retains nothing; re-fetches the whole working set every token) +-> 36.8 s / decode token = 0.027 tok/s +``` + +The seam was correct (100% intra-token hit, top-8 confirmed). The cause was a **hardcoded residency +budget that overcommitted RAM** — the single failure mode the substrate's pressure/governor +architecture exists to prevent. A budget sized to *fit* free RAM (net of the model's mmap footprint) +never thrashes. On this box that is ~18-22 GB, not 40. + +## Principle: the governor owns the budget. Nothing else sets it. + +``` +SystemProfile (measured free RAM/VRAM, minus model mmap footprint, minus headroom) + -> SubstrateGovernor / MemoryPressureMonitor [M5 OWNS] policy + -> ServingExpertPager (observe pressure + expert trace -> budget_bytes + window_k + pin_list) + -> plan-file (atomic-rename JSON: {budget_bytes, window_k, pin_list}) the ONE wire + -> ResidencyCache (C++) reads budget from the plan-file. Pure mechanism. +``` + +Rules: + +1. **Delete `GGML_MOE_HOST_CACHE_GB` (and any VRAM-cache env) as a budget *input*.** They were the + prototype bypass. The C++ cache takes budget **only** from the plan-file. `MoeServingConfig` keeps + the *operational* knobs (which fetcher, stats/trace/capture sinks) but not the budget. +2. **Budget must be net of the model's mmap working set.** Pinned host cache + mmap resident set must + never exceed the RAM budget. This is the specific accounting that was missing today. +3. **Mechanism vs policy stays split** (already true in the traits): `ResidencyCache` / + `DirectReadFetcher` = mechanism; `ServingExpertPager` / `TierPolicy` / `PagerCaptureSink` = policy, + governed. Pressure rises -> governor shrinks `budget_bytes` -> plan-file updates -> cache evicts. + That is the RTOS control loop, not a new subsystem. +4. **No prototype rigging.** Serve launch, budget, and measurement come from the governed serving lane + in continuum-core, not scratchpad `.bat`s and hand-`curl`. + +## [M5 OWNS] Governor budget interface — the seam I need, please correct + +Open questions for the governor lane (I sketched answers; they are guesses, edit freely): + +- Does `SystemProfile.serving_budget_bytes()` already return a **host-residency** budget net of the + model's mmap footprint, or only a VRAM/headroom figure? If not, where should the mmap footprint be + measured and subtracted (loader reports resident bytes -> profile)? +- Should `ServingExpertPager` pull the budget from `SystemProfile` on each reconcile tick, or should + the governor *push* a budget revision through `PressureBroker` that the pager consumes? +- Is there an existing `ResourcePool` / `PagedResourcePool` this residency cache should register with so + eviction is a first-class governed pool (per the disk-eviction "every cache class has a decided + eviction story" discipline), rather than a private cache the governor can't see? +- On overcommit, is the correct actuator (a) shrink `budget_bytes`, (b) demote expert precision tier, + or (c) both, ordered — and does that ordering live in `TierPolicy`? + +## Measurement (VDD, not ad-hoc curl) + +Ad-hoc `curl` fooled us twice this session (ghost server on a shared port; phantom "hang" that was a +detached client failing to submit). Measurement is a tested harness: + +- `tests/test-moe-residency.cpp` — TDD for the keying/config invariants (now includes + `test_serving_config_from_env`) + a **VDD trace-replay** path that asserts a nonzero reuse floor on a + real captured trace (`replay_trace`). This is the regression gate for the pager. +- A serve-smoke that asserts decode produces tokens above a floor tok/s, so client flakiness can never + again read as a code regression. (To build; belongs in the governed serving lane, not a script.) + +## Done / next + +- **Done, pushed** (k3-adopt `dd8463b74`): `MoeServingConfig` single config-manager (killed 13 + scattered `getenv`), injected into `ResidencyCache` (module no longer reads global env), + model-agnostic `k3_ -> moe_` rename, `>RAM` mmap prefetch-skip, `test_serving_config_from_env`. +- **Next, gated on the [M5 OWNS] seam above:** make host-cache budget plan-file-only; wire + `ServingExpertPager` budget from the governed `SystemProfile` net of mmap footprint; register the + residency cache as a governed pool; build the serve-smoke. From 079bfb60cafd094f2d5ab840a73051a19ca27a0b Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 13:39:06 -0500 Subject: [PATCH 08/27] docs(arch): answer the [M5 OWNS] governor-budget seam in place (net-of-mmap is explicit arithmetic; plan_file.budget_bytes is the lease wire) Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo --- .../MOE-SERVING-GOVERNED-BUDGET.md | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md b/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md index cc73d3234e..2b485bf3e6 100644 --- a/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md +++ b/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md @@ -65,20 +65,39 @@ Rules: 4. **No prototype rigging.** Serve launch, budget, and measurement come from the governed serving lane in continuum-core, not scratchpad `.bat`s and hand-`curl`. -## [M5 OWNS] Governor budget interface — the seam I need, please correct - -Open questions for the governor lane (I sketched answers; they are guesses, edit freely): - -- Does `SystemProfile.serving_budget_bytes()` already return a **host-residency** budget net of the - model's mmap footprint, or only a VRAM/headroom figure? If not, where should the mmap footprint be - measured and subtracted (loader reports resident bytes -> profile)? -- Should `ServingExpertPager` pull the budget from `SystemProfile` on each reconcile tick, or should - the governor *push* a budget revision through `PressureBroker` that the pager consumes? -- Is there an existing `ResourcePool` / `PagedResourcePool` this residency cache should register with so - eviction is a first-class governed pool (per the disk-eviction "every cache class has a decided - eviction story" discipline), rather than a private cache the governor can't see? -- On overcommit, is the correct actuator (a) shrink `budget_bytes`, (b) demote expert precision tier, - or (c) both, ordered — and does that ordering live in `TierPolicy`? +## [M5 OWNS] Governor budget interface — answered (M5, 2026-08-01) + +1. **`serving_budget_bytes()` is NOT net of mmap, and never can be by watching free + memory.** It returns `0.80 x min(available_memory(), total_vram)` (`system_profile.rs` + via `host_budget_from` — a headroom figure). The trap: mmap'd weight pages are + file-backed, so the OS reports them "available" while they are load-bearing — + evicting them re-fetches weights, which is the fetch-bandwidth collapse wearing a + healthy free-RAM number. Net-of-mmap is therefore EXPLICIT plan arithmetic at the + reconcile site: `expert_host_cache = f(available, weights_bytes (already on the + planner, serving_daemon.rs), kv_total = kv_at(ctx) x lanes, OS floor)`, plus a + Windows private-commit ceiling (commit must never exceed physical RAM — pagefile + overcommit thrashes silently instead of OOMing loud). This derivation is task #287, + my lane. +2. **Push via `watch`, consume on your tick.** The canonical shape + (CONCURRENCY-STYLE-GUIDE): the governor publishes budget revisions on its own + cadence through its `watch::Sender`; `ServingExpertPager` borrows the + latest at each reconcile tick. Not per-event `PressureBroker` traffic — the broker + is for relief demands; the budget rides the profile snapshot. Sticky hysteresis on + the published value ([[never-thrash]]). +3. **Yes — register the residency cache as a governed pool** with a real + `evict_at_least` (the "every cache class has a decided eviction story" discipline; + the `broker_relieve_actually_deletes_from_an_over_budget_pool` test shape is the + guard). RAM-class pool, `PagedResourcePool` is the right primitive. +4. **(c) both, ordered — and the ordering lives in `TierPolicy`, agreed.** Shrink + `budget_bytes` FIRST (fast: plan-file actuation, next-token effect, no quality + cost), demote precision tier SECOND (slower, quality-affecting, and imatrix-gated + today so it is not yet a live lever). Both directions sticky so recovery grows + back without oscillation (#214 grow-back lesson applies here too). + +The wire needs nothing new: `plan_file.budget_bytes` already exists and your +`ResidencyCache` already honors it — the whole fix is the derivation feeding the +existing field. Cross-link: EXPERT-PAGING-CONTROL-LAW.md S5 (the plan wire), S7 (the +lever stack this composes with). ## Measurement (VDD, not ad-hoc curl) From fdee966afea9f88fed1506d2f7d86acde3b15918 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 14:39:36 -0500 Subject: [PATCH 09/27] docs(arch): measured governed-budget inputs + graduated serving/load path Records the BigMama measurements feeding M5's #287 derivation (non-cache ~56GB, per-token working set 5.5GB, governed budget ~6GB, fetch recovers to 2.5GB/s at fit), the now-complete C++ cache mechanism (enable-from-plan, grow, shrink), and the three-piece graduated path to serving/load kimi-k3 (catalog row + serving-lane MoE launch + #287) replacing the rigged .bat. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../MOE-SERVING-GOVERNED-BUDGET.md | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md b/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md index 2b485bf3e6..990f953154 100644 --- a/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md +++ b/docs/architecture/MOE-SERVING-GOVERNED-BUDGET.md @@ -110,11 +110,42 @@ detached client failing to submit). Measurement is a tested harness: - A serve-smoke that asserts decode produces tokens above a floor tok/s, so client flakiness can never again read as a code regression. (To build; belongs in the governed serving lane, not a script.) -## Done / next - -- **Done, pushed** (k3-adopt `dd8463b74`): `MoeServingConfig` single config-manager (killed 13 - scattered `getenv`), injected into `ResidencyCache` (module no longer reads global env), - model-agnostic `k3_ -> moe_` rename, `>RAM` mmap prefetch-skip, `test_serving_config_from_env`. -- **Next, gated on the [M5 OWNS] seam above:** make host-cache budget plan-file-only; wire - `ServingExpertPager` budget from the governed `SystemProfile` net of mmap footprint; register the - residency cache as a governed pool; build the serve-smoke. +## Measured on BigMama (2026-08-01) - inputs for the #287 derivation + +Ungoverned static budgets were run to characterize the box (they thrash by design; do NOT read them +as the governed result - a governed budget flexes with KV and never overcommits): + +| budget (hardcoded) | private commit | fetch | outcome | +|---|---|---|---| +| 40 GiB | 95.9 GB (>63.4 RAM) | 205 MB/s | pagefile thrash, 0.027 tok/s | +| 8 GiB (during load) | 60.6 GB | **2485 MB/s** | fits RAM, fetch fully recovered | +| 8 GiB (during decode, KV grew) | 63.9 GB | 165 MB/s | tipped over -> thrash again | + +Derived inputs for `expert_host_cache = f(available, weights_bytes, kv_total, OS floor)`: +- Total RAM 63.4 GB. Non-cache private footprint ~56 GB (base + KV + CUDA staging). +- K3 top-8 per-token expert working set ~5.5 GB (res_exp 2208). +- So the governed budget on this box is ~6 GB (62 - 56), which holds ~1 token's set -> ~40% recency + retention, misses fetching at the recovered ~2.5 GB/s. That is the regime that should pull tok/s back + toward 0.5 - NOT written off. The governor MUST subtract KV growth continuously (decode tipped 8 GiB + over) and cap on the Windows private-commit ceiling. + +## C++ mechanism - COMPLETE (k3-adopt) + +The cache honors the governed lease fully: `dd8463b74` config-manager + naming; `848f409c7` budget is +plan-file-only in governed mode (env can't overcommit); `b0e877cbd` poll the plan every token so a +governed budget can turn the cache ON (it starts at 0); `8680cefa9` free pools on budget DECREASE so +the governor can flex the cache down under pressure. Grow + shrink + enable-from-plan all validated +(builds green, test 94/0). Partial-evict-keeping-hottest on shrink is the one future refinement. + +## Graduated path: `serving/load kimi-k3` (replaces the rigged .bat) + +Three pieces, then a JOINT governed measurement (no more hand-`curl`): +1. **Catalog row for K3** (BigMama lane, `model_registry/catalog.rs`) - servable metadata + the serving + profile: `--n-cpu-moe 999`, `--override-kv kimi-k3.expert_used_count=int:8`, `-ngl `, + `GGML_MOE_DIRECT_READ=1`, `GGML_MOE_PLAN_FILE=`. Gated on 2+3 so it's not a servable row + that thrashes. +2. **Serving-lane MoE launch** (`inference/llama_server.rs`, M5) - set those flags + the plan-file env + for a streaming-MoE model; today the launcher wires KV/context budget but not the MoE offload env. +3. **#287 budget derivation** (M5) - writes `plan_file.budget_bytes` from the profile above, flexing + with KV. Register the cache as a governed `PagedResourcePool` with `evict_at_least` (the C++ free + path above is its actuator). From 91c7b2a90da43155906bef90b5ab9d01940f981d Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sat, 1 Aug 2026 19:04:28 -0500 Subject: [PATCH 10/27] windows: make continuum-core build + link on windows-msvc (first time) start-server.sh now provisions the full Windows CUDA build env before the cargo builds (the cargo/nvcc path had none, unlike the vcvars-wrapped llama cmake): import MSVC via vswhere->VS2022-14.4x + a .bat env dump (cl.exe for nvcc), pin CMAKE to the manifest install, force CMAKE_GENERATOR=Ninja (the VS18-2026 auto- pick is undefined in cmake 3.30), add the Windows SDK bin (mt.exe/rc.exe), select a complete CUDA toolkit + CUDA_PATH (a provisioning split left cuda-env with 0 import libs vs cuda-13.2's 12), and RUSTFLAGS -L for pocket-tts (which emits no link-search) while re-carrying +crt-static so the /MT GPU stack still links. Portability: expert_container.rs + commands/capacity.rs used Unix-only std::os::unix::fs::FileExt::read_exact_at. Add crate::platform_io::pread_exact (unix read_exact_at / windows seek_read loop) - one place for positioned reads. Build validated (npm start exit 0, continuum-core lib clean). A separate runtime hot-loop on the #2088 core at startup is tracked apart from this build fix. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../src/capacity/expert_container.rs | 4 +- core/continuum-core/src/commands/capacity.rs | 3 +- core/continuum-core/src/lib.rs | 1 + core/continuum-core/src/platform_io.rs | 52 +++++++++++ tools/scripts/start-server.sh | 91 +++++++++++++++++++ 5 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 core/continuum-core/src/platform_io.rs diff --git a/core/continuum-core/src/capacity/expert_container.rs b/core/continuum-core/src/capacity/expert_container.rs index 3bbb1898c3..74c2f2056c 100644 --- a/core/continuum-core/src/capacity/expert_container.rs +++ b/core/continuum-core/src/capacity/expert_container.rs @@ -23,7 +23,6 @@ use std::fs::File; use std::io::Read; -use std::os::unix::fs::FileExt; use std::path::{Path, PathBuf}; use serde::{Deserialize, Serialize}; @@ -271,8 +270,7 @@ impl ExpertBank { } debug_assert_eq!(buf.len() as u64, self.record_bytes); let offset = expert as u64 * self.record_bytes; - self.file - .read_exact_at(buf, offset) + crate::platform_io::pread_exact(&self.file, buf, offset) .map_err(|source| ContainerError::BankIo { path: self.path.clone(), source, diff --git a/core/continuum-core/src/commands/capacity.rs b/core/continuum-core/src/commands/capacity.rs index 3190264ee8..aa0c1c85dd 100644 --- a/core/continuum-core/src/commands/capacity.rs +++ b/core/continuum-core/src/commands/capacity.rs @@ -132,7 +132,6 @@ fn probe( reads: u32, ) -> Result { use std::io::Write; - use std::os::unix::fs::FileExt; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; @@ -189,7 +188,7 @@ fn probe( x ^= x >> 7; x ^= x << 17; let rec = x % bank_records; - if f.read_exact_at(&mut buf, rec * record_bytes).is_ok() { + if crate::platform_io::pread_exact(&f, &mut buf, rec * record_bytes).is_ok() { done.fetch_add(record_bytes, Ordering::Relaxed); } } diff --git a/core/continuum-core/src/lib.rs b/core/continuum-core/src/lib.rs index 3e45258dde..a185fc5462 100644 --- a/core/continuum-core/src/lib.rs +++ b/core/continuum-core/src/lib.rs @@ -41,6 +41,7 @@ pub mod ffi; pub mod forge; pub mod genome; pub mod capacity; +mod platform_io; pub mod governor; pub mod gpu; pub mod http; diff --git a/core/continuum-core/src/platform_io.rs b/core/continuum-core/src/platform_io.rs new file mode 100644 index 0000000000..d145ae8860 --- /dev/null +++ b/core/continuum-core/src/platform_io.rs @@ -0,0 +1,52 @@ +//! Cross-platform positioned file I/O. +//! +//! Unix has `std::os::unix::fs::FileExt::read_exact_at`; Windows has +//! `std::os::windows::fs::FileExt::seek_read`, which (like `read`) may return short, so on Windows we +//! loop to fill the whole buffer. This is the ONE place the platform split lives - callers use +//! [`pread_exact`] and never reach for `os::unix`/`os::windows` directly (the un-cfg-gated +//! `os::unix::fs::FileExt` import is exactly what broke the windows-msvc build). + +use std::fs::File; +use std::io; + +/// Read exactly `buf.len()` bytes at absolute `offset`, without moving the file cursor. Portable +/// equivalent of Unix `read_exact_at`. +pub(crate) fn pread_exact(file: &File, buf: &mut [u8], offset: u64) -> io::Result<()> { + #[cfg(unix)] + { + use std::os::unix::fs::FileExt; + file.read_exact_at(buf, offset) + } + #[cfg(windows)] + { + use std::os::windows::fs::FileExt; + let mut buf = buf; + let mut off = offset; + while !buf.is_empty() { + match file.seek_read(buf, off) { + Ok(0) => { + return Err(io::Error::new( + io::ErrorKind::UnexpectedEof, + "failed to fill whole buffer", + )) + } + Ok(n) => { + let tmp = buf; + buf = &mut tmp[n..]; + off += n as u64; + } + Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {} + Err(e) => return Err(e), + } + } + Ok(()) + } + #[cfg(not(any(unix, windows)))] + { + let _ = (file, buf, offset); + Err(io::Error::new( + io::ErrorKind::Unsupported, + "positioned reads unsupported on this platform", + )) + } +} diff --git a/tools/scripts/start-server.sh b/tools/scripts/start-server.sh index 7014ad6c9d..5d0a3035e6 100755 --- a/tools/scripts/start-server.sh +++ b/tools/scripts/start-server.sh @@ -295,6 +295,97 @@ if [ -n "$CONTINUUM_RELEASE" ]; then PROFILE_LABEL="release" fi +# ── Windows: import the MSVC toolchain so cargo's CUDA (candle) build finds cl.exe ────────── +# candle compiles CUDA kernels (affine.cu, ...) via nvcc, which needs cl.exe as its host +# compiler plus INCLUDE/LIB. The cargo builds below run in THIS bash shell (unlike the +# llama-server cmake build, which runs inside a vcvars .bat), so without this nvcc fails with +# "Cannot find compiler 'cl.exe' in PATH" and the whole core build dies. Import it once: export +# INCLUDE/LIB verbatim (only cl.exe reads them) and prepend the EXACT MSVC + Windows SDK bin +# dirs (from vcvars, converted to unix) to PATH — nvcc finds cl.exe while bash's own PATH +# resolution stays intact (we add unix dirs, never overwrite PATH with the Windows one). VS2022 +# (14.4x) is selected explicitly: nvcc 12.x rejects the newer 14.5x/VS18 toolset. +if [ "$_mf_os" = windows ] && command -v nvcc >/dev/null 2>&1 && ! command -v cl.exe >/dev/null 2>&1; then + _vswhere="/c/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" + _vs="" + [ -x "$_vswhere" ] && _vs="$("$_vswhere" -version "[17.0,18.0)" -products '*' \ + -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \ + -property installationPath 2>/dev/null | head -1)" + _vcvars_u="" + [ -n "$_vs" ] && _vcvars_u="$(cygpath -u "$_vs\\VC\\Auxiliary\\Build\\vcvars64.bat" 2>/dev/null)" + if [ -n "$_vcvars_u" ] && [ -f "$_vcvars_u" ]; then + # Capture vcvars' env via a .bat FILE, not inline `cmd //c "call … && set"`: the vcvars path + # has spaces AND parens, and escaping nested quotes through bash->cmd corrupts it (the same + # reason install-llama-server.sh emits a .bat). The .bat calls vcvars then dumps `set`. + _msbat="$(mktemp --suffix=.bat 2>/dev/null || echo "${TEMP:-/tmp}/_cc_vcvars_$$.bat")" + printf '@echo off\r\ncall "%s" >nul 2>&1\r\nset\r\n' "$(cygpath -w "$_vcvars_u")" > "$_msbat" + _msenv="$(cmd //c "$(cygpath -w "$_msbat")" 2>/dev/null | tr -d '\r')" + rm -f "$_msbat" + export INCLUDE="$(printf '%s\n' "$_msenv" | sed -n 's/^INCLUDE=//Ip' | head -1)" + export LIB="$(printf '%s\n' "$_msenv" | sed -n 's/^LIB=//Ip' | head -1)" + _vct="$(printf '%s\n' "$_msenv" | sed -n 's/^VCToolsInstallDir=//Ip' | head -1)" + _sdkbin="$(printf '%s\n' "$_msenv" | sed -n 's/^WindowsSdkVerBinPath=//Ip' | head -1)" + # Guard each conversion: only prepend a REAL existing directory. An empty/failed cygpath would + # otherwise inject a bogus relative entry that corrupts the Windows-format PATH the cargo build + # subprocess inherits, which silently breaks other tools' resolution (e.g. cmake "program not found"). + if [ -n "$_vct" ]; then _clb="$(cygpath -u "${_vct}bin\\Hostx64\\x64" 2>/dev/null)"; [ -d "$_clb" ] && PATH="$_clb:$PATH"; fi + if [ -n "$_sdkbin" ]; then _sdb="$(cygpath -u "${_sdkbin}x64" 2>/dev/null)"; [ -d "$_sdb" ] && PATH="$_sdb:$PATH"; fi + export PATH + # Pin cmake explicitly: the cmake crate (core/llama build.rs) resolves cmake via the CMAKE env + # var or PATH, but a manifest-provisioned cmake lives at ~/.continuum/tools/cmake/bin and is not + # guaranteed on the build shell's PATH (measured: absent in a clean subshell -> "cmake not + # found"). Point CMAKE at the known install (same resolution as install-llama-server.sh) and put + # its dir on PATH for cmake's own sub-tools. + _ccmk="$(command -v cmake 2>/dev/null || echo "${CONTINUUM_HOME:-$HOME/.continuum}/tools/cmake/bin/cmake.exe")" + if [ -x "$_ccmk" ]; then + export CMAKE="$(cygpath -w "$_ccmk" 2>/dev/null || echo "$_ccmk")" + PATH="$(dirname "$_ccmk"):$PATH"; export PATH + fi + # Force a generator cmake actually knows. The cmake crate auto-picks the newest installed VS; on a + # VS18-2026 box that is "Visual Studio 18 2026" - a generator cmake 3.30.x does NOT define ("Could + # not create named generator"). Ninja is version-agnostic, uses the MSVC env imported above, and + # matches the llama-server build. [[windows-build-env-drift]] + _cninja="$(command -v ninja 2>/dev/null || echo "${CONTINUUM_HOME:-$HOME/.continuum}/tools/ninja/ninja.exe")" + if [ -x "$_cninja" ]; then + export CMAKE_GENERATOR="Ninja" + # ninja must be ON PATH: the cmake crate ignores CMAKE_MAKE_PROGRAM env, so with -G Ninja it + # searches PATH ("unable to find Ninja / CMAKE_MAKE_PROGRAM is not set" otherwise). + PATH="$(dirname "$_cninja"):$PATH"; export PATH + fi + # CUDA_PATH must be set: cudarc/candle/pocket-tts read it to emit their link-search; without it the + # link has NO CUDA search path (measured: LNK1181 cuda.lib). Point it at a cuda-* whose import-lib + # dir actually has the libs (a provisioning split can leave the crate-detected dir EMPTY - cuda-env + # /Library/lib/x64=0 vs cuda-13.2=12; the #6 provisioning fix unifies them, and this node's cuda-env + # was completed by copying the sibling's libs in). candle finds nvcc via PATH independently, so a + # libs-only CUDA_PATH is fine (build proven). Real fix: provision ONE complete toolkit (#6). + if [ -z "$CUDA_PATH" ]; then + for _cand in "${CONTINUUM_HOME:-$HOME/.continuum}"/cuda-env "${CONTINUUM_HOME:-$HOME/.continuum}"/cuda-*; do + for _sub in Library/lib/x64 lib/x64; do + if [ -f "$_cand/$_sub/curand.lib" ] && [ -f "$_cand/$_sub/cuda.lib" ]; then + export CUDA_PATH="$(cygpath -w "$_cand" 2>/dev/null || echo "$_cand")" + _culibw="$(cygpath -w "$_cand/$_sub" 2>/dev/null || echo "$_cand/$_sub")" + # pocket-tts links cuda.lib but (unlike cudarc) emits no rustc-link-search, relying on the + # linker's own search. rustc links with the newest VS's linker + ITS OWN LIB (not ours), so + # the dir must reach link.exe via RUSTFLAGS -L. RUSTFLAGS env REPLACES (not merges) the + # .cargo/config target rustflags, so re-include +crt-static (the task-#4 /MT fix) or the whole + # GPU stack mislinks LNK2038 MT-vs-MD. + case " $RUSTFLAGS " in *"-L native=${_culibw} "*) : ;; *) export RUSTFLAGS="-C target-feature=+crt-static -L native=${_culibw} ${RUSTFLAGS}" ;; esac + echo "▶ CUDA_PATH=$CUDA_PATH + RUSTFLAGS -L $_culibw (import libs in $_sub)" + break 2 + fi + done + done + [ -z "$CUDA_PATH" ] && echo "⚠ no complete CUDA import-lib dir found (cuda-*/**/{cuda,curand}.lib) - core link WILL fail. Provisioning gap (#6)." >&2 + fi + if command -v cl.exe >/dev/null 2>&1; then + echo "▶ MSVC toolchain imported for the CUDA cargo build (cl.exe on PATH for nvcc/candle)" + else + echo "⚠ MSVC import ran but cl.exe still unresolved — the CUDA cargo build will fail" >&2 + fi + else + echo "✗ Windows+CUDA needs VS2022 (14.4x) C++ x64 toolset for nvcc's host compiler; vswhere/vcvars not found — the core build will fail. Install via the 'msvc' module." >&2 + fi +fi + # ── Build the continuum-mcp bin ────────────────────────────────────── # The MCP server is a separate stdio bin that MCP clients (unsloth Studio, # Claude Code) SPAWN — it isn't launched by us, so it must exist on disk after From b2e7c942bab062fe849a2d2e26b227a1e2c09195 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 06:38:18 -0500 Subject: [PATCH 11/27] feat(capacity): device_fit VRAM-partition calc for the governor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pure calc the governor uses to fit a streaming-MoE's RESIDENT (non-expert) tier to a device VRAM budget and reconcile it with the expert tier on ONE budget — fixing the double-count where the expert pager was handed the full VRAM ceiling while resident silently ate most of it. Partition (in order): compute reserve -> resident (Native | device-fit Override | Unfittable) -> sufficient-context KV -> everything left = hot-expert VRAM budget (maximized: more on-GPU experts, fewer streams). Context is derived + clamped, never hand-picked. Artifact resolver injected (no hardcoded paths). Standalone-validated 7/7; M5 wires it into the daemon spawn path + launch (ServingTarget.resident_override) per the K3 sprint split. Refs #29 #31 #36. Arch-confirmed on real K3 UD-IQ2 (93 blk/896 exp/top-16). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../continuum-core/src/capacity/device_fit.rs | 400 ++++++++++++++++++ core/continuum-core/src/capacity/mod.rs | 1 + 2 files changed, 401 insertions(+) create mode 100644 core/continuum-core/src/capacity/device_fit.rs diff --git a/core/continuum-core/src/capacity/device_fit.rs b/core/continuum-core/src/capacity/device_fit.rs new file mode 100644 index 0000000000..d9f62d1b57 --- /dev/null +++ b/core/continuum-core/src/capacity/device_fit.rs @@ -0,0 +1,400 @@ +//! Device-fit VRAM planning — the governor's answer to "how does THIS model's +//! resident (non-expert) tier meet THIS device's VRAM budget, and how much VRAM +//! is left to hold hot experts on-device?" +//! +//! A streaming MoE serve splits into two tiers with different homes: +//! * **experts** (`*_exps`) — paged; the [`ServingExpertPager`] plans which +//! layers sit HOT in VRAM and streams the cold complement from NVMe. +//! * **resident** (attention / embeddings / output / dense / norms / +//! shared-experts) — must live in VRAM for fast compute, offloaded WHOLE. +//! A fused attention op (K3's Gated Delta Net) CANNOT span CPU/GPU, so the +//! resident tier is all-or-nothing on the device: a partial `-ngl` corrupts +//! the graph (`buffer->buft` assertion). This file decides how the whole +//! resident tier fits, and — crucially — RECONCILES it with the expert tier. +//! +//! The reconciliation is the point. Resident weights, the KV cache, the compute +//! graph, AND the hot experts all sit on the SAME device budget. Before this, +//! the expert pager was handed the full VRAM ceiling while resident silently ate +//! most of it — the two tiers double-counted the card. Here the budget is +//! partitioned ONCE: compute reserve, then resident, then a SUFFICIENT context's +//! KV, and **everything left over is the hot-expert VRAM budget**. Maximizing +//! that leftover is "as much GPU as possible": the more experts resident, the +//! fewer NVMe fetches per token — the structural win over WASTE (which keeps the +//! trunk in CPU RAM and streams every expert). [[k3-beats-waste-decisively]], +//! [[pager-control-law-is-fractal-to-grid]], task #34. +//! +//! Three resident outcomes, no guessing ([[no-masking-fallbacks-my-style-tell]]): +//! * [`ResidentFit::Native`] — resident fits as-shipped → offload all, no override. +//! * [`ResidentFit::Override`] — resident overflows, but a device-fit artifact +//! supplies a precision-shrunk resident that fits → offload all, load resident +//! from the override (`LLAMA_RESIDENT_OVERRIDE`), experts stream from the +//! primary. The misfit-design move: fit the model to the owned device. +//! * [`ResidentFit::Unfittable`] — resident overflows and no fitting override +//! resolves → this device cannot GPU-serve this model. Route to CPU/grid, +//! LOUD; never silently OOM a doomed launch. +//! +//! Context is DERIVED, never hand-picked (#31): a desired window clamped to what +//! the leftover-after-resident affords and to the model's own max. Pure over its +//! inputs; the artifact resolver is INJECTED (this module never knows a path, a +//! url, or a cache layout). + +use std::path::PathBuf; + +const GB: u64 = 1024 * 1024 * 1024; + +/// A resolved device-fit resident-override artifact: where its first shard lives +/// and how many bytes its (precision-shrunk) resident tier occupies on-device. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ResidentOverride { + /// First shard of the device-fit GGUF whose resident tensors the loader + /// sources (`LLAMA_RESIDENT_OVERRIDE`); its experts are ignored (the primary + /// streams those). May sit on cold storage — only its resident bytes are + /// mapped, once, at load (the loader hook's lazy, prefetch-0 mmap). + pub path: PathBuf, + /// The resident (non-expert) byte total this override loads onto the device. + pub resident_bytes: u64, +} + +/// How the model's resident tier meets the VRAM budget. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ResidentFit { + /// Resident fits as-shipped — offload all resident to GPU, no override file. + Native, + /// Resident overflows; this override supplies a shrunk resident that fits. + Override(ResidentOverride), + /// Resident overflows and no fitting override resolves. Route to CPU/grid. + Unfittable { + /// The as-shipped resident tier that did not fit. + resident_bytes: u64, + /// The budget it had to fit under (VRAM − compute reserve). + usable_bytes: u64, + }, +} + +impl ResidentFit { + /// The resident bytes that actually load onto the device under this fit + /// (as-shipped for `Native`, shrunk for `Override`). `None` when unfittable. + pub fn device_resident_bytes(&self, native_bytes: u64) -> Option { + match self { + Self::Native => Some(native_bytes), + Self::Override(o) => Some(o.resident_bytes), + Self::Unfittable { .. } => None, + } + } + + /// The override GGUF the launcher exports as `LLAMA_RESIDENT_OVERRIDE`, if any. + pub fn override_path(&self) -> Option<&PathBuf> { + match self { + Self::Override(o) => Some(&o.path), + _ => None, + } + } +} + +/// The device + serve facts a device-fit decision needs. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct DeviceFitInputs { + /// As-shipped resident (non-expert) weight bytes (`weights_bytes − expert_bytes_total`). + pub resident_bytes: u64, + /// Governed VRAM budget for this serve (`SystemProfile::serving_budget_bytes`). + pub vram_budget_bytes: u64, + /// KV cache bytes per ONE token per lane (from the model's attention geometry). + pub kv_bytes_per_token: u64, + /// Fixed compute-graph + backend-context VRAM beyond weights and KV. + pub compute_reserve_bytes: u64, + /// The context window we'd LIKE to serve (the planner's target). Clamped down + /// to what leftover-after-resident affords and to `model_max_context`. + pub desired_context: u32, + /// The model's own maximum context (`{arch}.context_length`) — the ceiling. + pub model_max_context: u32, + /// Concurrent decode lanes (`--parallel`); KV is per-lane, experts are shared. + pub lanes: u32, +} + +/// The complete governed VRAM serving plan: resident source, derived context, and +/// the hot-expert VRAM budget the leftover affords. The launcher turns this into +/// `LLAMA_RESIDENT_OVERRIDE` + `-c`; the expert pager consumes `expert_vram_budget_bytes`. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DeviceFitPlan { + /// How the resident tier fits (native / override / unfittable). + pub resident: ResidentFit, + /// The per-lane context window the plan serves (derived, clamped). Zero iff + /// the resident tier is `Unfittable`. + pub context_window: u32, + /// VRAM left for HOT experts after resident + KV + compute reserve — the + /// budget handed to the [`ServingExpertPager`]. This is the number to MAXIMIZE + /// (more on-GPU experts = fewer NVMe streams = beats WASTE). Zero iff unfittable. + pub expert_vram_budget_bytes: u64, +} + +impl DeviceFitPlan { + /// True when this model can be GPU-served on this device (native or via override). + pub fn is_gpu_servable(&self) -> bool { + !matches!(self.resident, ResidentFit::Unfittable { .. }) + } +} + +/// Runtime reserve when the caller has no measured compute figure: mirrors +/// fit-device.cpp's default (`max(2 GiB, 10% of budget)`) so the Rust plan and the +/// C++ artifact planner hold back the same headroom. +pub fn default_compute_reserve_bytes(vram_budget_bytes: u64) -> u64 { + (vram_budget_bytes / 10).max(2 * GB) +} + +/// Largest per-lane context (in tokens) whose KV fits `kv_budget_bytes`, clamped +/// to the model max. Zero when KV or lanes are zero. +fn context_fitting( + kv_budget_bytes: u64, + kv_bytes_per_token: u64, + lanes: u32, + model_max_context: u32, +) -> u32 { + if kv_bytes_per_token == 0 || lanes == 0 { + return 0; + } + let per_lane = kv_budget_bytes / lanes as u64; + let tokens = per_lane / kv_bytes_per_token; + u32::try_from(tokens).unwrap_or(u32::MAX).min(model_max_context) +} + +/// Plan how a model's resident tier fits the device, the context the leftover +/// affords, and the hot-expert VRAM budget. `resolve_override` is the adapter: +/// given the usable byte budget (VRAM − compute reserve) it returns an override +/// whose resident is PROMISED to fit — the plan re-verifies and rejects an +/// oversized one. +/// +/// Budget partition (in order): compute reserve → resident → KV for a sufficient +/// context → **everything left = hot-expert VRAM budget** (maximized). +pub fn plan_device_fit( + inputs: &DeviceFitInputs, + resolve_override: impl FnOnce(u64) -> Option, +) -> DeviceFitPlan { + let usable = inputs + .vram_budget_bytes + .saturating_sub(inputs.compute_reserve_bytes); + + let resident = if inputs.resident_bytes <= usable { + ResidentFit::Native + } else { + match resolve_override(usable) { + // Trust-but-verify: a shrunk resident that STILL overflows is a broken + // artifact — refuse it, don't OOM the launch on a false promise. + Some(ov) if ov.resident_bytes <= usable => ResidentFit::Override(ov), + _ => ResidentFit::Unfittable { + resident_bytes: inputs.resident_bytes, + usable_bytes: usable, + }, + } + }; + + let Some(on_device_resident) = resident.device_resident_bytes(inputs.resident_bytes) else { + return DeviceFitPlan { + resident, + context_window: 0, + expert_vram_budget_bytes: 0, + }; + }; + + // VRAM after the resident weights: shared between the KV cache and hot experts. + let after_resident = usable.saturating_sub(on_device_resident); + + // Reserve KV for the DESIRED context, but never more than after_resident can + // hold — a tight resident (K3 ~30 GB on 32 GB) squeezes the window rather than + // overflowing. The context is the floor we give up first so experts keep VRAM. + let desired = inputs.desired_context.min(inputs.model_max_context); + let desired_kv = inputs + .kv_bytes_per_token + .saturating_mul(desired as u64) + .saturating_mul(inputs.lanes.max(1) as u64); + + let (context_window, kv_bytes) = if desired_kv <= after_resident { + (desired, desired_kv) + } else { + // Squeeze: the largest window whose KV fits what's left after resident. + let ctx = context_fitting( + after_resident, + inputs.kv_bytes_per_token, + inputs.lanes.max(1), + desired, + ); + let kv = inputs + .kv_bytes_per_token + .saturating_mul(ctx as u64) + .saturating_mul(inputs.lanes.max(1) as u64); + (ctx, kv) + }; + + // Everything the resident + KV didn't claim is the hot-expert budget. This is + // the lever we maximize: more on-GPU experts, fewer streams, beat WASTE. + let expert_vram_budget_bytes = after_resident.saturating_sub(kv_bytes); + + DeviceFitPlan { + resident, + context_window, + expert_vram_budget_bytes, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn override_of(bytes: u64) -> impl FnOnce(u64) -> Option { + move |_usable| { + Some(ResidentOverride { + path: PathBuf::from("D:/k3-fit/Kimi-K3-fit-00001-of-00016.gguf"), + resident_bytes: bytes, + }) + } + } + fn no_override() -> impl FnOnce(u64) -> Option { + |_usable| None + } + + // what this catches: a resident tier that fits as-shipped serves NATIVE (no + // override artifact) and hot experts get the leftover VRAM — the small-MoE path. + #[test] + fn resident_under_budget_is_native_and_experts_get_leftover() { + let plan = plan_device_fit( + &DeviceFitInputs { + resident_bytes: 20 * GB, + vram_budget_bytes: 32 * GB, + kv_bytes_per_token: 128 * 1024, + compute_reserve_bytes: 2 * GB, // usable 30 + desired_context: 8192, + model_max_context: 262_144, + lanes: 1, + }, + no_override(), + ); + assert_eq!(plan.resident, ResidentFit::Native); + assert!(plan.is_gpu_servable()); + assert_eq!(plan.context_window, 8192); + // usable 30 − resident 20 − KV(8192×128KiB=1GiB) = ~9 GiB for hot experts. + assert!(plan.expert_vram_budget_bytes > 8 * GB); + } + + // what this catches: THE K3 case — 58 GB resident on 32 GB overflows, the 29 GB + // device-fit override is selected (not a partial -ngl, not an OOM), and the + // leftover funds hot experts. + #[test] + fn overflowing_resident_takes_override_and_frees_expert_vram() { + let plan = plan_device_fit( + &DeviceFitInputs { + resident_bytes: 58 * GB, + vram_budget_bytes: 32 * GB, + kv_bytes_per_token: 64 * 1024, + compute_reserve_bytes: 2 * GB, // usable 30 + desired_context: 4096, + model_max_context: 262_144, + lanes: 1, + }, + override_of(24 * GB), // aggressive shrink → room for experts + ); + match &plan.resident { + ResidentFit::Override(o) => assert_eq!(o.resident_bytes, 24 * GB), + other => panic!("expected Override, got {other:?}"), + } + assert!(plan.resident.override_path().is_some()); + // usable 30 − resident 24 − small KV → ~6 GiB hot experts (the WASTE-beating margin). + assert!(plan.expert_vram_budget_bytes > 5 * GB); + assert_eq!(plan.context_window, 4096); + } + + // what this catches: a shrunk override that STILL overflows is rejected as a + // broken artifact rather than OOMing the launch on a false promise. + #[test] + fn oversized_override_is_rejected_as_unfittable() { + let plan = plan_device_fit( + &DeviceFitInputs { + resident_bytes: 58 * GB, + vram_budget_bytes: 32 * GB, + kv_bytes_per_token: 64 * 1024, + compute_reserve_bytes: 2 * GB, + desired_context: 4096, + model_max_context: 262_144, + lanes: 1, + }, + override_of(40 * GB), + ); + assert!(matches!(plan.resident, ResidentFit::Unfittable { .. })); + assert!(!plan.is_gpu_servable()); + assert_eq!(plan.context_window, 0); + assert_eq!(plan.expert_vram_budget_bytes, 0); + } + + // what this catches: overflow with no override → Unfittable, so the caller + // routes to CPU/grid instead of launching a doomed GPU serve. + #[test] + fn overflow_without_override_is_unfittable() { + let plan = plan_device_fit( + &DeviceFitInputs { + resident_bytes: 58 * GB, + vram_budget_bytes: 32 * GB, + kv_bytes_per_token: 64 * 1024, + compute_reserve_bytes: 2 * GB, + desired_context: 4096, + model_max_context: 262_144, + lanes: 1, + }, + no_override(), + ); + assert!(matches!( + plan.resident, + ResidentFit::Unfittable { resident_bytes, usable_bytes } + if resident_bytes == 58 * GB && usable_bytes == 30 * GB + )); + } + + // what this catches: when resident nearly fills the card, the context is + // SQUEEZED to fit the sliver left (never overflow), and experts get ~nothing — + // the honest tight-fit signal that says "shrink resident more to beat WASTE." + #[test] + fn tight_resident_squeezes_context_not_overflow() { + let plan = plan_device_fit( + &DeviceFitInputs { + resident_bytes: 58 * GB, + vram_budget_bytes: 32 * GB, + kv_bytes_per_token: 64 * 1024, + compute_reserve_bytes: 2 * GB, // usable 30 + desired_context: 32_768, // wants a big window… + model_max_context: 262_144, + lanes: 1, + }, + override_of(29 * GB), // …but resident eats 29 of 30, ~1 GiB left + ); + assert!(matches!(plan.resident, ResidentFit::Override(_))); + // 1 GiB / 64 KiB ≈ 16k tokens max, below the 32k desired → squeezed, not overflowed. + assert!(plan.context_window > 0 && plan.context_window < 32_768); + // KV ate the sliver → almost nothing for experts (the tight-fit truth). + assert!(plan.expert_vram_budget_bytes < 1 * GB); + } + + // what this catches: more lanes → smaller per-lane window from the same VRAM. + #[test] + fn more_lanes_shrink_the_per_lane_window() { + let mk = |lanes| { + plan_device_fit( + &DeviceFitInputs { + resident_bytes: 20 * GB, + vram_budget_bytes: 32 * GB, + kv_bytes_per_token: 256 * 1024, + compute_reserve_bytes: 2 * GB, + desired_context: 262_144, // want max so VRAM is the binding limit + model_max_context: 262_144, + lanes, + }, + no_override(), + ) + .context_window + }; + assert!(mk(4) < mk(1), "more lanes must shrink the per-lane window"); + } + + // what this catches: the default reserve tracks fit-device.cpp (max(2 GiB, 10%)). + #[test] + fn default_reserve_matches_fit_device_cpp() { + assert_eq!(default_compute_reserve_bytes(32 * GB), 3 * GB + GB / 5); // 10% of 32 = 3.2 + assert_eq!(default_compute_reserve_bytes(8 * GB), 2 * GB); // 10% of 8 = 0.8 → floored to 2 + } +} diff --git a/core/continuum-core/src/capacity/mod.rs b/core/continuum-core/src/capacity/mod.rs index c23f914f3a..5514ce1374 100644 --- a/core/continuum-core/src/capacity/mod.rs +++ b/core/continuum-core/src/capacity/mod.rs @@ -24,6 +24,7 @@ pub mod bandit_plan_controller; pub mod consumer; +pub mod device_fit; pub mod expert_container; pub mod expert_decay_policy; pub mod expert_ecache; From 834967ac794b7e0da91d0ce9eec2460c84c7bece Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 06:56:40 -0500 Subject: [PATCH 12/27] feat(serving): resident-override plumbing on ServingTarget + launcher Wire foundation for the governor's device_fit plan: ServingTarget carries resident_override: Option, and the launcher exports it as LLAMA_RESIDENT_OVERRIDE so llama.cpp sources the precision-shrunk RESIDENT (non-expert) tensors from the device-fit GGUF (all offloaded to GPU) while the primary streams experts. All builders updated; defaults None (resident serves as-shipped, no behavior change) until compute_resident_override + the resolve-or-generate resolver (#35) land next. In-crate validated. Refs #29 #36. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/continuum-core/src/cognition/eval.rs | 2 ++ .../src/inference/llama_server.rs | 20 +++++++++++++++++++ .../src/modules/serving_daemon.rs | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/core/continuum-core/src/cognition/eval.rs b/core/continuum-core/src/cognition/eval.rs index 178a5c2f81..d24f6ff984 100644 --- a/core/continuum-core/src/cognition/eval.rs +++ b/core/continuum-core/src/cognition/eval.rs @@ -666,6 +666,7 @@ async fn spawn_gene_eval_lane( }], placement: placement_evidence.placement, expert_placement: None, // eval lanes run the whole model; no K3 expert paging + resident_override: None, // eval lanes serve resident as-shipped; no device-fit override }; emit_eval_phase("loading_lane", &format!("cold-loading gene eval lane ({})", gene.name)); let lane = EphemeralServingLane::spawn(&target, EVAL_LANE_BASE_PORT) @@ -776,6 +777,7 @@ async fn build_base_eval_lane_inner(base_id: &str) -> Result…", not a frozen bar. diff --git a/core/continuum-core/src/inference/llama_server.rs b/core/continuum-core/src/inference/llama_server.rs index 1a5c88d0a7..256df67621 100644 --- a/core/continuum-core/src/inference/llama_server.rs +++ b/core/continuum-core/src/inference/llama_server.rs @@ -212,6 +212,15 @@ pub struct ServingTarget { /// `relaunch_needed`), not by the probe-based reconcile here, since there is no API to /// read a running server's `-ot`. Per-expert paging (no relaunch) is slice-2. pub expert_placement: Option, + /// Device-fit resident-override: when the model's RESIDENT (non-expert) tier + /// overflows the governed VRAM budget as-shipped, the governor's + /// [`device_fit`](crate::capacity::device_fit) plan resolves a precision-shrunk + /// resident-override GGUF that fits. The launcher exports it as + /// `LLAMA_RESIDENT_OVERRIDE` so llama.cpp sources the resident tensors from it + /// (all offloaded to GPU) while the primary GGUF streams experts. `None` = + /// resident fits as-shipped (Native), served with no override — the default and + /// the only shape for a dense or small-MoE model. [[device-fit-repeatable-primitive]] / #29. + pub resident_override: Option, } /// Where a serving lane's model weights are resident — see [`ServingTarget::placement`]. @@ -1648,6 +1657,16 @@ impl LlamaServerControl for LlamaServerProcess { mmproj_local_path) or drop the Vision capability so the row stops claiming sight." ); } + // Device-fit resident-override (#29): source the RESIDENT (non-expert) + // tensors from the precision-shrunk fit GGUF so the whole resident tier fits + // VRAM offloaded to GPU, while this primary GGUF streams the experts. The + // loader hook (`LLAMA_RESIDENT_OVERRIDE`) lazy-maps only the override's + // resident bytes (its experts are ignored). Set by the governor's device_fit + // plan when as-shipped resident overflows the VRAM budget; absent = resident + // fits as-shipped (no override, no env). [[device-fit-repeatable-primitive]]. + if let Some(ov) = &target.resident_override { + cmd.env("LLAMA_RESIDENT_OVERRIDE", ov); + } // `--embeddings` is deliberately NOT set on this GENERATION lane. On the // current llama.cpp build it puts the server in embedding (non-causal) // mode, which makes generation fail with `500 "Compute error."` on EVERY @@ -2116,6 +2135,7 @@ mod tests { adapters: Vec::new(), placement: LanePlacement::Gpu, expert_placement: None, + resident_override: None, } } diff --git a/core/continuum-core/src/modules/serving_daemon.rs b/core/continuum-core/src/modules/serving_daemon.rs index daffe91f7e..e399b53aee 100644 --- a/core/continuum-core/src/modules/serving_daemon.rs +++ b/core/continuum-core/src/modules/serving_daemon.rs @@ -929,6 +929,12 @@ impl ServingDaemonModule { // offloadable layer). [[LanePlacement]]. placement: crate::inference::llama_server::LanePlacement::Gpu, expert_placement, + // Device-fit resident-override (#29): computed by `compute_resident_override` + // from the model's resident (non-expert) footprint vs the governed VRAM + // budget via `capacity::device_fit`. `None` until that compute + the + // resolve-or-generate artifact resolver (#35) land — resident then serves + // as-shipped (Native), unchanged from today. Wiring in progress, not a stub. + resident_override: None, }; // One reconcile at a time. If the swap finds `true`, another is already From 7e3c019a805a51f6ea49708b9ff11cfebfadd6b1 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 07:20:03 -0500 Subject: [PATCH 13/27] chore(vendor): bump llama.cpp fork to k3-adopt e3ce51df5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit M5's per-layer KV accessors (n_head_kv_il + n_embd_head_{k,v}_il, continuum #238) + graph reconciliation. The K3 engine now builds against these — enables the device_fit resident-override serve + honest per-layer K3 KV sizing. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index eee635ba2c..e3ce51df59 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit eee635ba2ceeb56d26d8f4c21864c006a8fd9872 +Subproject commit e3ce51df596547b9540afa6b093559096025f475 From ec1b54163b2b5a864a51b6dc4b65434b5a7f42d2 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 10:44:32 -0500 Subject: [PATCH 14/27] =?UTF-8?q?feat(serving):=20compute=5Fresident=5Fove?= =?UTF-8?q?rride=20=E2=80=94=20wire=20device=5Ffit=20into=20the=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The governor now DECIDES the resident source per serve: compute_resident_override derives resident_bytes (weights - expert_bytes_total) vs the governed VRAM ceiling via capacity::device_fit, and sets ServingTarget.resident_override. A dense/small model fits native (None); a >VRAM-resident MoE (K3) resolves a cached device-fit override that fits, else Unfittable → route to grid / generate (#35), glass-boxed. resolve_device_fit_override (model_registry::artifacts): looks up a per-user device-fit cache convention (/device-fit//) + a resident-bytes sidecar; returns the override only when its resident fits the usable budget. No hardcoded paths; generation/HF discovery is #35. The resident-fit decision turns only on resident_bytes vs budget — per-layer KV (#2107 ModelCapabilities) drives the context/expert split elsewhere, so KV is not consulted here. Refs #29 #35 #36. In-crate validated. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../src/model_registry/artifacts.rs | 47 +++++++++++ .../src/modules/serving_daemon.rs | 83 +++++++++++++++++-- 2 files changed, 124 insertions(+), 6 deletions(-) diff --git a/core/continuum-core/src/model_registry/artifacts.rs b/core/continuum-core/src/model_registry/artifacts.rs index ef718a738e..673d5bcb7d 100644 --- a/core/continuum-core/src/model_registry/artifacts.rs +++ b/core/continuum-core/src/model_registry/artifacts.rs @@ -180,6 +180,53 @@ fn resolve_from_local_model_roots(model_id: &str) -> Option { None } +/// Resolve a CACHED device-fit resident-override for `(model_id, usable_bytes)`. +/// The device-fit foundry (`tools/moe-fit`) writes a precision-shrunk RESIDENT +/// (non-expert) GGUF into a per-model cache dir plus a `resident-bytes` sidecar; +/// this looks it up and returns it ONLY when its resident tier fits the caller's +/// usable VRAM. Generation / HF discovery is #35 — absent a cached artifact this +/// returns `None` and the caller falls to `Unfittable` (loud), never a hardcoded +/// path. [[device-fit-repeatable-primitive]] +pub fn resolve_device_fit_override( + model_id: &str, + usable_bytes: u64, +) -> Option { + let dir = device_fit_cache_dir(model_id); + if !dir.is_dir() { + return None; + } + let first_shard = first_gguf_in_dir(&dir)?; + // The foundry records the resident byte total the shrink produced, so the plan + // verifies fit without loading the GGUF. Missing sidecar = not our foundry's + // artifact → refuse rather than guess its size ([[no-masking-fallbacks-my-style-tell]]). + let resident_bytes: u64 = fs::read_to_string(dir.join("resident-bytes")) + .ok()? + .trim() + .parse() + .ok()?; + (resident_bytes <= usable_bytes).then_some(crate::capacity::device_fit::ResidentOverride { + path: first_shard, + resident_bytes, + }) +} + +/// Per-user cache dir a device-fit override for `model_id` lives in: +/// `/device-fit//`. A convention (mirrors +/// [`local_model_roots`]), never a hardcoded operator path. +fn device_fit_cache_dir(model_id: &str) -> PathBuf { + let slug: String = model_id + .chars() + .map(|c| { + if c.is_ascii_alphanumeric() { + c.to_ascii_lowercase() + } else { + '-' + } + }) + .collect(); + storage_root().join("device-fit").join(slug) +} + fn local_model_roots() -> Vec { let mut roots = Vec::new(); if let Some(home) = home_dir_string() { diff --git a/core/continuum-core/src/modules/serving_daemon.rs b/core/continuum-core/src/modules/serving_daemon.rs index e399b53aee..64c7ce5d8a 100644 --- a/core/continuum-core/src/modules/serving_daemon.rs +++ b/core/continuum-core/src/modules/serving_daemon.rs @@ -686,6 +686,76 @@ impl ServingDaemonModule { ctx.committed_placement.clone() } + /// Device-fit resident-override (#29): does this model's RESIDENT (non-expert) + /// tier fit the governed VRAM budget as-shipped, or must the launcher source a + /// precision-shrunk resident from a device-fit override GGUF? The resident-FIT + /// decision turns ONLY on `resident_bytes` vs the budget minus a fixed compute + /// reserve — per-layer KV (M5's #2107 `ModelCapabilities`) drives the CONTEXT + + /// expert-VRAM split, NOT this, so KV is deliberately not consulted here. `None` + /// = resident fits as-shipped (dense / small MoE, served normally) OR no fitting + /// override is cached yet (a >VRAM-resident MoE like K3 until the resolver #35 + /// discovers/generates one — then the launch OOMs LOUD rather than silently + /// mis-serving, [[no-masking-fallbacks-my-style-tell]]). + fn compute_resident_override(&self, model: &Model) -> Option { + let budget = governed_vram_ceiling(&self.resource_daemon)?; + if budget == 0 { + return None; + } + // Expert-tensor total — present only for a MoE serve (a dense model's + // resident always places on GPU normally, no device-fit split). Read under + // the same never-across-await sync Mutex as the placement path. + let expert_bytes_total = { + let guard = self.moe_serving.lock().ok()?; + match guard.as_ref() { + Some((id, ctx)) if id.as_str() == model.id.as_str() => ctx.expert_bytes_total, + _ => return None, + } + }; + let fp = footprint_for(model)?; + let resident_bytes = fp.weights_bytes.saturating_sub(expert_bytes_total); + let model_id = model.id.clone(); + let inputs = crate::capacity::device_fit::DeviceFitInputs { + resident_bytes, + vram_budget_bytes: budget, + kv_bytes_per_token: 0, // not consulted for the resident-fit decision — see doc + compute_reserve_bytes: + crate::capacity::device_fit::default_compute_reserve_bytes(budget), + desired_context: model.context_window, + model_max_context: model.context_window, + lanes: 1, + }; + let plan = crate::capacity::device_fit::plan_device_fit(&inputs, |usable| { + crate::model_registry::artifacts::resolve_device_fit_override(&model_id, usable) + }); + crate::probe!( + class = "serving.device_fit", + model = model.id.as_str(), + resident_bytes, + budget_bytes = budget, + gpu_servable = plan.is_gpu_servable(), + has_override = plan.resident.override_path().is_some(), + "device-fit resident tier: {}", + match &plan.resident { + crate::capacity::device_fit::ResidentFit::Native => + "fits as-shipped (native, all resident on GPU)".to_string(), + crate::capacity::device_fit::ResidentFit::Override(o) => format!( + "device-fit override {} GiB resident from {}", + o.resident_bytes / (1024 * 1024 * 1024), + o.path.display() + ), + crate::capacity::device_fit::ResidentFit::Unfittable { + resident_bytes, + usable_bytes, + } => format!( + "UNFITTABLE: resident {} GiB > {} GiB usable — route to grid or generate an override (#35)", + resident_bytes / (1024 * 1024 * 1024), + usable_bytes / (1024 * 1024 * 1024) + ), + }, + ); + plan.resident.override_path().cloned() + } + /// #287 slice 2 — the governed host-cache lease, derived LIVE on the tick and /// published to the per-port plan file her `ResidencyCache` mtime-polls. This is /// the loop-closer that retires the `GGML_MOE_HOST_CACHE_GB=40` scratchpad @@ -920,6 +990,12 @@ impl ServingDaemonModule { // for a dense model (or before the pager has committed a placement) — served exactly // as before, no override. let expert_placement = self.compute_expert_placement(&model); + // Device-fit resident-override (#29): computed from the model's resident + // (non-expert) footprint vs the governed VRAM budget. `Some(path)` when + // resident overflows as-shipped and a cached device-fit override fits (the + // launcher sources resident from it via `LLAMA_RESIDENT_OVERRIDE`); `None` + // when resident fits natively OR no override is cached yet (resolver #35). + let resident_override = self.compute_resident_override(&model); let target = ServingTarget { model, context_window: served_ctx, @@ -929,12 +1005,7 @@ impl ServingDaemonModule { // offloadable layer). [[LanePlacement]]. placement: crate::inference::llama_server::LanePlacement::Gpu, expert_placement, - // Device-fit resident-override (#29): computed by `compute_resident_override` - // from the model's resident (non-expert) footprint vs the governed VRAM - // budget via `capacity::device_fit`. `None` until that compute + the - // resolve-or-generate artifact resolver (#35) land — resident then serves - // as-shipped (Native), unchanged from today. Wiring in progress, not a stub. - resident_override: None, + resident_override, }; // One reconcile at a time. If the swap finds `true`, another is already From eddadc9e2c8e5a331e3f98d205bf48d4c6327ad7 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 11:53:07 -0500 Subject: [PATCH 15/27] =?UTF-8?q?docs(arch):=20storage=20serving-tier=20go?= =?UTF-8?q?vernor=20=E2=80=94=20NVMe<->cold=20contention=20managed=20like?= =?UTF-8?q?=20VRAM/RAM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Joel: 'like vram and memory, this contention has to be managed between cold storage and nvme.' Design: NVMe is a governed HOT-SERVING tier (a ResourcePool, same TrackedDir + evict_at_least machinery as CargoTargetPool), whose eviction = MIGRATE frozen/duplicate artifacts to the Cold drive, not a manual rm. Serving asks ensure_hot_resident(model); composes with device_fit's Unfittable one tier down (VRAM). Corrects the DriveRole bug: Cold (HDD) is FROZEN storage, never the per-token streaming tier (HDD = unservable). Dissolves today's K3 container disk fight: the C: IQ2 is a verified duplicate of the D: copy -> governor migrates it off NVMe -> container fits, no human deletes anything. Refs #12 #36. Design for M5's system_resources lane. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../STORAGE-SERVING-TIER-GOVERNOR.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 docs/architecture/STORAGE-SERVING-TIER-GOVERNOR.md diff --git a/docs/architecture/STORAGE-SERVING-TIER-GOVERNOR.md b/docs/architecture/STORAGE-SERVING-TIER-GOVERNOR.md new file mode 100644 index 0000000000..63e2dbc43c --- /dev/null +++ b/docs/architecture/STORAGE-SERVING-TIER-GOVERNOR.md @@ -0,0 +1,92 @@ +# Storage serving-tier governor — NVMe↔cold contention, managed like VRAM/RAM + +**Status:** design (2026-08-02, BigMama). Prompted by Joel: *"Like vram and memory, this +contention has to be managed too between cold storage and nvme."* Written because completing the K3 +expert container hit a manual disk fight (delete the 662 GB C: copy? pack from D:?) that the +substrate should have resolved on its own. + +## The gap + +`capacity::system_profile::DriveRole` today has two roles — `System` (OS/working) and `Cold` (the +big offload drive) — and documents `Cold` as *"where MoE expert sets are paged into VRAM on +demand."* **That is wrong for a spinning HDD.** Measured ([[hdd-vs-nvme-is-a-residency-tier]]): +streaming an expert bank off a 130 MB/s HDD = 156–544 s/token = unservable. The model conflates two +physically different tiers: + +- **Hot serving tier** — the artifact being *paged per token* (the K3 expert **container**). MUST + live on NVMe (2.6 GB/s). This is a device-like resource with a **budget** (NVMe free − system + reserve) and **contention** (two big models' containers can't both be resident). +- **Frozen tier** — artifacts NOT streamed per token: source GGUFs, backups, models-not-currently + served. These belong on the Cold drive. A GGUF the foundry already re-packed into a container is + frozen — its NVMe copy is pure duplication. + +Nothing governs the boundary, so a human (or an agent) hand-decides which 662 GB file to delete to +fit a 667 GB container. That is the VRAM-OOM story from a year ago, one tier down. + +## The model: NVMe is a governed hot-serving tier + +Reuse the machinery that already exists for `cargo-target` — do NOT invent a parallel one: + +- `system_resources::disk_reporters::TrackedDir` — a named, measured disk cache class. +- `paging::pool::ResourcePool` (`capacity_bytes` / `usage_bytes` / `evict_at_least`) — the eviction + contract. `CargoTargetPool` is the worked example. +- `disk_eviction::every_cache_class_has_a_decided_eviction_story` — the test that FAILS on an + undecided class (CLAUDE.md disk doctrine). + +Add **one new `ResourcePool`**: `NvmeServingTierPool`. + +- `capacity_bytes` = NVMe (System drive) total − a system reserve (OS/build headroom, governed, not + a magic constant). +- `usage_bytes` = bytes of hot serving artifacts resident on NVMe (containers + device-fit + overrides + primary GGUFs currently served). +- **`evict_at_least(want)` = migrate the coldest FROZEN / DUPLICATE artifact off NVMe to the Cold + drive** (not delete — *migrate*, and a verified duplicate that already exists on Cold is a pure + drop). Coldest-first: models not currently served, then source GGUFs whose experts are already in + a container, then LRU by last-served. Never evict the artifact the active serve is paging. + +The `DriveRole` doc is corrected: `Cold` = frozen storage, **never** the per-token streaming tier. + +## Serving integration (dissolves the manual fight) + +The serving planner already computes what a model needs. Extend it: before a serve, ask the storage +governor to **make the hot tier resident** — + +``` +storage.ensure_hot_resident(model) -> + needs = container_bytes(model) + device_fit_override_bytes(model) // the per-token-paged set + if nvme_free >= needs { place / keep on NVMe; done } + else { NvmeServingTierPool.evict_at_least(needs - nvme_free) } // migrate frozen/dupes to Cold + if still short -> Unfittable: route to grid, LOUD (no silent HDD-stream fallback) +``` + +`capacity::device_fit` already returns `Unfittable` for the VRAM tier; this is the exact same shape +one level down for the **NVMe** tier. The two compose: a model is GPU-servable on this box iff its +resident tier fits VRAM AND its paged tier fits NVMe (after governed frozen-eviction). + +## The K3 worked example (what should have happened today) + +1. Foundry packs the K3 expert container (667 GB, hot) onto NVMe. +2. `ensure_hot_resident(kimi-k3)` sees NVMe short by ~76 GB. +3. `NvmeServingTierPool.evict_at_least(76 GB)` finds the **C: IQ2 GGUF** — its experts are already in + the container (frozen) AND a verified identical copy exists on the Cold drive + (`D:\continuum-cold\…\UD-IQ2_XXS`, 16 shards, 662 GB). It is a pure duplicate → drop from NVMe. +4. Container fits. Serve. **No human deletes anything; the governor tiered it.** + +## Boundaries / ownership + +- The `ResourcePool` + `TrackedDir` + `disk_eviction` machinery is M5's `system_resources` / + governor lane — this pool registers there, same as `CargoTargetPool`. +- Duplicate detection (an NVMe GGUF whose identical twin is on Cold) is a small content/shard + identity check; a hash or (size + shard count + name) match is enough for the "safe to drop" + verdict — never drop an NVMe artifact without a verified Cold twin. +- Migration cost (NVMe→Cold write, or Cold→NVMe promote for a re-served cold model) is real disk + bandwidth; the governor leases it like any other, and a promote from a 130 MB/s HDD is a + first-token latency the planner must surface (it is why "serve a cold model" is not free). + +## Why this is the right shape + +The pager control law is fractal ([[pager-control-law-is-fractal-to-grid]]): VRAM↔RAM↔NVMe↔Cold is +the same predict-recency → allocate-under-budget → evict-coldest loop at every level. The serving +tier on NVMe is just the next rung down from the expert pager on VRAM — and one rung up from the +grid pooling capacity across nodes. Managing it with the SAME `ResourcePool` contract keeps the +substrate coherent instead of growing a bespoke disk-juggler. From 3077e6c042b7cf83d2cd83738e2cf6561b8e30ea Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 12:36:21 -0500 Subject: [PATCH 16/27] =?UTF-8?q?feat(capacity):=20verified=20cold-twin=20?= =?UTF-8?q?detection=20=E2=80=94=20safe-to-drop=20primitive=20for=20the=20?= =?UTF-8?q?storage=20tier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gate the NVMe serving-tier eviction (#302) consults before dropping a frozen GGUF: is an IDENTICAL twin already on cold storage? is_structural_twin (pure) = same shard count + per-shard name + size, zero-byte shards never match. scan_shards + find_cold_twin are the thin fs layer. Never drop an NVMe artifact without a VERIFIED cold twin (dropping 662GB on a path guess is the failure this guards). Standalone-validated 5/5. Composes with device_fit + M5's NvmeServingTierPool. Refs #12 #36. Design: STORAGE-SERVING-TIER-GOVERNOR.md. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/continuum-core/src/capacity/cold_twin.rs | 184 ++++++++++++++++++ core/continuum-core/src/capacity/mod.rs | 1 + 2 files changed, 185 insertions(+) create mode 100644 core/continuum-core/src/capacity/cold_twin.rs diff --git a/core/continuum-core/src/capacity/cold_twin.rs b/core/continuum-core/src/capacity/cold_twin.rs new file mode 100644 index 0000000000..6a52759e8a --- /dev/null +++ b/core/continuum-core/src/capacity/cold_twin.rs @@ -0,0 +1,184 @@ +//! Verified cold-twin detection — the "safe to drop from NVMe" primitive for the +//! storage serving-tier governor (`docs/architecture/STORAGE-SERVING-TIER-GOVERNOR.md`). +//! +//! When the NVMe hot-serving tier is over budget, the governor's `evict_at_least` +//! migrates the coldest FROZEN/DUPLICATE artifact to the Cold drive. A frozen GGUF +//! whose identical twin ALREADY exists on cold storage is a pure duplicate — dropping +//! its NVMe copy loses no data. But "identical" must be VERIFIED, never assumed from a +//! path: dropping a 662 GB model on a bad guess is the failure this guards +//! ([[no-masking-fallbacks-my-style-tell]]). The verdict here is the gate an eviction +//! pool consults before it drops anything. +//! +//! Verification tiers (cheap → strong), the caller picks the floor: +//! * **structural** — same shard count, same names, same per-shard sizes. Catches a +//! partial/truncated copy or a different quant. The default floor (what a human +//! `dir` comparison does, but mechanical). +//! * **content** (caller's job, not here) — a header-magic check or a hash. This +//! module returns the candidate; the caller escalates if it wants stronger proof. +//! +//! Pure over its inputs (the shard lists); the fs scan that produces them is a thin +//! separate step so the match logic is unit-testable without touching disk. + +use std::path::{Path, PathBuf}; + +/// One shard's identity for twin comparison: file name + byte length. Deliberately +/// NOT the full path — a twin lives under a different root by definition. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ShardStat { + pub name: String, + pub size: u64, +} + +/// The shard set of one artifact (a multi-file GGUF), sorted by name for order-stable +/// comparison. Produced by [`scan_shards`]; compared by [`is_structural_twin`]. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ArtifactShards { + pub dir: PathBuf, + pub shards: Vec, +} + +impl ArtifactShards { + /// Total bytes across all shards — the reclaim that dropping this copy frees. + pub fn total_bytes(&self) -> u64 { + self.shards.iter().map(|s| s.size).sum() + } +} + +/// STRUCTURAL twin test (the default safe-to-drop floor): the two artifacts have the +/// same shard count, and each shard matches its counterpart by NAME and SIZE. Order is +/// normalized (both sorted by name). An empty artifact never twins anything (dropping +/// on "both empty" is a bug, not a duplicate). Pure — no I/O. +pub fn is_structural_twin(nvme: &ArtifactShards, cold: &ArtifactShards) -> bool { + if nvme.shards.is_empty() || nvme.shards.len() != cold.shards.len() { + return false; + } + nvme.shards + .iter() + .zip(cold.shards.iter()) + .all(|(a, b)| a.name == b.name && a.size == b.size && a.size > 0) +} + +/// Scan `dir` for shards with `ext` (e.g. `"gguf"`), returning name+size sorted by +/// name. Missing dir / no matches → empty shard list (never twins). Thin I/O layer +/// over the pure [`is_structural_twin`]. +pub fn scan_shards(dir: &Path, ext: &str) -> ArtifactShards { + let mut shards: Vec = std::fs::read_dir(dir) + .into_iter() + .flatten() + .flatten() + .filter_map(|e| { + let path = e.path(); + if path.extension().and_then(|s| s.to_str()) != Some(ext) { + return None; + } + let name = path.file_name()?.to_str()?.to_string(); + let size = e.metadata().ok()?.len(); + Some(ShardStat { name, size }) + }) + .collect(); + shards.sort_by(|a, b| a.name.cmp(&b.name)); + ArtifactShards { + dir: dir.to_path_buf(), + shards, + } +} + +/// Find a VERIFIED structural twin of `nvme_artifact` under any of `cold_roots` (the +/// Cold-drive artifact roots). Returns the cold twin's dir when found — the signal that +/// the NVMe copy is a safe-to-drop duplicate. `None` = no verified twin → the governor +/// must NOT drop the NVMe copy (migrate the bytes instead, or keep it). +/// +/// A cold root is scanned one level deep for a subdir whose shards structurally twin the +/// NVMe artifact (the model's own dir name may differ across drives, so match on shard +/// identity, not the dir name). +pub fn find_cold_twin( + nvme_artifact: &ArtifactShards, + cold_roots: &[PathBuf], + ext: &str, +) -> Option { + if nvme_artifact.shards.is_empty() { + return None; + } + for root in cold_roots { + // the root itself might hold the shards… + let here = scan_shards(root, ext); + if is_structural_twin(nvme_artifact, &here) { + return Some(root.clone()); + } + // …or one of its immediate subdirs (Steam-library-style per-model dirs). + if let Ok(entries) = std::fs::read_dir(root) { + for sub in entries.flatten() { + let p = sub.path(); + if p.is_dir() { + let cand = scan_shards(&p, ext); + if is_structural_twin(nvme_artifact, &cand) { + return Some(p); + } + } + } + } + } + None +} + +#[cfg(test)] +mod tests { + use super::*; + + fn art(shards: &[(&str, u64)]) -> ArtifactShards { + ArtifactShards { + dir: PathBuf::from("x"), + shards: shards + .iter() + .map(|(n, s)| ShardStat { + name: n.to_string(), + size: *s, + }) + .collect(), + } + } + + // what this catches: identical shard sets (name+size) verify as twins — the K3 + // case (16 shards, matching sizes) → safe to reclaim the NVMe copy. + #[test] + fn identical_shards_are_a_twin() { + let a = art(&[("k3-00001.gguf", 41 * 1024), ("k3-00002.gguf", 45 * 1024)]); + let b = art(&[("k3-00001.gguf", 41 * 1024), ("k3-00002.gguf", 45 * 1024)]); + assert!(is_structural_twin(&a, &b)); + } + + // what this catches: a TRUNCATED/partial cold copy (one shard short) is NOT a twin + // — never drop the NVMe copy against an incomplete backup. + #[test] + fn missing_shard_is_not_a_twin() { + let a = art(&[("k3-00001.gguf", 41 * 1024), ("k3-00002.gguf", 45 * 1024)]); + let b = art(&[("k3-00001.gguf", 41 * 1024)]); + assert!(!is_structural_twin(&a, &b)); + } + + // what this catches: same names but a DIFFERENT size (different quant, or a + // corrupt/partial shard) is NOT a twin — size is load-bearing. + #[test] + fn size_mismatch_is_not_a_twin() { + let a = art(&[("k3-00001.gguf", 41 * 1024)]); + let b = art(&[("k3-00001.gguf", 20 * 1024)]); + assert!(!is_structural_twin(&a, &b)); + } + + // what this catches: an empty artifact never twins anything — dropping on + // "both empty" would be a bug, not a verified duplicate. + #[test] + fn empty_never_twins() { + assert!(!is_structural_twin(&art(&[]), &art(&[]))); + assert!(!is_structural_twin(&art(&[("a.gguf", 10)]), &art(&[]))); + } + + // what this catches: a zero-byte shard (the interrupted-write case, like the + // container's L11=0) never counts as a matching shard. + #[test] + fn zero_byte_shard_is_not_a_match() { + let a = art(&[("a.gguf", 0)]); + let b = art(&[("a.gguf", 0)]); + assert!(!is_structural_twin(&a, &b)); + } +} diff --git a/core/continuum-core/src/capacity/mod.rs b/core/continuum-core/src/capacity/mod.rs index 5514ce1374..d21724579b 100644 --- a/core/continuum-core/src/capacity/mod.rs +++ b/core/continuum-core/src/capacity/mod.rs @@ -23,6 +23,7 @@ //! IS a real regression test. pub mod bandit_plan_controller; +pub mod cold_twin; pub mod consumer; pub mod device_fit; pub mod expert_container; From ca8dbfcc080517b85af749d5effc2fae1baeac5e Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 12:59:09 -0500 Subject: [PATCH 17/27] =?UTF-8?q?chore(vendor):=20bump=20llama.cpp=20fork?= =?UTF-8?q?=20to=20k3-adopt=20c6469d5=20=E2=80=94=20container-serve=20wire?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both halves of the DirContainerFetcher wire (BigMama fetcher + moe_pick_fetcher branch 175ac9d6a; M5 caller-side encode + record_bytes reader c6469d5). Serving now reads the aligned per-layer container (GGML_MOE_CONTAINER) instead of the scattered raw GGUF — the honest ~2.6GB/s path. Retires the built-not-wired ContainerFetcher. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index e3ce51df59..c6469d5764 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit e3ce51df596547b9540afa6b093559096025f475 +Subproject commit c6469d57648f70432f96b38e0c98a41e5ce97928 From e936f5ec9b8a9c7e2d44042bc93632b5cdf05680 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 18:17:02 -0500 Subject: [PATCH 18/27] fix(serving): resident_override on vision_sidecar ServingTarget + K3 coverage measurement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merge fix: vision_sidecar's ServingTarget was missing resident_override (added by #29). Plus a measurement test that drains the real K3 routed-access fixture through the #282 predictive instrument and prints repeat_recall / predicted_delta / schedulable_coverage — the go/no-go for the LiveUploadPager predictive pipeline (H2D/token = (1 - coverage) x ~11GB). Prints, never asserts (real routing sample). NOTE: can't run on windows-msvc (pre-existing cargo-test Unix-socket block, ipc/mod.rs); runs on M5's Mac. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../continuum-core/src/capacity/trace_tail.rs | 30 +++++++++++++++++++ .../src/inference/vision_sidecar.rs | 1 + 2 files changed, 31 insertions(+) diff --git a/core/continuum-core/src/capacity/trace_tail.rs b/core/continuum-core/src/capacity/trace_tail.rs index 69af58ad9c..535424c0b4 100644 --- a/core/continuum-core/src/capacity/trace_tail.rs +++ b/core/continuum-core/src/capacity/trace_tail.rs @@ -483,4 +483,34 @@ mod tests { assert_eq!(pin_ceiling(4000 * mb, 0, 10, 100), 0); assert_eq!(pin_ceiling(4000 * mb, 10_000 * mb, 0, 0), 0); } + + // MEASUREMENT (go/no-go for the LiveUploadPager predictive pipeline, #23/#34): the REAL K3 + // routed-access trace's schedulable coverage decides whether predictive prefetch can hide the + // per-op H2D — H2D/token = (1 - coverage) × ~11GB. Prints, never asserts a value (the fixture is + // a real routing sample, not a synthetic invariant); run with --nocapture to read it. + #[test] + fn k3_fixture_measured_schedulable_coverage() { + let fixture = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../docs/architecture/prototypes/expert-pager/fixtures/k3-routed-access.trace"); + if !fixture.is_file() { + eprintln!("[K3-COVERAGE] fixture absent ({}), skipping", fixture.display()); + return; + } + let mut tail = MoeTraceTail::new(92); // K3: 92 MoE layers + let mut tokens = 0u64; + for _ in 0..100_000 { + let n = tail.drain(&fixture); + tokens += n; + if n == 0 { + break; + } + } + eprintln!( + "[K3-COVERAGE] tokens={} repeat_recall={:?} predicted_delta={:?} schedulable_coverage={:?} (x100)", + tokens, + tail.repeat_recall_x100(), + tail.predicted_delta_recall_x100(), + tail.schedulable_coverage_x100() + ); + } } diff --git a/core/continuum-core/src/inference/vision_sidecar.rs b/core/continuum-core/src/inference/vision_sidecar.rs index d98272984b..7448794ef3 100644 --- a/core/continuum-core/src/inference/vision_sidecar.rs +++ b/core/continuum-core/src/inference/vision_sidecar.rs @@ -194,6 +194,7 @@ pub async fn ensure_sidecar( adapters: Vec::new(), placement: LanePlacement::Cpu, expert_placement: None, + resident_override: None, // vision sidecar serves as-shipped; no device-fit override }; let lane = EphemeralServingLane::spawn(&target, VISION_SIDECAR_BASE_PORT) .await From 3319e9be7c5604d7b8ad2c5ab7f839aa6f1e6472 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 19:56:07 -0500 Subject: [PATCH 19/27] feat(pager-driver): offline warm-coverage measurement (--synth-layers, --once, --budget-slots) The moe-pager-driver gains an offline replay mode so any completed GGML_MOE_TRACE_FILE can be scored on any box (windows-msvc clean by crate constraint), not just tailed live next to a serve: - --synth-layers N: synthesize the tkey->layer map from layer count alone (TkeyTable::for_layers, the same zero-config seam MoeTraceTail owns) instead of requiring an operator tkey-to-layer-matrix.json. - --once: exit when the trace stops growing (EOF) and print a SUMMARY line with mean DECODE-token serving hit = warm schedulable coverage. - --budget-slots N: override the predictor residency budget (default auto = first token x1.5) to measure the coverage-vs-free-VRAM curve (the device-fit tradeoff). Measured on BigMama run2.trace (302 warm decode tokens): bandit coverage 13.8% @250 slots -> 51.3% @2000 -> 65.7% @4024, beating naive last-N recency by +7-9pts at matched VRAM. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../src/bin/moe-pager-driver.rs | 119 +++++++++++++++--- 1 file changed, 103 insertions(+), 16 deletions(-) diff --git a/core/expert-pager-policy/src/bin/moe-pager-driver.rs b/core/expert-pager-policy/src/bin/moe-pager-driver.rs index dc5ce536f1..a5ebfa8476 100644 --- a/core/expert-pager-policy/src/bin/moe-pager-driver.rs +++ b/core/expert-pager-policy/src/bin/moe-pager-driver.rs @@ -34,7 +34,14 @@ use expert_pager_policy::BanditPlanController; struct Args { trace: PathBuf, - table: PathBuf, + /// Operator-authored tkey→layer JSON. Mutually exclusive with + /// `synth_layers` — exactly one is required. + table: Option, + /// Synthesize the tkey→layer map from layer count alone + /// ([`TkeyTable::for_layers`]) — the zero-config seam `MoeTraceTail` + /// uses. Lets the driver replay a completed trace on any box + /// without an operator JSON (offline warm-coverage measurement). + synth_layers: Option, plan: PathBuf, budget_bytes: u64, window_k: u32, @@ -47,11 +54,20 @@ struct Args { /// Precision-ladder index the unpinned cold tail fetches from (the /// small-quant bank — the beat-WASTE knob). None = container default. default_tier: Option, + /// Offline replay: exit once the trace stops growing (EOF), print a + /// SUMMARY line with mean decode-token serving hit. Without it the + /// driver tails forever (the live-next-to-serve mode). + once: bool, + /// Override the predictor's residency budget (expert slots). Default + /// is auto (first token × 1.5). Set this to measure coverage at a + /// REALISTIC free-VRAM budget — the device-fit tradeoff curve. + budget_slots: Option, } fn parse_args() -> Result { let mut trace = None; let mut table = None; + let mut synth_layers = None; let mut plan = None; let mut budget_bytes = None; let mut window_k = None; @@ -60,16 +76,28 @@ fn parse_args() -> Result { let mut poll_ms = 50u64; let mut pin_tier = None; let mut default_tier = None; + let mut once = false; + let mut budget_slots = None; let argv: Vec = std::env::args().skip(1).collect(); let mut i = 0; while i < argv.len() { let flag = argv[i].as_str(); + // `--once` is a lone toggle (no value); handle it before the + // value-consuming flags so it doesn't swallow the next arg. + if flag == "--once" { + once = true; + i += 1; + continue; + } let value = argv .get(i + 1) .ok_or_else(|| format!("{flag} needs a value"))?; match flag { "--trace" => trace = Some(PathBuf::from(value)), "--table" => table = Some(PathBuf::from(value)), + "--synth-layers" => { + synth_layers = Some(value.parse().map_err(|e| format!("--synth-layers: {e}"))?) + } "--plan" => plan = Some(PathBuf::from(value)), "--budget-bytes" => { budget_bytes = Some(value.parse().map_err(|e| format!("--budget-bytes: {e}"))?) @@ -86,13 +114,20 @@ fn parse_args() -> Result { "--default-tier" => { default_tier = Some(value.parse().map_err(|e| format!("--default-tier: {e}"))?) } + "--budget-slots" => { + budget_slots = Some(value.parse().map_err(|e| format!("--budget-slots: {e}"))?) + } other => return Err(format!("unknown flag {other}")), } i += 2; } + if table.is_some() == synth_layers.is_some() { + return Err("exactly one of --table or --synth-layers is required".into()); + } Ok(Args { trace: trace.ok_or("--trace required")?, - table: table.ok_or("--table required")?, + table, + synth_layers, plan: plan.ok_or("--plan required")?, budget_bytes: budget_bytes.ok_or("--budget-bytes required")?, window_k: window_k.ok_or("--window-k required")?, @@ -101,6 +136,8 @@ fn parse_args() -> Result { poll_ms, pin_tier, default_tier, + once, + budget_slots, }) } @@ -117,19 +154,29 @@ fn main() { } }; - let table_json = match std::fs::read_to_string(&args.table) { - Ok(s) => s, - Err(e) => { - eprintln!("moe-pager-driver: read table {}: {e}", args.table.display()); - std::process::exit(1); + let table = match (&args.table, args.synth_layers) { + (Some(path), _) => { + let table_json = match std::fs::read_to_string(path) { + Ok(s) => s, + Err(e) => { + eprintln!("moe-pager-driver: read table {}: {e}", path.display()); + std::process::exit(1); + } + }; + match TkeyTable::from_json(&table_json) { + Ok(t) => t, + Err(e) => { + eprintln!("moe-pager-driver: {e}"); + std::process::exit(1); + } + } } - }; - let table = match TkeyTable::from_json(&table_json) { - Ok(t) => t, - Err(e) => { - eprintln!("moe-pager-driver: {e}"); - std::process::exit(1); + (None, Some(n)) => { + println!("# synthesizing tkey table for {n} layers (zero-config seam)"); + TkeyTable::for_layers(n) } + // parse_args guarantees exactly one is set. + (None, None) => unreachable!("parse_args enforces --table xor --synth-layers"), }; println!( "# driver up: table {} tkeys, trace {}, plan {}, pin_top {}, rewrite_every {}", @@ -148,17 +195,32 @@ fn main() { let mut offset: u64 = 0; let mut carry: Vec = Vec::new(); let mut token_idx: u64 = 0; + // Offline (`--once`) warm-coverage aggregation: mean serving hit over + // DECODE tokens only (prefill's big batches are not representative of + // the steady-state paging load). `in_decode` flips true at the + // prefill→decode boundary. + let mut in_decode = false; + let mut decode_tokens = 0u64; + let mut hit_sum = 0.0f64; loop { let mut file = match std::fs::File::open(&args.trace) { Ok(f) => f, Err(_) => { + if args.once && offset > 0 { + break; + } // Serve not started yet — wait for the trace to appear. std::thread::sleep(std::time::Duration::from_millis(args.poll_ms)); continue; } }; let len = file.metadata().map(|m| m.len()).unwrap_or(0); + // Offline replay: the trace has stopped growing and we've drained + // it — emit the summary and exit instead of tailing forever. + if args.once && offset > 0 && len <= offset { + break; + } if len < offset { // Truncated: a NEW serve started. Reset the whole loop // state — stale scores belong to the previous generation. @@ -193,6 +255,7 @@ fn main() { // prefill batches churn the cache, so the // boundary is when the hint matters most). if boundary.observe(experts.len()) { + in_decode = true; if let Some(ctl) = controller.as_ref() { match ctl.write_tiered_plan( &args.plan, @@ -213,15 +276,25 @@ fn main() { } } let ctl = controller.get_or_insert_with(|| { - let budget = experts.len() * 3 / 2; + let budget = args.budget_slots.unwrap_or(experts.len() * 3 / 2); println!( - "# first token: {} experts -> budget {budget} slots", - experts.len() + "# first token: {} experts -> budget {budget} slots{}", + experts.len(), + if args.budget_slots.is_some() { + " (operator override)" + } else { + " (auto: ×1.5)" + } ); BanditPlanController::new(budget) }); let hit = ctl.observe_token(&experts); token_idx += 1; + // Warm-coverage aggregation: decode tokens only. + if in_decode { + decode_tokens += 1; + hit_sum += hit; + } let arms: Vec = ctl .per_arm_reward() .iter() @@ -259,4 +332,18 @@ fn main() { } std::thread::sleep(std::time::Duration::from_millis(args.poll_ms)); } + + // Reached only in `--once` (offline) mode: the trace is fully drained. + // The mean decode-token serving hit IS the warm schedulable coverage — + // the fraction of per-token expert H2D copies the pager avoids. + let mean_hit = if decode_tokens > 0 { + hit_sum / decode_tokens as f64 + } else { + 0.0 + }; + println!( + "# SUMMARY tokens_total {token_idx} decode_tokens {decode_tokens} \ + mean_decode_hit {mean_hit:.4} unknown_tkeys {}", + segmenter.unknown_tkeys + ); } From a19df011cb36375cabb2f4fd0b5690c8568d7734 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Sun, 2 Aug 2026 20:20:06 -0500 Subject: [PATCH 20/27] =?UTF-8?q?feat(pager):=20measure=20cross-layer=20pr?= =?UTF-8?q?efetch=20predictor=20ceiling=20=E2=80=94=20DEAD=20lever=20for?= =?UTF-8?q?=20K3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VDD offline measurement (cooccur-ceiling bin) on the real warm serve trace (run2.trace, 122 held-out decode tokens, 11102 layer-steps): cross_layer_cooccur_hit 0.159 (adjacent-layer noisy-OR) recency_same_layer_hit 0.403 (last token, same layer) structure beyond recency -0.244 cooccur_recall_on_recency_misses 0.112 (11824/106058) Adjacent-layer co-occurrence predicts Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- .../src/bin/cooccur-ceiling.rs | 242 ++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 core/expert-pager-policy/src/bin/cooccur-ceiling.rs diff --git a/core/expert-pager-policy/src/bin/cooccur-ceiling.rs b/core/expert-pager-policy/src/bin/cooccur-ceiling.rs new file mode 100644 index 0000000000..46b693b707 --- /dev/null +++ b/core/expert-pager-policy/src/bin/cooccur-ceiling.rs @@ -0,0 +1,242 @@ +//! cooccur-ceiling — offline VDD measurement of the CROSS-LAYER PREFETCH +//! predictor's ceiling (the `CrossLayerExpertPredictor` lever) on a real +//! `GGML_MOE_TRACE_FILE`. +//! +//! The bandit EMA residency curve (moe-pager-driver) answers "which +//! experts to KEEP resident across tokens" — a recency-family signal. This +//! bin answers a DIFFERENT question: within ONE forward pass, given the +//! experts that fired in layer L, how predictable are layer L+1's experts +//! from learned co-occurrence? If high, prefetching L+1 RAM→VRAM on a copy +//! stream while L computes can HIDE the per-expert H2D latency the residency +//! curve can't avoid — the two levers compose. +//! +//! Method (honest held-out): segment the trace into per-token, per-layer +//! expert sets. Train an adjacent-layer noisy-OR co-occurrence model on the +//! first `--train-frac` of DECODE tokens; on the rest, for each layer step +//! L→L+1 predict L+1's top-|L+1| experts from L's fired experts and score +//! the hit fraction. Baseline = predict L+1 as the PREVIOUS token's L+1 +//! experts (recency). The gap is the exploitable cross-layer structure. +//! +//! Usage: +//! cooccur-ceiling --trace --synth-layers [--train-frac 0.6] + +use std::collections::{HashMap, HashSet}; +use std::path::PathBuf; + +use expert_pager_policy::segment::{parse_records, TkeyTable, TokenSegmenter}; +use expert_pager_policy::ExpertId; + +struct Args { + trace: PathBuf, + synth_layers: u32, + train_frac: f64, +} + +fn parse_args() -> Result { + let mut trace = None; + let mut synth_layers = None; + let mut train_frac = 0.6f64; + let argv: Vec = std::env::args().skip(1).collect(); + let mut i = 0; + while i < argv.len() { + let flag = argv[i].as_str(); + let value = argv + .get(i + 1) + .ok_or_else(|| format!("{flag} needs a value"))?; + match flag { + "--trace" => trace = Some(PathBuf::from(value)), + "--synth-layers" => { + synth_layers = Some(value.parse().map_err(|e| format!("--synth-layers: {e}"))?) + } + "--train-frac" => { + train_frac = value.parse().map_err(|e| format!("--train-frac: {e}"))? + } + other => return Err(format!("unknown flag {other}")), + } + i += 2; + } + Ok(Args { + trace: trace.ok_or("--trace required")?, + synth_layers: synth_layers.ok_or("--synth-layers required")?, + train_frac, + }) +} + +/// Group one token's flat expert set into per-layer expert sets. +fn by_layer(token: &HashSet) -> HashMap> { + let mut m: HashMap> = HashMap::new(); + for e in token { + m.entry(e.layer).or_default().insert(e.expert); + } + m +} + +/// Adjacent-layer co-occurrence tallies: cooccur[(L, p)][n] = times expert +/// `n` in layer L+1 fired in a pass where expert `p` fired in layer L. seen +/// counts the denominator P(n | L, p). +#[derive(Default)] +struct CoOccur { + seen: HashMap<(u32, u32), u64>, + cooccur: HashMap<(u32, u32), HashMap>, +} + +impl CoOccur { + fn learn(&mut self, layers: &HashMap>, n_layers: u32) { + for l in 0..n_layers.saturating_sub(1) { + let (Some(prev), Some(next)) = (layers.get(&l), layers.get(&(l + 1))) else { + continue; + }; + for &p in prev { + *self.seen.entry((l, p)).or_insert(0) += 1; + let row = self.cooccur.entry((l, p)).or_default(); + for &n in next { + *row.entry(n).or_insert(0) += 1; + } + } + } + } + + /// Predict layer L+1's experts (noisy-OR over the fired predecessors in + /// layer L), return the top-`budget` by confidence. + fn predict(&self, l: u32, prev: &HashSet, budget: usize) -> HashSet { + // noisy-OR: P(n) = 1 - Π_p (1 - P(n|p)) + let mut not_fire: HashMap = HashMap::new(); + for &p in prev { + let Some(seen) = self.seen.get(&(l, p)).copied().filter(|&s| s > 0) else { + continue; + }; + if let Some(row) = self.cooccur.get(&(l, p)) { + for (&n, &c) in row { + let cond = c as f64 / seen as f64; + *not_fire.entry(n).or_insert(1.0) *= 1.0 - cond; + } + } + } + let mut scored: Vec<(f64, u32)> = + not_fire.into_iter().map(|(n, nf)| (1.0 - nf, n)).collect(); + let b = budget.min(scored.len()); + if b == 0 { + return HashSet::new(); + } + let idx = (b - 1).min(scored.len() - 1); + scored.select_nth_unstable_by(idx, |a, c| { + c.0.partial_cmp(&a.0).unwrap_or(std::cmp::Ordering::Equal) + }); + scored[..b].iter().map(|x| x.1).collect() + } +} + +fn hit(pred: &HashSet, actual: &HashSet) -> f64 { + if actual.is_empty() { + return 0.0; + } + actual.iter().filter(|e| pred.contains(e)).count() as f64 / actual.len() as f64 +} + +fn main() { + let args = match parse_args() { + Ok(a) => a, + Err(e) => { + eprintln!("cooccur-ceiling: {e}"); + eprintln!("usage: cooccur-ceiling --trace --synth-layers [--train-frac 0.6]"); + std::process::exit(2); + } + }; + let bytes = match std::fs::read(&args.trace) { + Ok(b) => b, + Err(e) => { + eprintln!("cooccur-ceiling: read {}: {e}", args.trace.display()); + std::process::exit(1); + } + }; + let table = TkeyTable::for_layers(args.synth_layers); + let (records, _consumed) = parse_records(&bytes); + + // Segment into completed token expert-sets, grouped per layer. + let mut segmenter = TokenSegmenter::new(); + let mut tokens: Vec>> = Vec::new(); + for rec in records { + if let Some(token) = segmenter.push(rec, &table) { + if !token.is_empty() { + tokens.push(by_layer(&token)); + } + } + } + // The big prefill token skews sizes; drop the first (prefill) token so + // the measurement is on decode-shaped passes. + if !tokens.is_empty() { + tokens.remove(0); + } + let n = tokens.len(); + if n < 4 { + eprintln!("cooccur-ceiling: only {n} tokens — need more trace"); + std::process::exit(1); + } + let split = ((n as f64) * args.train_frac) as usize; + let split = split.clamp(1, n - 1); + + // Train. + let mut model = CoOccur::default(); + for tok in &tokens[..split] { + model.learn(tok, args.synth_layers); + } + + // Test each L→L+1 step on held-out tokens: co-occurrence vs recency. + let mut co_sum = 0.0f64; + let mut rec_sum = 0.0f64; + let mut steps = 0u64; + // The decision-relevant metric: of the experts RECENCY MISSES (the ones + // a prefetch predictor would exist to catch), what fraction does + // co-occurrence recover? High = prefetch has a real niche on top of + // residency; low = co-occurrence is redundant-or-worse than recency. + let mut miss_total = 0u64; + let mut miss_caught = 0u64; + for t in split..n { + let cur = &tokens[t]; + let prevtok = &tokens[t - 1]; + for l in 0..args.synth_layers.saturating_sub(1) { + let (Some(prev_experts), Some(actual)) = (cur.get(&l), cur.get(&(l + 1))) else { + continue; + }; + let budget = actual.len(); // predict exactly as many as fire + let co_pred = model.predict(l, prev_experts, budget); + co_sum += hit(&co_pred, actual); + // Recency baseline: last token's SAME layer L+1 experts. + let empty = HashSet::new(); + let rec_pred = prevtok.get(&(l + 1)).unwrap_or(&empty); + rec_sum += hit(rec_pred, actual); + // Co-occurrence recall on the recency-miss subset. + for e in actual { + if !rec_pred.contains(e) { + miss_total += 1; + if co_pred.contains(e) { + miss_caught += 1; + } + } + } + steps += 1; + } + } + + let scale = if steps > 0 { 1.0 / steps as f64 } else { 0.0 }; + println!( + "# cooccur-ceiling: {n} tokens ({split} train / {} test), {steps} layer-steps scored", + n - split + ); + println!("cross_layer_cooccur_hit {:.4}", co_sum * scale); + println!("recency_same_layer_hit {:.4}", rec_sum * scale); + println!( + "# structure beyond recency: {:+.4} (positive = co-occurrence beats recency overall)", + (co_sum - rec_sum) * scale + ); + let miss_recall = if miss_total > 0 { + miss_caught as f64 / miss_total as f64 + } else { + 0.0 + }; + println!( + "cooccur_recall_on_recency_misses {:.4} ({miss_caught}/{miss_total}) \ + — the prefetch niche: co-occurrence's recall on the experts recency misses", + miss_recall + ); +} From bfc5ed65fd1f61a58cd0597f860776eeaee7fd56 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 00:48:44 -0500 Subject: [PATCH 21/27] =?UTF-8?q?chore(vendor):=20bump=20llama.cpp=20to=20?= =?UTF-8?q?de29843e0=20=E2=80=94=20device-resident=20expert=20cache=20half?= =?UTF-8?q?=20(#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pins the fork at the DeviceUploadFetcher wiring (my half of the LiveUpload- Pager H2D-kill). Off unless GGML_MOE_VRAM_CACHE_GB / plan device_budget_bytes enables it; host serving path byte-for-byte unchanged. M5's expert-loop D2D half lands next on the same seam. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index 5471dec47c..de29843e0b 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit 5471dec47c139890e6ad307782b89d2dfa93a054 +Subproject commit de29843e0b545385e56841cd5ecd58feadd48dbe From 1da3a0e2c8b6e33b21d1eaa79f2954654661c8d7 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 02:04:12 -0500 Subject: [PATCH 22/27] =?UTF-8?q?chore(vendor):=20bump=20llama.cpp=20to=20?= =?UTF-8?q?0fbe4e27a=20=E2=80=94=20quantize=20--resident-only=20+=20tier?= =?UTF-8?q?=20manifest=20(#40)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enables the device-fit division: produce a small resident override per precision tier + a (tier_label, resident_bytes) sidecar the governor reads to co-optimize the VRAM split. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index de29843e0b..0fbe4e27ac 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit de29843e0b545385e56841cd5ecd58feadd48dbe +Subproject commit 0fbe4e27ac9b65876adc1b3130a91109b34b99f8 From fe624eaec9dd5fde4b75a71c694b8b34127592d1 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 02:10:22 -0500 Subject: [PATCH 23/27] =?UTF-8?q?feat(pager):=20DivisionPolicy=20=E2=80=94?= =?UTF-8?q?=20the=20governor's=20VRAM-division=20RL=20brain=20(#2/#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The second control rung above the pager's DecayBandit. The pager decides WHICH experts stay resident (reward=hit-rate, cheap, online). This decides HOW TO DIVIDE the card — resident (non-expert) weights vs expert cache — to MAXIMIZE tok/s. That reward (actual tok/s) is EXPENSIVE (a serve), so naive online RL flails; the fix is SIM-WARM-START: predict tok/s per division OFFLINE from the measured coverage curve, then a slow bandit refines each arm from real measured tok/s. - CoverageModel: piecewise-linear coverage(slots) over MEASURED points (k3_measured() = the trace-replay curve); saturates, never extrapolates up. - predict_tok_s: coverage -> (1-coverage)*experts/token*expert_bytes H2D -> t_token -> tok/s. Higher coverage -> less H2D -> faster (the load-bearing property, tested). - feasible_divisions: tier catalog (from --resident-only manifests) x HardwareBudget -> cache budget/slots per tier; drops VRAM-overflow tiers. - DivisionBandit: warm_start from the predictor; observe(tier, measured_tok_s) overrides the prior on first serve then EMAs — the expensive reward spent only on the arm actually run. Policy lives here (windows-clean, 4 tests pass); serving_daemon actuates it (M5's #2: discover manifests, feed catalog+budget+live tok/s, apply the chosen {resident_tier, device_budget_bytes} to the plan). Fractal control law: pager (experts<->hit-rate) -> this (VRAM split<->tok/s) -> grid. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/expert-pager-policy/src/division.rs | 315 +++++++++++++++++++++++ core/expert-pager-policy/src/lib.rs | 5 + 2 files changed, 320 insertions(+) create mode 100644 core/expert-pager-policy/src/division.rs diff --git a/core/expert-pager-policy/src/division.rs b/core/expert-pager-policy/src/division.rs new file mode 100644 index 0000000000..1f3545cec3 --- /dev/null +++ b/core/expert-pager-policy/src/division.rs @@ -0,0 +1,315 @@ +//! DivisionPolicy — the governor's VRAM-division RL brain (#2/#3, the second control rung). +//! +//! The pager decides WHICH experts stay resident (reward = per-token hit-rate, cheap → online +//! [`crate::decay::DecayBandit`]). This rung decides HOW TO DIVIDE the card: how much VRAM goes to the +//! resident (non-expert) weights vs the expert cache, to MAXIMIZE tok/s. The reward here — actual +//! tok/s — is EXPENSIVE to sample (a serve + warm ≈ minutes), so a naive online bandit would flail. +//! The fix is SIM-WARM-START: predict tok/s for every candidate division OFFLINE from the measured +//! coverage curve (no serve), pick from that, then a SLOW bandit refines each arm from real measured +//! tok/s. Warm-start from the model, reinforcement-optimize on the real hardware. +//! +//! Same shape as the pager: POLICY lives here (windows-clean, testable standalone); the serving_daemon +//! ACTUATES it (feeds the `--resident-only` tier manifests + live tok/s, applies the chosen +//! {resident_tier, device_budget_bytes} to the plan file). This is the reusable brain of governor #2. +//! +//! The control law is FRACTAL: pager (experts↔hit-rate) → THIS (VRAM split↔tok/s) → grid (node↔throughput). + +/// One resident precision tier, read from a `--resident-only` sidecar manifest +/// (`{tier_label, resident_bytes}`). resident_bytes is the MEASURED footprint at that precision. +#[derive(Debug, Clone)] +pub struct ResidentTier { + pub label: String, + pub resident_bytes: u64, +} + +/// The device's fixed budget the division must fit inside (all VRAM figures, bytes). +#[derive(Debug, Clone, Copy)] +pub struct HardwareBudget { + pub vram_total_bytes: u64, + pub kv_bytes: u64, // KV cache reservation + pub compute_reserve_bytes: u64, // graph scratch + activations headroom +} + +impl HardwareBudget { + /// VRAM left for the expert cache after a given resident tier is placed. Saturating at 0 + /// (a tier whose resident + KV + reserve exceeds VRAM is infeasible → no cache). + pub fn expert_cache_bytes(&self, resident_bytes: u64) -> u64 { + self.vram_total_bytes + .saturating_sub(resident_bytes) + .saturating_sub(self.kv_bytes) + .saturating_sub(self.compute_reserve_bytes) + } +} + +/// The per-model MoE shape that turns a cache size into a fetch cost. +#[derive(Debug, Clone, Copy)] +pub struct MoeShape { + pub expert_bytes: u64, // one expert record (all matrices packed), e.g. 8_093_696 for K3 + pub experts_per_token: u64, // routed activations per decode token (≈ top_k * n_moe_layers) +} + +/// Coverage(cache_slots) = fraction of a token's experts already resident, as a piecewise-linear +/// curve over MEASURED points. Monotone non-decreasing, saturating. Defaults to the K3 trace-replay +/// numbers ([[k3-coverage-vs-vram-curve]]); a model supplies its own points as it's measured. +#[derive(Debug, Clone)] +pub struct CoverageModel { + points: Vec<(u64, f64)>, // (slots, coverage in [0,1]), sorted ascending by slots +} + +impl CoverageModel { + /// `points` need not be pre-sorted; (0,0) is implied. Coverage is clamped to [0,1]. + pub fn new(mut points: Vec<(u64, f64)>) -> Self { + points.push((0, 0.0)); + points.sort_by_key(|p| p.0); + points.dedup_by_key(|p| p.0); + for p in &mut points { + p.1 = p.1.clamp(0.0, 1.0); + } + Self { points } + } + + /// The measured K3 bandit-residency curve (slots → coverage), from real trace replay. + pub fn k3_measured() -> Self { + Self::new(vec![ + (250, 0.138), + (500, 0.235), + (1000, 0.364), + (1500, 0.451), + (2000, 0.513), + (4024, 0.657), + ]) + } + + /// Interpolate coverage at `slots` (piecewise-linear; flat beyond the last measured point — + /// we never extrapolate an optimistic coverage past what was measured). + pub fn coverage(&self, slots: u64) -> f64 { + if self.points.is_empty() { + return 0.0; + } + let last = self.points.last().unwrap(); + if slots >= last.0 { + return last.1; // saturate, don't extrapolate upward + } + // find the bracketing segment + let mut prev = self.points[0]; + for &cur in &self.points[1..] { + if slots < cur.0 { + let span = (cur.0 - prev.0) as f64; + let t = if span > 0.0 { (slots - prev.0) as f64 / span } else { 0.0 }; + return prev.1 + t * (cur.1 - prev.1); + } + prev = cur; + } + prev.1 + } +} + +/// A candidate way to divide the card. +#[derive(Debug, Clone)] +pub struct DivisionConfig { + pub tier_idx: usize, // index into the tier catalog + pub device_budget_bytes: u64, // expert cache budget this tier frees + pub cache_slots: u64, // device_budget_bytes / expert_bytes +} + +/// Predicted decode tok/s for a division, computed OFFLINE (no serve). This is the warm-start prior. +/// +/// coverage = model(slots); a cache HIT skips the per-token H2D, a MISS pays it: +/// h2d_bytes/token = (1 - coverage) * experts_per_token * expert_bytes +/// t_token ≈ h2d_bytes / pcie_h2d_bps + compute_floor_s +/// tok/s ≈ 1 / t_token +/// Higher coverage → less H2D → faster. `compute_floor_s` is the irreducible per-token compute +/// (matmuls + kernel launches) that residency can't remove — the ceiling the curve approaches. +pub fn predict_tok_s( + cfg: &DivisionConfig, + model: &CoverageModel, + shape: &MoeShape, + pcie_h2d_bps: f64, + compute_floor_s: f64, +) -> f64 { + let coverage = model.coverage(cfg.cache_slots); + let h2d_bytes = (1.0 - coverage) * shape.experts_per_token as f64 * shape.expert_bytes as f64; + let t_token = (h2d_bytes / pcie_h2d_bps.max(1.0)) + compute_floor_s.max(0.0); + if t_token > 0.0 { 1.0 / t_token } else { 0.0 } +} + +/// Enumerate the feasible divisions over a tier catalog: each tier that fits VRAM yields one config +/// with the cache budget its resident footprint frees. Infeasible tiers (resident > VRAM) are dropped. +pub fn feasible_divisions( + tiers: &[ResidentTier], + hw: &HardwareBudget, + shape: &MoeShape, +) -> Vec { + let mut out = Vec::new(); + for (i, t) in tiers.iter().enumerate() { + let budget = hw.expert_cache_bytes(t.resident_bytes); + let slots = if shape.expert_bytes > 0 { budget / shape.expert_bytes } else { 0 }; + if budget == 0 || slots == 0 { + continue; // this tier leaves no room for a cache — not a useful division + } + out.push(DivisionConfig { tier_idx: i, device_budget_bytes: budget, cache_slots: slots }); + } + out +} + +/// EMA rate for the measured-tok/s reward — how fast a division's value tracks real serves. +const REWARD_ALPHA: f64 = 0.4; + +/// The slow bandit over divisions. Every arm starts with its OFFLINE predicted tok/s as a prior; +/// the arm that gets SERVED updates its value toward the MEASURED tok/s (EMA). `choose` serves the +/// best current value, so a good prediction is exploited immediately and a wrong one is corrected as +/// soon as it's measured — the expensive reward is spent only on the arm we actually run. +#[derive(Debug, Clone)] +pub struct DivisionBandit { + configs: Vec, + value: Vec, // current tok/s estimate per arm (prior, then EMA of measured) + measured: Vec, // has this arm been served at least once? +} + +impl DivisionBandit { + /// Warm-start every arm from the offline predictor. Empty catalog → an empty bandit (`choose` + /// returns None); the caller falls back to its current fixed division. + pub fn warm_start( + configs: Vec, + model: &CoverageModel, + shape: &MoeShape, + pcie_h2d_bps: f64, + compute_floor_s: f64, + ) -> Self { + let value = configs + .iter() + .map(|c| predict_tok_s(c, model, shape, pcie_h2d_bps, compute_floor_s)) + .collect(); + let measured = vec![false; configs.len()]; + Self { configs, value, measured } + } + + /// The division to serve now: argmax current value (predicted-or-measured). Ties → lowest index. + pub fn choose(&self) -> Option<&DivisionConfig> { + self.value + .iter() + .enumerate() + .max_by(|a, b| a.1.partial_cmp(b.1).unwrap_or(std::cmp::Ordering::Equal)) + .map(|(i, _)| &self.configs[i]) + } + + /// Feed back the MEASURED tok/s for the tier that was served (the reward). First measurement + /// REPLACES the prior (the real number beats the prediction outright); later ones EMA in, so a + /// non-stationary workload keeps the estimate fresh. + pub fn observe(&mut self, tier_idx: usize, measured_tok_s: f64) { + if let Some(pos) = self.configs.iter().position(|c| c.tier_idx == tier_idx) { + if self.measured[pos] { + self.value[pos] = (1.0 - REWARD_ALPHA) * self.value[pos] + REWARD_ALPHA * measured_tok_s; + } else { + self.value[pos] = measured_tok_s; // prior → truth on first real serve + self.measured[pos] = true; + } + } + } + + pub fn predicted_value(&self, tier_idx: usize) -> Option { + self.configs.iter().position(|c| c.tier_idx == tier_idx).map(|p| self.value[p]) + } + pub fn len(&self) -> usize { self.configs.len() } + pub fn is_empty(&self) -> bool { self.configs.is_empty() } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn k3_shape() -> MoeShape { + MoeShape { expert_bytes: 8_093_696, experts_per_token: 1472 } + } + + /// what this catches: the coverage model interpolates between measured points, saturates past the + /// last one (never extrapolates optimistic), and is monotone. A regression here corrupts every + /// tok/s prediction downstream. + #[test] + fn coverage_interpolates_saturates_and_is_monotone() { + let m = CoverageModel::k3_measured(); + assert!((m.coverage(0) - 0.0).abs() < 1e-9); + assert!((m.coverage(250) - 0.138).abs() < 1e-6); + // midpoint 375 slots is between (250,.138) and (500,.235) + let mid = m.coverage(375); + assert!(mid > 0.138 && mid < 0.235, "interp {mid}"); + // saturates, doesn't extrapolate above the last measured coverage + assert!((m.coverage(9999) - 0.657).abs() < 1e-6); + // monotone non-decreasing + let mut prev = 0.0; + for s in (0..4500).step_by(100) { + let c = m.coverage(s); + assert!(c + 1e-9 >= prev, "non-monotone at {s}: {c} < {prev}"); + prev = c; + } + } + + /// what this catches: THE load-bearing property — more expert-cache VRAM (a smaller/cheaper + /// resident) predicts MORE tok/s, because coverage rises and per-token H2D falls. If this inverts, + /// the governor would "optimize" toward starving the cache. Uses the measured K3 curve + shape. + #[test] + fn more_cache_predicts_more_tok_s() { + let model = CoverageModel::k3_measured(); + let shape = k3_shape(); + let (bps, floor) = (25.0e9, 0.010); // ~25 GB/s H2D, 10 ms compute floor + let small = DivisionConfig { tier_idx: 0, device_budget_bytes: 500 * shape.expert_bytes, cache_slots: 500 }; + let big = DivisionConfig { tier_idx: 1, device_budget_bytes: 2000 * shape.expert_bytes, cache_slots: 2000 }; + let t_small = predict_tok_s(&small, &model, &shape, bps, floor); + let t_big = predict_tok_s(&big, &model, &shape, bps, floor); + assert!(t_big > t_small, "more cache must predict faster: {t_big} !> {t_small}"); + } + + /// what this catches: a tier whose resident overflows VRAM is dropped (no negative/huge budget), + /// and a tier that fits yields slots = freed/expert_bytes. + #[test] + fn feasible_divisions_drop_overflow_and_size_cache() { + let hw = HardwareBudget { + vram_total_bytes: 32 * 1024 * 1024 * 1024, + kv_bytes: 1 * 1024 * 1024 * 1024, + compute_reserve_bytes: 2 * 1024 * 1024 * 1024, + }; + let shape = k3_shape(); + let tiers = vec![ + ResidentTier { label: "q6_K".into(), resident_bytes: 33 * 1024 * 1024 * 1024 }, // overflows 32GB + ResidentTier { label: "q4_K".into(), resident_bytes: 25 * 1024 * 1024 * 1024 }, // fits + ResidentTier { label: "q3_K".into(), resident_bytes: 16 * 1024 * 1024 * 1024 }, // fits, more cache + ]; + let divs = feasible_divisions(&tiers, &hw, &shape); + assert_eq!(divs.len(), 2, "q6_K overflows and must be dropped"); + // the q3_K tier frees more VRAM than q4_K → more slots + let q4 = divs.iter().find(|d| d.tier_idx == 1).unwrap(); + let q3 = divs.iter().find(|d| d.tier_idx == 2).unwrap(); + assert!(q3.cache_slots > q4.cache_slots); + } + + /// what this catches: the bandit warm-starts from the predictor and then a MEASURED reward + /// overrides the prior on first serve (real number beats prediction). Encodes the sim-warm-start + /// + slow-refine contract that makes an expensive-reward learner viable. + #[test] + fn bandit_warm_starts_then_measurement_overrides_prior() { + let hw = HardwareBudget { + vram_total_bytes: 32 * 1024 * 1024 * 1024, + kv_bytes: 1 * 1024 * 1024 * 1024, + compute_reserve_bytes: 2 * 1024 * 1024 * 1024, + }; + let shape = k3_shape(); + let model = CoverageModel::k3_measured(); + let tiers = vec![ + ResidentTier { label: "q4_K".into(), resident_bytes: 25 * 1024 * 1024 * 1024 }, + ResidentTier { label: "q3_K".into(), resident_bytes: 16 * 1024 * 1024 * 1024 }, + ]; + let divs = feasible_divisions(&tiers, &hw, &shape); + let mut bandit = DivisionBandit::warm_start(divs, &model, &shape, 25.0e9, 0.010); + assert_eq!(bandit.len(), 2); + // warm-start: the bigger-cache tier (q3_K, idx 1) should predict faster and be chosen + assert_eq!(bandit.choose().unwrap().tier_idx, 1); + // now REALITY says q4_K (idx 0) actually served much faster (e.g. q3_K crushed quality/thrashed) + bandit.observe(0, 5.0); + assert_eq!(bandit.choose().unwrap().tier_idx, 0, "measured reward must override the prior"); + // a second measurement EMAs, not replaces + let before = bandit.predicted_value(0).unwrap(); + bandit.observe(0, 1.0); + let after = bandit.predicted_value(0).unwrap(); + assert!(after < before && after > 1.0, "EMA blend: {after} between prior 5.0 and new 1.0"); + } +} diff --git a/core/expert-pager-policy/src/lib.rs b/core/expert-pager-policy/src/lib.rs index 427ac4a1fd..2e9233253e 100644 --- a/core/expert-pager-policy/src/lib.rs +++ b/core/expert-pager-policy/src/lib.rs @@ -8,11 +8,16 @@ pub mod controller; pub mod decay; +pub mod division; pub mod expert_id; pub mod plan_file; pub mod segment; pub use controller::BanditPlanController; pub use decay::{DecayBandit, EmaScoreboard, DECAY_ARMS, REWARD_ALPHA}; +pub use division::{ + feasible_divisions, predict_tok_s, CoverageModel, DivisionBandit, DivisionConfig, + HardwareBudget, MoeShape, ResidentTier, +}; pub use expert_id::ExpertId; pub use plan_file::{write_plan_file, PlanFileDocument, PlanPin, PLAN_FILE_VERSION}; From 8dcf0d8ffb2be702e96a445f232999b26b6287d2 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 04:23:36 -0500 Subject: [PATCH 24/27] =?UTF-8?q?chore(vendor):=20bump=20llama.cpp=20to=20?= =?UTF-8?q?2a32025dd=20=E2=80=94=20device-cache=20un-crashable=20(clamp=20?= =?UTF-8?q?to=20free=20VRAM=20+=20null-buffer=20guard,=20#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Testing convicted the segfault as VRAM oversubscription (K3 33GB resident + env cache on a 32GB card, cudaMalloc lazy-VMM deferred fault). Fix: clamp device budget to measured free VRAM (mine) + M5's D2D null-buffer guard. Device cache now disables safely where there's no room (K3) and works where there is (V4-Flash); can't crash from any budget source. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index 0fbe4e27ac..2a32025dd1 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit 0fbe4e27ac9b65876adc1b3130a91109b34b99f8 +Subproject commit 2a32025dd156a34fe6a84e7f2cc604500ae97b8f From acae69b033a0a56d7f056f44a5c18b7f8f90b58e Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 11:37:38 -0500 Subject: [PATCH 25/27] test(division): bandit learns residency saturation from measured V4-Flash curve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feeds the real BigMama RTX 5090 --n-cpu-moe sweep (DeepSeek-V4-Flash UD-IQ2_M) into DivisionBandit: 0 resident=1.39, 8 resident=1.69, 14 resident=1.68 tok/s. Asserts the bandit converges on the SATURATION KNEE (8 layers), not max residency — 8->14 layers buys nothing at +11GB VRAM. Encodes the measured finding that the governor must learn 'minimal static residency + max device cache', the freed VRAM belonging to the recency cache (#43), not to over-pinned static layers. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/expert-pager-policy/src/division.rs | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/core/expert-pager-policy/src/division.rs b/core/expert-pager-policy/src/division.rs index 1f3545cec3..1e4dc926f5 100644 --- a/core/expert-pager-policy/src/division.rs +++ b/core/expert-pager-policy/src/division.rs @@ -312,4 +312,38 @@ mod tests { let after = bandit.predicted_value(0).unwrap(); assert!(after < before && after > 1.0, "EMA blend: {after} between prior 5.0 and new 1.0"); } + + /// what this catches: the RL division bandit, fed the REAL measured V4-Flash residency curve + /// (BigMama RTX 5090, DeepSeek-V4-Flash UD-IQ2_M, `--n-cpu-moe` sweep), learns the SATURATION KNEE + /// from measurement — it picks the tok/s-max division (8 resident layers), NOT the max-residency + /// one, even though the latter pins ~11 GB more VRAM. This is the empirical proof that static + /// residency saturates: 0→8 layers buys +0.30 tok/s, 8→14 buys nothing (1.69 vs 1.68). A bandit + /// that merely maximized residency would waste the VRAM the device cache should own — which is why + /// "minimal static residency + max device cache" is the division the governor must converge to. + /// Measured 2026-08-03; sweep = scratch-v4flash-sweep.sh, curve = division-curve.jsonl. + #[test] + fn bandit_learns_residency_saturation_from_measured_v4flash_curve() { + // Each arm is one `--n-cpu-moe` division. This axis is STATIC layer residency (not the device + // cache), so budget/slots are placeholders and the MEASURED reward — not the coverage prior — + // drives the choice. Flat prior (empty coverage model → equal warm-start) makes that explicit. + let divs = vec![ + DivisionConfig { tier_idx: 0, device_budget_bytes: 0, cache_slots: 0 }, // ncpu=48, 0 resident + DivisionConfig { tier_idx: 1, device_budget_bytes: 0, cache_slots: 0 }, // ncpu=40, 8 resident + DivisionConfig { tier_idx: 2, device_budget_bytes: 0, cache_slots: 0 }, // ncpu=34, 14 resident + ]; + let flat = CoverageModel::new(vec![]); + let shape = MoeShape { expert_bytes: 1, experts_per_token: 1 }; + let mut bandit = DivisionBandit::warm_start(divs, &flat, &shape, 25.0e9, 0.010); + assert_eq!(bandit.len(), 3); + // feed the REAL measured decode tok/s (BigMama 5090, this session) + bandit.observe(0, 1.39); // 0 resident (all experts stream from NVMe) + bandit.observe(1, 1.69); // 8 resident — the knee + bandit.observe(2, 1.68); // 14 resident — saturated, no gain over 8 at +11 GB VRAM + // the bandit converges on the KNEE (idx 1), not the max-residency arm (idx 2) + assert_eq!(bandit.choose().unwrap().tier_idx, 1, "must learn the saturation knee, not max residency"); + // strictly better than the all-stream baseline + assert!(bandit.predicted_value(1).unwrap() > bandit.predicted_value(0).unwrap()); + // saturation: MORE residency (idx 2) is NOT better than the knee (idx 1) + assert!(bandit.predicted_value(2).unwrap() <= bandit.predicted_value(1).unwrap()); + } } From b3ebe910490bf20ce415398828ec0f1766230560 Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 12:49:36 -0500 Subject: [PATCH 26/27] test(division): bandit finds non-monotonic device-cache budget optimum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measured V4-Flash device-cache coverage curve (5090, GGML_MOE_VRAM_CACHE_GB sweep): 6GB/992slots=1.80, 12GB/1985=3.10, 22GB/3630=2.96 tok/s, all 100% hit. tok/s is NON-MONOTONIC in budget: undersized churns, 12GB is the plateau knee, 22GB is no better (100% hit but O(slots) reserve_slot eviction scan). predict_tok_s's monotonic prior would pick 22GB; only the measured reward lands on 12GB — which frees ~20GB of a 32GB card for co-resident lanes. Pins the invariant that the governor must not oversize the cache and starve other models. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/expert-pager-policy/src/division.rs | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/core/expert-pager-policy/src/division.rs b/core/expert-pager-policy/src/division.rs index 1e4dc926f5..8dc4fb9cc5 100644 --- a/core/expert-pager-policy/src/division.rs +++ b/core/expert-pager-policy/src/division.rs @@ -346,4 +346,39 @@ mod tests { // saturation: MORE residency (idx 2) is NOT better than the knee (idx 1) assert!(bandit.predicted_value(2).unwrap() <= bandit.predicted_value(1).unwrap()); } + + /// what this catches: the load-bearing reason the bandit corrects its OWN prior. The device-cache + /// coverage/tok-s response is NON-MONOTONIC in VRAM budget — measured on V4-Flash (5090, UD-IQ2_M, + /// GGML_MOE_VRAM_CACHE_GB sweep): 6GB/992 slots → 1.80 (undersized, evict-churn), 12GB/1985 → 3.10 + /// (plateau knee), 22GB/3630 → 2.96 (oversized: 100% hit but the O(slots) reserve_slot eviction scan + /// costs). Coverage is 100% from ~12GB up, so predict_tok_s's monotonic "more slots → more tok/s" + /// prior is WRONG past the coverage knee: it would pick 22GB. Only the MEASURED reward finds the 12GB + /// optimum — and 12GB frees ~20GB of a 32GB card for other lanes. If this test inverts, the governor + /// oversizes the cache and starves co-resident models. Measured 2026-08-03; coverage-curve.jsonl. + #[test] + fn bandit_finds_nonmonotonic_device_cache_budget_optimum() { + // arms = device-cache VRAM budgets; tier_idx maps to the sweep point. cache_slots carries the + // measured slot count so a naive coverage prior WOULD rank 22GB highest — the measured reward + // must override that and land on 12GB (the plateau knee, max tok/s at min VRAM). + let divs = vec![ + DivisionConfig { tier_idx: 0, device_budget_bytes: 6 << 30, cache_slots: 992 }, // undersized + DivisionConfig { tier_idx: 1, device_budget_bytes: 12 << 30, cache_slots: 1985 }, // knee + DivisionConfig { tier_idx: 2, device_budget_bytes: 22 << 30, cache_slots: 3630 }, // oversized + ]; + // The monotonic prior (k3 curve) ranks the biggest cache first — set up the wrong belief... + let model = CoverageModel::k3_measured(); + let shape = MoeShape { expert_bytes: 2_163_200, experts_per_token: 774 }; + let mut bandit = DivisionBandit::warm_start(divs, &model, &shape, 25.0e9, 0.010); + assert_eq!(bandit.predicted_value(2).unwrap() >= bandit.predicted_value(1).unwrap(), true, + "prior should (wrongly) favor the biggest cache before measurement"); + // ...then MEASUREMENT corrects it to the real non-monotonic curve. + bandit.observe(0, 1.80); + bandit.observe(1, 3.10); + bandit.observe(2, 2.96); + assert_eq!(bandit.choose().unwrap().tier_idx, 1, "bandit must land on the 12GB plateau knee"); + // oversizing (22GB) is NOT better than the knee — so the governor frees the difference + assert!(bandit.predicted_value(2).unwrap() <= bandit.predicted_value(1).unwrap()); + // undersizing (6GB, evict-churn) is clearly worse despite also showing 100% hit on warm tokens + assert!(bandit.predicted_value(0).unwrap() < bandit.predicted_value(1).unwrap()); + } } From a31baa51d89be0e38f60c5a77760c661ed64e54c Mon Sep 17 00:00:00 2001 From: Joel Teply Date: Mon, 3 Aug 2026 12:54:04 -0500 Subject: [PATCH 27/27] =?UTF-8?q?chore(vendor):=20bump=20llama.cpp=20to=20?= =?UTF-8?q?fa7e0d8e9=20=E2=80=94=20#43=20device-cache=20fix=20+=20async=20?= =?UTF-8?q?restore=20+=20enum=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Includes the prefetch host_visible guard (THE #43 crash fix, validated 3.05 tok/s V4-Flash device cache on the 5090), M5's async cpy_tensor_async restore, and the moe-pack quant-enum fix. A fresh parent build now includes the un-crashable device cache instead of the pre-fix pin. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q4NU4VNiELPQfBpCacDZGc --- core/vendor/llama.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/llama.cpp b/core/vendor/llama.cpp index 2a32025dd1..fa7e0d8e9e 160000 --- a/core/vendor/llama.cpp +++ b/core/vendor/llama.cpp @@ -1 +1 @@ -Subproject commit 2a32025dd156a34fe6a84e7f2cc604500ae97b8f +Subproject commit fa7e0d8e9e475387e40d2de02522b90bb22438be