The study is a reproducible experiment: harness, configs, raw data, and analysis are all
version-controlled, and the report derives from the data. This page is the operational summary; the repo’s
RUNBOOK.md is the step-by-step.
A single box (“trixi”): a Corsair AI Workstation 300 — AMD Ryzen AI Max+ 395 APU with the Radeon 8060S integrated GPU (gfx1151, RDNA 3.5, no FP8), 124 GB usable unified LPDDR5X (~215 GB/s, shared by CPU and GPU), Ubuntu, single-node k0s. The unified-memory pool and its bandwidth are central to the findings (see RQ3 and the batch-size result in RQ2).
llamacpp
Deployment; the single iGPU can’t train and serve at once (concurrent compute segfaults). Every run
frees the GPU first (kubectl scale deploy/llamacpp --replicas=0) and restores it after. A
watchdog re-scales the service back up on a ~30-min cadence, so long runs re-assert the scale-down and verify
no contention (throughput is flat across the boundary).All runs go through one Docker image and wrapper so the ROCm/torch stack and device mapping are identical
every time. The working build is the axolotl image (torch 2.8.0+rocm 7.12) driving plain
transformers + peft (the hf engine). An earlier unsloth image’s
torch 2.7.1 segfaulted at first kernel dispatch on gfx1151 — a broken build, not a hardware limit.
TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1 torch’s SDPA flash/efficient
backends report “no available kernel” and attn=sdpa silently falls back to the math
kernel — which would void the eager-vs-AOTriton A/B. The toolbox defaults it on; it’s captured in every
run’s environment manifest.Each arm’s baseline config, pinned to an exact Hugging Face revision. Derived from the run records:
| arm | model @ revision | method | lora | seq | bs×ga | optim | warmup+measure | A/B winner |
|---|
Two arms needed framework fixes before they would train on gfx1151 — each surfaced one at a time by the smoke run, all now in the harness:
target_modules (PEFT can’t infer them for
gpt_oss); Mxfp4Config(dequantize=True) (MXFP4 weights can’t be trained packed —
dequantized to bf16, ~54 GB); and experts_implementation="eager" (the default grouped-GEMM
MoE path calls torch._grouped_mm, “not supported on ROCM”). gpt-oss has no SDPA path,
so it’s eager-only.token_type_ids as a training input — supplied as
all-zeros (text) by the collator for this architecture.From the repo on the GPU box (everything runs through ./toolbox.sh):
Sweeps are idempotent and resumable — a crash or OOM mid-sweep loses nothing; re-running skips
finished configs. Off-GPU, the orchestration is unit-tested (make test, 19 passing) without a GPU.
Self-contained and data-driven. site/build_site.py reads data/runs.jsonl and emits
site/data.js; the pages render hand-built SVG from it — no figure is hand-typed, and the whole site
regenerates from a clean checkout: