| name | ml-engineering |
| description | Field-tested methodology and concrete recipes for training and operating large-scale LLM/VLM/multi-modal models end to end - choosing and benchmarking accelerators, storage and network; SLURM/Kubernetes orchestration; maximizing training throughput and fitting models in memory; diagnosing and surviving training instabilities, NaN/Inf, and hardware/job failures; checkpointing and fault tolerance; inference performance and memory; debugging multi-node/ multi-GPU hangs; and writing/running tests. Use when the user is training or fine-tuning large models, hits low TFLOPS/MFU, OOM, slow dataloading, a loss spike/divergence, a NCCL/InfiniBand or multi-node hang, node/GPU failures, checkpoint or preemption problems, storage/network bottlenecks, or needs to pick GPUs/cloud/file-systems or size inference latency/throughput. Distilled from "Machine Learning Engineering", the latest version of which can be found at https://github.com/stas00/ml-engineering
The latest SKILL.md version can be found at https://github.com/stas00/ml-engineering/blob/master/SKILL.md |
Machine Learning Engineering
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.
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
Pick the fix by symptom
| Symptom | Reach for |
|---|
| Low TFLOPS / MFU, "GPUs feel idle" | Find the bottleneck: mamf-finder, performance checklist, DataLoader, NUMA, dim divisibility |
| Training OOM | Memory anatomy → activation checkpointing/offload/parallelism; profile; PYTORCH_CUDA_ALLOC_CONF |
| Slow steps but GPUs busy on comms | Benchmark network (all_reduce_bench), check intra/inter-node, NCCL settings |
| Slow dataloading / GPU starvation | DataLoader, local NVMe, prefetch/workers |
| Loss spike / divergence / NaN | Logbooks, init/STD, underflow-overflow detection, tensor scans |
| Multi-node/GPU hang or deadlock | torch-distributed-gpu-test.py → py-spy all ranks → NCCL_DEBUG=INFO |
| Node/GPU dies mid-run | Spare nodes, frequent checkpoints, auto-restart, kill/save switch |
| Job keeps getting preempted | forced preemption, queue chained jobs |
| Checkpoint save/load is slow | Benchmark storage, choose FS, local vs shared |
| Choosing GPUs / cloud / storage | Comparison tables, MAMF, choose a cloud provider |
| Inference too slow / won't fit | Metrics (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.