The subtitle script injected the 'Machine Learning Systems' link as a
sibling of the logo <img>, which sits inside Quarto's
<a class="sidebar-logo-link"> wrapper. That nested our anchor inside the
logo anchor (invalid HTML), so clicking it fired the outer logo link
(./index.html) instead of navigating to the book. Insert the subtitle
after the logo anchor as a child of .sidebar-header so the link works.
The version chip keys off subtitle.parentNode and is fixed by the same move.
nbdev 3.0.16 (2026-05-19) introduced a hard failure on the legacy
`settings.ini` config — `Found old settings.ini. Migrate to
pyproject.toml using nbdev-migrate-config`. The current TinyTorch
checkout still uses settings.ini, so every dev push since 3.0.16
landed has broken at the first inline module export.
Pin to <3.0.16 to restore CI. Full migration via nbdev-migrate-config
is the long-term direction but is a separate change.
GPT._create_causal_mask was returning an additive -inf mask
(upper-triangular with -inf, 0 for allowed positions) but
_apply_mask in module 12 expects a binary mask (1=allow, 0=block)
and computes adder = (1 - mask) * MASK_VALUE.
With the old mask, every allowed position (value 0) got masked by
(1-0)*(-1e9) = -1e9, blocking ALL attention -- both past and future
tokens. Only an infinite value in the mask produced the correct
-inf addend for blocked positions.
Fix: use np.tril(np.ones(...)) which is the binary lower-triangular
convention that _apply_mask expects.
When B is a 1D vector, numpy's .T is a no-op (returns the same 1D
array), so the previous code called np.matmul(grad_output, b.data)
which either failed on mismatched shapes or silently computed a dot
product instead of the outer product needed for grad_A.
For A(m,k) @ b(k,) -> out(m,):
grad_A = np.outer(grad_output, b) (m,k) -- was broken
grad_b = a.T @ grad_output (k,) -- was broken for 1D a
Fixes the symmetric case (1D a) with grad_B = np.outer(a, grad_output).
The PR's inline ← arrow form crams annotations into the line ends and
clutters the diagram box. The original vertical layout keeps the box
clean and places the explanations below where they're visually separate.
Pandoc subscript requires no spaces between paired tildes. The two tildes
on this line are separated by sentence text with spaces, so the bare ~
renders as literal. The backslash escape was defensive but unnecessary.
Every subsite's announcement bar Line 1 carried a 'Start reading →' / 'Start building →' / 'Get started →' link that pointed at the very subsite the reader was already on. Clicking it was a no-op self-navigation.
Strip the CTA from Line 1 across all 8 sites that have the regression:
- announcement-vol1.yml drop 'Start reading →'
- announcement-vol2.yml drop 'Start reading →'
- tinytorch drop 'Start building →'
- mlsysim drop 'Get started →'
- kits drop 'Get started →'
- labs drop 'Preview →'
- slides drop 'Browse decks →'
- instructors drop 'Start here →'
Line 1 keeps the bold identity statement, which is what readers came for. The other lines (Vol I / II links, sibling row, newsletter CTA) keep their navigations since they DO lead somewhere new.
announcement-book.yml is unchanged — its Line 1 already points at the ecosystem root (https://mlsysbook.ai/), not at /book/ where the reader is.
Two related fixes to the chip JS in sidebar-subtitle.html:
1. Bump the chip's literal from v0.1.10 to v0.1.11 to match the actual current release. The v0.1.11 publish-live (commit 3449ee7050) bumped settings.ini and the README badge but did not propagate to the chip, so the live site shows the announcement bar saying 'v0.1.11 released' next to a chip still saying v0.1.10. The companion ci(tinytorch-publish-live) commit on this branch adds the missing UPDATE_VERSION sed step so this never drifts again.
2. Remove the version reference from the doc comment ('The chip's v0.1.10 ...' → 'The chip's version literal ...') so the comment no longer needs to be bumped alongside the literal. The // TINYTORCH_VERSION_CHIP sed marker is still anchored on the literal line and is the single source the workflow targets.
For the public launch, every site's "Alongside the book" (or "Build
with your students") row now lists StaffML alongside TinyTorch, Hardware
Kits, MLSys·im, and Labs. Two coupled changes:
• StaffML appended with verb "practice" — pairs cleanly with the
existing verbs (build / deploy / model / explore / practice).
• MLSys·im verb changed from "simulate" to "model" to match the
project's own self-description ("first-principles analytical
modeling for ML training and inference; model the physics before
you build"). MLSys·im is analytical, not Monte-Carlo simulation;
the new verb is more honest and the audience reads it cleanly.
Also restores tinytorch/quarto/config/announcement.yml to the canonical
4-line ecosystem template. That file had been silently rewritten to a
release-only banner ("🎉 v0.1.11 released — ...") by the
tinytorch-publish-live workflow, dropping the ecosystem cross-links
entirely. Restoration here; workflow fix is a separate commit.
Per-site row state after this commit (each site omits itself):
site, vol1, vol2: TinyTorch · Kits · MLSys·im · Labs · StaffML
instructors: TinyTorch · Kits · Slides · StaffML
kits: TinyTorch · MLSys·im · Labs · StaffML
labs: TinyTorch · Kits · MLSys·im · StaffML
mlsysim: TinyTorch · Kits · Labs · StaffML
tinytorch: Kits · MLSys·im · Labs · StaffML
slides: (teacher-focused row, unchanged)
The staffml site itself has its own Next.js ecosystem navbar
(EcosystemBar.tsx) which is out of scope for this Quarto-only sweep
and audited separately.
The docstring stated full_journey takes ~10min; the most recent CI
run that reached the JSON output reported 451.63 seconds = 7.5 min
for 20 modules + 6 milestones. Update to ~7-8min and note the
20-module + 6-milestone shape so the comment reflects what the test
actually exercises.
Also serves as the path-touching change that retriggers
tinytorch-validate-dev on a push event (the prior push-event run
was cancelled by an inadvertent manual workflow_dispatch — the
concurrency group's cancel-in-progress flag superseded the
in-progress push run, leaving the badge red despite a healthy
workflow).
* Document GELU activation function in 02_activations.qmd
Added GELU activation function explanation and implementation.
* docs(tinytorch): add GELU implementation
This commit adds the GELU activation function implementation to the 2nd module in the docs.
* Update GELU code to reflect src code change
Refactor GELU activation to use a simplified sigmoid approximation.
* docs(tinytorch): polish GELU activation section
---------
Co-authored-by: Vijay Janapa Reddi <vj@eecs.harvard.edu>
Round 2 of the bib audit, covering paper subprojects (mlsysim,
tinytorch, periodic-table, mlperf-edu) that the textbook-focused first
pass deferred. Same pattern as round 1: surname/year prefixes did not
match the entry's actual paper, plus several corrupt entries from
Crossref misidentification.
Renames:
- mlsysim/{docs,paper}: barrett2024 -> zheng2024sglang (SGLang paper,
Zheng is first author).
- mlsysim/paper: zhao2025 -> deepseek2025v3 (DeepSeek-V3 ISCA paper,
corporate author DeepSeek-AI).
- tinytorch: key499f5624 -> tanenbaum1987os (hash-fallback for
Tanenbaum OS textbook); fry1985 -> abelson1996sicp (SICP 2nd ed,
Fry is not in author list); wooster1982 -> papert1980mindstorms
(Mindstorms by Papert, Wooster not in author list); collins2018 ->
collins1989apprenticeship (Cognitive Apprenticeship paper is 1989).
- tinytorch + periodic-table: vaswani2025 -> vaswani2017attention
(Attention paper is 2017; entries had a corrupt publisher and bogus
DOI from Crossref misidentification).
Body fixes accompanying renames:
- tanenbaum1987os, abelson1996sicp, papert1980mindstorms: rebuilt as
@book entries (were @article with stale review/journal DOIs).
- vaswani2017attention: rebuilt with canonical NeurIPS 2017 metadata
(Curran Associates, vol 30, pp 5998-6008); dropped corrupt DOI.
Orphan deletions:
- tinytorch keybe9561f4 (hash-fallback, no cite sites).
- mlperf-edu vaswani2017attention (orphan).
21 cite-site updates across 4 paper subprojects. bib_lint reports 0
errors across all 5 modified bibs.
Wraps up the bib-verify sweep across vol1, vol2, and the paper sub-projects,
and corrects three citation issues introduced earlier in the branch:
- Restore tang20211bit (1-bit Adam, Tang et al. ICML 2021) in vol2 bib and
in collective_communication.qmd. The earlier sweep had renamed the cite
to li2022, which now resolved to AlphaCode or 1-Bit LAMB.
- Restore micikevicius2018mixed in vol1 bib to point at "Mixed Precision
Training" (Micikevicius et al. ICLR 2018). The entry had been overwritten
with an unrelated OpenSeq2Seq paper while the cite key stayed the same.
- Drop the unused li2022 (AlphaCode) entry and the duplicate li2022 (1-Bit
LAMB) entry from vol2 bib.
Also remove eight same-paper duplicate entries that the sweep had left
behind (vol1: lawson1979, gholami2022, lange2009, ribeiro2016; vol2:
bursztein2024, rasley2020, sevilla2022, narayanan2019).
After this commit the bibs have zero duplicate keys and zero orphan
citations across both volumes and all five paper sub-projects.
Deleted reddi2024mlsysbook from tinytorch/paper and rafailov2023direct from
periodic-table/paper. Both were identified as true orphans (not cited in
any .qmd or .tex) and out of scope for their respective papers.
The previous scope was .qmd only, which made every paper-bib entry not
cited from a chapter look orphan even when paper.tex cited it. Adds
\cite/\citep/\citet/\citeauthor/\citeyear pattern matching for the four
paper.tex files (interviews, tinytorch, periodic-table, mlsysim).
Also fixes 6 broken links in tinytorch/paper/paper.tex caused by earlier
bib-audit deletions of keys that had year/surname mismatches. Restored
these entries with corrected keys (appel2002tiger, reddi2021widening,
pfaff2009pintos, rush2020minitorch, zhang2023dive) and updated the .tex
file to match. Replaced kannan2022astrasim with won2023astrasim2.