Struct Param
pub struct Param<T>where
T: Parameter,{
pub id: ParamId,
/* private fields */
}Expand description
Parameters are the fundamental building blocks of modules where they serve as containers for tensors that can be updated during training, and loaded during inference. If you don’t want to save the tensors and/or don’t want to update it during training, you don’t need this type to wrap your tensor.
§Core Lazy Initialization Architecture
Param<T> has a dual-state design using OnceCell<T>:
§State Management
Two possible states:
- Initialized:
state: OnceCell<T>contains value,initialization: None - Uninitialized (Lazy):
stateis empty,initialization: Some(RwLock<Option<Uninitialized<T>>>)
Fields§
§id: ParamIdThe unique ID of this parameter. This is used by eg. optimizers to associate a gradient with a specific parameter.
Implementations§
§impl<T> Param<T>where
T: Parameter,
impl<T> Param<T>where
T: Parameter,
pub fn initialized(id: ParamId, value: T) -> Param<T>
pub fn initialized(id: ParamId, value: T) -> Param<T>
Create a new parameter that is already initialized.
pub fn uninitialized<F>(
id: ParamId,
init: F,
device: <T as Parameter>::Device,
is_require_grad: bool,
shape: Shape,
) -> Param<T>
pub fn uninitialized<F>( id: ParamId, init: F, device: <T as Parameter>::Device, is_require_grad: bool, shape: Shape, ) -> Param<T>
Create a new parameter that is not already initialized.
pub fn val(&self) -> T
pub fn val(&self) -> T
Gets the parameter value, initializing it lazily if needed.
For initialized parameters, this returns a clone of the cached value. For uninitialized parameters, this triggers initialization:
pub fn is_initialized(&self) -> bool
pub fn is_initialized(&self) -> bool
Check if the parameter has been initialized.
Returns true if the parameter’s value has been computed and cached,
false if it’s still lazy and will be initialized on first access.
pub fn into_value(self) -> T
pub fn into_value(self) -> T
Gets the parameter’s value while consuming the parameter.
pub fn consume(self) -> (ParamId, T, ParamMapper<T>)
pub fn consume(self) -> (ParamId, T, ParamMapper<T>)
Gets the parameter id and value while consuming the parameter.
pub fn map<F>(self, func: F) -> Param<T>where
F: FnOnce(T) -> T,
pub fn map<F>(self, func: F) -> Param<T>where
F: FnOnce(T) -> T,
Execute the given function on the inner value.
pub fn from_mapped_value(
id: ParamId,
value: T,
param_mapper: ParamMapper<T>,
) -> Param<T>
pub fn from_mapped_value( id: ParamId, value: T, param_mapper: ParamMapper<T>, ) -> Param<T>
Create an initialized parameter with the given id, value, and param mapper.
This is a helper method for creating parameters while preserving the param mapper, typically used in ModuleMapper implementations.
pub fn load_mapper<F>(self, func: F) -> Param<T>
pub fn load_mapper<F>(self, func: F) -> Param<T>
Runs a transformation on the parameter when loading.
pub fn save_mapper<F>(self, func: F) -> Param<T>
pub fn save_mapper<F>(self, func: F) -> Param<T>
Runs a transformation on the parameter when saving.
pub fn init_mapper<F>(self, func: F) -> Param<T>
pub fn init_mapper<F>(self, func: F) -> Param<T>
Execute the given function on the inner value.
pub fn lazy_device(&self) -> <T as Parameter>::Device
pub fn lazy_device(&self) -> <T as Parameter>::Device
The device on which the parameter is or will be initialized, without triggering initialization.
This is critical for the load optimization: when loading tensors into an uninitialized parameter, we need to know the target device to move the loaded tensor appropriately, but we don’t want to trigger the initialization function (which would allocate an unnecessary tensor).
Use this instead of crate::tensor::Tensor::device when you need the device but want to preserve lazy initialization.
pub fn set_require_grad(self, require_grad: bool) -> Param<T>
pub fn set_require_grad(self, require_grad: bool) -> Param<T>
Override the gradient requirement for the current parameter.
§impl<B, const D: usize> Param<Tensor<B, D>>where
B: Backend,
impl<B, const D: usize> Param<Tensor<B, D>>where
B: Backend,
pub fn from_tensor(value: Tensor<B, D>) -> Param<Tensor<B, D>>
pub fn from_tensor(value: Tensor<B, D>) -> Param<Tensor<B, D>>
Create a new parameter from a float tensor.
§Warnings
We strongly recommend using Param::uninitialized if you are using this method to initialize parameters inside a module, since the tensor initialization will be lazy, making the loading of weights more performant.
pub fn lazy_shape(&self) -> Shape
pub fn lazy_shape(&self) -> Shape
The shape of the parameter, without triggering initialization.
This is critical for shape validation during loading: when applying tensors to an uninitialized parameter, we need to validate the shape without triggering the initialization function (which would allocate an unnecessary tensor).
Use this instead of crate::tensor::Tensor::shape when you need the shape but want to preserve lazy initialization.
pub fn from_data<T>(
data: T,
device: &<B as Backend>::Device,
) -> Param<Tensor<B, D>>where
T: Into<TensorData>,
pub fn from_data<T>(
data: T,
device: &<B as Backend>::Device,
) -> Param<Tensor<B, D>>where
T: Into<TensorData>,
Create a new parameter from data.
pub fn transform_for_load(
self,
tensor: Tensor<B, D>,
param_id: ParamId,
) -> Param<Tensor<B, D>>
pub fn transform_for_load( self, tensor: Tensor<B, D>, param_id: ParamId, ) -> Param<Tensor<B, D>>
Transform a parameter for loading by applying load transformations.
This method is used to restore a parameter from a tensor (typically during deserialization).
It ensures the tensor is moved to the expected device, applies the param mapper’s
on_load transformation, and preserves the autodiff settings (require_grad).
pub fn transform_for_save(&self) -> Param<Tensor<B, D>>
pub fn transform_for_save(&self) -> Param<Tensor<B, D>>
Transform a parameter for saving by applying save transformations.
This method is used to prepare a parameter for saving (typically during serialization).
It applies the param mapper’s on_save transformation, which can be used
to modify the tensor before serialization (e.g., quantization, precision conversion).
§impl<B, const D: usize> Param<Tensor<B, D, Int>>where
B: Backend,
impl<B, const D: usize> Param<Tensor<B, D, Int>>where
B: Backend,
pub fn lazy_shape(&self) -> Shape
pub fn lazy_shape(&self) -> Shape
The shape of the parameter, without triggering initialization.
This is critical for shape validation during loading: when applying tensors to an uninitialized parameter, we need to validate the shape without triggering the initialization function (which would allocate an unnecessary tensor).
Use this instead of crate::tensor::Tensor::shape when you need the shape but want to preserve lazy initialization.
pub fn transform_for_load(
self,
tensor: Tensor<B, D, Int>,
param_id: ParamId,
) -> Param<Tensor<B, D, Int>>
pub fn transform_for_load( self, tensor: Tensor<B, D, Int>, param_id: ParamId, ) -> Param<Tensor<B, D, Int>>
Transform a parameter for loading by applying load transformations.
This method is used to restore a parameter from a tensor (typically during deserialization).
It ensures the tensor is moved to the expected device and applies the param mapper’s
on_load transformation.
pub fn transform_for_save(&self) -> Param<Tensor<B, D, Int>>
pub fn transform_for_save(&self) -> Param<Tensor<B, D, Int>>
Transform a parameter for saving by applying save transformations.
This method is used to prepare a parameter for saving (typically during serialization).
It applies the param mapper’s on_save transformation, which can be used
to modify the tensor before serialization (e.g., quantization, precision conversion).
§impl<B, const D: usize> Param<Tensor<B, D, Bool>>where
B: Backend,
impl<B, const D: usize> Param<Tensor<B, D, Bool>>where
B: Backend,
pub fn lazy_shape(&self) -> Shape
pub fn lazy_shape(&self) -> Shape
The shape of the parameter, without triggering initialization.
This is critical for shape validation during loading: when applying tensors to an uninitialized parameter, we need to validate the shape without triggering the initialization function (which would allocate an unnecessary tensor).
Returns:
- For uninitialized params: the shape from the
Uninitializedstruct - For initialized params: the actual shape from the tensor
Use this instead of crate::tensor::Tensor::shape when you need the shape but want to preserve lazy initialization.
pub fn transform_for_load(
self,
tensor: Tensor<B, D, Bool>,
param_id: ParamId,
) -> Param<Tensor<B, D, Bool>>
pub fn transform_for_load( self, tensor: Tensor<B, D, Bool>, param_id: ParamId, ) -> Param<Tensor<B, D, Bool>>
Transform a parameter for loading by applying load transformations.
This method is used to restore a parameter from a tensor (typically during deserialization).
It ensures the tensor is moved to the expected device and applies the param mapper’s
on_load transformation.
pub fn transform_for_save(&self) -> Param<Tensor<B, D, Bool>>
pub fn transform_for_save(&self) -> Param<Tensor<B, D, Bool>>
Transform a parameter for saving by applying save transformations.
This method is used to prepare a parameter for saving (typically during serialization).
It applies the param mapper’s on_save transformation, which can be used
to modify the tensor before serialization (e.g., quantization, precision conversion).
Trait Implementations§
§impl<const D: usize, B> AutodiffModule<B> for Param<Tensor<B, D>>where
B: AutodiffBackend,
impl<const D: usize, B> AutodiffModule<B> for Param<Tensor<B, D>>where
B: AutodiffBackend,
§type InnerModule = Param<Tensor<<B as AutodiffBackend>::InnerBackend, D>>
type InnerModule = Param<Tensor<<B as AutodiffBackend>::InnerBackend, D>>
§fn valid(&self) -> <Param<Tensor<B, D>> as AutodiffModule<B>>::InnerModule
fn valid(&self) -> <Param<Tensor<B, D>> as AutodiffModule<B>>::InnerModule
§impl<const D: usize, B> AutodiffModule<B> for Param<Tensor<B, D, Bool>>where
B: AutodiffBackend,
impl<const D: usize, B> AutodiffModule<B> for Param<Tensor<B, D, Bool>>where
B: AutodiffBackend,
§type InnerModule = Param<Tensor<<B as AutodiffBackend>::InnerBackend, D, Bool>>
type InnerModule = Param<Tensor<<B as AutodiffBackend>::InnerBackend, D, Bool>>
§fn valid(&self) -> <Param<Tensor<B, D, Bool>> as AutodiffModule<B>>::InnerModule
fn valid(&self) -> <Param<Tensor<B, D, Bool>> as AutodiffModule<B>>::InnerModule
§impl<const D: usize, B> AutodiffModule<B> for Param<Tensor<B, D, Int>>where
B: AutodiffBackend,
impl<const D: usize, B> AutodiffModule<B> for Param<Tensor<B, D, Int>>where
B: AutodiffBackend,
§type InnerModule = Param<Tensor<<B as AutodiffBackend>::InnerBackend, D, Int>>
type InnerModule = Param<Tensor<<B as AutodiffBackend>::InnerBackend, D, Int>>
§fn valid(&self) -> <Param<Tensor<B, D, Int>> as AutodiffModule<B>>::InnerModule
fn valid(&self) -> <Param<Tensor<B, D, Int>> as AutodiffModule<B>>::InnerModule
§impl<const D: usize, B> Module<B> for Param<Tensor<B, D>>where
B: Backend,
impl<const D: usize, B> Module<B> for Param<Tensor<B, D>>where
B: Backend,
§fn visit<V>(&self, visitor: &mut V)where
V: ModuleVisitor<B>,
fn visit<V>(&self, visitor: &mut V)where
V: ModuleVisitor<B>,
§fn map<M>(self, mapper: &mut M) -> Param<Tensor<B, D>>where
M: ModuleMapper<B>,
fn map<M>(self, mapper: &mut M) -> Param<Tensor<B, D>>where
M: ModuleMapper<B>,
§fn into_record(self) -> <Param<Tensor<B, D>> as Module<B>>::Record
fn into_record(self) -> <Param<Tensor<B, D>> as Module<B>>::Record
§fn load_record(
self,
record: <Param<Tensor<B, D>> as Module<B>>::Record,
) -> Param<Tensor<B, D>>
fn load_record( self, record: <Param<Tensor<B, D>> as Module<B>>::Record, ) -> Param<Tensor<B, D>>
§fn to_device(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D>>
fn to_device(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D>>
§fn fork(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D>>
fn fork(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D>>
§fn collect_devices(
&self,
devices: Vec<<B as Backend>::Device>,
) -> Vec<<B as Backend>::Device>
fn collect_devices( &self, devices: Vec<<B as Backend>::Device>, ) -> Vec<<B as Backend>::Device>
§fn devices(&self) -> Vec<<B as Backend>::Device>
fn devices(&self) -> Vec<<B as Backend>::Device>
§fn num_params(&self) -> usize
fn num_params(&self) -> usize
§fn save_file<FR, PB>(
self,
file_path: PB,
recorder: &FR,
) -> Result<(), RecorderError>
fn save_file<FR, PB>( self, file_path: PB, recorder: &FR, ) -> Result<(), RecorderError>
§fn load_file<FR, PB>(
self,
file_path: PB,
recorder: &FR,
device: &<B as Backend>::Device,
) -> Result<Self, RecorderError>
fn load_file<FR, PB>( self, file_path: PB, recorder: &FR, device: &<B as Backend>::Device, ) -> Result<Self, RecorderError>
§fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
§impl<const D: usize, B> Module<B> for Param<Tensor<B, D, Bool>>where
B: Backend,
impl<const D: usize, B> Module<B> for Param<Tensor<B, D, Bool>>where
B: Backend,
§fn visit<V>(&self, visitor: &mut V)where
V: ModuleVisitor<B>,
fn visit<V>(&self, visitor: &mut V)where
V: ModuleVisitor<B>,
§fn map<M>(self, mapper: &mut M) -> Param<Tensor<B, D, Bool>>where
M: ModuleMapper<B>,
fn map<M>(self, mapper: &mut M) -> Param<Tensor<B, D, Bool>>where
M: ModuleMapper<B>,
§fn into_record(self) -> <Param<Tensor<B, D, Bool>> as Module<B>>::Record
fn into_record(self) -> <Param<Tensor<B, D, Bool>> as Module<B>>::Record
§fn load_record(
self,
record: <Param<Tensor<B, D, Bool>> as Module<B>>::Record,
) -> Param<Tensor<B, D, Bool>>
fn load_record( self, record: <Param<Tensor<B, D, Bool>> as Module<B>>::Record, ) -> Param<Tensor<B, D, Bool>>
§fn to_device(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Bool>>
fn to_device(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Bool>>
§fn fork(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Bool>>
fn fork(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Bool>>
§fn collect_devices(
&self,
devices: Vec<<B as Backend>::Device>,
) -> Vec<<B as Backend>::Device>
fn collect_devices( &self, devices: Vec<<B as Backend>::Device>, ) -> Vec<<B as Backend>::Device>
§fn devices(&self) -> Vec<<B as Backend>::Device>
fn devices(&self) -> Vec<<B as Backend>::Device>
§fn num_params(&self) -> usize
fn num_params(&self) -> usize
§fn save_file<FR, PB>(
self,
file_path: PB,
recorder: &FR,
) -> Result<(), RecorderError>
fn save_file<FR, PB>( self, file_path: PB, recorder: &FR, ) -> Result<(), RecorderError>
§fn load_file<FR, PB>(
self,
file_path: PB,
recorder: &FR,
device: &<B as Backend>::Device,
) -> Result<Self, RecorderError>
fn load_file<FR, PB>( self, file_path: PB, recorder: &FR, device: &<B as Backend>::Device, ) -> Result<Self, RecorderError>
§fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
§impl<const D: usize, B> Module<B> for Param<Tensor<B, D, Int>>where
B: Backend,
impl<const D: usize, B> Module<B> for Param<Tensor<B, D, Int>>where
B: Backend,
§fn visit<V>(&self, visitor: &mut V)where
V: ModuleVisitor<B>,
fn visit<V>(&self, visitor: &mut V)where
V: ModuleVisitor<B>,
§fn map<M>(self, mapper: &mut M) -> Param<Tensor<B, D, Int>>where
M: ModuleMapper<B>,
fn map<M>(self, mapper: &mut M) -> Param<Tensor<B, D, Int>>where
M: ModuleMapper<B>,
§fn into_record(self) -> <Param<Tensor<B, D, Int>> as Module<B>>::Record
fn into_record(self) -> <Param<Tensor<B, D, Int>> as Module<B>>::Record
§fn load_record(
self,
record: <Param<Tensor<B, D, Int>> as Module<B>>::Record,
) -> Param<Tensor<B, D, Int>>
fn load_record( self, record: <Param<Tensor<B, D, Int>> as Module<B>>::Record, ) -> Param<Tensor<B, D, Int>>
§fn to_device(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Int>>
fn to_device(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Int>>
§fn fork(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Int>>
fn fork(self, device: &<B as Backend>::Device) -> Param<Tensor<B, D, Int>>
§fn collect_devices(
&self,
devices: Vec<<B as Backend>::Device>,
) -> Vec<<B as Backend>::Device>
fn collect_devices( &self, devices: Vec<<B as Backend>::Device>, ) -> Vec<<B as Backend>::Device>
§fn devices(&self) -> Vec<<B as Backend>::Device>
fn devices(&self) -> Vec<<B as Backend>::Device>
§fn num_params(&self) -> usize
fn num_params(&self) -> usize
§fn save_file<FR, PB>(
self,
file_path: PB,
recorder: &FR,
) -> Result<(), RecorderError>
fn save_file<FR, PB>( self, file_path: PB, recorder: &FR, ) -> Result<(), RecorderError>
§fn load_file<FR, PB>(
self,
file_path: PB,
recorder: &FR,
device: &<B as Backend>::Device,
) -> Result<Self, RecorderError>
fn load_file<FR, PB>( self, file_path: PB, recorder: &FR, device: &<B as Backend>::Device, ) -> Result<Self, RecorderError>
§fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
§impl<const D: usize, B> ModuleDisplay for Param<Tensor<B, D>>where
B: Backend,
impl<const D: usize, B> ModuleDisplay for Param<Tensor<B, D>>where
B: Backend,
§fn format(&self, passed_settings: DisplaySettings) -> String
fn format(&self, passed_settings: DisplaySettings) -> String
§fn custom_settings(&self) -> Option<DisplaySettings>
fn custom_settings(&self) -> Option<DisplaySettings>
§impl<const D: usize, B> ModuleDisplay for Param<Tensor<B, D, Bool>>where
B: Backend,
impl<const D: usize, B> ModuleDisplay for Param<Tensor<B, D, Bool>>where
B: Backend,
§fn format(&self, passed_settings: DisplaySettings) -> String
fn format(&self, passed_settings: DisplaySettings) -> String
§fn custom_settings(&self) -> Option<DisplaySettings>
fn custom_settings(&self) -> Option<DisplaySettings>
§impl<const D: usize, B> ModuleDisplay for Param<Tensor<B, D, Int>>where
B: Backend,
impl<const D: usize, B> ModuleDisplay for Param<Tensor<B, D, Int>>where
B: Backend,
§fn format(&self, passed_settings: DisplaySettings) -> String
fn format(&self, passed_settings: DisplaySettings) -> String
§fn custom_settings(&self) -> Option<DisplaySettings>
fn custom_settings(&self) -> Option<DisplaySettings>
§impl<B, const D: usize> Record<B> for Param<Tensor<B, D>>where
B: Backend,
impl<B, const D: usize> Record<B> for Param<Tensor<B, D>>where
B: Backend,
§type Item<S: PrecisionSettings> = ParamSerde<FloatTensorSerde<S>>
type Item<S: PrecisionSettings> = ParamSerde<FloatTensorSerde<S>>
§impl<B, const D: usize> Record<B> for Param<Tensor<B, D, Bool>>where
B: Backend,
impl<B, const D: usize> Record<B> for Param<Tensor<B, D, Bool>>where
B: Backend,
§type Item<S: PrecisionSettings> = ParamSerde<BoolTensorSerde>
type Item<S: PrecisionSettings> = ParamSerde<BoolTensorSerde>
§impl<B, const D: usize> Record<B> for Param<Tensor<B, D, Int>>where
B: Backend,
impl<B, const D: usize> Record<B> for Param<Tensor<B, D, Int>>where
B: Backend,
§type Item<S: PrecisionSettings> = ParamSerde<IntTensorSerde<S>>
type Item<S: PrecisionSettings> = ParamSerde<IntTensorSerde<S>>
Auto Trait Implementations§
impl<T> !Freeze for Param<T>
impl<T> !RefUnwindSafe for Param<T>
impl<T> Send for Param<T>
impl<T> !Sync for Param<T>
impl<T> Unpin for Param<T>
impl<T> !UnwindSafe for Param<T>
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
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>
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>
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§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> ToCompactString for Twhere
T: Display,
impl<T> ToCompactString for Twhere
T: Display,
§fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
fn try_to_compact_string(&self) -> Result<CompactString, ToCompactStringError>
ToCompactString::to_compact_string()] Read more§fn to_compact_string(&self) -> CompactString
fn to_compact_string(&self) -> CompactString
CompactString]. Read more