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 iterate_submodules(
      self, module: nn.Module
  ) -> Iterable[nn.Module]:
      if has_trainable_params(module):
          yield module
  
      # Don't recurse if module is handled by functorch
      if (
          has_trainable_params(module)
          and type(module) not in self.GRAD_SAMPLERS
          and type(module) not in [DPRNN, DPLSTM, DPGRU]
      ):
          return
  
      for m in module.children():
          yield from self.iterate_submodules(m)
  
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 3 for calling the GradSampleModule obj's underlying member method code with example usage: obj.iterate_submodules(module) without return types