Machine Learning Engineering

August 14, 2026 · View on GitHub

Distilled from Machine Learning Engineering Open Book by Stas Bekman - source: https://github.com/stas00/ml-engineering (CC BY-SA 4.0). Know-how from training BLOOM-176B, IDEFICS-80B and production RAG and RL training and inference systems. This skill is a condensed index; each section links back to the full chapter for depth, scripts, and benchmarks.

A field-tested, end-to-end guide to training and serving large models (LLMs, VLMs, multi-modal, RAG) on real hardware at scale - distilled from actually training BLOOM-176B and IDEFICS-80B and building production inference/RAG systems. It is a practitioner's brain dump: opinionated guidance backed by copy-paste scripts, benchmark tools, and comparison tables, written for the engineers and operators who have to make expensive clusters actually deliver a finished model.

It spans the entire stack that decides whether a run succeeds and how much it costs: selecting and benchmarking accelerators, storage, and network so the fast compute is never starved; orchestrating jobs with SLURM/Kubernetes; maximizing throughput (MFU) and fitting models in memory via parallelism (DP/TP/PP/ZeRO), activation recomputation, and offload; keeping training numerically stable through loss spikes and NaN/Inf; and surviving the inevitable hardware and job failures with frequent checkpointing, spare capacity, and automatic restarts. On the serving side it covers inference latency/throughput/cost trade-offs, KV-cache and memory sizing, and framework selection - plus diagnosing multi-node/multi-GPU hangs and testing the whole thing.

Use it as an operator's runbook: figure out which resource is actually the bottleneck (compute? memory? network? storage? dataloader?), then jump to the targeted recipe. For pure debugging technique (gdb/strace/py-spy/CUDA), pair this with The Art of Debugging.

Core principles

  • Measure, don't assume. Vendor/theoretical TFLOPS are marketing; benchmark your hardware and software stack before optimizing or buying. Track MFU/throughput, not vibes.
  • Find the actual bottleneck. A training step is gated by the slowest of: accelerator compute, memory bandwidth/capacity, inter/intra-node network, storage IO, or CPU dataloading. Optimizing anything else is wasted effort.
  • At scale, failure is the steady state. With hundreds/thousands of accelerators, hardware will fail mid-run. Design for frequent checkpoints, automatic restarts, spare nodes, and kill/save switches from day one.
  • Reproduce small and fast. Debug on a tiny model / few layers / one node before burning cluster time - see The Art of Debugging.
  • Watch the logbooks. Others have already hit your instability; training chronicles document the loss spikes and the fixes. See LLM/VLM chronicles.

Compute / accelerators

Full chapter: Compute · Accelerators.

Storage (IO)

Full chapter: Storage.

  • Pick the file system for the job: distributed/parallel FS for shared checkpoints and datasets; fast local NVMe beats network storage for scratch/hot data. See which file system to choose and local storage beats cloud storage.
  • Benchmark IO before you trust it (checkpoint save/load and dataset streaming are common stalls). See storage benchmarks.
  • Gotchas that bite at scale: you often get less usable capacity than sold; some clouds put backups on the same partition; always keep checksums. Clean up instead of overpaying - see why pay for more storage.

Network

Full chapter: Network.

Orchestration & SLURM

Full chapter: Orchestration · SLURM · Kubernetes.

  • Verify the cluster before the big run: every GPU on every node must talk to every other. Run torch-distributed-gpu-test.py across all nodes first.
  • SLURM day-to-day: the users cheatsheet covers sbatch/srun/salloc, job arrays, dependencies, and inspecting the queue; keep the allocation and re-srun for fast debug iterations.
  • Launchers (torchrun/accelerate/deepspeed under SLURM): see launchers.

Training: performance & memory

Full chapter: Performance.

Training: stability (instabilities & NaN/Inf)

Full chapter: Instabilities.

Training: fault tolerance & checkpoints

Full chapter: Fault tolerance · Checkpoints.

Inference

Full chapter: Inference.

Debugging distributed / PyTorch at scale

Full chapter: Debugging · PyTorch.

Testing

Full chapter: Testing.

  • Run tests surgically (select, parametrize, repeat, control output/parallelism): running tests.
  • Write robust tests (fixtures, temp dirs, RNG control for reproducibility, distributed tests): writing tests.
  • When a test misbehaves: debugging tests.

Key tools

NeedTool
Verify all GPUs/nodes can talk & allocatetorch-distributed-gpu-test.py
Real network throughput (all-reduce busbw)all_reduce_bench.py
Actual achievable matmul FLOPS of an acceleratormamf-finder.py
Tiny models/tokenizers/datasets for fast iterationmake-tiny guide
Better trace for distributed hangsNicerTrace

Pick the fix by symptom

SymptomReach for
Low TFLOPS / MFU, "GPUs feel idle"Find the bottleneck: mamf-finder, performance checklist, DataLoader, NUMA, dim divisibility
Training OOMMemory anatomy → activation checkpointing/offload/parallelism; profile; PYTORCH_ALLOC_CONF
Slow steps but GPUs busy on commsBenchmark network (all_reduce_bench), check intra/inter-node, NCCL settings
Slow dataloading / GPU starvationDataLoader, local NVMe, prefetch/workers
Loss spike / divergence / NaNLogbooks, init/STD, underflow-overflow detection, tensor scans
Multi-node/GPU hang or deadlocktorch-distributed-gpu-test.pypy-spy all ranks → NCCL_DEBUG=INFO
Node/GPU dies mid-runSpare nodes, frequent checkpoints, auto-restart, kill/save switch
Job keeps getting preemptedforced preemption, queue chained jobs
Checkpoint save/load is slowBenchmark storage, choose FS, local vs shared
Choosing GPUs / cloud / storageComparison tables, MAMF, choose a cloud provider
Inference too slow / won't fitMetrics (TTFT/TPOT), KV-cache memory, framework choice, model-load speedups

Notes for AI agents

  • Diagnose before optimizing. Identify which resource (compute/memory/network/storage/dataloader) is the actual bottleneck with a measurement; don't tune blindly.
  • Prefer measured numbers over spec sheets. Use the provided benchmark scripts on the target hardware/software stack before recommending changes or purchases.
  • Assume failures at scale. For any long/large run, verify checkpointing, restart, spare capacity, and a kill switch exist before worrying about peak speed.
  • Verify the cluster first. Run the distributed connectivity test before blaming model code for a multi-node problem.
  • Reuse the community's hard-won lessons. Check the training logbooks for known instabilities and fixes before re-deriving them.
  • Read the linked chapter section before applying a recipe - each has worked examples, exact commands, caveats, and scripts.
  • For deep single-process/tool debugging (gdb, strace, py-spy, cProfile, core files), use the companion skill: The Art of Debugging.