JAX Training Recipe
JAX is not PyTorch with different syntax. Functions are pure, state is explicit,
and transformations (jit, vmap, grad, pmap) compose only when the function
boundaries are clean.
For concrete config/checklist details, read references/training-recipe-details.md.
Intake
Specify:
- task, dataset, loss, and metric;
- target device: CPU, single GPU, multi-GPU, TPU;
- model framework: Flax/Linen, Equinox, or raw JAX;
- randomness needs: dropout, sampling, augmentation;
- state needs: batch norm, optimizer state, EMA, checkpointing.
Workflow
- Define the experiment and minimal data batch.
- Plan PRNG key ownership and splitting.
- Define model/state boundaries.
- Initialize model and optimizer.
- Write a pure
train_step. - Add
jitonly after the un-jitted step works. - Add
vmap/pmaponly after single-device behavior is correct. - Add checkpointing and restore tests.
- Run first-run safety checks.
- Stage rollout from tiny batch to full training.
JAX-Specific Rules
- Never reuse a PRNG key.
- Keep state explicit; do not hide mutable state in closures.
- Avoid Python side effects inside
jit. - Treat shape changes under
jitas design decisions. - Debug without
jitfirst, then re-enable transformations one at a time. - Replicate state deliberately for multi-device training.
Common Failure Modes
- Reused PRNG keys causing repeated dropout/sampling.
- Tracer errors from Python control flow or side effects.
- Batch norm/dropout state not separated from params.
- Shape mismatch under
vmaporpmap. - NaNs hidden by compiled loops.
- Checkpoints missing optimizer or batch-stat state.
Output
Return:
- experiment summary;
- PRNG strategy;
- model/state design;
- train/eval step plan;
- minimal config;
- first-run checks;
- JAX-specific failure modes;
- scale-up plan.