class_docstr: Starts with a linear warmup lr schedule until it reaches N epochs and a flat lr schedule
  until it reaches M epochs then applies the specific scheduler (For example: ReduceLROnPlateau).
  
  Args:
      optimizer (:class:`torch.optim.Optimizer`): Wrapped optimizer.
      warmup_epochs (int): Number of epochs to linearly warmup lr until starting applying the scheduler.
      delay_epochs (int): Number of epochs to keep the initial lr until starting applying the scheduler.
      after_scheduler (:class:`torch.optim.lr_scheduler`): After target_epoch, use this scheduler.
      last_epoch (int, optional): The index of last epoch, defaults to -1. When last_epoch=-1,
          the schedule is started from the beginning or When last_epoch=-1, sets initial lr as lr.
code: def step(self, epoch=None):
      if self.finished:
          if epoch is None:
              self.after_scheduler.step(None)
              self._last_lr = self.after_scheduler.get_last_lr()
          else:
              self.after_scheduler.step(epoch - self.warmup_epochs)
              self._last_lr = self.after_scheduler.get_last_lr()
      else:
          return super().step(epoch)
  
imports: import torch
  from packaging.version import Version
label_desc: Use image node_id 4 for calling the WarmupDelayerScheduler obj's underlying member method code with example usage: obj.step(epoch) and returns: super