code: def on_train_batch_end(
      self, trainer: pl.Trainer, pl_module, outputs, batch, batch_idx
  ):
      # pl_module.max_steps is "original" max steps without trainer extra steps.
      if (trainer.global_step + 1) % 3 == 0 and (
          trainer.global_step + 1
      ) < pl_module.max_steps:
          schedulers = trainer.lr_scheduler_configs
  
          for scheduler in schedulers:
              # Decrement the counter by 2, then perform a scheduler.step() to perform a no-up
              # as well as update the optimizer lr in all param groups
              scheduler.scheduler.last_epoch -= 2
              scheduler.scheduler.step()
  
          # Increase the max step count by 1
          trainer.fit_loop.epoch_loop.max_steps = (
              trainer.fit_loop.epoch_loop.max_steps + 1
          )
  
imports: import math
  import random
  import omegaconf
  import pytest
  import pytorch_lightning
  import torch
  import torch.optim
  from pytorch_lightning.utilities import rank_zero_only
  from nemo.core import config, optim
  from nemo.core.optim.lr_scheduler import AVAILABLE_SCHEDULERS
  from nemo.core.optim.optimizers import AVAILABLE_OPTIMIZERS
  from nemo.utils import logging
label_desc: Use image node_id 1 for calling the SchedulerNoOpCallback obj's underlying member method code with example usage: obj.on_train_batch_end(trainer, pl_module, outputs, batch, batch_idx) without return types