pub struct Lion {
pub lr: f32,
pub beta1: f32,
pub beta2: f32,
pub weight_decay: f32,
/* private fields */
}Expand description
EvoLved sign-momentum optimizer.
Per-tensor state: one f32 buffer (half of Adam’s footprint).
Fields§
§lr: f32Learning rate. Critical: typically 3–10× smaller than the
AdamW LR you’d use on the same model (because the update has
unit ‖sign(·)‖ per coordinate).
beta1: f32Interpolation coefficient for the update direction (β₁ in
Chen et al.). Default 0.9.
beta2: f32EMA coefficient for the carried momentum (β₂). Default 0.99.
weight_decay: f32Decoupled weight-decay coefficient λ. Tune ~3–10× higher than
the AdamW λ you’d pair with the same model. Default 0.0.
Implementations§
Source§impl Lion
impl Lion
Sourcepub fn new(lr: f32) -> Self
pub fn new(lr: f32) -> Self
Construct with (β₁, β₂, λ) = (0.9, 0.99, 0.0).
Examples found in repository?
examples/step_bench.rs (line 80)
56fn main() {
57 for n in [64 * 1024usize, 1024 * 1024, 8 * 1024 * 1024] {
58 println!(
59 "\n{} elements ({:.1} MiB per buffer)",
60 n,
61 (n * 4) as f64 / 1048576.0
62 );
63 bench("adamw (f64 default)", n, Box::new(AdamW::new(1e-3)));
64 bench(
65 "adamw f32Math",
66 n,
67 Box::new(AdamW::new(1e-3).with_f32_math(true)),
68 );
69 bench("adam (f64 default)", n, Box::new(Adam::new(1e-3)));
70 bench(
71 "adam f32Math",
72 n,
73 Box::new(Adam::new(1e-3).with_f32_math(true)),
74 );
75 bench("sgd+momentum", n, {
76 let mut o = Sgd::new(1e-3);
77 o.momentum = 0.9;
78 Box::new(o)
79 });
80 bench("lion", n, Box::new(Lion::new(1e-3)));
81 }
82}Sourcepub fn with_betas(self, b1: f32, b2: f32) -> Self
pub fn with_betas(self, b1: f32, b2: f32) -> Self
Override (β₁, β₂). They serve different roles — see the struct-level docs.
Sourcepub fn with_weight_decay(self, wd: f32) -> Self
pub fn with_weight_decay(self, wd: f32) -> Self
Override the decoupled-decay coefficient.
Trait Implementations§
Source§impl Optimizer for Lion
impl Optimizer for Lion
Source§fn set_lr(&mut self, lr: f32)
fn set_lr(&mut self, lr: f32)
Set the base learning rate (for LR schedules / warmup). Default is a
no-op for algorithms without a scalar
lr (e.g. Adafactor’s relative
step size); every algorithm in this crate that has an lr field
overrides this to update it.Source§fn state_dict(&self) -> Option<OptimizerState>
fn state_dict(&self) -> Option<OptimizerState>
Snapshot the optimizer’s state for a checkpoint. Read more
Source§fn load_state_dict(&mut self, state: &OptimizerState) -> bool
fn load_state_dict(&mut self, state: &OptimizerState) -> bool
Restore a snapshot. Returns false when unsupported or when the state does
not belong to this algorithm.
fn step( &mut self, name: &str, _shape: &[usize], param: &mut [f32], grad: &[f32], )
Source§fn step_batch(&mut self, items: &mut [OptItem<'_>])
fn step_batch(&mut self, items: &mut [OptItem<'_>])
Batched step over ALL parameters in one call. Default: sequential
step per item — bit-identical to the per-parameter loop. Optimizers
whose parameter groups are independent (e.g. Muon on the 2-D weight
matrices vs AdamW on the embeddings/biases/norms) can override this to
run the groups on separate threads; because the groups touch disjoint
parameters and disjoint optimizer state, the result is bit-for-bit the
same as the serial loop — only the wall-clock (the CPU-side optimizer
bubble) shrinks toward max(group_times) instead of their sum.Source§fn end_iteration(&mut self)
fn end_iteration(&mut self)
Advance the global step counter. Most algorithms increment per
call to
step, so most implementations leave this a no-op.Source§fn lr_scale(&self, _name: &str) -> f32
fn lr_scale(&self, _name: &str) -> f32
Per-tensor multiplier on the effective learning rate. Default
is
1.0 for every name. Override when wrapping this crate to
support per-name LR schedules (e.g. embedding-vs-attention
splits, or the Gaussian-splat attribute-typed LR setup). The
CPU impls in this crate currently honor this only when the
caller passes a pre-scaled lr for the relevant call —
backends are encouraged to consult it inside their fused
kernel.Auto Trait Implementations§
impl Freeze for Lion
impl RefUnwindSafe for Lion
impl Send for Lion
impl Sync for Lion
impl Unpin for Lion
impl UnsafeUnpin for Lion
impl UnwindSafe for Lion
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more