Files
cs249r_book/site/games/checkpoint.qmd
Vijay Janapa Reddi 9d4732f4ff fix(games): module-relative imports across all 13 remaining games
The same path-prefix bug that broke Lander on dev preview affected the other
13 games too. Fixing all of them in one batch so the entire catalog works
on /cs249r_book_dev/, mlsysbook.ai/, and localhost equally.

Pattern applied:
  .qmd  include-in-header script:
    import "/assets/games/X.mjs"  →  import "../assets/games/X.mjs"
  .mjs  ES imports:
    from "/assets/games/runtime.mjs"          →  from "./runtime.mjs"
    from "/assets/games/vendor/pixi.min.mjs"  →  from "./vendor/pixi.min.mjs"

Files touched (10 .mjs + 13 .qmd):
  .mjs: allreduce, batch, cluster, kvcache, moe, oom, pipeline, prune,
        quantization, topology
  .qmd: allreduce, batch, checkpoint, cluster, kvcache, loader, moe, oom,
        pipeline, prune, quantization, roofline, topology
  (checkpoint, loader, roofline .mjs already used 'import * as runtime from
   ./runtime.mjs' — only their qmd files needed updating)

Verification: all 14 games rendered locally (quarto render games/), served
via python3 -m http.server, swept with Playwright headless Chromium.
Result: 14/14 pass — canvas mounted, MLSP runtime ready, game registered,
no JS errors, no 4xx network requests. Visual screenshots confirm each
game's HUD/title/content paints correctly.
2026-04-25 19:16:00 -04:00

69 lines
2.8 KiB
Plaintext

---
title: "Checkpoint Roulette"
subtitle: "Fault tolerance and checkpointing at scale."
description: "A browser mini-game from MLSysBook Playground. Hold space to progress, but release to checkpoint before node failure strikes."
page-layout: article
format:
html:
include-in-header:
- text: |
<link rel="stylesheet" href="/assets/games/common.css">
<script type="module">
import "../assets/games/runtime.mjs";
import "../assets/games/checkpoint.mjs";
</script>
---
```{=html}
<div class="mlsp-game-container" role="region" aria-label="Checkpoint Roulette mini-game">
<canvas id="mlsp-canvas" class="mlsp-game-canvas" width="680" height="460"></canvas>
<div class="mlsp-game-hud">
<span class="mlsp-score">progress <span id="mlsp-score">0</span>%</span>
<span>hold <kbd>Space</kbd> to train · release to checkpoint · watch for failure</span>
<button type="button" class="mlsp-fullscreen-btn" onclick="this.closest('.mlsp-game-container').requestFullscreen()" title="Full Screen" aria-label="Full Screen">⛶</button>
</div>
</div>
<div id="mlsp-aha-slot"></div>
<script>
(function bootCheckpoint(){
function tryBoot() {
if (!window.MLSP || !MLSP.games || !MLSP.games.checkpoint) return setTimeout(tryBoot, 30);
var canvas = document.getElementById("mlsp-canvas");
var $score = document.getElementById("mlsp-score");
var ahaSlot = document.getElementById("mlsp-aha-slot");
var pendingResult = null;
var resolvedApi = null;
Promise.resolve(MLSP.games.checkpoint(canvas, {
onScoreChange: function(s) { $score.textContent = s.score; },
onGameOver: function(result) {
if (resolvedApi) attachAha(resolvedApi, result);
else pendingResult = result;
},
onRetry: function() { window.location.reload(); }
})).then(function(api) {
resolvedApi = api;
if (pendingResult) attachAha(api, pendingResult);
});
function attachAha(api, result) {
MLSP.showAhaCard(ahaSlot, api.ahaLabel, api.ahaText, api.ahaLink);
}
}
tryBoot();
})();
</script>
```
## How to play
Hold `Spacebar` to train your model and fill the progress bar. Beware of hidden "Node Failure" lightning strikes—the background will pulse red as a warning. If `Spacebar` is held during a strike, your progress resets to the last checkpoint. Release `Spacebar` safely to write a checkpoint and save your current progress.
## The Systems Concept
At large scale, hardware failures are inevitable. Frequent checkpoints save your progress during node failures, but taking them consumes I/O bandwidth and pauses training. Finding the right checkpoint frequency is an exercise in push-your-luck optimization.
---
*Part of [MLSysBook Playground](/games/). Found a bug? [Report an issue](https://github.com/harvard-edge/cs249r_book/issues/new?labels=bug&title=Bug+in+Game).*