Events API¶
Handlers receive an EventContext; keys vary by event. Epoch values are one-based.
Broadcast handlers run model-first and then in callback order. Provider/executor
events are exclusive and reject multiple handlers.
Data lifecycle events are owned only by a DataPack; placing them on a model or
callback fails during discovery. They may run through an attached Battery or a
standalone DataPack.resolve() call.
Distinct events may share one implementation by stacking decorators. This is useful when train, validation, and test steps have the same behavior:
@charge(Event.TRAIN_STEP)
@charge(Event.VALIDATION_STEP)
@charge(Event.TEST_STEP)
def step(self, context: EventContext):
batch = context["batch"]
return self.shared_step(batch)
Repeating the same event on one callable is rejected during handler discovery.
DataPack events¶
These handlers receive DataContext, documented in the Data API, rather
than the model-step EventContext. Every data event receives data_pack, stage,
and device; Battery-managed calls also receive battery. The stage is "fit",
"test", or "predict". When the DataPack defines a non-negative seed, the context
also contains seed and a fresh generator initialized with that seed.
| Event | Dispatch and timing | Additional context | Return or default |
|---|---|---|---|
PREPARE_DATA |
Idempotent preparation, at most once per Battery or standalone resolution | None | None; defaults to no operation |
SETUP_DATA |
Once per managed workflow; branch on stage |
None | One DatasetBundle; no default |
CONFIGURE_DATALOADER |
Once for every selected dataset | phase, datasets, dataset, dataset_name |
DataLoaderConfig or custom DataLoader; defaults to DataLoaderConfig() |
TEARDOWN_DATA |
On every managed-workflow exit, including failures | datasets when setup succeeded |
None; defaults to no operation |
Workflow events¶
| Phase | Once around workflow | Around each epoch | Around each batch | Required step |
|---|---|---|---|---|
| Train | BEFORE_TRAIN, AFTER_TRAIN |
BEFORE_TRAIN_EPOCH, AFTER_TRAIN_EPOCH |
BEFORE_TRAIN_STEP, AFTER_TRAIN_STEP |
TRAIN_STEP |
| Validation | BEFORE_VALIDATION, AFTER_VALIDATION |
BEFORE_VALIDATION_EPOCH, AFTER_VALIDATION_EPOCH |
BEFORE_VALIDATION_STEP, AFTER_VALIDATION_STEP |
VALIDATION_STEP |
| Test | BEFORE_TEST, AFTER_TEST |
BEFORE_TEST_EPOCH, AFTER_TEST_EPOCH |
BEFORE_TEST_STEP, AFTER_TEST_STEP |
TEST_STEP |
| Predict | BEFORE_PREDICT, AFTER_PREDICT |
BEFORE_PREDICT_EPOCH, AFTER_PREDICT_EPOCH |
BEFORE_PREDICT_STEP, AFTER_PREDICT_STEP |
PREDICT_STEP |
Optimization extension events¶
| Event | Dispatch | Purpose |
|---|---|---|
SETUP |
Broadcast | Configure callbacks for the selected device |
STEP_EXECUTION_CONTEXT |
Context providers | Wrap model steps, for example with autocast |
CONFIGURE_TRAIN_STEP |
Exclusive provider | Select zeroing, loss division, and optimizer boundary |
BEFORE_BACKWARD / AFTER_BACKWARD |
Broadcast | Observe or adjust backward preparation/completion |
BACKWARD |
Exclusive executor | Replace ordinary loss.backward() |
BEFORE_GRADIENT_CLIP |
Broadcast | Prepare gradients, including AMP unscaling |
GRADIENT_CLIP |
Exclusive executor | Apply configured clipping |
BEFORE_OPTIMIZER_STEP / AFTER_OPTIMIZER_STEP |
Broadcast | Observe actual optimizer boundaries |
OPTIMIZER_STEP |
Exclusive executor | Replace ordinary optimizer.step() |
The generated Event reference below documents the exact context available for each
event and its default behavior.
torch_batteries.events
¶
Lifecycle and optimization events used by the trainer and callbacks.
Public API¶
Event— names every lifecycle, step, and optimization extension point.EventContext— typed mapping of values available to event handlers.OptimizationStep— immutable gradient-operation plan for one train batch.charge— marks a model or callback method as an event handler.EventHandler— discovers handlers and applies broadcast, provider, executor, and context-manager dispatch rules.
Event
Source
¶
Bases: Enum
Events that can be used with the @charge decorator.
Events are triggered at different points during training/testing/prediction.
Model and callback events receive an EventContext; DataPack lifecycle events
receive a DataContext. Whenever an event lists epoch in its context, the
value follows the one-based public convention documented by EventContext.
DataPack Lifecycle Events¶
These events may be handled only by the DataPack attached to a Battery. The
stage field is "fit", "test", or "predict". A DataPack that defines a
non-negative seed also receives seed and a deterministic generator.
-
PREPARE_DATA: Broadcast side-effect event for idempotent downloads and cache population. It runs at most once per Battery, before the first implicit setup.- Context:
battery,data_pack,stage,device; optionalseed,generator - Return:
None - Default: no operation
- Context:
-
SETUP_DATA: Exclusive provider called once for every implicit fit, test, or prediction workflow. Usestageto construct and return only the datasets required by the active workflow.- Context: same as
PREPARE_DATA - Return:
DatasetBundle - Default: none; an implicit workflow requires exactly one valid bundle
- Context: same as
-
CONFIGURE_DATALOADER: Exclusive provider called for every dataset selected from the setup bundle. The phase-specificgeneratoruses a deterministic offset from the DataPack seed.- Context:
battery,data_pack,stage,device,phase,datasets,dataset,dataset_name; optionalseed,generator - Return:
DataLoaderConfigortorch.utils.data.DataLoader - Default:
DataLoaderConfig()
- Context:
-
TEARDOWN_DATA: Broadcast side-effect event that always runs when an implicit workflow exits, including after setup, loader, or model failures.datasetsis present only when setup completed successfully.- Context:
battery,data_pack,stage,device; optionalseed,generator,datasets - Return:
None - Default: no operation
- Context:
Optimization Extension Events¶
The events below are public extension points. They may be handled by a method on the model or by a callback. Broadcast handlers run model-first and then in callback-list order. Exclusive providers and executors allow only one handler across the model and callbacks; discovery fails with a clear conflict error when more than one is registered.
-
SETUP: Broadcast once after Battery and event discovery are complete, before checkpoint state can be restored.- Context:
battery,model,optimizer,device - Return: ignored
- Default: no operation
- Context:
-
ON_EXCEPTION: Broadcast exactly once when an exception escapes a public training, validation, testing, or prediction workflow. Handler failures are logged and suppressed, then the original workflow exception is re-raised. Normal streaming-prediction exhaustion and generator closure do not emit it.- Context:
battery,model,optimizer,exception - Return: ignored
- Default: no operation
- Context:
-
STEP_EXECUTION_CONTEXT: Context-provider event requested immediately beforeTRAIN_STEP,VALIDATION_STEP,TEST_STEP, andPREDICT_STEP. Every handler must return a context manager. Context managers enter model-first and then in callback order, and always exit in reverse order, including when step execution raises.- Context:
battery,model,optimizer,device,phase,batch,batch_idx,epoch - Return: a context manager
- Default:
contextlib.nullcontext()
- Context:
-
CONFIGURE_TRAIN_STEP: Exclusive provider called after moving a training batch to the device and before zeroing gradients or runningTRAIN_STEP.- Context:
battery,model,optimizer,device,phase,batch,batch_idx,total_batches,epoch,optimizer_step_idx - Return:
OptimizationStep - Default:
OptimizationStep()
- Context:
-
BEFORE_BACKWARD: Broadcast after parsing the training result and dividing its loss according to the optimization plan. Handlers may replacebackward_lossbut must not perform backward themselves.- Context: training batch fields plus
loss_tensor,backward_loss,optimization_plan,optimizer_step, andoptimizer_step_idx - Return: ignored
- Context: training batch fields plus
-
BACKWARD: Exclusive executor for backpropagation. It runs for every training batch, including intermediate accumulation batches.- Context: same as
BEFORE_BACKWARD - Return:
None - Default:
backward_loss.backward()
- Context: same as
-
AFTER_BACKWARD: Broadcast after backward succeeds. It is not emitted when backward raises. Gradients may still be AMP-scaled at this point.- Context: same as
BEFORE_BACKWARD - Return: ignored
- Context: same as
-
BEFORE_GRADIENT_CLIP: Broadcast only on a real optimizer boundary, after backward and before clipping. Mixed-precision handlers use it to unscale gradients. Every handler finishes beforeGRADIENT_CLIP.- Context: same as
BEFORE_BACKWARD - Return: ignored
- Context: same as
-
GRADIENT_CLIP: Exclusive optional executor for gradient clipping.- Context: same as
BEFORE_GRADIENT_CLIP - Return:
None - Default: no clipping
- Context: same as
-
BEFORE_OPTIMIZER_STEP: Broadcast after gradient preparation and clipping, immediately before the optimizer operation.- Context: same as
BEFORE_GRADIENT_CLIP - Return: ignored
- Context: same as
-
OPTIMIZER_STEP: Exclusive executor for the optimizer operation.- Context: same as
BEFORE_OPTIMIZER_STEP - Return:
None - Default:
optimizer.step()
- Context: same as
-
AFTER_OPTIMIZER_STEP: Broadcast after the optimizer operation succeeds and Battery incrementsoptimizer_step_idx. It is never emitted for intermediate accumulation batches or failed optimizer operations.- Context: same as
BEFORE_OPTIMIZER_STEP, with the updatedoptimizer_step_idx - Return: ignored
- Context: same as
Model provider example:
@charge(Event.CONFIGURE_TRAIN_STEP)
def configure_step(self, context: EventContext) -> OptimizationStep:
return OptimizationStep()
Callback execution-context example:
@charge(Event.STEP_EXECUTION_CONTEXT)
def execution_context(self, context: EventContext):
return torch.autocast(context["device"].type, dtype=torch.bfloat16)
Exclusive executor example:
@charge(Event.BACKWARD)
def backward(self, context: EventContext) -> None:
context["backward_loss"].backward()
Training Events¶
-
BEFORE_TRAIN: Called before training starts.- Context:
optimizer
- Context:
-
AFTER_TRAIN: Called after training completes.- Context:
optimizer,epoch,train_metrics,val_metrics(if validation ran),history_train_loss,history_val_loss,history_train_metrics,history_val_metrics
- Context:
-
BEFORE_TRAIN_EPOCH: Called before each training epoch.- Context:
optimizer,epoch
- Context:
-
AFTER_TRAIN_EPOCH: Called after each training epoch.- Context:
optimizer,epoch,train_metrics,history_train_loss,history_val_loss,history_train_metrics,history_val_metrics
- Context:
-
BEFORE_TRAIN_STEP: Called before each training batch.- Context:
optimizer,batch,batch_idx,epoch
- Context:
-
TRAIN_STEP: Called for each training batch. ReturnsStepOutput, or a scalar loss when automatic Battery metrics are not configured.- Context:
optimizer,batch,batch_idx,epoch
- Context:
-
AFTER_TRAIN_STEP: Called after each training batch.- Context:
optimizer,batch,batch_idx,epoch,loss,train_loss,train_metrics
- Context:
Validation Events¶
-
BEFORE_VALIDATION: Called before validation starts.- Context:
optimizer,epoch,train_metrics,history_train_loss,history_val_loss,history_train_metrics,history_val_metrics
- Context:
-
AFTER_VALIDATION: Called after validation completes.- Context:
optimizer,epoch,train_metrics,val_metrics,history_train_loss,history_val_loss,history_train_metrics,history_val_metrics
- Context:
-
BEFORE_VALIDATION_EPOCH: Called before each validation epoch.- Context:
epoch
- Context:
-
AFTER_VALIDATION_EPOCH: Called after each validation epoch.- Context:
epoch,val_metrics
- Context:
-
BEFORE_VALIDATION_STEP: Called before each validation batch.- Context:
batch,batch_idx,epoch
- Context:
-
VALIDATION_STEP: Called for each validation batch. ReturnsStepOutput, or a scalar loss when automatic Battery metrics are not configured.- Context:
batch,batch_idx,epoch
- Context:
-
AFTER_VALIDATION_STEP: Called after each validation batch.- Context:
batch,batch_idx,epoch,loss,val_loss,val_metrics
- Context:
Test Events¶
-
BEFORE_TEST: Called before testing starts.- Context:
optimizer
- Context:
-
AFTER_TEST: Called after testing completes.- Context:
optimizer,loss,test_loss,test_metrics
- Context:
-
BEFORE_TEST_EPOCH: Called before test epoch.- Context:
optimizer,epoch
- Context:
-
AFTER_TEST_EPOCH: Called after test epoch.- Context:
optimizer,epoch,loss,test_loss,test_metrics
- Context:
-
BEFORE_TEST_STEP: Called before each test batch.- Context:
optimizer,batch,batch_idx,epoch
- Context:
-
TEST_STEP: Called for each test batch. ReturnsStepOutput, or a scalar loss when automatic Battery metrics are not configured.- Context:
optimizer,batch,batch_idx,epoch
- Context:
-
AFTER_TEST_STEP: Called after each test batch.- Context:
optimizer,batch,batch_idx,epoch,loss,test_loss,test_metrics
- Context:
Prediction Events¶
-
BEFORE_PREDICT: Called before prediction starts.- Context:
optimizer
- Context:
-
AFTER_PREDICT: Called after prediction completes.- Context:
optimizer,predictions
- Context:
-
BEFORE_PREDICT_EPOCH: Called before prediction epoch.- Context:
optimizer,epoch
- Context:
-
AFTER_PREDICT_EPOCH: Called after prediction epoch.- Context:
optimizer,epoch,predictions
- Context:
-
BEFORE_PREDICT_STEP: Called before each prediction batch.- Context:
optimizer,batch,batch_idx,epoch
- Context:
-
PREDICT_STEP: Called for each prediction batch (must return predictions).- Context:
optimizer,batch,batch_idx,epoch
- Context:
-
AFTER_PREDICT_STEP: Called after each prediction batch.- Context:
optimizer,batch,batch_idx,epoch,predictions
- Context:
EventContext
Source
¶
Bases: TypedDict
Context dictionary passed to event handlers.
Different events populate different keys. All keys are optional so the same type can describe training, validation, testing, and prediction events.
Common keys:
battery: TheBatteryinstance managing the workflow.model: The model/module being trained, validated, tested, or used for prediction.optimizer: The optimizer when available.batch: Current batch data, usually a tuple or list of tensors.batch_idx: Current batch index within the active phase.epoch: One-based public epoch number. Training and validation workflows expose1, 2, 3, ...; single-pass test and prediction workflows expose1.device: Device selected by Battery.phase: Active workflow phase:train,validation,test, orpredict.dataset_name: Name of the active implicit DataPack dataset.exception: Original failure supplied only toON_EXCEPTION.
Optimization keys:
total_batches: Number of batches in the active training loader.optimization_plan: Zeroing, loss-scaling, and optimizer-boundary plan.loss_tensor: Original scalar loss returned by the training step.backward_loss: Loss tensor that will be passed to backward. ABEFORE_BACKWARDhandler may replace it.optimizer_step: Whether the current batch performs a real optimizer step.optimizer_step_idx: Number of successfully completed optimizer steps.
Loss keys:
train_loss: Current training loss for training step events.val_loss: Current validation loss for validation step events.test_loss: Current test loss for test events.loss: Deprecated compatibility alias for the phase-specific loss key.
Metric keys:
train_metrics: Current training batch or epoch metrics.val_metrics: Current validation batch or epoch metrics.test_metrics: Current test batch or final metrics.
History keys:
history_train_loss: Training loss history for completed epochs.history_val_loss: Validation loss history for completed epochs.history_train_metrics: Training metric history for completed epochs.history_val_metrics: Validation metric history for completed epochs.
Prediction keys:
predictions: Model predictions from a prediction step or prediction run.
OptimizationStep
Source
dataclass
¶
Describe the gradient operations required for one training batch.
Returned by a model or callback handling
:attr:Event.CONFIGURE_TRAIN_STEP. With no handler, Battery uses these
defaults to zero gradients, backpropagate the full loss, and perform one
optimizer step per batch.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
zero_grad
|
bool
|
Whether gradients are cleared before the model step. |
True
|
optimizer_step
|
bool
|
Whether this batch completes an optimizer group. |
True
|
loss_divisor
|
int
|
Positive divisor applied to the loss before backward. |
1
|
EventHandler
Source
¶
Bases: _ChargedHandlerBase
Handles discovery and execution of methods decorated with @charge.
This class discovers methods on a model that are decorated with @charge
and provides methods to call them based on events.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model
|
Module
|
PyTorch model containing decorated methods |
required |
callbacks
|
list | None
|
Optional list of callback objects with decorated methods |
None
|
Examples:
get_handler(event) Source
¶
Get the handler for a specific event.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
The event to get a handler for |
required |
Returns:
| Type | Description |
|---|---|
list[Callable] | Callable | None
|
The handler method if found, None otherwise |
has_handler(event) Source
¶
Check if a handler exists for the given event.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
The event to check for. |
required |
Returns:
| Type | Description |
|---|---|
bool
|
True if a handler exists, otherwise False. |
call(event, *args, **kwargs) Source
¶
Call a handler if it exists.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
The event to trigger |
required |
*args
|
Any
|
Positional arguments to pass to the handler |
()
|
**kwargs
|
Any
|
Keyword arguments to pass to the handler |
{}
|
Returns:
| Type | Description |
|---|---|
Any
|
The result of the handler call, or None if no handler exists |
provide(event, *args, default, **kwargs) Source
¶
Return an exclusive provider result or a caller-supplied default.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
Exclusive provider event to dispatch. |
required |
*args
|
Any
|
Positional arguments passed to the provider. |
()
|
default
|
Any
|
Value returned when no provider is registered. |
required |
**kwargs
|
Any
|
Keyword arguments passed to the provider. |
{}
|
execute(event, *args, **kwargs) Source
¶
Run one exclusive executor and report whether it handled the event.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
Exclusive executor event to dispatch. |
required |
*args
|
Any
|
Positional arguments passed to the executor. |
()
|
**kwargs
|
Any
|
Keyword arguments passed to the executor. |
{}
|
execution_context(event, *args, **kwargs) Source
¶
Enter every ordered context manager returned for an event.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
Context-provider event to dispatch. |
required |
*args
|
Any
|
Positional arguments passed to each provider. |
()
|
**kwargs
|
Any
|
Keyword arguments passed to each provider. |
{}
|
charge(event) Source
¶
Decorator to mark methods for specific training events.
Handlers accept the context associated with the selected event. Model and callback
events receive EventContext; DataPack events receive DataContext.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event
|
Event
|
The event type from the Event enum |
required |
Returns:
| Type | Description |
|---|---|
Callable[[Callable[P, R]], Callable[P, R]]
|
Decorated function with event metadata |
Examples:
@charge(Event.TRAIN_STEP)
def training_step(self, context: EventContext):
batch = context["batch"]
x, y = batch
pred = self(x)
loss = F.mse_loss(pred, y)
return loss
@charge(Event.BEFORE_TRAIN_EPOCH)
def on_epoch_start(self, context: EventContext):
print(f"Starting epoch {context['epoch']}")
@charge(Event.AFTER_TRAIN_STEP)
def on_train_step_end(self, context: EventContext):
# Log metrics, update learning rate, etc.
if context.get("loss"):
print(f"Batch {context['batch_idx']}: loss={context['loss']}")