class_docstr: To use Apex's DistributedFusedAdam, we need to shard the optimizer states when
  saving/loading checkpoints.
code: def precision_plugin(
      self, precision_plugin: Optional[PrecisionPlugin]
  ) -> None:
      self._precision_plugin = precision_plugin
      # https://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance
      self._precision_plugin.optimizer_step = types.MethodType(
          DistAdamNativeMixedPrecisionPlugin.optimizer_step,
          self._precision_plugin,
      )
      self._precision_plugin.clip_grad_by_norm = types.MethodType(
          DistAdamNativeMixedPrecisionPlugin.clip_grad_by_norm,
          self._precision_plugin,
      )
  
imports: from typing import Any, Callable, Dict, List, Optional, Union
  from pathlib import Path
  import types
  import torch
  from torch.optim.optimizer import Optimizer
  from torch.optim import LBFGS
  from apex.contrib.optimizers.distributed_fused_adam import DistributedFusedAdam
  from pytorch_lightning.strategies.ddp import DDPStrategy
  from pytorch_lightning.plugins.precision import PrecisionPlugin, NativeMixedPrecisionPlugin
  from pytorch_lightning.core.optimizer import LightningOptimizer
  from pytorch_lightning.utilities.exceptions import MisconfigurationException
label_desc: Use image node_id 3 for calling the DDPStrategyZero2 obj's underlying member method code with example usage: obj.precision_plugin(precision_plugin) without return types