class_docstr: Hooks-based implementation of AbstractGradSampleModule
  
  Computes per-sample gradients using custom-written methods for each layer.
  See README.md for more details
code: def capture_activations_hook(
      self,
      module: nn.Module,
      forward_input: List[torch.Tensor],
      _forward_output: torch.Tensor,
  ):
      if (
          not requires_grad(module)
          or not module.training
          or not torch.is_grad_enabled()
      ):
          return
  
      if not self.hooks_enabled:
          return
  
      if not hasattr(module, "activations"):
          module.activations = []
      module.activations.append(
          [t.detach() for t in forward_input]
      )  # pyre-ignore
  
      for _, p in trainable_parameters(module):
          p._forward_counter += 1
  
imports: from __future__ import annotations
  import logging
  import warnings
  from functools import partial
  from typing import Iterable, List, Tuple
  import torch
  import torch.nn
  from opacus.grad_sample.functorch import ft_compute_per_sample_gradient, prepare_layer
  from opacus.grad_sample.gsm_base import AbstractGradSampleModule
  from opacus.layers.dp_rnn import DPGRU, DPLSTM, DPRNN, RNNLinear
  from opacus.utils.module_utils import has_trainable_params, requires_grad, trainable_modules, trainable_parameters
label_desc: Use image node_id 9 for calling the GradSampleModule obj's underlying member method code with example usage: obj.capture_activations_hook(module, forward_input, _forward_output) without return types