Take any model you can already run — a Hugging Face model, your LLM-from-scratch project, or a public repo — and produce a written bottleneck report for one forward+backward step: a correctly-timed wall-clock breakdown (CUDA Events, not naive time.time()), an arithmetic-intensity estimate for its biggest matmul, a full memory-budget breakdown (params/gradients/optimizer/activations), and a one-paragraph verdict naming whether the step is compute-, memory-, or communication-bound and why.
bench, arithmetic_intensity, and memory_budget_gb helpers from this module verbatim; only swap in your model's real shapes.step time (CUDA events): 187.4 ms
forward: 61.2 ms backward: 126.2 ms
biggest matmul (4096x4096x4096): AI=910.2 FLOPs/byte -> compute-bound (ridge=153.0)
memory budget: params=14.0GB grads=14.0GB optimizer=28.0GB activations=9.6GB total=65.6GB
verdict: compute-bound — 82% of step time is spent in matmul/attention kernels at >80% of peak TFLOP/s.