Files
cs249r_book/site/games/kvcache.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

73 lines
2.8 KiB
Plaintext

---
title: "KV Cache Packer"
subtitle: "Fit the prompts before memory fragments."
description: "A browser mini-game from MLSysBook Playground. Manage KV cache fragmentation in LLM inference."
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/kvcache.mjs";
</script>
---
```{=html}
<div class="mlsp-game-container" role="region" aria-label="KV Cache Packer mini-game">
<canvas id="mlsp-canvas" class="mlsp-game-canvas" width="680" height="460"></canvas>
<div class="mlsp-game-hud">
<span class="mlsp-score">score <span id="mlsp-score">0</span></span>
<span>Click to place · Phase 2: Spacebar to defrag · <kbd>R</kbd> retry</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 bootKVCache(){
function tryBoot() {
if (!window.MLSP || !MLSP.games || !MLSP.games.kvcache) 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.kvcache(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
1. In Phase 1, click a row with enough contiguous space for the incoming request bar.
2. Watch requests complete at different times. The holes they leave behind create fragmentation.
3. In Phase 2, paged mode splits requests into small blocks. Press <kbd>Space</kbd> to defrag and recover capacity.
## The Systems Concept
In LLM inference, serving requests requires storing key-value tensors for every active sequence. Contiguous allocation wastes capacity when prompts and generations finish at different times. PagedAttention-style block allocation turns the KV cache into a paging problem, reducing external fragmentation and allowing larger effective batches.
---
*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).*