pub struct Param<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.
§Cloning
Cloning a parameter is always cheap; it never allocates or initializes tensors. Clones share the same lazy initialization state, so initialization happens at most once and all clones resolve to the same value regardless of which one triggered it.
This sharing is strictly scoped to lazy initialization. It only guarantees that all clones observe the same initialization result. Subsequent transformations operate on independent parameter values and never propagate across clones.
Fields§
§id: ParamIdThe unique ID of this parameter. This is used by eg. optimizers to associate a gradient with a specific parameter.
Implementations§
Source§impl<T: Parameter> Param<T>
impl<T: Parameter> Param<T>
Sourcepub fn initialized(id: ParamId, value: T) -> Self
pub fn initialized(id: ParamId, value: T) -> Self
Create a new parameter that is already initialized.
Sourcepub fn uninitialized<F>(
id: ParamId,
init: F,
device: Device,
is_require_grad: bool,
shape: Shape,
) -> Self
pub fn uninitialized<F>( id: ParamId, init: F, device: Device, is_require_grad: bool, shape: Shape, ) -> Self
Create a new parameter that is not already initialized.
Sourcepub fn val(&self) -> T
pub fn val(&self) -> T
Gets the effective parameter value, initializing it lazily if needed.
For initialized parameters, this returns a clone of the cached value. For uninitialized parameters, this triggers initialization.
When a LoRA adapter is attached, this returns the composed value
base + scale * (a @ b) rather than the raw stored base. Use base to
access the raw stored value without composition.
Sourcepub fn base(&self) -> T
pub fn base(&self) -> T
Gets the raw stored parameter value (the frozen base when a LoRA adapter is attached), without applying any adapter composition.
Sourcepub fn adapter(&self) -> Option<&LoraAdapter>
pub fn adapter(&self) -> Option<&LoraAdapter>
The LoRA adapter attached to this parameter, if any.
Sourcepub 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.
Sourcepub fn into_value(self) -> T
pub fn into_value(self) -> T
Gets the parameter’s value while consuming the parameter.
Sourcepub fn consume(self) -> (ParamId, T, ParamMapper<T>)
pub fn consume(self) -> (ParamId, T, ParamMapper<T>)
Gets the parameter id and raw value while consuming the parameter.
Returns the raw stored value (the frozen base when a LoRA adapter is attached); any
adapter is dropped. Module traversals strip the adapter before calling into map_float,
so mappers always observe the structural base.
Sourcepub fn map<F: FnOnce(T) -> T>(self, func: F) -> Self
pub fn map<F: FnOnce(T) -> T>(self, func: F) -> Self
Execute the given function on the inner value.
Sourcepub fn from_mapped_value(
id: ParamId,
value: T,
param_mapper: ParamMapper<T>,
) -> Self
pub fn from_mapped_value( id: ParamId, value: T, param_mapper: ParamMapper<T>, ) -> Self
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.
Sourcepub fn load_mapper<F: Fn(T) -> T + Send + Sync + 'static>(self, func: F) -> Self
pub fn load_mapper<F: Fn(T) -> T + Send + Sync + 'static>(self, func: F) -> Self
Runs a transformation on the parameter when loading.
Sourcepub fn save_mapper<F: Fn(T) -> T + Send + Sync + 'static>(self, func: F) -> Self
pub fn save_mapper<F: Fn(T) -> T + Send + Sync + 'static>(self, func: F) -> Self
Runs a transformation on the parameter when saving.
Sourcepub fn init_mapper<F: Fn(T) -> T + Send + Sync + 'static>(self, func: F) -> Selfwhere
T: Sync + 'static,
pub fn init_mapper<F: Fn(T) -> T + Send + Sync + 'static>(self, func: F) -> Selfwhere
T: Sync + 'static,
Returns a new parameter whose initialization value is transformed by the given function.
If the parameter is still uninitialized (lazy), the transformation is chained onto the existing initialization without triggering evaluation. If the parameter is already initialized, it immediately applies the transformation to the current value.
Sourcepub fn lazy_device(&self) -> Device
pub fn lazy_device(&self) -> 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.
Sourcepub fn set_require_grad(self, require_grad: bool) -> Self
pub fn set_require_grad(self, require_grad: bool) -> Self
Override the gradient requirement for the current parameter.
Sourcepub 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.
Sourcepub fn transform_for_load(self, tensor: T, param_id: ParamId) -> Self
pub fn transform_for_load(self, tensor: T, param_id: ParamId) -> Self
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).
Sourcepub fn transform_for_save(&self) -> Self
pub fn transform_for_save(&self) -> Self
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).
Source§impl<const D: usize> Param<Tensor<D>>
impl<const D: usize> Param<Tensor<D>>
Sourcepub fn from_tensor(value: Tensor<D>) -> Self
pub fn from_tensor(value: Tensor<D>) -> Self
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.
Sourcepub fn from_data<T>(data: T, device: &Device) -> Selfwhere
T: Into<TensorData>,
pub fn from_data<T>(data: T, device: &Device) -> Selfwhere
T: Into<TensorData>,
Create a new parameter from data.
Trait Implementations§
Source§impl<const D: usize> Module for Param<Tensor<D>>
impl<const D: usize> Module for Param<Tensor<D>>
Source§fn visit<V: ModuleVisitor>(&self, visitor: &mut V)
fn visit<V: ModuleVisitor>(&self, visitor: &mut V)
Source§fn map<M: ModuleMapper>(self, mapper: &mut M) -> Self
fn map<M: ModuleMapper>(self, mapper: &mut M) -> Self
Source§fn to_device(self, device: &Device) -> Self
fn to_device(self, device: &Device) -> Self
Source§fn fork(self, device: &Device) -> Self
fn fork(self, device: &Device) -> Self
Source§fn collect_devices(&self, devices: Vec<Device>) -> Vec<Device>
fn collect_devices(&self, devices: Vec<Device>) -> Vec<Device>
Source§fn devices(&self) -> Devices
fn devices(&self) -> Devices
Source§fn freeze_group(self, group: ParamGroup) -> Self
fn freeze_group(self, group: ParamGroup) -> Self
require_grad to false for every parameter in the given group, leaving the rest
of the module untouched. Read moreSource§fn unfreeze_group(self, group: ParamGroup) -> Self
fn unfreeze_group(self, group: ParamGroup) -> Self
require_grad to true for every parameter in the given group, leaving the rest
of the module untouched. Read moreSource§fn train(self) -> Selfwhere
Self: AutodiffModule,
fn train(self) -> Selfwhere
Self: AutodiffModule,
Source§fn num_params(&self) -> usize
fn num_params(&self) -> usize
Source§fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
Source§fn quantize_weights_group(
self,
quantizer: &mut Quantizer,
group: ParamGroup,
) -> Self
fn quantize_weights_group( self, quantizer: &mut Quantizer, group: ParamGroup, ) -> Self
Source§fn apply_lora(self, config: LoraConfig) -> Selfwhere
Self: Sized,
fn apply_lora(self, config: LoraConfig) -> Selfwhere
Self: Sized,
Source§fn apply_qlora(self, config: LoraConfig, quantizer: Quantizer) -> Selfwhere
Self: Sized,
fn apply_qlora(self, config: LoraConfig, quantizer: Quantizer) -> Selfwhere
Self: Sized,
Source§fn into_record(self) -> ModuleRecordwhere
Self: Sized,
fn into_record(self) -> ModuleRecordwhere
Self: Sized,
ModuleRecord. Read moreSource§fn try_load_record(self, record: ModuleRecord) -> Result<Self, RecordError>where
Self: Sized,
fn try_load_record(self, record: ModuleRecord) -> Result<Self, RecordError>where
Self: Sized,
ModuleRecord to this module, returning the loaded
module. Read moreSource§fn load_record(self, record: ModuleRecord) -> Selfwhere
Self: Sized,
fn load_record(self, record: ModuleRecord) -> Selfwhere
Self: Sized,
ModuleRecord to this module, consuming and returning
it. Read moreSource§fn save_file<P: AsRef<Path>>(self, path: P) -> Result<(), RecordError>where
Self: Sized,
fn save_file<P: AsRef<Path>>(self, path: P) -> Result<(), RecordError>where
Self: Sized,
std only.Source§fn load_file<P: AsRef<Path>>(self, path: P) -> Selfwhere
Self: Sized,
fn load_file<P: AsRef<Path>>(self, path: P) -> Selfwhere
Self: Sized,
std only.Source§fn try_load_file<P: AsRef<Path>>(self, path: P) -> Result<Self, RecordError>where
Self: Sized,
fn try_load_file<P: AsRef<Path>>(self, path: P) -> Result<Self, RecordError>where
Self: Sized,
std only.Source§impl<const D: usize> Module for Param<Tensor<D, Int>>
impl<const D: usize> Module for Param<Tensor<D, Int>>
Source§fn visit<V: ModuleVisitor>(&self, visitor: &mut V)
fn visit<V: ModuleVisitor>(&self, visitor: &mut V)
Source§fn map<M: ModuleMapper>(self, mapper: &mut M) -> Self
fn map<M: ModuleMapper>(self, mapper: &mut M) -> Self
Source§fn to_device(self, device: &Device) -> Self
fn to_device(self, device: &Device) -> Self
Source§fn fork(self, device: &Device) -> Self
fn fork(self, device: &Device) -> Self
Source§fn collect_devices(&self, devices: Vec<Device>) -> Vec<Device>
fn collect_devices(&self, devices: Vec<Device>) -> Vec<Device>
Source§fn devices(&self) -> Devices
fn devices(&self) -> Devices
Source§fn freeze_group(self, group: ParamGroup) -> Self
fn freeze_group(self, group: ParamGroup) -> Self
require_grad to false for every parameter in the given group, leaving the rest
of the module untouched. Read moreSource§fn unfreeze_group(self, group: ParamGroup) -> Self
fn unfreeze_group(self, group: ParamGroup) -> Self
require_grad to true for every parameter in the given group, leaving the rest
of the module untouched. Read moreSource§fn train(self) -> Selfwhere
Self: AutodiffModule,
fn train(self) -> Selfwhere
Self: AutodiffModule,
Source§fn num_params(&self) -> usize
fn num_params(&self) -> usize
Source§fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
Source§fn quantize_weights_group(
self,
quantizer: &mut Quantizer,
group: ParamGroup,
) -> Self
fn quantize_weights_group( self, quantizer: &mut Quantizer, group: ParamGroup, ) -> Self
Source§fn apply_lora(self, config: LoraConfig) -> Selfwhere
Self: Sized,
fn apply_lora(self, config: LoraConfig) -> Selfwhere
Self: Sized,
Source§fn apply_qlora(self, config: LoraConfig, quantizer: Quantizer) -> Selfwhere
Self: Sized,
fn apply_qlora(self, config: LoraConfig, quantizer: Quantizer) -> Selfwhere
Self: Sized,
Source§fn into_record(self) -> ModuleRecordwhere
Self: Sized,
fn into_record(self) -> ModuleRecordwhere
Self: Sized,
ModuleRecord. Read moreSource§fn try_load_record(self, record: ModuleRecord) -> Result<Self, RecordError>where
Self: Sized,
fn try_load_record(self, record: ModuleRecord) -> Result<Self, RecordError>where
Self: Sized,
ModuleRecord to this module, returning the loaded
module. Read moreSource§fn load_record(self, record: ModuleRecord) -> Selfwhere
Self: Sized,
fn load_record(self, record: ModuleRecord) -> Selfwhere
Self: Sized,
ModuleRecord to this module, consuming and returning
it. Read moreSource§fn save_file<P: AsRef<Path>>(self, path: P) -> Result<(), RecordError>where
Self: Sized,
fn save_file<P: AsRef<Path>>(self, path: P) -> Result<(), RecordError>where
Self: Sized,
std only.Source§fn load_file<P: AsRef<Path>>(self, path: P) -> Selfwhere
Self: Sized,
fn load_file<P: AsRef<Path>>(self, path: P) -> Selfwhere
Self: Sized,
std only.Source§fn try_load_file<P: AsRef<Path>>(self, path: P) -> Result<Self, RecordError>where
Self: Sized,
fn try_load_file<P: AsRef<Path>>(self, path: P) -> Result<Self, RecordError>where
Self: Sized,
std only.Source§impl<const D: usize> Module for Param<Tensor<D, Bool>>
impl<const D: usize> Module for Param<Tensor<D, Bool>>
Source§fn visit<V: ModuleVisitor>(&self, visitor: &mut V)
fn visit<V: ModuleVisitor>(&self, visitor: &mut V)
Source§fn map<M: ModuleMapper>(self, mapper: &mut M) -> Self
fn map<M: ModuleMapper>(self, mapper: &mut M) -> Self
Source§fn to_device(self, device: &Device) -> Self
fn to_device(self, device: &Device) -> Self
Source§fn fork(self, device: &Device) -> Self
fn fork(self, device: &Device) -> Self
Source§fn collect_devices(&self, devices: Vec<Device>) -> Vec<Device>
fn collect_devices(&self, devices: Vec<Device>) -> Vec<Device>
Source§fn devices(&self) -> Devices
fn devices(&self) -> Devices
Source§fn freeze_group(self, group: ParamGroup) -> Self
fn freeze_group(self, group: ParamGroup) -> Self
require_grad to false for every parameter in the given group, leaving the rest
of the module untouched. Read moreSource§fn unfreeze_group(self, group: ParamGroup) -> Self
fn unfreeze_group(self, group: ParamGroup) -> Self
require_grad to true for every parameter in the given group, leaving the rest
of the module untouched. Read moreSource§fn train(self) -> Selfwhere
Self: AutodiffModule,
fn train(self) -> Selfwhere
Self: AutodiffModule,
Source§fn num_params(&self) -> usize
fn num_params(&self) -> usize
Source§fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
fn quantize_weights(self, quantizer: &mut Quantizer) -> Self
Source§fn quantize_weights_group(
self,
quantizer: &mut Quantizer,
group: ParamGroup,
) -> Self
fn quantize_weights_group( self, quantizer: &mut Quantizer, group: ParamGroup, ) -> Self
Source§fn apply_lora(self, config: LoraConfig) -> Selfwhere
Self: Sized,
fn apply_lora(self, config: LoraConfig) -> Selfwhere
Self: Sized,
Source§fn apply_qlora(self, config: LoraConfig, quantizer: Quantizer) -> Selfwhere
Self: Sized,
fn apply_qlora(self, config: LoraConfig, quantizer: Quantizer) -> Selfwhere
Self: Sized,
Source§fn into_record(self) -> ModuleRecordwhere
Self: Sized,
fn into_record(self) -> ModuleRecordwhere
Self: Sized,
ModuleRecord. Read moreSource§fn try_load_record(self, record: ModuleRecord) -> Result<Self, RecordError>where
Self: Sized,
fn try_load_record(self, record: ModuleRecord) -> Result<Self, RecordError>where
Self: Sized,
ModuleRecord to this module, returning the loaded
module. Read moreSource§fn load_record(self, record: ModuleRecord) -> Selfwhere
Self: Sized,
fn load_record(self, record: ModuleRecord) -> Selfwhere
Self: Sized,
ModuleRecord to this module, consuming and returning
it. Read moreSource§fn save_file<P: AsRef<Path>>(self, path: P) -> Result<(), RecordError>where
Self: Sized,
fn save_file<P: AsRef<Path>>(self, path: P) -> Result<(), RecordError>where
Self: Sized,
std only.Source§fn load_file<P: AsRef<Path>>(self, path: P) -> Selfwhere
Self: Sized,
fn load_file<P: AsRef<Path>>(self, path: P) -> Selfwhere
Self: Sized,
std only.Source§fn try_load_file<P: AsRef<Path>>(self, path: P) -> Result<Self, RecordError>where
Self: Sized,
fn try_load_file<P: AsRef<Path>>(self, path: P) -> Result<Self, RecordError>where
Self: Sized,
std only.Source§impl<const D: usize> ModuleDisplay for Param<Tensor<D>>
impl<const D: usize> ModuleDisplay for Param<Tensor<D>>
Source§fn format(&self, passed_settings: DisplaySettings) -> String
fn format(&self, passed_settings: DisplaySettings) -> String
Source§fn custom_settings(&self) -> Option<DisplaySettings>
fn custom_settings(&self) -> Option<DisplaySettings>
Source§impl<const D: usize> ModuleDisplay for Param<Tensor<D, Int>>
impl<const D: usize> ModuleDisplay for Param<Tensor<D, Int>>
Source§fn format(&self, passed_settings: DisplaySettings) -> String
fn format(&self, passed_settings: DisplaySettings) -> String
Source§fn custom_settings(&self) -> Option<DisplaySettings>
fn custom_settings(&self) -> Option<DisplaySettings>
Source§impl<const D: usize> ModuleDisplay for Param<Tensor<D, Bool>>
impl<const D: usize> ModuleDisplay for Param<Tensor<D, Bool>>
Source§fn format(&self, passed_settings: DisplaySettings) -> String
fn format(&self, passed_settings: DisplaySettings) -> String
Source§fn custom_settings(&self) -> Option<DisplaySettings>
fn custom_settings(&self) -> Option<DisplaySettings>
Auto Trait Implementations§
impl<T> !RefUnwindSafe for Param<T>
impl<T> !UnwindSafe for Param<T>
impl<T> Freeze for Param<T>
impl<T> Send for Param<T>where
T: Sync,
impl<T> Sync for Param<T>where
T: Sync,
impl<T> Unpin for Param<T>
impl<T> UnsafeUnpin 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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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