
    9i                        S SK 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\R                  " \R                  S
9 " S S\
5      5       r\R                  " \R                   S
9 " S S\5      5       rg)    N)	clip_grad)Hooks)
OutputKeys)HOOKS)Hook)Priorityc                   6    \ rS rSrS rS rS r\S 5       rSr	g)OptimizerProcessor   c                 8    UR                   R                  5         g)zjInitialize the optimizer.

This is a strategic function which can be registered by other hook's function.
N)	optimizer	zero_gradselftrainers     h/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/trainers/hooks/optimizer/base.pyinitialize_optimizer'OptimizerProcessor.initialize_optimizer   s    
 	##%    c                     g N r   s     r   before_forward!OptimizerProcessor.before_forward   s    r   c                 z   U H7  nUR                   U==   U-  ss'   UR                   U   R                  5         M9     [        R                  " X5      (       ac  Ub+  U R                  " UR
                  R                  5       40 UD6  UR                  R                  5         UR                  R                  5         gg)aw  Do module backward, optimizer's step and zero_grad and clip the grads.

This is a strategic function which can be registered by other hook's function.

Args:
    trainer(`EpochBasedTrainer`): The trainer instance.
    loss_keys(`list`): The list of loss keys.
    cumulative_iters(`int`): The cumulative iters for gradients.
    grad_clip(`dict`): The grad clipping options.
N)
train_outputsbackwardr   every_n_iters
clip_gradsmodel
parametersr   stepr   )r   r   	loss_keyscumulative_iters	grad_clipks         r   r   OptimizerProcessor.backward   s     A!!!$(88$!!!$--/  g88$ 8 8 :HiH""$'') 9r   c                 |    [        [        S U 5      5      n [        U 5      S:  a  [        R                  " U 40 UD6$ g )Nc                 D    U R                   =(       a    U R                  S L$ r   )requires_gradgrad)ps    r   <lambda>/OptimizerProcessor.clip_grads.<locals>.<lambda>2   s    Q__Ct1CCr   r   )listfilterlenr   clip_grad_norm_)params	clip_argss     r   r   OptimizerProcessor.clip_grads/   s>    CVLNv;?,,VAyAA r   r   N)
__name__
__module____qualname____firstlineno__r   r   r   staticmethodr   __static_attributes__r   r   r   r
   r
      s'    &*, B Br   r
   )module_namec                   r    \ rS rSrSr\R                  rSS\R                  4 SS jjr
S rS rS rS	 rS
rg)OptimizerHook7   a  Optimizer hook

Args:
    cumulative_iters (int): interval of gradients accumulation. Default: 1
    grad_clip (dict): Default None. Containing keys:
        max_norm (float or int): max norm of the gradients
        norm_type (float or int): type of the used p-norm. Can be ``'inf'`` for infinity norm.
        More details please refer to `torch.nn.utils.clip_grad.clip_grad_norm_`
    loss_keys (str | list): keys list of loss
   Nc                     [        U[        5      (       a  U/n[        U[        [        45      (       d   eX0l        Xl        X l        [        5       U l        g r   )	
isinstancestrtupler/   r#   r$   r%   r
   	processor)r   r$   r%   r#   kwargss        r   __init__OptimizerHook.__init__F   sI    
 i%%"I)eT]3333" 0"+-r   c                     Xl         g r   )rE   )r   rE   s     r   set_processorOptimizerHook.set_processorS   s    "r   c                 \    U R                   Ul         U R                  R                  U5        g r   )r$   rE   r   r   s     r   
before_runOptimizerHook.before_runV   s"    #'#8#8 ++G4r   c                 :    U R                   R                  U5        g r   )rE   r   r   s     r   before_train_iterOptimizerHook.before_train_iterZ   s    %%g.r   c                 z    U R                   R                  XR                  U R                  U R                  5        g r   )rE   r   r#   r$   r%   r   s     r   after_train_iterOptimizerHook.after_train_iter]   s)    9N9N $	0r   )r$   r%   r#   rE   )returnN)r6   r7   r8   r9   __doc__r   ABOVE_NORMALPRIORITYr   LOSSrG   rJ   rM   rP   rS   r;   r   r   r   r>   r>   7   sF    	 $$H #$%??. #	.#5/0r   r>   c                   8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )NoneOptimizerHookb   c                 4   > [         [        U ]  X#S9  Xl        g )N)r%   r#   )superr[   rG   r$   )r   r$   r%   r#   	__class__s       r   rG   NoneOptimizerHook.__init__e   s!    / 	0 	6 0r   c                     g r   r   r   s     r   rM   NoneOptimizerHook.before_runk       r   c                     g r   r   r   s     r   rS   "NoneOptimizerHook.after_train_itern   rc   r   )r$   )r@   Nloss)	r6   r7   r8   r9   rG   rM   rS   r;   __classcell__)r_   s   @r   r[   r[   b   s    1 r   r[   )loggingtorch.nn.utilsr   modelscope.metainfor   modelscope.outputsr   !modelscope.trainers.hooks.builderr   modelscope.trainers.hooks.hookr   "modelscope.trainers.hooks.priorityr   r
   register_moduler>   r[   r   r   r   <module>rp      s     $ % ) 3 / 7'B 'BT 5#6#67'0D '0 8'0T 5#:#:;  <r   