Skip to main content

OptimizationState

Struct OptimizationState 

Source
pub struct OptimizationState<A: Float + 'static, D: Dimension + 'static> { /* private fields */ }
Expand description

Current optimization state: parameters plus everything needed to move them.

Implementations§

Source§

impl<A, D> OptimizationState<A, D>
where A: Float + ScalarOperand + Debug + Send + Sync + 'static, D: Dimension + 'static,

Source

pub fn new( parameters: Array<A, D>, kind: HardwareOptimizerKind, base_learning_rate: A, accumulation_steps: usize, ) -> Self

Build a state around parameters, using the optimizer family kind.

accumulation_steps is clamped to at least 1: zero micro-batches per update would mean the parameters never move.

Source

pub fn step(&mut self, gradients: &Array<A, D>) -> Result<HardwareStepReport<A>>

Apply one gradient.

With accumulation_steps == 1 this performs an optimizer update immediately. Otherwise the gradient is summed into the accumulator and the update happens once the window is full, using the mean of the window so the effective learning rate does not scale with the number of micro-batches.

A gradient whose shape differs from the parameters is reported rather than silently zipped against a truncated view.

Source

pub fn parameters(&self) -> &Array<A, D>

Current parameters.

Source

pub fn step_count(&self) -> usize

Number of optimizer updates applied so far.

Source

pub fn optimizer_kind(&self) -> HardwareOptimizerKind

Optimizer family currently in use.

Source

pub fn learning_rate(&self) -> A

Learning rate the next update will use.

Source

pub fn base_learning_rate(&self) -> A

Rate this state was constructed with, for comparison against the live OptimizationState::learning_rate.

Source

pub fn accumulation_steps(&self) -> usize

Micro-batches per optimizer update.

Source

pub fn accumulated_micro_steps(&self) -> usize

Micro-batches currently held in the accumulator.

Source

pub fn set_accumulation_steps(&mut self, accumulation_steps: usize)

Change the accumulation window.

Any partially accumulated window is discarded: mixing gradients averaged over different window sizes would silently change the effective learning rate of the next update.

Source

pub fn set_lr_scheduler( &mut self, schedule: Box<dyn LearningRateScheduler<A> + Send + Sync>, )

Install a learning rate schedule.

The schedule owns the rate from this point on: every update reads LearningRateScheduler::get_learning_rate and pushes it into the optimizer, so a rate set directly on the optimizer would be overwritten.

base_learning_rate is deliberately left alone: it records what this state was constructed with, which is the only thing a later comparison against the live rate can be meaningful against.

Source

pub fn rebuild_optimizer(&mut self, kind: HardwareOptimizerKind)

Replace the optimizer with a freshly built one of family kind.

This discards the accumulated moment state, which is why super::HardwareAwareOptimizer::optimize_for_hardware only does it before the first update.

Source

pub fn set_optimizer( &mut self, kind: HardwareOptimizerKind, optimizer: Box<dyn Optimizer<A, D> + Send + Sync>, )

Install a caller-supplied optimizer, for the cases the built-in recommendation does not cover.

kind is what the state will report from OptimizationState::optimizer_kind; pass the family optimizer actually belongs to so the reported state stays truthful.

Trait Implementations§

Source§

impl<A, D> Debug for OptimizationState<A, D>
where A: Float + Debug + 'static, D: Dimension + 'static,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<A, D> !RefUnwindSafe for OptimizationState<A, D>

§

impl<A, D> !UnwindSafe for OptimizationState<A, D>

§

impl<A, D> Freeze for OptimizationState<A, D>
where A: Freeze, D: Freeze,

§

impl<A, D> Send for OptimizationState<A, D>
where A: Send,

§

impl<A, D> Sync for OptimizationState<A, D>
where A: Sync,

§

impl<A, D> Unpin for OptimizationState<A, D>
where A: Unpin, D: Unpin,

§

impl<A, D> UnsafeUnpin for OptimizationState<A, D>
where A: UnsafeUnpin, D: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V