o
    ॵi                     @   sr   d dl 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 ejejdG d	d
 d
eZdS )    N)Hooks)HOOKS)Hook)Priority)save_checkpoint)	is_master)module_namec                   @   s@   e Zd ZejZi dfddZdd Zdd Zdd	 Z	d
d Z
dS )SparsityHookNc                 C   s   || _ || _|dg | _|dd| _|dd| _|dd| _|dd| _|dd| _d	| _	d	| _
|d
d| _|dd| _|dd| _|dd| _|dd| _d S )Ncompress_moduleweight_rank   weight_beta   	mask_rankmask_alpha1mask_alpha2r   	frequencyinitial_warmupg?final_warmupg333333?initial_sparsityg        final_sparsity)pruning_methodsave_dirgetr
   r   r   r   r   r   step
total_stepr   r   r   r   r   )selfr   configr    r   g/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/compression/sparsity_hook.py__init__   s   zSparsityHook.__init__c                 C   s  dd l }ddlm}m} | jd u r|j| _t| jdkr1||j| j	| j
| j| j| j| j|jd n(| jD ]$}|j D ]\}}||krDq;||| j	| j
| j| j| j| j|jd q;q4tt|jjD ]?}g }	|jj| d D ]*}
d}|j D ]\}}t||r||
 |jj rd} nqv|s|	|
 qm|	|jj| d< qag }|j D ]\}}t||r|dd	 | D  q|jd|i |j|j | _d S )
Nr   r   )SparseLinearconvert_sparse_network)r   r   r   r   r   r   loggerparamsFTc                 S   s   g | ]}|j r|qS r   )requires_grad).0pr   r   r   
<listcomp>[   s    z+SparsityHook.before_run.<locals>.<listcomp>) torchutilsr!   r"   r   work_dirlenr
   modelr   r   r   r   r   r   r#   named_modulesrange	optimizerparam_groups
isinstanceequalhalfweightdataappendextend
parametersadd_param_groupiters_per_epoch_max_epochsr   )r   trainerr)   r!   r"   cmnamemoduleinew_train_paramsparamis_find
new_paramsr   r   r   
before_run$   sn   






zSparsityHook.before_runc                 C   sx   ddl m}m} || j| j| j| j| j| j| j	}||j
| t r3|jd| j d| j d|  |  jd7  _d S )Nr   )schedule_sparsity_ratioupdate_network_sparsityzStep[/z] current sparsity ratio = )r*   rG   rH   r   r   r   r   r   r   r   r-   r   r#   info)r   r=   rG   rH   cur_sparsityr   r   r   before_train_itera   s    
zSparsityHook.before_train_iterc                 C   s*   ddl m} ||j|jd | | d S )Nr   )generate_sparse_model)r#   )r*   rM   r-   r#   _save_checkpoint)r   r=   rM   r   r   r   	after_runw   s   zSparsityHook.after_runc                 C   s6   t  r	|jd tj| jd}t|j||j	 d S )Nz#Saving checkpoint at final compresszcompress_model.pth)
r   r#   rJ   ospathjoinr   r   r-   r0   )r   r=   cur_save_namer   r   r   rN   ~   s   zSparsityHook._save_checkpoint)__name__
__module____qualname__r   HIGHESTPRIORITYr    rF   rL   rO   rN   r   r   r   r   r	      s    =r	   )rP   modelscope.metainfor   !modelscope.trainers.hooks.builderr   modelscope.trainers.hooks.hookr   "modelscope.trainers.hooks.priorityr   modelscope.utils.checkpointr   modelscope.utils.torch_utilsr   register_moduler	   r   r   r   r   <module>   s   