o
    *j                     @   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   t/var/www/html/Deteccion_Ine/venv/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   )Zrequires_grad).0pr   r   r   
<listcomp>[   s    z+SparsityHook.before_run.<locals>.<listcomp>) torchutilsr!   r"   r   Zwork_dirlenr
   modelr   r   r   r   r   r   r#   Znamed_modulesrange	optimizerZparam_groups
isinstanceequalZhalfweightdataappendextend
parametersZadd_param_groupZiters_per_epochZ_max_epochsr   )r   trainerr(   r!   r"   cmnamemoduleiZnew_train_paramsparamZ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)   r=   r>   r   r   r   r   r   r   r   r+   r   r#   info)r   r5   r=   r>   Z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)   rB   r+   r#   _save_checkpoint)r   r5   rB   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#   r@   ospathjoinr   r   r+   r-   )r   r5   Zcur_save_namer   r   r   rC   ~   s   zSparsityHook._save_checkpoint)__name__
__module____qualname__r   ZHIGHESTZPRIORITYr    r<   rA   rD   rC   r   r   r   r   r	      s    =r	   )rE   Zmodelscope.metainfor   Z!modelscope.trainers.hooks.builderr   Zmodelscope.trainers.hooks.hookr   Z"modelscope.trainers.hooks.priorityr   Zmodelscope.utils.checkpointr   Zmodelscope.utils.torch_utilsr   Zregister_moduler	   r   r   r   r   <module>   s   