
    9i                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  SSK
Jr  SSKJr  SS	KJr   " S
 S5      r " S S5      r\R$                  " \R&                  S9 " S S\5      5       r " S S\5      r\R$                  " \R*                  S9 " S S\5      5       r\R$                  " \R,                  S9 " S S\5      5       rg)    )Hooks)build_lr_scheduler)LogKeys)
get_logger)	is_master   )HOOKS)Hook)Priorityc                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
LrSchedulerProcessor   c                      S U l         S U l        g Nlr_strategywarmup_lr_scheduler)selfs    k/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/trainers/hooks/lr_scheduler_hook.py__init__LrSchedulerProcessor.__init__   s    #'     c                     Xl         g r   )r   )r   r   s     r   set_lr_strategy$LrSchedulerProcessor.set_lr_strategy   s    &r   c                     Xl         g r   )r   )r   r   s     r   set_warmup_lr_scheduler,LrSchedulerProcessor.set_warmup_lr_scheduler   s    #6 r   c                     g)zmInitialize the lr scheduler.

This is a strategic function which can be registered by other hook's function.
N r   trainers     r   initialize_lr_scheduler,LrSchedulerProcessor.initialize_lr_scheduler   s    
 	r   c                     U R                   b  U R                   R                  5         gUR                  R                  5         g)zhDo lr scheduler's step.

This is a strategic function which can be registered by other hook's function.
N)r   steplr_schedulerr!   s     r   r&   LrSchedulerProcessor.step    s4    
 ##/$$))+  %%'r   c                    SS K n[        UR                  UR                  R                  5      (       a*  UR                  R
                   Vs/ s H  o3S   PM	     nnU$ [        UR                  [        5      (       aP  [        5       nUR                  R                  5        H&  u  pVUR
                   Vs/ s H  o3S   PM	     snXE'   M(     U$ [        S5      es  snf s  snf )Nr   lrz6lr is not applicable because optimizer does not exist.)	torch
isinstance	optimizeroptim	Optimizerparam_groupsdictitemsRuntimeError)r   r"   r+   groupr*   namer.   s          r   get_current_lr#LrSchedulerProcessor.get_current_lr*   s    g'')>)>??+2+<+<+I+IJ+I%++IBJ 	 ))400B&006685:5G5GH5GE$K5GH  9
 	 HJ J K Is   C4Cr   N)__name__
__module____qualname____firstlineno__r   r   r   r#   r&   r6   __static_attributes__r    r   r   r   r      s     ('7(r   r   c                        \ rS rSrSrSrSrSrg)
LrStrategy9   by_epochby_stepnor    N)r8   r9   r:   r;   r@   rA   rB   r<   r    r   r   r>   r>   9   s    HG	Br   r>   )module_namec                      ^  \ rS rSrSr\R                  r\R                  S4 SU 4S jjjr
S rS rS rS rS	 rS
 rSrU =r$ )LrSchedulerHook?   zhLr scheduler.

Args:
    by_epoch (bool): Whether lr changes by epoch
    warmup (dict): warm up config
Nc                    > [         TU ]  5         SU;   a0  US   (       a  [        R                  O[        R                  U l        OXl        X l        S U l        [        5       U l	        g )Nr@   )
superr   r>   r@   rA   r   warmupr   r   	processor)r   r   rI   kwargs	__class__s       r   r   LrSchedulerHook.__init__I   s[     	6<7z22!+!3!3   +#' -/r   c                     Xl         g r   )rJ   )r   rJ   s     r   set_processorLrSchedulerHook.set_processorW   s    "r   c                    U R                   R                  U R                  5        U R                  b{  [	        U R                  [
        5      (       a  SU R                  ;   d   e[        U R                  SUR                  0S9U l        U R                   R                  U R                  5        U R                   R                  U5        g )Ntypebase_scheduler)cfgdefault_args)rJ   r   r   rI   r,   r1   r   r'   r   r   r#   r!   s     r   
before_runLrSchedulerHook.before_runZ   s    &&t'7'78;;"dkk400Vt{{5JJJ'9KK.0D0DE(GD$ NN2243K3KL..w7r   c                    U R                   [        R                  :X  a9  UR                  [	        USS5      S-
  :  a  U R
                  R                  U5        U R                  U5      UR                  R                  [        R                  '   g )Ncumulative_itersr   )r   r>   rA   itergetattrrJ   r&   _get_log_lr
log_bufferoutputr   LRr!   s     r   after_train_iter LrSchedulerHook.after_train_itere   sq    z111gllg+QG023G4 74NN(040@0@0I!!'**-r   c                 p    U R                  U5      UR                  R                  [        R                  '   g r   )r\   r]   r^   r   r_   r!   s     r   before_train_epoch"LrSchedulerHook.before_train_epochk   s'    040@0@0I!!'**-r   c                 x    U R                   [        R                  :X  a  U R                  R	                  U5        g g r   )r   r>   r@   rJ   r&   r!   s     r   after_train_epoch!LrSchedulerHook.after_train_epochn   s-    z222NN( 3r   c                 p   [        U S5      (       d  [        5       U l        U R                  R                  U5      n[	        U[
        5      (       a  US   nU$ [	        U[        5      (       d   e0 nUR                  5        H1  u  pE[	        U[
        5      (       d   eUR                  XES   05        M3     U$ )NrJ   r   )	hasattrr   rJ   r6   r,   listr1   r2   update)r   r"   cur_lrr*   klr_s         r   r\   LrSchedulerHook._get_log_lrr   s    t[))13DN..w7fd##B 	 fd++++B ,,.!#t,,,,		1!f+& ) 	r   )r   rJ   rI   r   returnN)r8   r9   r:   r;   __doc__r   LOWPRIORITYr>   r@   r   rO   rV   r`   rc   rf   r\   r<   __classcell__rL   s   @r   rE   rE   ?   sZ     ||H (000 #0 0#	8JJ) r   rE   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )PlateauLrSchedulerProcessor   c                 .   > [         TU ]  5         Xl        g r   rH   r   
metric_key)r   r|   rL   s     r   r   $PlateauLrSchedulerProcessor.__init__       $r   c                 `   UR                   c)  [        5       (       a  [        SUR                   S35        g UR                   U R                     nU R
                  [        R                  :X  aA  U R                  b  U R                  R                  US9  g UR                  R                  US9  g g )NzCurrent epoch z< has no evaluation metric values, skip lr_scheduler.step() !)metrics)metric_valuesr   printepochr|   r   r>   r@   r   r&   r'   )r   r"   r   s      r   r&    PlateauLrSchedulerProcessor.step   s      ({{$W]]O3op ''8z222''3((--g->$$))'):	 3r   )r|   )r8   r9   r:   r;   r   r&   r<   ru   rv   s   @r   rx   rx      s    %; ;r   rx   c                   P   ^  \ rS rSrSr\R                  rU 4S jrS r	S r
SrU =r$ )PlateauLrSchedulerHook   zLr scheduler hook for `ReduceLROnPlateau`.

Args:
    metric_key (str): Metric key returned from `trainer.metric_values`,
        get the value of metric key and pass it to `ReduceLROnPlateau.step`.
c                 .   > [         TU ]  5         Xl        g r   r{   )r   r|   rK   rL   s      r   r   PlateauLrSchedulerHook.__init__   r~   r   c                     UR                  [        5      n[        U5      S:  aT  [        US   R                  5      [        S 5      [
        4;   a(  US   R                  [        U R                  5      5        g g g )Nr   )	get_hookrE   lenrR   rJ   r   rO   rx   r|   )r   r"   lr_scheduler_hooks      r   register_processor)PlateauLrSchedulerHook.register_processor   sv    #,,_= !A%$!!$..+048J4H4J+J a ..+DOO<>+J%r   c                 h    [        US5      (       d  [        5       U l        g UR                  U l        g )Nlogger)ri   r   r   r!   s     r   rV   !PlateauLrSchedulerHook.before_run   s#    w))$,DK!..DKr   )r   r|   )r8   r9   r:   r;   rr   r   rs   rt   r   r   rV   r<   ru   rv   s   @r   r   r      s'     ||H%>) )r   r   c                   T   ^  \ rS rSr\R
                  rSSU 4S jjjrS rS r	Sr
U =r$ )NoneLrSchedulerHook   c                     > [         TU ]  XS9  g )N)r@   rI   )rH   r   )r   r@   rI   rL   s      r   r   NoneLrSchedulerHook.__init__   s    (:r   c                     g r   r    r!   s     r   rV   NoneLrSchedulerHook.before_run       r   c                     g r   r    r!   s     r   rf   %NoneLrSchedulerHook.after_train_epoch   r   r   r    )TNrp   )r8   r9   r:   r;   r   rs   rt   r   rV   rf   r<   ru   rv   s   @r   r   r      s'     ||H; ; r   r   N)modelscope.metainfor   'modelscope.trainers.lrscheduler.builderr   modelscope.utils.constantr   modelscope.utils.loggerr   modelscope.utils.torch_utilsr   builderr	   hookr
   priorityr   r   r>   register_modulerE   rx   r   r   r    r   r   <module>r      s    & F - . 2   ) )X  5#8#89Ad A :AH;"6 ;. 5#?#?@)T ) A)8 5#<#<=/  >r   