The subscribe modal (shared across the book, site, labs, kits, and
mlsysim subsites) was a plain div overlay:
- No role="dialog", aria-modal, or accessible name, so screen readers
never announced it as a dialog and could wander into the page
behind the overlay.
- No focus trap: Tab walked out of the modal into the visually hidden
background page.
- Focus was never returned to the triggering element on close, dropping
keyboard users at the top of the document.
- Open/close animations played regardless of prefers-reduced-motion.
Changes to the canonical shared/scripts/subscribe-modal.js:
- role="dialog" aria-modal="true" aria-labelledby on the container,
with an id on the existing title.
- Tab/Shift+Tab now cycle within the modal's visible, enabled controls
(computed per keypress, so the trap also works on the post-submit
success view).
- The opener element is saved on openModal() and refocused on close.
- Animations are disabled under prefers-reduced-motion: reduce.
Mirrors regenerated with shared/scripts/sync-mirrors.sh (CI drift
check). Escape-to-close and overlay-click behavior unchanged.
- Move Figure 5 (design-space heatmap) to its first reference in 6.2 so the
section-boundary float barrier no longer flushes p24's left column.
- Tighten the abstract from 231 to ~175 words for cleaner progressive disclosure.
- Correct Validation Anchor 4: PaLM-540B ran on 6,144 TPU v4 chips (two pods),
57.8% HFU vs 46.2% MFU; drop the fabricated 64,000-chip scaling claim.
- Split the chain-of-thought latency multiplier (6.5x) from the cost/fleet
multiplier (~8x, tracking total decode tokens).
Replace the model_scaling raster in sustainable_ai with a matplotlib figure cell generated from published Kaplan et al. (2020) fit constants, now stored as Literature.KaplanScalingLaws with provenance so the figure traces to source-of-truth instead of a traced image.
Convert the remaining 'fig = plt.gcf()' figure cells across seven vol2 chapters (collective_communication, edge_intelligence, fleet_orchestration, ops_scale, performance_engineering, robust_ai, sustainable_ai) to end with plt.show() then plt.close(), matching the book's standard figure-cell convention so every generated figure is explicitly emitted and closed.
Three runnable Tier 1-3 examples extending the appendix cookbook, each with output verified verbatim against the current package and added to the cookbook reference list:
- Scenario F: Scenario.evaluate() three-level scorecard (Feasibility/Performance/Macro) via the pre-built ChatbotServing scenario.
- Scenario G: ParallelismOptimizer design-space search recovering TP=8/PP=2/DP=16 on a 256-GPU cluster with the ranked candidate list.
- Scenario H: a single Engine.solve call spanning datacenter to microcontroller (LeNet1 on ESP32-S3, MobileNet variants on Jetson Orin Nano and Coral).
paper.tex compiles (pdflatex); the only build errors in a fresh worktree are the untracked figure PDFs, which are present in the main checkout.
Audited paper.tex against the live package; the framework description (YAML+pydantic registries, 8 zoos, flop base dimension, instance/tech-class) was already accurate. Updated every drifted number/claim:
- Counts: 116 -> 126 provenance records; 34 -> 37 hardware devices (added V100 PCIe, Jetson Orin Nano, Apple M2 rows to the catalog table); 749 -> 862 test suite; figure caption four -> five invariant checks (matching the five enumerated in the Validation section).
- Executed-listing outputs regenerated from the current solvers: Solver Composition (54.9% / 68.1 day / 15,905,569 USD) and Carbon Accounting (57 days / 110.3 tonnes).
- Validation: Anchor 3 39.6 -> 39.1% MFU. Anchor 7 rewritten -- the ParallelismOptimizer now recovers Meta's TP=8, PP=16 backbone because the optimizer-state-aware memory prescreen (fixed in the mlsysim audit) drives PP=16 (was PP=4); prescreen prose now reads weights+gradients+optimizer state.
- validate_anchors.py: synced PAPER_CLAIMS/REPORTED to the corrected values; Anchor 5 now uses Chinchilla's actual C=5.88e23 (-> 70.0B). Harness reports all seven anchors match.
paper.tex compiles cleanly (pdflatex, no errors).
- ParallelismOptimizer: include Adam optimizer state in the per-GPU memory
prescreen (was weights + gradients only), so the search no longer admits
parallelism splits that OOM the instant optimizer state is allocated;
activations stay out (the search does not model the microbatch that sizes them)
- SystemEvaluator: the distributed feasibility lens reports SKIPPED with a
reason instead of a no-op PASS, so the scorecard never claims 'will run'
without having checked
- TopologyModel: reconcile the bisection-bandwidth comment with the tested
fat-tree-normalized beta convention (comment-only; value unchanged)
resolve_precision('fp32') yields key 'fp32', which was absent from the H100/H200 precision_flops map (stored as 'fp32_cuda' = 67 TFLOP/s), so Engine.solve fell through to peak_flops (989, the FP16 dense rate) -- a ~15x FP32 overestimate reachable by no precision string.
- Rename precision_flops key fp32_cuda -> fp32 on H100 and H200 (value 67 TFLOP/s unchanged)
- Propagate the rename to every consumer, value-preserving: 2 LEGO cells
(compute_infrastructure, appendix_assumptions), 2 mlsysim_constants audit
manifests, and the migrate-constants map
- Add test_hardware guards: precision-vocabulary check (no canonical precision
aliased away) + H100/H200 fp32 -> 67 regression
Add native Binder checks for LEGO formatting/unit/prose contracts, extend mlsysim formatter helpers, and normalize Vol1/Vol2 LEGO output strings through typed formatters.
Validate precision-sensitive prose rendering across both volumes and promote direct math/string assembly to fmt_math, fmt_display_math, fmt_text, and domain-specific helpers.
Adds an EdgeInferenceBenchmarks Python series (8 MLPerf-Tiny / vendor latency-
energy points across MCU/ASIC, edge-accelerator, and edge-GPU tiers) with
provenance, mirroring the ComputeTrend series pattern. @fig-edge-inference-landscape
now builds its device list from the registry instead of inline tuples.
Adds a Literature.ResponsibleAIOverhead collection (DP, fairness, SHAP, adversarial, federated overheads across accuracy/training/inference/memory) with RESPONSIBLE_AI_OVERHEAD provenance. The @tbl-responsible-ai-overhead cells now source their ranges from the registry instead of hardcoded values.
The 64-A100 training-emissions cells (TrainingEmissions, TrainingEmbodiedRecap)
read Hardware.Cloud.H100.embodied_carbon_kg (164) for an A100 run. Point them at
Hardware.Cloud.A100, and update the registry A100 value 130 -> 150 kg to match the
Luccioni et al. 2023 figure the chapter already cites. Registry, cells, and prose
now agree: 150 kg/A100, ~9.6 t unamortized, ~92 kg amortized for the 14-day run.
Adds a MigProfile schema + Hardware.Cloud.A100.mig_profiles (1g.10gb..7g.80gb,
GPU memory + SM count) sourced to the NVIDIA MIG User Guide. The A100-80GB MIG
profile table in fleet_orchestration (w1A-004) now pulls its GPU-memory and
SM-count cells from the registry instead of hardcoded values.
Adds Systems.Reliability.Hbm.soft_error_fit_per_mbit = 250 FIT/Mbit, sourced
to a new HBM_SOFT_ERROR_FIT_PER_MBIT provenance entry citing the published
200-5000 FIT/Mbit DRAM soft-error range (Tezzaron; soft-error literature). A
field validator guards that band so a units/transcription slip cannot land.
Pins fault_tolerance w1A-003: the unprotected-HBM soft-error budget (250 FIT/Mbit
x 1,024 x A100 HBM -> aggregate FIT -> ~20 s mean time to first corruption) now
flows from a HbmSerBudget LEGO cell instead of hardcoded prose literals.
Add VIDEO_4K_WIDTH/HEIGHT to mlsysim core/units.py and import them
(with VIDEO_BYTES_PER_PIXEL_RGB) into the DataLocalityInvariant LEGO
cell, matching the sibling BandwidthBottleneck cell that already pulls
1080p dimensions from the registry. Genuinely scenario-specific inputs
(broadband uplink, cloud latency, fps) stay local and documented.
Document the 4K parameters in the appendix scale-references table.
Rendered values unchanged (24.9 MB frame, 1990.7 ms vs 110 ms).
Hardware specs already get sanity-bounds protection in
test_physics_bounds.py (catching an 80 TB/s typo for 80 GB/s), but
registered model specs had no equivalent guard: a transposed parameter
count (124M typed as 421M) or a decimal slip (124 typed as 12.4) in a
registry YAML would bind silently.
Two layers now protect every TransformerWorkload:
- test_transformer_attention_geometry: universal invariant that
hidden_dim splits evenly into heads with a 32-256 head dim and is a
multiple of 64 (catches transposed hidden_dim/heads across all 13
registered transformers).
- test_transformer_curated_specs: a curated, web-verified spec table
(seeded with GPT-2 Small, Radford 2019) that fails CI when a registry
value diverges >1% from its verified figure. Extend the table whenever
a new model spec is registered.
Wire GPT2_Small into the two chapter-side checks so its specs cannot be
hardcoded into a LEGO cell: CANONICAL in audit_mlsysim_drift.py and
HARDCODED_REGISTRY in book_check_registry_sources.py.
Verified the guard fires: transposing 124M to 421M fails the curated
test, and swapping hidden_dim/heads fails the geometry invariant.
- swap hardcoded GPT-2 XL heads=25 to Models.Language.GPT2.heads
- add GPT2_Small (124M, 12 layers, 768 hidden, 12 heads) to the model
registry with Radford 2019 provenance; attention-intensity cell now sources
hidden_dim/heads from it (values identical, mlsysim suite 814 passed)
- Add full_examples field to DatasetProfile + Datasets.ImageNet (14,197,122,
web-verified vs Deng 2009) distinct from training_examples (ILSVRC-1k, 1.28M)
- Pin both 'ImageNet 14 million images' refs to ImageNetCorpus cell (now 14.2M from registry) (w1A-vol1-ml_workflow-005)
- Add Literature.Surveys group with the six CrowdFlower 2016 time-allocation
buckets (60/19/9/3/4/5), verified against the primary report (page 6 chart),
with provenance URL + new CROWDFLOWER_2016 key.
- DataScientistTime cell LOAD now reads buckets from Literature.Surveys instead of
hardcoding them; identical values, GUARD sum=100 holds. (w1A-vol1-ml_workflow-006)
Verified against Apple newsroom (June 6, 2022): 16-core Neural Engine = 15.8
trillion ops/sec, 100 GB/s unified memory. Provenance kind estimate -> datasheet
with official Apple URL. Value unchanged.
The 4.1 GFLOP value (modern MAC count, torchvision/fvcore ~4.09 GMAC) is the
book-wide figure (nn_architectures GFLOP guards, frameworks, roofline tutorial).
Provenance previously cited He et al. (2016) whose Table 1 reports 3.8e9 under
their counting; add a notes field documenting the convention so value and citation
no longer appear to contradict. Value unchanged.