class_docstr: Learning Rate configuration
  
  Args:
      base_lr (float): base learning rate
      schedulers (list): learning rate schedulers
class_docstr_tok: ["Learning","Rate","configuration","Args",":","base_lr","(","float",")",":","base","learning","rate","schedulers","(","list",")",":","learning","rate","schedulers"]
code: def __call__(self, step_per_epoch):
      assert len(self.schedulers) >= 1
      if not self.schedulers[0].use_warmup:
          return self.schedulers[0](
              base_lr=self.base_lr, step_per_epoch=step_per_epoch
          )
  
      # TODO: split warmup & decay
      # warmup
      boundary, value = self.schedulers[1](self.base_lr, step_per_epoch)
      # decay
      decay_lr = self.schedulers[0](
          self.base_lr, boundary, value, step_per_epoch
      )
      return decay_lr
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import sys
  import math
  import paddle
  import paddle.nn
  import paddle.optimizer
  import paddle.regularizer
  from ppdet.core.workspace import register, serializable
  import copy
  from .adamw import AdamWDL, build_adamwdl
  from ppdet.utils.logger import setup_logger
label_desc: Use image node_id 2 for calling the LearningRate obj's underlying member method code with example usage: obj.__call__(step_per_epoch) and returns: decay_lr, self