o
    ॵi                     @   s   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 ddl
mZ ddlmZ dd	lmZ G d
d dZG dd dZejejdG dd deZG dd deZejejdG dd deZejejdG dd deZdS )    )Hooks)build_lr_scheduler)LogKeys)
get_logger)	is_master   )HOOKS)Hook)Priorityc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )LrSchedulerProcessorc                 C   s   d | _ d | _d S N)lr_strategywarmup_lr_scheduler)self r   _/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/lr_scheduler_hook.py__init__   s   
zLrSchedulerProcessor.__init__c                 C   
   || _ d S r   )r   )r   r   r   r   r   set_lr_strategy      
z$LrSchedulerProcessor.set_lr_strategyc                 C   r   r   )r   )r   r   r   r   r   set_warmup_lr_scheduler   r   z,LrSchedulerProcessor.set_warmup_lr_schedulerc                 C   s   dS )z}Initialize the lr scheduler.

        This is a strategic function which can be registered by other hook's function.
        Nr   r   trainerr   r   r   initialize_lr_scheduler   s   z,LrSchedulerProcessor.initialize_lr_schedulerc                 C   s&   | j dur| j   dS |j  dS )zxDo lr scheduler's step.

        This is a strategic function which can be registered by other hook's function.
        N)r   steplr_schedulerr   r   r   r   r       s   
zLrSchedulerProcessor.stepc                 C   st   dd l }t|j|jjrdd |jjD }|S t|jtr6t }|j D ]\}}dd |jD ||< q%|S td)Nr   c                 S      g | ]}|d  qS lrr   .0groupr   r   r   
<listcomp>.       z7LrSchedulerProcessor.get_current_lr.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r   r"   2   r#   z6lr is not applicable because optimizer does not exist.)	torch
isinstance	optimizeroptim	Optimizerparam_groupsdictitemsRuntimeError)r   r   r$   r   namer'   r   r   r   get_current_lr*   s   z#LrSchedulerProcessor.get_current_lrN)	__name__
__module____qualname__r   r   r   r   r   r.   r   r   r   r   r      s    
r   c                   @   s   e Zd ZdZdZdZdS )
LrStrategyby_epochby_stepnoN)r/   r0   r1   r3   r4   r5   r   r   r   r   r2   9   s    r2   )module_namec                       sb   e Zd ZdZejZejdf	d fddZ	dd Z
dd	 Zd
d Zdd Zdd Zdd Z  ZS )LrSchedulerHookzxLr scheduler.

    Args:
        by_epoch (bool): Whether lr changes by epoch
        warmup (dict): warm up config
    Nreturnc                    sH   t    d|v r|d rtjntj| _n|| _|| _d | _t | _	d S )Nr3   )
superr   r2   r3   r4   r   warmupr   r   	processor)r   r   r:   kwargs	__class__r   r   r   I   s   

zLrSchedulerHook.__init__c                 C   r   r   )r;   )r   r;   r   r   r   set_processorW   r   zLrSchedulerHook.set_processorc                 C   sf   | j | j | jd ur+t| jtrd| jv sJ t| jd|jid| _| j 	| j | j 
| d S )Ntypebase_scheduler)cfgdefault_args)r;   r   r   r:   r%   r*   r   r   r   r   r   r   r   r   r   
before_runZ   s   
zLrSchedulerHook.before_runc                 C   sF   | j tjkr|jt|ddd kr| j| | ||jj	t
j< d S )Ncumulative_itersr   )r   r2   r4   itergetattrr;   r   _get_log_lr
log_bufferoutputr   LRr   r   r   r   after_train_itere   s   z LrSchedulerHook.after_train_iterc                 C   s   |  ||jjtj< d S r   )rH   rI   rJ   r   rK   r   r   r   r   before_train_epochk   s   z"LrSchedulerHook.before_train_epochc                 C   s    | j tjkr| j| d S d S r   )r   r2   r3   r;   r   r   r   r   r   after_train_epochn   s   z!LrSchedulerHook.after_train_epochc                 C   s|   t | ds	t | _| j|}t|tr|d }|S t|ts!J i }| D ]\}}t|ts2J |||d i q'|S )Nr;   r   )	hasattrr   r;   r.   r%   listr*   r+   update)r   r   cur_lrr   klr_r   r   r   rH   r   s   

zLrSchedulerHook._get_log_lrr8   N)r/   r0   r1   __doc__r
   LOWPRIORITYr2   r3   r   r?   rD   rL   rM   rN   rH   __classcell__r   r   r=   r   r7   ?   s    r7   c                       s$   e Zd Z fddZdd Z  ZS )PlateauLrSchedulerProcessorc                       t    || _d S r   r9   r   
metric_key)r   r]   r=   r   r   r         

z$PlateauLrSchedulerProcessor.__init__c                 C   sp   |j d u rt rtd|j d d S |j | j }| jtjkr6| jd ur-| jj	|d d S |j
j	|d d S d S )NzCurrent epoch z< has no evaluation metric values, skip lr_scheduler.step() !)metrics)metric_valuesr   printepochr]   r   r2   r3   r   r   r   )r   r   r_   r   r   r   r      s   

z PlateauLrSchedulerProcessor.step)r/   r0   r1   r   r   rY   r   r   r=   r   rZ      s    rZ   c                       s6   e Zd ZdZejZ fddZdd Zdd Z	  Z
S )PlateauLrSchedulerHookzLr 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                    r[   r   r\   )r   r]   r<   r=   r   r   r      r^   zPlateauLrSchedulerHook.__init__c                 C   sP   | t}t|dkr$t|d jtd tfv r&|d t| j d S d S d S )Nr   )	get_hookr7   lenr@   r;   r   r?   rZ   r]   )r   r   lr_scheduler_hookr   r   r   register_processor   s   
z)PlateauLrSchedulerHook.register_processorc                 C   s"   t |dst | _d S |j| _d S )Nlogger)rO   r   rh   r   r   r   r   rD      s   
z!PlateauLrSchedulerHook.before_run)r/   r0   r1   rV   r
   rW   rX   r   rg   rD   rY   r   r   r=   r   rc      s    rc   c                       s6   e Zd ZejZd
d fddZdd Zdd	 Z  Z	S )NoneLrSchedulerHookTNr8   c                    s   t  j||d d S )N)r3   r:   )r9   r   )r   r3   r:   r=   r   r   r      s   zNoneLrSchedulerHook.__init__c                 C      d S r   r   r   r   r   r   rD         zNoneLrSchedulerHook.before_runc                 C   rj   r   r   r   r   r   r   rN      rk   z%NoneLrSchedulerHook.after_train_epoch)TNrU   )
r/   r0   r1   r
   rW   rX   r   rD   rN   rY   r   r   r=   r   ri      s
    ri   N)modelscope.metainfor   'modelscope.trainers.lrscheduler.builderr   modelscope.utils.constantr   modelscope.utils.loggerr   modelscope.utils.torch_utilsr   builderr   hookr	   priorityr
   r   r2   register_moduler7   rZ   rc   ri   r   r   r   r   <module>   s"   ,D