Skip to content

Cookbook — Optimizers

1. AdamW (the default)

Intent: Decoupled-weight-decay Adam — the workhorse of LLM training.

from SneppX_ALG import AdamW

opt = AdamW(model.parameters(), lr=2e-4, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01)
opt.zero_grad(); loss.backward(); opt.step()

Notes: Both a pure-Python (optim.py) and a fused CUDA (kernel/cuda/optim_cuda.cu) implementation exist. The CUDA kernel is used automatically when _HAS_CUDA is set. CPU-safe.

2. SGD with momentum

Intent: Simple, reproducible baseline.

from SneppX_ALG import SGD

opt = SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=1e-4)

Notes: Momentum buffer is stored per-parameter in opt.state.

3. Lion (EvoLved Sign Direction)

Intent: Memory-light optimizer (stores 1 buffer instead of 2).

from SneppX_ALG import Lion

opt = Lion(model.parameters(), lr=1e-4, betas=(0.9, 0.999), weight_decay=1e-2)

4. LAMB / LARS (large-batch / layerwise)

Intent: Scale batch size to thousands of devices.

from SneppX_ALG import LAMB, LARS

opt = LAMB(model.parameters(), lr=1e-3, weight_decay=0.01)
# or, for convolutional nets:
opt = LARS(model.parameters(), lr=0.1, momentum=0.9, trust_coefficient=1e-3)

Notes: LAMB trusts layer norms; both trust-region optimizers.

5. Swap optimizers mid-run (state-dict portability)

Intent: Save AdamW state, resume as SGD for fine-tuning.

from SneppX_ALG import AdamW, SGD

sd = opt.state_dict()                 # portable dict
opt2 = SGD(model.parameters(), lr=1e-2)
opt2.load_state_dict(sd)              # SGD ignores m/v, keeps lr

Notes: state_dict/load_state_dict store lr, weight_decay, and per-param state. Mismatched optimizer types keep the scalar fields; mismatched momentum buffers are re-initialized. CPU-safe.

6. Schedule-free AdamW

Intent: Remove LR scheduling overhead from the hot loop.

from SneppX_ALG import ScheduleFreeAdamW   # (optim_extra)

opt = ScheduleFreeAdamW(model.parameters(), lr=1e-3, weight_decay=0.01, warmup=500)
for step in range(10000):
    loss = model(x)
    loss.backward()
    opt.step()                       # no scheduler.step() needed
    opt.pretrain() / opt.train()     # toggle schedule-free mode

7. AdaFactor (memory-efficient, no momentum)

Intent: Train huge models with <1 extra buffer per param.

from SneppX_ALG import AdaFactor

opt = AdaFactor(model.parameters(), lr=1e-3, scale_parameter=True, relative_step=True)

8. Sophia / SOAP (second-order-aware)

Intent: Faster convergence on convex-ish losses.

from SneppX_ALG import Sophia, SOAP

opt = Sophia(model.parameters(), lr=1e-4)      # Hessian-free diagonal approx
opt = SOAP(model.parameters(), lr=1e-3)        # block-wise second order

9. Distributed optimizer (ZeRO-1)

Intent: Shard optimizer state across ranks.

from SneppX_ALG import DistributedAdam       # distributed-aware

opt = DistributedAdam(model.parameters(), lr=1e-3, zero_stage=1)
# gradients are all-reduced before the step; state is per-rank

10. Pick a scheduler factory

Intent: One-liner scheduler selection.

from SneppX_ALG import get_scheduler

sched = get_scheduler("cosine", opt, num_warmup_steps=500, num_training_steps=10_000)

Notes: Supports "linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup", "reduce_on_plateau". CPU-safe.

11. Inspect optimizer state

Intent: Debug / log LR / moment norms.

from SneppX_ALG import AdamW

opt = AdamW(model.parameters(), lr=2e-4, weight_decay=0.01)
print(opt.lr)
print(len(opt.state))               # one dict per param