Session Guide
This book is designed to be read in one-hour sessions, each pairing reading and experimentation with a hands-on step of the capstone project — done alongside a coding agent acting as your tutor (see How to Read This Book).
Every session has the same shape:
- Read & experiment (~20 min) — the chapter section and notebook cells for the hour.
- Build (~30 min) — you write the project code; the agent hints, reviews, and keeps time.
- Verify & log (~10 min) — run the session’s Done-when check, log the session.
Each card marks a Midpoint: stop there if you’re splitting the session into two 30-minute sittings. Needs lists prerequisite sessions; the agent checks them before starting. Milestone acceptance checks live in tests/milestones/ — a session is done when its test passes, not when anyone says it looks done. The full minute-by-minute protocol, the tutor’s rules, and the hint ladder are documented in Inside a Session.
Sessions are numbered S<module>.<k> after the notebook modules (notebooks/00_… → S0.x). Read them in the order of this page — note the GPU module (S5.x) comes before the finale (S4.x), matching the milestone order in The Project.
Phase 0 — DNN Refresher (optional)
Skippable if MLPs, backprop, and cross-entropy are second nature — but skipping requires passing the phase self-check the agent administers during /onboard. M0’s artifacts are referenced again at the finale, so if you skip the sessions, still do S0.5.
S0.1 — Neurons, layers, and the forward pass
- Chapter: Neurons & MLPs
- Read (~40 min): the whole chapter; run every cell. Rebuild the XOR truth table by hand before running the XOR section.
- Build (~15 min): in a scratch cell, change the MLP width/depth on
make_moonsand find the smallest network that still separates the moons cleanly (plot_decision_boundaryis your instrument). - Midpoint: after the universal-approximation section.
- Done-when: self-check quiz with the agent (topics: why stacked linear layers collapse; what a hidden unit’s decision boundary looks like; parameter count of
MLP(2, [8, 3])). - Needs: nothing.
- Artifact: none (read-only session).
S0.2 — Backprop from scratch
- Chapter: Backprop & Micrograd
- Read (~35 min): the whole chapter; run every cell. Before running the
.backward()cell, predict the gradients of the worked example by hand. - Build (~20 min): pick one expression with shared subexpressions (e.g.
y = x*x + x*z), derivedy/dxby hand, then verify withValue— explain to the agent whygrad +=(not=) is what makes the shared case correct. - Midpoint: after the chain-rule-on-a-graph section, before the
Valueclass. - Done-when: self-check quiz (topics: topological order; gradient accumulation; what
zero_gradprevents). - Needs: S0.1.
- Artifact: none.
S0.3 — The training loop
- Chapter: The Training Loop
- Read (~30 min): the whole chapter; run every cell.
- Build (~25 min): break the loop on purpose, one line at a time — remove
zero_grad, flip the sign of the step, set the LR 100x too high — predict each failure mode before running it, then watch the loss curve confirm or refute you. - Midpoint: before the minibatch section.
- Done-when: self-check quiz (topics: the five lines of the loop; what each failure mode above looks like on a loss curve).
- Needs: S0.2.
- Artifact: none.
S0.4 — Softmax and cross-entropy
- Chapter: Softmax & Cross-Entropy
- Read (~40 min): the chapter up to (not including) the M0 milestone; run every cell. Derive the
p − ygradient on paper before the notebook derives it for you. - Build (~15 min): with vocab_size = 3, compute one full softmax + CE forward pass with a calculator and match the notebook’s numbers.
- Midpoint: after the CE-vs-MSE section.
- Done-when: self-check quiz (topics: subtract-max stability; temperature; why MSE’s gradient vanishes where CE’s doesn’t).
- Needs: S0.3.
- Artifact: none.
S0.5 — 🏗️ M0: train an MLP classifier with your own engine
- Chapter: Softmax & Cross-Entropy § Project milestone M0
- Read (~10 min): the M0 milestone cell; skim
tests/test_fundamentals.py::TestMLP::test_grad_parity_with_torchfor the weight-copy recipe. - Build (~40 min): part 1 — gradient parity on one 16-point spiral batch (
fundamentalsengine vs identical-weight torch model); recordm0_grad_max_abs_diff. Part 2 — train an MLP on the full 300-point spiral; recordm0_spiral_train_acc. Both keys go incheckpoints/myllm/metrics.json. - Midpoint: between part 1 and part 2.
- Done-when:
uv run pytest tests/milestones/test_m00_classifier.py - Needs: S0.4 (or a passed Phase 0 skip-quiz).
- Artifact:
checkpoints/myllm/metrics.json(m0_grad_max_abs_diff < 1e-6,m0_spiral_train_acc >= 0.95).
After this phase: the from-scratch project p0 — Autograd from a blank file rebuilds the engine with nothing open. Untimed, outside the session sequence, same tutor ground rules.
Phase 1 — Transformer Internals
S1.1 — Transformer overview, part I: the parts
- Chapter: Transformer Overview
- Read (~45 min): the first half — embeddings through the transformer block; run every cell. Before each parameter-count cell, predict the count from the shapes.
- Build (~10 min): change one knob (
dim,n_layers,n_heads) in the tiny config and predict, then verify, the new parameter count. - Midpoint: after the attention section.
- Done-when: self-check quiz (topics: where the parameters live; what the embedding table costs; what
n_headschanges and what it doesn’t). - Needs: S0.5 (or Phase 0 skip-quiz).
- Artifact: none.
S1.2 — 🏗️ M1: design your model (transformer overview, part II)
- Chapter: Transformer Overview, second half + § Project milestone M1
- Read (~20 min): finish the chapter — training the tiny model and
generate_tiny. - Build (~30 min): design your model under the 2M-parameter budget: pick
dim,n_layers,n_heads,vocab_size; build aTransformerConfig; verifyconfig.num_params() <= 2_000_000; run a(4, 32)batch through it; savecheckpoints/myllm/config.json. - Midpoint: after finishing the chapter reading.
- Done-when:
uv run pytest tests/milestones/test_m01_config.py - Needs: S1.1.
- Artifact:
checkpoints/myllm/config.json.
S1.3 — 🏗️ M2: attention shapes and your KV-cache budget
- Chapter: Attention Mechanisms
- Read (~25 min): the chapter through the MHA/GQA/MQA quality comparison; run every cell. Redo the chapter’s cache-size table for your model’s
dimbefore the Build. - Build (~25 min): compute KV bytes/token for your config (
2 × n_layers × n_kv_heads × head_dim × 4in fp32) across MHA/GQA/MQA; choose the largestn_kv_headsthat keeps batch 8 × 512 tokens under 8 MB; rerun the quality comparison at your sizes; updateconfig.json. - Midpoint: after the Read block.
- Done-when:
uv run pytest tests/milestones/test_m02_kv_budget.py - Needs: S1.2.
- Artifact: updated
checkpoints/myllm/config.json(n_kv_heads).
S1.4 — 🏗️ M3: dense or MoE, decided with numbers
- Chapter: Mixture of Experts
- Read (~30 min): the whole chapter; run every cell.
- Build (~20 min): compute a 4-expert top-1 MoE variant of your config — total vs active parameters — and write the dense-vs-MoE decision to
checkpoints/myllm/DECISIONS.mdunder a## M3heading, with both counts and one paragraph on the M13 serving cost either way. - Midpoint: after the routing/load-balancing sections.
- Done-when:
uv run pytest tests/milestones/test_m03_decisions.py - Needs: S1.3.
- Artifact:
checkpoints/myllm/DECISIONS.md(## M3entry).
After this phase: p1 — A tiny GPT from a blank file — the whole architecture again, from nothing, causality test included.
Phase 2 — Training Optimization
S2.1 — The training loop, at full scale
- Chapter: Training From Scratch
- Read (~45 min): the whole chapter; run every cell. This is S0.3’s loop with real tensors — name the correspondence line by line as you go.
- Build (~10 min): change one training knob (batch size or LR) and predict the loss curve’s reaction before rerunning.
- Midpoint: before the loss-curve-reading section.
- Done-when: self-check quiz (topics: what a healthy loss curve looks like; the three pathologies and their causes).
- Needs: S1.2 (M2/M3 recommended but not required).
- Artifact: none.
S2.2 — 🏗️ M4a: your model trains (smoke run)
- Chapter: Training From Scratch § Project milestone M4
- Read (~10 min): the M4 milestone cell.
- Build (~40 min): load
checkpoints/myllm/config.json, build theTransformer, and point the chapter’s loop at it. Run a 20-step smoke run on CPU/MPS; save the losses tocheckpoints/myllm/loss_smoke.json(a JSON list of floats). Loss must end lower than it starts. At the end of the session, launch the real 300-step run (it finishes between sessions): savestep300.pt({'config': cfg_dict, 'model': state_dict}) andloss_step300.jsonwhen it completes. - Midpoint: once the smoke run’s first losses print.
- Done-when:
uv run pytest tests/milestones/test_m04a_smoke.py - Needs: S2.1.
- Artifact:
checkpoints/myllm/loss_smoke.json; 300-step run launched.
S2.3 — 🏗️ M4b: read your first real loss curve
- Chapter: Training From Scratch (loss-curve sections, revisited)
- Read (~15 min): revisit the chapter’s loss-curve pathology gallery with your curve on screen.
- Build (~35 min): verify
step300.ptreloads into a fresh model without key errors; plotloss_step300.json; annotate the curve — warmup transient? plateau? final loss < 60% of initial? — and write one paragraph of diagnosis into your session log. - Midpoint: after the reload check.
- Done-when:
uv run pytest tests/milestones/test_m04b_step300.py - Needs: S2.2 (with the 300-step run finished).
- Artifact:
checkpoints/myllm/step300.pt+loss_step300.json, verified.
S2.4 — 🏗️ M5: sweep schedules on your model
- Chapter: Learning Rate Schedules
- Read (~20 min): the whole chapter. Start the sweep first (3 × 200 steps runs in the background while you read).
- Build (~30 min): sweep constant / cosine / warmup+cosine on your model — same seed and init, 200 steps each. Record all three final losses and your choice in
metrics.json['m5_schedule_sweep']({'constant': …, 'cosine': …, 'warmup_cosine': …, 'chosen': '…'}) and add"schedule": "<chosen>"toconfig.json. - Midpoint: after the Read block (sweep still running is fine — log PARTIAL and verify next sitting).
- Done-when:
uv run pytest tests/milestones/test_m05_schedule.py - Needs: S2.3.
- Artifact:
metrics.json(m5_schedule_sweep) +config.json(schedule).
S2.5 — 🏗️ M6: measure your precision speedup
- Chapter: Mixed Precision
- Read (~30 min): the whole chapter; run every cell (Colab badge for the GPU parts).
- Build (~20 min): GPU (Colab T4): 200 steps fp32 vs bf16 autocast on your model; record tokens/sec for both and the loss gap in
metrics.json['m6_precision']. CPU only: record the fp32 baseline plus a note — the discipline is the milestone, not the hardware. Add"precision": "bf16"(or"fp32") toconfig.json. - Midpoint: after the loss-scaling section.
- Done-when:
uv run pytest tests/milestones/test_m06_precision.py - Needs: S2.3.
- Artifact:
metrics.json(m6_precision) +config.json(precision).
S2.6 — 🏗️ M7a: the effective-batch decision (and launch the release run)
- Chapter: Gradient Accumulation
- Read (~30 min): the whole chapter; run every cell — especially the loss-scaling-by-accumulation-steps trap.
- Build (~20 min): find the largest micro-batch your memory allows, set
accum_steps = 64 / micro_batch, and record the decision (numbers + reasoning) inDECISIONS.mdunder## M7. Then launch the release run: 1,000 steps, your adopted schedule (M5) and precision (M6) →final.pt+loss_final.json, finishing between sessions. - Midpoint: after the Read block.
- Done-when:
uv run pytest tests/milestones/test_m07a_decision.py - Needs: S2.4, S2.5.
- Artifact:
DECISIONS.md(## M7entry); release run launched.
S2.7 — 🏗️ M7b: the release checkpoint — and first words
- Chapter: Gradient Accumulation § Project milestone M7
- Read (~10 min): none new — this session harvests the release run.
- Build (~40 min): verify
final.ptreloads cleanly andloss_final.jsonbeatsstep300.pt’s final loss; plot both curves together. Then the payoff: loadfinal.ptinto the repo’sinference/generate.pyand sample your model’s first text (it will be bad — it’s 2M parameters; note what “bad” looks like, you’ll compare at M13). - Midpoint: after the verification, before sampling.
- Done-when:
uv run pytest tests/milestones/test_m07b_release.py - Needs: S2.6 (with the release run finished).
- Artifact:
checkpoints/myllm/final.pt+loss_final.json, verified.
S2.8 — 🏗️ M8: trust your optimizer
- Chapter: AdamW From Scratch
- Read (~30 min): the whole chapter; run every cell. Predict what removing bias correction does before the chapter shows you.
- Build (~20 min): 20 steps of your model twice from identical init and data order —
AdamWFromScratchvstorch.optim.AdamW, same hyperparameters, fp32. Record the worst per-parameter deviation inmetrics.json['m8_optimizer_max_diff'](must be < 1e-5). - Midpoint: after the bias-correction section.
- Done-when:
uv run pytest tests/milestones/test_m08_adamw.py - Needs: S2.3.
- Artifact:
metrics.json(m8_optimizer_max_diff).
After this phase: p2 — The training stack from a blank file — AdamW, the schedule, and accumulation, rebuilt and proven numerically.
Phase 5 — GPU & NVIDIA Tools
Yes, before the finale: M9–M12 build the performance vocabulary the mini-vLLM chapter assumes, and M10’s paged gather is the finale’s memory access pattern.
S5.1 — The GPU mental model
- Chapter: CUDA Basics
- Read (~45 min): the whole chapter; run every cell.
- Build (~10 min): compute arithmetic intensity for one op you know well (your model’s output head GEMM at batch 1) and place it on the chapter’s roofline by hand.
- Midpoint: after the memory-hierarchy section.
- Done-when: self-check quiz (topics: coalescing; occupancy; why decode is bandwidth-bound).
- Needs: S2.3 (your model must exist and mean something to you).
- Artifact: none.
S5.2 — 🏗️ M9: your model’s decode roofline
- Chapter: CUDA Basics § Project milestone M9
- Read (~10 min): the M9 milestone cell; the T4 roofline section again.
- Build (~40 min): decode FLOPs/token ≈
2 × num_params; bytes/token ≈ weight bytes + KV bytes at the current context. Compute your model’s decode arithmetic intensity at batch 1, 8, 32; find the bandwidth→compute crossover batch; recordmetrics.json['m9_roofline']as{'intensity_b1': …, 'intensity_b8': …, 'intensity_b32': …, 'crossover_batch': …, 'conclusion': '…'}. Cross-check FLOPs withai_playground.profiling.flops. - Midpoint: after the batch-1 intensity.
- Done-when:
uv run pytest tests/milestones/test_m09_roofline.py - Needs: S5.1.
- Artifact:
metrics.json(m9_roofline).
S5.3 — SIMT on paper that runs
- Chapter: SIMT Simulator
- Read (~45 min): the whole chapter; run every cell. Predict each
coalescing_reportbefore running it. - Build (~10 min): write one deliberately awful (strided) access pattern and confirm the transaction count the report predicts.
- Midpoint: after the warp-execution sections.
- Done-when: self-check quiz (topics: warps vs threads; what makes an access coalesced; transactions-vs-ideal).
- Needs: S5.1.
- Artifact: none.
S5.4 — 🏗️ M10: the paged gather, verified
- Chapter: SIMT Simulator § Project milestone M10
- Read (~10 min): the M10 milestone cell; skim the mini-vLLM chapter’s block-table figure so you know what you’re building toward.
- Build (~40 min): write
paged_gather(ctx, pool, table, out)as a simulator kernel — each thread copies one element of one token-row from its physical block into contiguous output. Verify against numpy fancy-indexing; runcoalescing_report; recordmetrics.json['m10_coalescing']as{'block_size': …, 'transactions_ratio': …}. - Midpoint: kernel matches the reference (before the coalescing analysis).
- Done-when:
uv run pytest tests/milestones/test_m10_paged_gather.py - Needs: S5.3.
- Artifact:
metrics.json(m10_coalescing).
S5.5 — A virtual T4 with a time axis
- Chapter: Virtual GPU
- Read (~45 min): the whole chapter; run every cell.
- Build (~10 min): change one occupancy knob in a chapter experiment and predict the trace before rerunning.
- Midpoint: after the latency-hiding sections.
- Done-when: self-check quiz (topics: latency hiding; why more resident warps help until they don’t; reading achieved GB/s from a trace).
- Needs: S5.3.
- Artifact: none.
S5.6 — 🏗️ M11: predict your decode step
- Chapter: Virtual GPU § Project milestone M11
- Read (~10 min): the M11 milestone cell.
- Build (~40 min): one decode step at batch 8 moves ≈
weight_bytes + 8 × kv_bytes(t)from DRAM; simulate that traffic on the virtual T4 (a copy kernel sized to those bytes), read predicted cycles and achieved GB/s, convert to predicted tokens/sec; recordmetrics.json['m11_predicted']as{'tokens_per_sec': …, 'assumptions': '…'}. On Colab, run the chapter’s validation cells and record the real bandwidth beside it. - Midpoint: after computing the bytes, before simulating.
- Done-when:
uv run pytest tests/milestones/test_m11_predicted.py - Needs: S5.5, S5.2.
- Artifact:
metrics.json(m11_predicted).
S5.7 — SGEMM: naive to near-cuBLAS
- Chapter: SGEMM Optimization (Colab)
- Read (~50 min): the whole chapter on the Colab T4; run each kernel and watch the GFLOPs climb. Before each optimization, say what it buys and why.
- Build (~5 min): rank the optimizations by measured payoff — is the ranking what the chapter’s narrative led you to expect?
- Midpoint: after the shared-memory tiling kernel.
- Done-when: self-check quiz (topics: tiling; why occupancy alone doesn’t finish the job; where cuBLAS’s remaining margin comes from).
- Needs: S5.1.
- Artifact: none.
S5.8 — 🏗️ M12: your model’s GEMM shapes
- Chapter: SGEMM Optimization § Project milestone M12
- Read (~10 min): the M12 milestone cell.
- Build (~40 min): list every GEMM in one decode step of your model —
(B×dim)@(dim×dim)projections,(B×dim)@(dim×hidden)FFN,(B×dim)@(dim×vocab)head. On the Colab T4, timetorch.matmulat those shapes for B ∈ {1, 8, 32}; record GFLOPs vs the chapter’s kernels inmetrics.json['m12_gemms'](CPU fallback: record the shape table only). Connect the batch-1 numbers to M9’s conclusion. - Midpoint: shape table done, before timing.
- Done-when:
uv run pytest tests/milestones/test_m12_gemms.py - Needs: S5.7, S5.2.
- Artifact:
metrics.json(m12_gemms).
After this phase: p5 — A decode roofline model from a blank file — generalize M9/M11 into a calculator for any config on any GPU spec. No GPU needed.
Phase 4 — The Finale: Serve Your Own LLM
The finale’s Build steps live in checkpoints/myllm/src/serve_myllm.py — a real module, not notebook cells, so the milestone tests can import your engine (tests/milestones/conftest.py puts checkpoints/myllm/src on sys.path). Start it at S4.3; it grows one function per session.
S4.1 — Mini-vLLM, part I: the paged KV cache
- Chapter: Build a Mini vLLM, first half
- Read (~45 min): from the KV-cache memory problem through the paged cache and block tables; run every cell. Draw the block table for one of the chapter’s examples by hand.
- Build (~10 min): change the block size in a chapter experiment and predict the fragmentation change before rerunning.
- Midpoint: after the block-table section.
- Done-when: self-check quiz (topics: internal fragmentation; block tables; why paging beats one contiguous buffer per request).
- Needs: S2.7, S5.4 recommended.
- Artifact: none.
S4.2 — Mini-vLLM, part II: continuous batching
- Chapter: Build a Mini vLLM, second half
- Read (~45 min): scheduling, continuous batching, preemption; run every cell through the chapter’s toy-model correctness assert.
- Build (~10 min): shrink the toy example’s block pool until preemption fires; narrate to the agent exactly what the scheduler did and why.
- Midpoint: after the scheduling section.
- Done-when: self-check quiz (topics: prefill vs decode scheduling; preemption and recompute; why the correctness assert compares against full recompute).
- Needs: S4.1.
- Artifact: none.
S4.3 — 🏗️ M13a: your weights in the engine
- Chapter: Build a Mini vLLM § Project milestone M13, step 1
- Read (~10 min): the M13 milestone cell, step 1; the
MiniLayer↔︎ repoTransformerweight correspondence (q/k/v/o projections, SwiGLU, RMSNorms). - Build (~40 min): create
checkpoints/myllm/src/serve_myllm.pywithload_model(ws: Path) -> model— loadfinal.pt, map every weight onto the engine’s layer structure, expose the config. No generation yet; correct shapes and a clean load are the whole session. - Midpoint: attention weights mapped; FFN and norms remaining.
- Done-when:
uv run pytest tests/milestones/test_m13a_weights.py - Needs: S4.2, S2.7.
- Artifact:
checkpoints/myllm/src/serve_myllm.py(load_model).
S4.4 — 🏗️ M13b: prove it — paged equals reference
- Chapter: Build a Mini vLLM § Project milestone M13, step 2
- Read (~10 min): the chapter’s correctness assert for the toy model — you are about to earn the same assert on your own weights.
- Build (~40 min): add to
serve_myllm.py:greedy_paged(prompt_ids: list[int], n: int) -> list[int](prefill + decode through the paged cache) andgreedy_reference(prompt_ids, n)(full recompute each step). They must agree token-for-token: 3 prompts × 20 greedy tokens. - Midpoint:
greedy_referenceworking; paged path remaining. - Done-when:
uv run pytest tests/milestones/test_m13b_parity.py - Needs: S4.3.
- Artifact:
serve_myllm.py(greedy_paged,greedy_reference).
S4.5 — 🏗️ M13c: serve it — continuous batching under pressure
- Chapter: Build a Mini vLLM § Project milestone M13, step 3
- Read (~10 min): the chapter’s scheduler loop once more.
- Build (~40 min): add
serve(requests: list[list[int]], max_new: int, block_budget: int) -> dicttoserve_myllm.py— continuous batching over your model, returning at least{'completed': <int>, 'preemptions': <int>, 'outputs': [list[int], …]}. Run 16 requests with a block pool deliberately smaller than worst-case: all 16 must complete and preemption must fire at least once. - Midpoint: batching works with an oversized pool; now shrink it.
- Done-when:
uv run pytest tests/milestones/test_m13c_serve.py - Needs: S4.4.
- Artifact:
serve_myllm.py(serve).
S4.6 — 🏗️ M13d: read it — the whole book in one function call
- Chapter: Build a Mini vLLM § Project milestone M13, step 4
- Read (~5 min): nothing new. You’ve read the book.
- Build (~40 min): decode the first request’s output with your tokenizer — your model’s text through your paged engine. Record
metrics.json['m13_finale'] = {'text': '…', 'tokens_per_sec': …}and compare the measured rate against M11’s prediction. Then print the accumulatedmetrics.json— M0’s gradient parity to M13’s text — and write the retrospective in your session log. - Midpoint: text decoded; retrospective remaining.
- Done-when:
uv run pytest tests/milestones/test_m13d_finale.py - Needs: S4.5.
- Artifact:
metrics.json(m13_finale) — and the paper trail complete.
After this phase: p3 — A KV-cached decoder from a blank file — the finale’s core move again, standalone: no chapter engine to adapt, just a given model and your own cache, held to token-for-token parity.
Phase 6 — Building AI Agents (epilogue, optional)
Read-only sessions; the agents package (uv sync --extra agents) is the worked example.
S6.1 — What is an agent?
- Chapter: What is an Agent?
- Read (~45 min): the whole chapter; run every cell.
- Build (~10 min): trace one loop iteration of
ai_playground.agents.agent.Agenton paper — model call, tool call, observation — and match it to the chapter’s diagram. - Midpoint: after the loop diagram.
- Done-when: self-check quiz (topics: the ReAct loop; where the loop terminates; what the model actually sees each turn).
- Needs: S1.2 recommended.
- Artifact: none.
S6.2 — Tool use
- Chapter: Tool Use
- Read (~45 min): the whole chapter; run every cell.
- Build (~10 min): register one new tool of your own design in the
ToolRegistryand watch the agent decide when to call it. - Midpoint: after the tool-schema section.
- Done-when: self-check quiz (topics: tool schemas; when the model calls vs answers; error handling on tool failure).
- Needs: S6.1.
- Artifact: none.
S6.3 — Memory
- Chapter: Memory
- Read (~45 min): the whole chapter; run every cell.
- Build (~10 min): overflow
ConversationMemoryon purpose and inspect what the summarizer kept vs dropped. - Midpoint: after the bounded-memory section.
- Done-when: self-check quiz (topics: bounded vs vector memory; what summarization loses; when similarity search retrieves the wrong thing).
- Needs: S6.2.
- Artifact: none.
After this phase: p6 — An agent from a blank file — your own ReAct loop against a scripted LLM, no API key, error handling and step budget included.
Not yet sessioned
- Phase 3 — Distributed Training (
notebooks/03_distributed_training/): no chapters yet. Sessions will be added when the notebooks land. Its from-scratch project already exists and needs no GPU: p4 — Data parallelism from a blank file. - The Performance Exercises are excellent between-session material for readers with GPU time; they are deliberately outside the session sequence.