Onur Solmaz Cursor commited on
Commit
b2fecbb
·
1 Parent(s): 63e87ab

fix: correct MoE expert traffic, surface search limits, retire dennard naming

Browse files

Engine correctness:
- Fix the legacy MoE adapter's derived per-expert size: the denominator now
uses E - k routed experts, with shared experts folded into the fixed term,
so W_batch saturates at the total resident weight instead of overshooting
it (61 scraped MoE rows previously violated the upper-bound contract).
- Treat zero per-session allocation as unbounded session capacity instead of
no_session_capacity, and cap the batch search explicitly.
- Emit warnings when the batch search stops at the 10000 cap with the
per-session floor still satisfied, instead of silently underreporting the
KV-aware ceiling.

Data correction:
- nvidia--glm-5-2-nvfp4: the routed expert group was recorded as 1.668024072
GB from a split that double-counted shared-expert tensors; re-derived from
the same pinned shard headers as 1.592526600 GB so fixed + 256 experts now
reproduces the main resident total exactly. Catalog row and goldens updated.

Validation:
- validate-profiles now checks that saturated expert traffic (fixed + E
experts) stays within the swept resident footprint for both exact and
derived MoE adapters; this check is what caught the GLM 5.2 NVFP4 error.

Housekeeping (engine 1.1.0):
- Rename the Dennard orientation ceiling to the memory-power ceiling across
the engine contract, UI, docs, and tests, matching the source note that
retired the Dennard eponym: trace.dennard_ceiling_toks_per_s ->
trace.memory_power_ceiling_toks_per_s, ceilings.dennard_toks_per_s ->
ceilings.memory_power_toks_per_s, result.dennard -> result.memoryPowerCeiling.

Co-authored-by: Cursor <cursoragent@cursor.com>

app.html CHANGED
@@ -39,7 +39,7 @@
39
  <p>
40
  The local copy adds model metadata and theoretical memory-side
41
  decode bounds: single-session, KV-aware aggregate, and loose
42
- Dennard memory-power ceilings.
43
  </p>
44
  </div>
45
  </div>
 
39
  <p>
40
  The local copy adds model metadata and theoretical memory-side
41
  decode bounds: single-session, KV-aware aggregate, and loose
42
+ memory-power ceilings.
43
  </p>
44
  </div>
45
  </div>
assets/app.js CHANGED
@@ -2436,9 +2436,9 @@ function compareMemoryFitBatchLabel(result) {
2436
  : "-";
2437
  }
2438
 
2439
- function compareDenardLabel(result) {
2440
  return compareHasAuditedProfile(result)
2441
- ? compareNumberValue(result.dennard, (value) => fmtTok(value, 0))
2442
  : "-";
2443
  }
2444
 
@@ -2514,7 +2514,7 @@ function compareDefaultColumns(groupBy) {
2514
  { key: "bStar", label: "Usable sessions b*" },
2515
  { key: "aggregate", label: "Aggregate tok/s at b*" },
2516
  { key: "perSession", label: "Per-session tok/s at b*" },
2517
- { key: "dennard", label: "Dennard bound" },
2518
  ];
2519
  }
2520
 
@@ -2577,7 +2577,7 @@ function compareResultTableRow(row, groupBy, workloadSettings) {
2577
  bStar: compareCell(bStarLabel),
2578
  aggregate: compareCell(aggregateLabel),
2579
  perSession: compareCell(perSessionValue),
2580
- dennard: compareCell(compareDenardLabel(result)),
2581
  profile: compareCell(
2582
  result.profile_resolution?.model_profile || "-",
2583
  result.profile_resolution?.model_profile_status || "",
@@ -2660,7 +2660,7 @@ function comparePairDetailSection(row, workloadSettings) {
2660
  kind: "list",
2661
  title: "Calculation Details",
2662
  description:
2663
- "KV-aware bound: T(b) <= R / (W_batch(b) / b + K_read). Loose Dennard keeps C x R explicit and drops private read traffic.",
2664
  rows: [
2665
  compareLinkValue("Model", modelHref(model.id), model.id, model.name),
2666
  compareLinkValue("Hardware", deviceHref(hardware.id), hardware.name),
 
2436
  : "-";
2437
  }
2438
 
2439
+ function compareMemoryPowerCeilingLabel(result) {
2440
  return compareHasAuditedProfile(result)
2441
+ ? compareNumberValue(result.memoryPowerCeiling, (value) => fmtTok(value, 0))
2442
  : "-";
2443
  }
2444
 
 
2514
  { key: "bStar", label: "Usable sessions b*" },
2515
  { key: "aggregate", label: "Aggregate tok/s at b*" },
2516
  { key: "perSession", label: "Per-session tok/s at b*" },
2517
+ { key: "memoryPowerCeiling", label: "Memory-power bound" },
2518
  ];
2519
  }
2520
 
 
2577
  bStar: compareCell(bStarLabel),
2578
  aggregate: compareCell(aggregateLabel),
2579
  perSession: compareCell(perSessionValue),
2580
+ memoryPowerCeiling: compareCell(compareMemoryPowerCeilingLabel(result)),
2581
  profile: compareCell(
2582
  result.profile_resolution?.model_profile || "-",
2583
  result.profile_resolution?.model_profile_status || "",
 
2660
  kind: "list",
2661
  title: "Calculation Details",
2662
  description:
2663
+ "KV-aware bound: T(b) <= R / (W_batch(b) / b + K_read). The loose memory-power bound keeps C x R explicit and drops private read traffic.",
2664
  rows: [
2665
  compareLinkValue("Model", modelHref(model.id), model.id, model.name),
2666
  compareLinkValue("Hardware", deviceHref(hardware.id), hardware.name),
assets/bounds-engine.js CHANGED
@@ -1,4 +1,7 @@
1
  (function attachBoundsEngine(root) {
 
 
 
2
  const STATUS_CODES = Object.freeze({
3
  FITS: "fits",
4
  RESIDENT_NOT_FIT: "resident_not_fit",
@@ -47,7 +50,13 @@
47
  const shared = Number(arch.shared_experts_per_token || 0);
48
  const bytesPerParam = Number(adapter.weight_bytes_per_param || 0);
49
  if (!total || !active || !experts || !bytesPerParam) return Number(adapter.active_weight_gb || 0);
50
- const expertParamB = Number(adapter.expert_param_b || ((total - active) / Math.max(1, experts - routed - shared)));
 
 
 
 
 
 
51
  const fixedParamB = Number(adapter.fixed_param_b || Math.max(0, active - (routed + shared) * expertParamB));
52
  const sharedExpertParamB =
53
  adapter.shared_expert_param_b === undefined ? expertParamB : Number(adapter.shared_expert_param_b);
@@ -129,7 +138,7 @@
129
  const alloc = kvAllocGB(model, lAlloc);
130
  const free = capacity - resident - Number(overhead || 0);
131
  const bMem = alloc > 0 ? Math.max(0, Math.floor((free / alloc) + 1e-9)) : 0;
132
- const maxSearch = Math.min(bMem, 10000);
133
  let best = null;
134
  for (let b = 1; b <= maxSearch; b += 1) {
135
  const result = calculateBatchBound({ model, hardware, batch: b, rho: safeRho, lRead });
@@ -140,7 +149,7 @@
140
  const active = Number(model.adapter.active_weight_gb || batchWeightGB(model, 1, safeRho));
141
  const correction = capacity > 0 ? Math.max(0, 1 - ((resident + Number(overhead || 0)) / capacity)) : 0;
142
  const memoryPower = capacity * bandwidth;
143
- const dennard = alloc > 0 && active > 0
144
  ? safeRho * memoryPower / (alloc * active) * correction
145
  : 0;
146
  const fixed = fixedBatch
@@ -156,7 +165,7 @@
156
  bMem,
157
  best,
158
  single,
159
- dennard,
160
  fixed,
161
  memoryPower,
162
  status: fitStatuses({ free, bMem, fixed, best, rStar })
@@ -310,7 +319,7 @@
310
  const bandwidth = Number(hardware.memory.bandwidth_gbps || 0);
311
  const repo = profile?.repo || model?.id || "";
312
  return {
313
- engine_version: "1.0.0",
314
  schema_version: "1.0.0",
315
  status_code: PROFILE_STATUS_CODES.UNSUPPORTED_PROFILE,
316
  profile_resolution: {
@@ -338,7 +347,7 @@
338
  q_at_b_star_gb_per_output_token: 0,
339
  aggregate_toks_per_s: 0,
340
  per_session_toks_per_s: 0,
341
- dennard_ceiling_toks_per_s: 0
342
  },
343
  ceilings: {},
344
  usable_batch: {},
@@ -352,7 +361,7 @@
352
  bMem: 0,
353
  best: null,
354
  single: { batch: 1, batchWeight: 0, readTraffic: 0, q: 0, aggregate: 0, perSession: 0 },
355
- dennard: 0,
356
  fixed: null,
357
  memoryPower: capacity * bandwidth,
358
  status: {
@@ -425,10 +434,15 @@
425
  const resident = weight.resident;
426
  const alloc = profiledKvAllocGB(profile, lAlloc);
427
  const free = capacity - resident - overhead;
428
- const bMem = free >= 0 && alloc > 0
429
- ? Math.max(0, Math.floor((free / alloc) + 1e-9))
 
 
 
 
 
430
  : 0;
431
- const maxSearch = Math.min(bMem, 10000);
432
  const usableBatches = [];
433
  let best = null;
434
 
@@ -439,10 +453,26 @@
439
  if (!best || result.aggregate > best.aggregate) best = result;
440
  }
441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
442
  const single = calculateProfiledBatchBound({ profile, hardware, batch: 1, rho, lRead });
443
  const correction = capacity > 0 ? Math.max(0, 1 - ((resident + overhead) / capacity)) : 0;
444
  const active = weight.batchWeight(1, rho);
445
- const dennard = alloc > 0 && active > 0
446
  ? rho * memoryPower / (alloc * active) * correction
447
  : 0;
448
  const statusCode = profileStatusCode({ free, bMem, best });
@@ -464,11 +494,11 @@
464
  q_at_b_star_gb_per_output_token: best?.q ?? 0,
465
  aggregate_toks_per_s: best?.aggregate ?? 0,
466
  per_session_toks_per_s: best?.perSession ?? 0,
467
- dennard_ceiling_toks_per_s: dennard
468
  };
469
 
470
  return {
471
- engine_version: "1.0.0",
472
  schema_version: "1.0.0",
473
  status_code: statusCode,
474
  profile_resolution: {
@@ -486,11 +516,11 @@
486
  single_session_toks_per_s: single.aggregate,
487
  kv_aware_aggregate_toks_per_s: best.aggregate,
488
  per_session_at_b_star_toks_per_s: best.perSession,
489
- dennard_toks_per_s: dennard
490
  }
491
  : {
492
  single_session_toks_per_s: single.aggregate,
493
- dennard_toks_per_s: dennard
494
  },
495
  usable_batch: best
496
  ? {
@@ -498,7 +528,7 @@
498
  selection_rule: "max_aggregate_over_floor_qualified_batches"
499
  }
500
  : {},
501
- warnings: [],
502
  inputs_legacy: { lAlloc, lRead, overhead, rho, rStar },
503
  capacity,
504
  bandwidth,
@@ -508,7 +538,7 @@
508
  bMem,
509
  best,
510
  single,
511
- dennard,
512
  fixed: null,
513
  memoryPower,
514
  status: statuses
 
1
  (function attachBoundsEngine(root) {
2
+ const ENGINE_VERSION = "1.1.0";
3
+ const BATCH_SEARCH_CAP = 10000;
4
+
5
  const STATUS_CODES = Object.freeze({
6
  FITS: "fits",
7
  RESIDENT_NOT_FIT: "resident_not_fit",
 
50
  const shared = Number(arch.shared_experts_per_token || 0);
51
  const bytesPerParam = Number(adapter.weight_bytes_per_param || 0);
52
  if (!total || !active || !experts || !bytesPerParam) return Number(adapter.active_weight_gb || 0);
53
+ // Non-active parameters are the E - k routed experts a token does not
54
+ // select; shared experts are always-on, so they must not appear in the
55
+ // derived per-expert size denominator. Using E - k - s here overestimates
56
+ // the expert size and makes W_batch saturate above the total resident
57
+ // weight. Explicit adapter overrides bypass the derivation for audited
58
+ // packages with nonuniform shared-expert sizes.
59
+ const expertParamB = Number(adapter.expert_param_b || ((total - active) / Math.max(1, experts - routed)));
60
  const fixedParamB = Number(adapter.fixed_param_b || Math.max(0, active - (routed + shared) * expertParamB));
61
  const sharedExpertParamB =
62
  adapter.shared_expert_param_b === undefined ? expertParamB : Number(adapter.shared_expert_param_b);
 
138
  const alloc = kvAllocGB(model, lAlloc);
139
  const free = capacity - resident - Number(overhead || 0);
140
  const bMem = alloc > 0 ? Math.max(0, Math.floor((free / alloc) + 1e-9)) : 0;
141
+ const maxSearch = Math.min(bMem, BATCH_SEARCH_CAP);
142
  let best = null;
143
  for (let b = 1; b <= maxSearch; b += 1) {
144
  const result = calculateBatchBound({ model, hardware, batch: b, rho: safeRho, lRead });
 
149
  const active = Number(model.adapter.active_weight_gb || batchWeightGB(model, 1, safeRho));
150
  const correction = capacity > 0 ? Math.max(0, 1 - ((resident + Number(overhead || 0)) / capacity)) : 0;
151
  const memoryPower = capacity * bandwidth;
152
+ const memoryPowerCeiling = alloc > 0 && active > 0
153
  ? safeRho * memoryPower / (alloc * active) * correction
154
  : 0;
155
  const fixed = fixedBatch
 
165
  bMem,
166
  best,
167
  single,
168
+ memoryPowerCeiling,
169
  fixed,
170
  memoryPower,
171
  status: fitStatuses({ free, bMem, fixed, best, rStar })
 
319
  const bandwidth = Number(hardware.memory.bandwidth_gbps || 0);
320
  const repo = profile?.repo || model?.id || "";
321
  return {
322
+ engine_version: ENGINE_VERSION,
323
  schema_version: "1.0.0",
324
  status_code: PROFILE_STATUS_CODES.UNSUPPORTED_PROFILE,
325
  profile_resolution: {
 
347
  q_at_b_star_gb_per_output_token: 0,
348
  aggregate_toks_per_s: 0,
349
  per_session_toks_per_s: 0,
350
+ memory_power_ceiling_toks_per_s: 0
351
  },
352
  ceilings: {},
353
  usable_batch: {},
 
361
  bMem: 0,
362
  best: null,
363
  single: { batch: 1, batchWeight: 0, readTraffic: 0, q: 0, aggregate: 0, perSession: 0 },
364
+ memoryPowerCeiling: 0,
365
  fixed: null,
366
  memoryPower: capacity * bandwidth,
367
  status: {
 
434
  const resident = weight.resident;
435
  const alloc = profiledKvAllocGB(profile, lAlloc);
436
  const free = capacity - resident - overhead;
437
+ // A profile with zero per-session allocation is not bounded by memory at
438
+ // all; treat its session capacity as the search cap instead of zero.
439
+ const allocUnbounded = free >= 0 && alloc <= 0;
440
+ const bMem = free >= 0
441
+ ? alloc > 0
442
+ ? Math.max(0, Math.floor((free / alloc) + 1e-9))
443
+ : BATCH_SEARCH_CAP
444
  : 0;
445
+ const maxSearch = Math.min(bMem, BATCH_SEARCH_CAP);
446
  const usableBatches = [];
447
  let best = null;
448
 
 
453
  if (!best || result.aggregate > best.aggregate) best = result;
454
  }
455
 
456
+ const warnings = [];
457
+ if (allocUnbounded) {
458
+ warnings.push(
459
+ "Profile reports zero per-session KV/state allocation; memory does not bound concurrency and the batch search is capped at " +
460
+ `${BATCH_SEARCH_CAP}.`
461
+ );
462
+ }
463
+ const searchTruncated =
464
+ best !== null && best.batch === maxSearch && (allocUnbounded || bMem > maxSearch);
465
+ if (searchTruncated) {
466
+ warnings.push(
467
+ `Batch search stopped at ${maxSearch} with the per-session floor still satisfied; ` +
468
+ "the reported KV-aware ceiling may understate the true bound."
469
+ );
470
+ }
471
+
472
  const single = calculateProfiledBatchBound({ profile, hardware, batch: 1, rho, lRead });
473
  const correction = capacity > 0 ? Math.max(0, 1 - ((resident + overhead) / capacity)) : 0;
474
  const active = weight.batchWeight(1, rho);
475
+ const memoryPowerCeiling = alloc > 0 && active > 0
476
  ? rho * memoryPower / (alloc * active) * correction
477
  : 0;
478
  const statusCode = profileStatusCode({ free, bMem, best });
 
494
  q_at_b_star_gb_per_output_token: best?.q ?? 0,
495
  aggregate_toks_per_s: best?.aggregate ?? 0,
496
  per_session_toks_per_s: best?.perSession ?? 0,
497
+ memory_power_ceiling_toks_per_s: memoryPowerCeiling
498
  };
499
 
500
  return {
501
+ engine_version: ENGINE_VERSION,
502
  schema_version: "1.0.0",
503
  status_code: statusCode,
504
  profile_resolution: {
 
516
  single_session_toks_per_s: single.aggregate,
517
  kv_aware_aggregate_toks_per_s: best.aggregate,
518
  per_session_at_b_star_toks_per_s: best.perSession,
519
+ memory_power_toks_per_s: memoryPowerCeiling
520
  }
521
  : {
522
  single_session_toks_per_s: single.aggregate,
523
+ memory_power_toks_per_s: memoryPowerCeiling
524
  },
525
  usable_batch: best
526
  ? {
 
528
  selection_rule: "max_aggregate_over_floor_qualified_batches"
529
  }
530
  : {},
531
+ warnings,
532
  inputs_legacy: { lAlloc, lRead, overhead, rho, rStar },
533
  capacity,
534
  bandwidth,
 
538
  bMem,
539
  best,
540
  single,
541
+ memoryPowerCeiling,
542
  fixed: null,
543
  memoryPower,
544
  status: statuses
assets/local-frontier-model-data.js CHANGED
@@ -44433,13 +44433,13 @@ window.LOCAL_FRONTIER_MODEL_DATA = {
44433
  "weight_precision": "ModelOpt NVFP4 + BF16 fixed tensors",
44434
  "weight_bytes_per_param": 0.6169876465760088,
44435
  "resident_weight_gb": 464.795267072,
44436
- "active_weight_gb": 48.643642944,
44437
  "kv_alloc_gb_per_1k_tokens": 2.558592,
44438
  "kv_read_gb_per_1k_tokens": 2.558592,
44439
- "expert_param_b": 2.7034967089807207,
44440
  "fixed_param_b": 57.21257234872586,
44441
  "shared_expert_param_b": 0,
44442
- "notes": "Manual correction on 2026-07-08 from current Hugging Face API metadata, pinned model card, target config, hf_quant_config, base GLM-5.2 config comparison, safetensors index, and direct range-read safetensors shard headers. Active traffic is the single-session expected-distinct MoE text-decode weight traffic. KV display fields charge FP8 expanded K/V for 78 layers plus FP8 GLM-5.2 IndexShare DSA indexer key cache for 21 full indexer layers. The audited profile supersedes the generated 376.6649 GB resident estimate and all-layers BF16-ish KV estimate."
44443
  },
44444
  "sources": [
44445
  {
 
44433
  "weight_precision": "ModelOpt NVFP4 + BF16 fixed tensors",
44434
  "weight_bytes_per_param": 0.6169876465760088,
44435
  "resident_weight_gb": 464.795267072,
44436
+ "active_weight_gb": 48.039663168,
44437
  "kv_alloc_gb_per_1k_tokens": 2.558592,
44438
  "kv_read_gb_per_1k_tokens": 2.558592,
44439
+ "expert_param_b": 2.581132067777651,
44440
  "fixed_param_b": 57.21257234872586,
44441
  "shared_expert_param_b": 0,
44442
+ "notes": "Manual correction on 2026-07-08 from current Hugging Face API metadata, pinned model card, target config, hf_quant_config, base GLM-5.2 config comparison, safetensors index, and direct range-read safetensors shard headers. Active traffic is the single-session expected-distinct MoE text-decode weight traffic. KV display fields charge FP8 expanded K/V for 78 layers plus FP8 GLM-5.2 IndexShare DSA indexer key cache for 21 full indexer layers. The audited profile supersedes the generated 376.6649 GB resident estimate and all-layers BF16-ish KV estimate. Corrected on 2026-07-09: the routed expert group size was re-derived as 1.592526600 GB after the earlier split double-counted shared-expert tensors inside the routed sum."
44443
  },
44444
  "sources": [
44445
  {
assets/local-frontier-profile-data.js CHANGED
@@ -1,6 +1,6 @@
1
  window.LOCAL_FRONTIER_PROFILE_DATA = {
2
  "schema_version": "1.0.0",
3
- "generated_at": "2026-07-08T00:00:00.000Z",
4
  "profiles": [
5
  {
6
  "id": "abhishekchohan--gemma-3-12b-it-quantized-w4a16",
@@ -44286,7 +44286,7 @@ window.LOCAL_FRONTIER_PROFILE_DATA = {
44286
  },
44287
  {
44288
  "id": "nvidia--glm-5-2-nvfp4",
44289
- "version": "1.0.0",
44290
  "schema_version": "1.0.0",
44291
  "status": "audited",
44292
  "repo": "nvidia/GLM-5.2-NVFP4",
@@ -44309,7 +44309,7 @@ window.LOCAL_FRONTIER_PROFILE_DATA = {
44309
  "main_resident_weight_gb": 442.986259968,
44310
  "auxiliary_resident_weight_gb": 21.809007104,
44311
  "fixed_weight_gb": 35.299450368,
44312
- "routed_expert_weight_gb": 1.668024072,
44313
  "routed_experts": 256,
44314
  "routed_experts_per_token": 8,
44315
  "shared_experts_per_token": 1,
@@ -44427,7 +44427,7 @@ window.LOCAL_FRONTIER_PROFILE_DATA = {
44427
  "fixed_weight_gb",
44428
  "routed_expert_weight_gb"
44429
  ],
44430
- "notes": "Safetensors headers were range-read across all 47 shards. Stored tensors sum exactly to the index total_size of 464.795267072 GB: U8 362.387865600 GB, BF16 57.108379648 GB, F8_E4M3 45.298483200 GB, and F32 0.000538624 GB across 232385 tensors. Linked shard bytes total 464.823042096 GB, leaving 0.027775024 GB of safetensors header/container overhead outside tensor payloads. The input embedding contributes 1.903165440 GB resident-only, and auxiliary layer 78 contributes 19.905841664 GB resident-only. Ordinary decode main resident tensors therefore sum to 442.986259968 GB. Routed expert tensors in layers 3-77 sum to 427.014162432 GB and divide exactly into 256 uniform expert groups of 1.668024072 GB. Non-expert ordinary decode traffic, including lm_head.weight, dense layers 0-2, attention, gates, norms, routers, shared experts, and the GLM-5.2 full-indexer tensors, sums to 35.299450368 GB."
44431
  },
44432
  {
44433
  "label": "Audited GLM-5.2 FP8 profile and Transformers GLM MoE DSA implementation",
@@ -44443,8 +44443,8 @@ window.LOCAL_FRONTIER_PROFILE_DATA = {
44443
  ],
44444
  "review": {
44445
  "reviewed_by": "local-frontier-profile-review",
44446
- "reviewed_at": "2026-07-08",
44447
- "notes": "Audited from live HF API metadata, pinned model card, target config, hf_quant_config, base GLM-5.2 config comparison, direct safetensors header range reads across all 47 shards, and the existing audited GLM-5.2 DSA/IndexShare profiles."
44448
  },
44449
  "notes": "This profile models ordinary text decode with documented FP8 KV cache. It intentionally does not assume expert-parallel placement details, sparse attention compute savings, runtime-specific MLA compression, or speculative decoding speedups without direct implementation evidence."
44450
  },
 
1
  window.LOCAL_FRONTIER_PROFILE_DATA = {
2
  "schema_version": "1.0.0",
3
+ "generated_at": "2026-07-09T00:00:00.000Z",
4
  "profiles": [
5
  {
6
  "id": "abhishekchohan--gemma-3-12b-it-quantized-w4a16",
 
44286
  },
44287
  {
44288
  "id": "nvidia--glm-5-2-nvfp4",
44289
+ "version": "1.0.1",
44290
  "schema_version": "1.0.0",
44291
  "status": "audited",
44292
  "repo": "nvidia/GLM-5.2-NVFP4",
 
44309
  "main_resident_weight_gb": 442.986259968,
44310
  "auxiliary_resident_weight_gb": 21.809007104,
44311
  "fixed_weight_gb": 35.299450368,
44312
+ "routed_expert_weight_gb": 1.5925266,
44313
  "routed_experts": 256,
44314
  "routed_experts_per_token": 8,
44315
  "shared_experts_per_token": 1,
 
44427
  "fixed_weight_gb",
44428
  "routed_expert_weight_gb"
44429
  ],
44430
+ "notes": "Safetensors headers were range-read across all 47 shards. Stored tensors sum exactly to the index total_size of 464.795267072 GB: U8 362.387865600 GB, BF16 57.108379648 GB, F8_E4M3 45.298483200 GB, and F32 0.000538624 GB across 232385 tensors. Linked shard bytes total 464.823042096 GB, leaving 0.027775024 GB of safetensors header/container overhead outside tensor payloads. The input embedding contributes 1.903165440 GB resident-only, and auxiliary layer 78 contributes 19.905841664 GB resident-only. Ordinary decode main resident tensors therefore sum to 442.986259968 GB. Routed expert tensors under model.layers.3-77 .mlp.experts.N. sum to 407.686809600 GB and divide exactly into 256 uniform expert groups of 1.592526600 GB. Non-expert ordinary decode traffic, including lm_head.weight, dense layers 0-2, attention, gates, norms, routers, shared experts, and the GLM-5.2 full-indexer tensors, sums to 35.299450368 GB, so fixed plus all 256 routed expert groups reproduces the 442.986259968 GB main resident total exactly. An earlier revision of this profile recorded 1.668024072 GB per routed expert from a tensor grouping that double-counted the always-on shared-expert tensors inside the routed sum; the corrected split was re-derived from the same shard headers at the same commit."
44431
  },
44432
  {
44433
  "label": "Audited GLM-5.2 FP8 profile and Transformers GLM MoE DSA implementation",
 
44443
  ],
44444
  "review": {
44445
  "reviewed_by": "local-frontier-profile-review",
44446
+ "reviewed_at": "2026-07-09",
44447
+ "notes": "Audited from live HF API metadata, pinned model card, target config, hf_quant_config, base GLM-5.2 config comparison, direct safetensors header range reads across all 47 shards, and the existing audited GLM-5.2 DSA/IndexShare profiles. Re-reviewed 2026-07-09: the routed expert byte split was re-derived from the same pinned shard headers after a saturation consistency check flagged that fixed plus 256 routed experts exceeded the main resident total."
44448
  },
44449
  "notes": "This profile models ordinary text decode with documented FP8 KV cache. It intentionally does not assume expert-parallel placement details, sparse attention compute savings, runtime-specific MLA compression, or speculative decoding speedups without direct implementation evidence."
44450
  },
docs/bounds-engine-v1.md CHANGED
@@ -249,14 +249,20 @@ Single-session ceiling:
249
  single_session = R / (W_batch(1) / rho + K_read(L_read))
250
  ```
251
 
252
- Dennard orientation ceiling:
 
253
 
254
  ```text
255
  D = C * R
256
  resident_correction = 1 - (W_resident + O) / C
257
- dennard = rho * D / (K_alloc(L_alloc) * W_active) * resident_correction
258
  ```
259
 
 
 
 
 
 
260
  ## Statuses
261
 
262
  Root `status_code` values:
@@ -277,7 +283,7 @@ Successful and partial results include:
277
 
278
  ```json
279
  {
280
- "engine_version": "1.0.0",
281
  "schema_version": "1.0.0",
282
  "status_code": "ok",
283
  "profile_resolution": {
@@ -305,12 +311,18 @@ Successful and partial results include:
305
  "q_at_b_star_gb_per_output_token": 1.1106134884270131,
306
  "aggregate_toks_per_s": 245.81008860846453,
307
  "per_session_toks_per_s": 20.484174050705377,
308
- "dennard_ceiling_toks_per_s": 16017.778400892654
309
  },
310
  "warnings": []
311
  }
312
  ```
313
 
 
 
 
 
 
 
314
  These numbers are for the audited NVIDIA ModelOpt artifact, not the rounded
315
  Gemma worked example in the original note. The exact artifact has
316
  18.782360732 GB resident tensors, BF16 fixed language traffic, quantized routed
 
249
  single_session = R / (W_batch(1) / rho + K_read(L_read))
250
  ```
251
 
252
+ Memory-power orientation ceiling (named the Dennard ceiling before engine
253
+ 1.1.0; the bound is unchanged):
254
 
255
  ```text
256
  D = C * R
257
  resident_correction = 1 - (W_resident + O) / C
258
+ memory_power_ceiling = rho * D / (K_alloc(L_alloc) * W_active) * resident_correction
259
  ```
260
 
261
+ The batch search is capped at 10000. If the per-session floor is still
262
+ satisfied at the cap — including when a profile reports zero per-session
263
+ allocation, so memory does not bound concurrency at all — the result carries a
264
+ warning that the reported KV-aware ceiling may understate the true bound.
265
+
266
  ## Statuses
267
 
268
  Root `status_code` values:
 
283
 
284
  ```json
285
  {
286
+ "engine_version": "1.1.0",
287
  "schema_version": "1.0.0",
288
  "status_code": "ok",
289
  "profile_resolution": {
 
311
  "q_at_b_star_gb_per_output_token": 1.1106134884270131,
312
  "aggregate_toks_per_s": 245.81008860846453,
313
  "per_session_toks_per_s": 20.484174050705377,
314
+ "memory_power_ceiling_toks_per_s": 16017.778400892654
315
  },
316
  "warnings": []
317
  }
318
  ```
319
 
320
+ Engine 1.1.0 renamed the orientation-ceiling fields after the source note
321
+ retired the Dennard eponym: `trace.dennard_ceiling_toks_per_s` became
322
+ `trace.memory_power_ceiling_toks_per_s`, `ceilings.dennard_toks_per_s` became
323
+ `ceilings.memory_power_toks_per_s`, and the top-level `dennard` convenience
324
+ field became `memoryPowerCeiling`. The computed values are identical.
325
+
326
  These numbers are for the audited NVIDIA ModelOpt artifact, not the rounded
327
  Gemma worked example in the original note. The exact artifact has
328
  18.782360732 GB resident tensors, BF16 fixed language traffic, quantized routed
docs/compare-table-metrics.md CHANGED
@@ -114,7 +114,7 @@ set and should be visible without opening details.
114
  | Usable sessions `b*` | `trace.b_star` | Derived concurrency that maximizes aggregate throughput while meeting the per-session floor. |
115
  | Aggregate tok/s at `b*` | `trace.aggregate_toks_per_s` | Main total throughput estimate for useful concurrent serving. |
116
  | Per-session tok/s at `b*` | `trace.per_session_toks_per_s` | Individual user/session throughput at the chosen concurrency. |
117
- | Dennard bound | `trace.dennard_ceiling_toks_per_s` | A memory-power orientation bound for sanity checking. |
118
 
119
  Default visual priority:
120
 
@@ -124,7 +124,7 @@ Default visual priority:
124
  4. `Single-session tok/s`
125
  5. `Fit`
126
  6. `Max fit sessions`
127
- 7. `Dennard bound`
128
 
129
  The table may sort by aggregate throughput by default in one-model mode. In
130
  one-hardware mode, preserve model selection order unless the user chooses a
@@ -144,8 +144,8 @@ sort.
144
 
145
  When `status_code` is not `ok`, derived columns that depend on `b*` should show
146
  `-`. Columns that are still meaningful may remain populated. For example,
147
- `single_session_toks_per_s`, `b_mem`, and `dennard_ceiling_toks_per_s` can be
148
- shown for `no_floor` if the engine produced valid values.
149
 
150
  ## Advanced Toggle
151
 
@@ -224,7 +224,7 @@ Minimum details for supported rows:
224
  - `q(b_star)`
225
  - aggregate tok/s at `b_star`
226
  - per-session tok/s at `b_star`
227
- - Dennard bound
228
  - evidence links and warnings
229
 
230
  For unsupported rows, show:
 
114
  | Usable sessions `b*` | `trace.b_star` | Derived concurrency that maximizes aggregate throughput while meeting the per-session floor. |
115
  | Aggregate tok/s at `b*` | `trace.aggregate_toks_per_s` | Main total throughput estimate for useful concurrent serving. |
116
  | Per-session tok/s at `b*` | `trace.per_session_toks_per_s` | Individual user/session throughput at the chosen concurrency. |
117
+ | Memory-power bound | `trace.memory_power_ceiling_toks_per_s` | A memory-power orientation bound for sanity checking. |
118
 
119
  Default visual priority:
120
 
 
124
  4. `Single-session tok/s`
125
  5. `Fit`
126
  6. `Max fit sessions`
127
+ 7. `Memory-power bound`
128
 
129
  The table may sort by aggregate throughput by default in one-model mode. In
130
  one-hardware mode, preserve model selection order unless the user chooses a
 
144
 
145
  When `status_code` is not `ok`, derived columns that depend on `b*` should show
146
  `-`. Columns that are still meaningful may remain populated. For example,
147
+ `single_session_toks_per_s`, `b_mem`, and `memory_power_ceiling_toks_per_s` can
148
+ be shown for `no_floor` if the engine produced valid values.
149
 
150
  ## Advanced Toggle
151
 
 
224
  - `q(b_star)`
225
  - aggregate tok/s at `b_star`
226
  - per-session tok/s at `b_star`
227
+ - Memory-power bound
228
  - evidence links and warnings
229
 
230
  For unsupported rows, show:
docs/profiled-bounds-implementation-plan.md CHANGED
@@ -1027,7 +1027,7 @@ Bounds results should be serializable and testable.
1027
  "q_at_b_star_gb_per_output_token": 0.82,
1028
  "aggregate_toks_per_s": 333,
1029
  "per_session_toks_per_s": 20.8,
1030
- "dennard_ceiling_toks_per_s": 23700
1031
  },
1032
  "usable_batch": {
1033
  "b_star": 16,
@@ -1037,7 +1037,7 @@ Bounds results should be serializable and testable.
1037
  "single_session_toks_per_s": 120,
1038
  "kv_aware_aggregate_toks_per_s": 333,
1039
  "per_session_at_b_star_toks_per_s": 20.8,
1040
- "dennard_toks_per_s": 23700
1041
  },
1042
  "warnings": []
1043
  }
@@ -1060,7 +1060,7 @@ Required trace fields:
1060
  - `q_at_b_star_gb_per_output_token`
1061
  - `aggregate_toks_per_s`
1062
  - `per_session_toks_per_s`
1063
- - `dennard_ceiling_toks_per_s`
1064
 
1065
  The trace must be stable enough for snapshot tests and readable enough for the
1066
  calculation details UI.
@@ -1167,7 +1167,7 @@ W_active =
1167
  W_resident for dense weight adapters
1168
  W_batch(1) for MoE and other batch-dependent weight adapters
1169
 
1170
- dennard_ceiling =
1171
  rho * (C * R) / (K_alloc(L_alloc) * W_active) *
1172
  (1 - (W_resident + overhead) / C)
1173
  ```
@@ -1214,7 +1214,7 @@ object:
1214
  "q_at_b_star_gb_per_output_token": 0.82,
1215
  "aggregate_toks_per_s": 333,
1216
  "per_session_toks_per_s": 20.8,
1217
- "dennard_ceiling_toks_per_s": 23700
1218
  }
1219
  }
1220
  ```
@@ -1308,7 +1308,7 @@ Required `ceilings` fields when `status` is `ok`:
1308
  - `single_session_toks_per_s`
1309
  - `kv_aware_aggregate_toks_per_s`
1310
  - `per_session_at_b_star_toks_per_s`
1311
- - `dennard_toks_per_s`
1312
 
1313
  Required `usable_batch` fields when `status` is `ok`:
1314
 
@@ -1451,7 +1451,7 @@ Main result should show:
1451
  - single-session decode ceiling
1452
  - KV-aware aggregate decode ceiling
1453
  - per-session rate at `b_star`
1454
- - Dennard orientation ceiling
1455
 
1456
  Remove raw `Inspect concurrency` from the main UI.
1457
 
 
1027
  "q_at_b_star_gb_per_output_token": 0.82,
1028
  "aggregate_toks_per_s": 333,
1029
  "per_session_toks_per_s": 20.8,
1030
+ "memory_power_ceiling_toks_per_s": 23700
1031
  },
1032
  "usable_batch": {
1033
  "b_star": 16,
 
1037
  "single_session_toks_per_s": 120,
1038
  "kv_aware_aggregate_toks_per_s": 333,
1039
  "per_session_at_b_star_toks_per_s": 20.8,
1040
+ "memory_power_toks_per_s": 23700
1041
  },
1042
  "warnings": []
1043
  }
 
1060
  - `q_at_b_star_gb_per_output_token`
1061
  - `aggregate_toks_per_s`
1062
  - `per_session_toks_per_s`
1063
+ - `memory_power_ceiling_toks_per_s`
1064
 
1065
  The trace must be stable enough for snapshot tests and readable enough for the
1066
  calculation details UI.
 
1167
  W_resident for dense weight adapters
1168
  W_batch(1) for MoE and other batch-dependent weight adapters
1169
 
1170
+ memory_power_ceiling =
1171
  rho * (C * R) / (K_alloc(L_alloc) * W_active) *
1172
  (1 - (W_resident + overhead) / C)
1173
  ```
 
1214
  "q_at_b_star_gb_per_output_token": 0.82,
1215
  "aggregate_toks_per_s": 333,
1216
  "per_session_toks_per_s": 20.8,
1217
+ "memory_power_ceiling_toks_per_s": 23700
1218
  }
1219
  }
1220
  ```
 
1308
  - `single_session_toks_per_s`
1309
  - `kv_aware_aggregate_toks_per_s`
1310
  - `per_session_at_b_star_toks_per_s`
1311
+ - `memory_power_toks_per_s`
1312
 
1313
  Required `usable_batch` fields when `status` is `ok`:
1314
 
 
1451
  - single-session decode ceiling
1452
  - KV-aware aggregate decode ceiling
1453
  - per-session rate at `b_star`
1454
+ - Memory-power orientation ceiling
1455
 
1456
  Remove raw `Inspect concurrency` from the main UI.
1457
 
profiles/models/nvidia--glm-5-2-nvfp4.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "id": "nvidia--glm-5-2-nvfp4",
3
- "version": "1.0.0",
4
  "schema_version": "1.0.0",
5
  "status": "audited",
6
  "repo": "nvidia/GLM-5.2-NVFP4",
@@ -23,7 +23,7 @@
23
  "main_resident_weight_gb": 442.986259968,
24
  "auxiliary_resident_weight_gb": 21.809007104,
25
  "fixed_weight_gb": 35.299450368,
26
- "routed_expert_weight_gb": 1.668024072,
27
  "routed_experts": 256,
28
  "routed_experts_per_token": 8,
29
  "shared_experts_per_token": 1,
@@ -137,7 +137,7 @@
137
  "fixed_weight_gb",
138
  "routed_expert_weight_gb"
139
  ],
140
- "notes": "Safetensors headers were range-read across all 47 shards. Stored tensors sum exactly to the index total_size of 464.795267072 GB: U8 362.387865600 GB, BF16 57.108379648 GB, F8_E4M3 45.298483200 GB, and F32 0.000538624 GB across 232385 tensors. Linked shard bytes total 464.823042096 GB, leaving 0.027775024 GB of safetensors header/container overhead outside tensor payloads. The input embedding contributes 1.903165440 GB resident-only, and auxiliary layer 78 contributes 19.905841664 GB resident-only. Ordinary decode main resident tensors therefore sum to 442.986259968 GB. Routed expert tensors in layers 3-77 sum to 427.014162432 GB and divide exactly into 256 uniform expert groups of 1.668024072 GB. Non-expert ordinary decode traffic, including lm_head.weight, dense layers 0-2, attention, gates, norms, routers, shared experts, and the GLM-5.2 full-indexer tensors, sums to 35.299450368 GB."
141
  },
142
  {
143
  "label": "Audited GLM-5.2 FP8 profile and Transformers GLM MoE DSA implementation",
@@ -149,8 +149,8 @@
149
  ],
150
  "review": {
151
  "reviewed_by": "local-frontier-profile-review",
152
- "reviewed_at": "2026-07-08",
153
- "notes": "Audited from live HF API metadata, pinned model card, target config, hf_quant_config, base GLM-5.2 config comparison, direct safetensors header range reads across all 47 shards, and the existing audited GLM-5.2 DSA/IndexShare profiles."
154
  },
155
  "notes": "This profile models ordinary text decode with documented FP8 KV cache. It intentionally does not assume expert-parallel placement details, sparse attention compute savings, runtime-specific MLA compression, or speculative decoding speedups without direct implementation evidence."
156
  }
 
1
  {
2
  "id": "nvidia--glm-5-2-nvfp4",
3
+ "version": "1.0.1",
4
  "schema_version": "1.0.0",
5
  "status": "audited",
6
  "repo": "nvidia/GLM-5.2-NVFP4",
 
23
  "main_resident_weight_gb": 442.986259968,
24
  "auxiliary_resident_weight_gb": 21.809007104,
25
  "fixed_weight_gb": 35.299450368,
26
+ "routed_expert_weight_gb": 1.5925266,
27
  "routed_experts": 256,
28
  "routed_experts_per_token": 8,
29
  "shared_experts_per_token": 1,
 
137
  "fixed_weight_gb",
138
  "routed_expert_weight_gb"
139
  ],
140
+ "notes": "Safetensors headers were range-read across all 47 shards. Stored tensors sum exactly to the index total_size of 464.795267072 GB: U8 362.387865600 GB, BF16 57.108379648 GB, F8_E4M3 45.298483200 GB, and F32 0.000538624 GB across 232385 tensors. Linked shard bytes total 464.823042096 GB, leaving 0.027775024 GB of safetensors header/container overhead outside tensor payloads. The input embedding contributes 1.903165440 GB resident-only, and auxiliary layer 78 contributes 19.905841664 GB resident-only. Ordinary decode main resident tensors therefore sum to 442.986259968 GB. Routed expert tensors under model.layers.3-77 .mlp.experts.N. sum to 407.686809600 GB and divide exactly into 256 uniform expert groups of 1.592526600 GB. Non-expert ordinary decode traffic, including lm_head.weight, dense layers 0-2, attention, gates, norms, routers, shared experts, and the GLM-5.2 full-indexer tensors, sums to 35.299450368 GB, so fixed plus all 256 routed expert groups reproduces the 442.986259968 GB main resident total exactly. An earlier revision of this profile recorded 1.668024072 GB per routed expert from a tensor grouping that double-counted the always-on shared-expert tensors inside the routed sum; the corrected split was re-derived from the same shard headers at the same commit."
141
  },
142
  {
143
  "label": "Audited GLM-5.2 FP8 profile and Transformers GLM MoE DSA implementation",
 
149
  ],
150
  "review": {
151
  "reviewed_by": "local-frontier-profile-review",
152
+ "reviewed_at": "2026-07-09",
153
+ "notes": "Audited from live HF API metadata, pinned model card, target config, hf_quant_config, base GLM-5.2 config comparison, direct safetensors header range reads across all 47 shards, and the existing audited GLM-5.2 DSA/IndexShare profiles. Re-reviewed 2026-07-09: the routed expert byte split was re-derived from the same pinned shard headers after a saturation consistency check flagged that fixed plus 256 routed experts exceeded the main resident total."
154
  },
155
  "notes": "This profile models ordinary text decode with documented FP8 KV cache. It intentionally does not assume expert-parallel placement details, sparse attention compute savings, runtime-specific MLA compression, or speculative decoding speedups without direct implementation evidence."
156
  }
scripts/profile-utils.mjs CHANGED
@@ -193,6 +193,16 @@ function checkAuditedProfile(relativePath, profile, errors) {
193
  if (activeWeight > weightAdapter.resident_weight_gb + 1e-9) {
194
  errors.push(`${relativePath}: active traffic exceeds resident footprint`);
195
  }
 
 
 
 
 
 
 
 
 
 
196
  if (
197
  weightAdapter.main_resident_weight_gb !== undefined &&
198
  weightAdapter.auxiliary_resident_weight_gb !== undefined
@@ -246,4 +256,12 @@ function checkAuditedProfile(relativePath, profile, errors) {
246
  if (activeGb > residentGb + 1e-9) {
247
  errors.push(`${relativePath}: active traffic exceeds resident footprint`);
248
  }
 
 
 
 
 
 
 
 
249
  }
 
193
  if (activeWeight > weightAdapter.resident_weight_gb + 1e-9) {
194
  errors.push(`${relativePath}: active traffic exceeds resident footprint`);
195
  }
196
+ const saturatedWeight =
197
+ weightAdapter.fixed_weight_gb +
198
+ weightAdapter.routed_experts * weightAdapter.routed_expert_weight_gb;
199
+ const sweptResident =
200
+ weightAdapter.main_resident_weight_gb ?? weightAdapter.resident_weight_gb;
201
+ if (saturatedWeight > sweptResident + 1e-9) {
202
+ errors.push(
203
+ `${relativePath}: saturated expert traffic exceeds swept resident footprint`,
204
+ );
205
+ }
206
  if (
207
  weightAdapter.main_resident_weight_gb !== undefined &&
208
  weightAdapter.auxiliary_resident_weight_gb !== undefined
 
256
  if (activeGb > residentGb + 1e-9) {
257
  errors.push(`${relativePath}: active traffic exceeds resident footprint`);
258
  }
259
+ const saturatedGb =
260
+ (fixedParamB + weightAdapter.routed_experts * expertParamB) *
261
+ profile.serving.weight_bytes_per_param;
262
+ if (saturatedGb > residentGb + 1e-9) {
263
+ errors.push(
264
+ `${relativePath}: saturated expert traffic exceeds resident footprint`,
265
+ );
266
+ }
267
  }
scripts/test-bounds-engine.mjs CHANGED
The diff for this file is too large to render. See raw diff