o
    ॵi                     @   s   d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZd dl	m
Z
mZ d dlmZ e Zdd Zdd Zd	ejjd
edefddZd	ejjd
edefddZdS )    N)copyfile)load_checkpointsave_checkpoint)
get_loggerc                 C   s   t dd |  D S )Nc                 s   s    | ]
}|j r| V  qd S )N)requires_gradnumel).0p r
   c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/audio/kws_utils/model_utils.py	<genexpr>   s    z#count_parameters.<locals>.<genexpr>)sum
parameters)modelr
   r
   r   count_parameters   s   r   c               	      s  |  dd d usJ d| d }|  dd d usJ d| d  |  dd}|  dd}|  d	d}|  d
d}g }|rtd }|D ];}t|d,}	tj|	tjd}
t||
 |
d }|
d }||krr||krr|||gg7 }W d    n1 s|w   Y  qFt	|}t
|d d df }|| d d d }tdt|d |df   tdt|d |df tj   fdd|d |df D }ntd }t|tjjd}|| d  }t| d }|t|krtdt|| td|d  |d g}|D ]0}td| tj|tdd}|d u r+|}q| D ]}||  || 7  < q/q| D ]}|| d urXt|| t|||< qCtd| t|| |S ) N	dst_modelz6Please config param: dst_model, to save averaged modelsrc_pathzAPlease config param: src_path, path of checkpoints to be averagedval_bestTrueavg_num   	min_epoch	max_epochi   z{}/[!config]*.yamlr)Loadercv_lossepoch   zbest val scores = zselected epochs = r   c                    s   g | ]} d  t| qS )z/{}.pt)formatint)r   r   r   r
   r   
<listcomp>;   s    z!average_model.<locals>.<listcomp>z{}/[!avg][!final]*.pt)keyz8insufficient epochs for averaging, exist num:{}, need:{}zselect epoch on best val:{}zProcessing {}cpu)map_locationzSaving to {})getglobr   openyamlload
FullLoaderprintnparrayargsortloggerinfostrastypeint64sortedospathgetmtimelentorchdevicekeystrue_dividesave)kwargsr   r   r   r   r   
val_scoresyamlsyfdic_yamllossr   sort_idxsorted_val_scores	path_listavgr7   stateskr
   r!   r   average_model   s   





rL   r   network_file	model_dirc                 C   sx   t |tj|d t||  tj|d}t|ddd}|  }|| W d    n1 s1w   Y  |  |S )Nzorigin.torch.ptconvert.kaldi.txtwutf8encoding)	r   r6   r7   joinr   r(   to_kaldi_netwriteclose)r   rM   rN   
kaldi_textfout	nnet_despr
   r
   r   convert_to_kaldic   s   
r[   c                 C   s   t | }td| t|tj|d | | tj|d}t	| |d d d d td tj|d}t
|ddd	}|  }|| W d    n1 sRw   Y  |  |S )
Nzthe number of model params: {}zorigin.kaldi.txtzconvert.torch.ptFz1convert torch format back to kaldi for recheck...rO   rP   rQ   rR   )r   r0   r1   r   r   r6   r7   rT   to_pytorch_netr   r(   rU   rV   rW   )r   rM   rN   
num_paramssave_model_pathrX   rY   rZ   r
   r
   r   convert_to_pytorcht   s   

r_   )r'   r6   reshutilr   numpyr-   r:   r)   modelscope.utils.checkpointr   r   modelscope.utils.loggerr   r0   r   rL   nnModuler2   r[   r_   r
   r
   r
   r   <module>   s4   L
