
    9i1V                        S SK r S SKrS SKrS SKrS SKJrJrJr  S SKrS SK	J
r  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Jr  S S	KJr  S S
KJr  S SKJr  S SKJrJ r   S SK!J"r"  S SK#J$r$J%r%  S SK&J'r'  S SK(J)r)  S SK*J+r+  SSK,J-r-J.r.J/r/  SSK0J1r1  SSK2J3r3J4r4J5r5  SSK6J7r7J8r8J9r9  \)" 5       r:\Rv                  " \Rx                  S9 " S S\5      5       r=g)    N)CallableDictOptional)SummaryWriter)nn)optim)
DataLoader)Trainers)Model
TorchModel)kws_nearfield_dataset)BaseTrainer)TRAINERS)load_checkpointsave_checkpoint)Config)DEFAULT_MODEL_REVISION	ModelFile)create_device)
get_logger)set_random_seed   )executor_cvexecutor_testexecutor_train)compute_det)query_token_setread_lexicon
read_token)average_modelconvert_to_kaldicount_parameters)module_namec                      ^  \ rS rSrSS\4S\S\S\\   S\\   S\\   4
U 4S jjjrS	 r	S
\S\
\\4   4S jrS\R                  4S jrSS jrSS jrSrU =r$ )KWSNearfieldTrainer%   Nmodelwork_dircfg_filearg_parse_fnmodel_revisionc                 X  > [        U[        5      (       aR  U R                  X5      U l        Uc8  [        R
                  R                  U R                  [        R                  5      nO.Uc   S5       e[        R
                  R                  U5      U l        [        TU ]-  X45        [        R                  " U5      nSU l        UR                  R!                  SS5      U l        [%        UR!                  SS5      5        U R'                  5         X l        U R*                  S:X  af  [        R
                  R-                  U R(                  5      (       d   [        R.                  " U R(                  5        [0        R3                  S	U 35        [        R
                  R                  U R                  S
5      n[        R
                  R-                  U5      (       d
   U S35       e[5        U5      U l        [        R
                  R                  U R                  S5      n	[        R
                  R-                  U	5      (       d
   U	 S35       e[9        U	5      U l        [        R
                  R                  U R                  S5      n
[        R
                  R-                  U
5      (       d
   U
 S35       eXR<                  S'   Xpl        U R*                  S:X  a  [        R
                  R-                  U R(                  5      (       d   [        R.                  " U R(                  5        [        R
                  R                  U R(                  S5      n[A        US5       n[B        RD                  " URG                  5       5      nURI                  U5        SSS5        gg! , (       d  f       g= f)z
Args:
    model (str): model id in modelscope
    work_dir (str): main directory for training and evaluating
    cfg_file (str): config file for training and evaluating
    kwargs:
        seed (int): random seed
Nz?Config file should not be None if model is not from pretrained!pytorchdist_backendncclseedi  r   zCurrent working dir is ztrain/tokens.txtz is missingztrain/lexicon.txtz&train/feature_transform.txt.80dim-l2r2	cmvn_fileconfig.yamlw)%
isinstancestrget_or_download_model_dir	model_dirospathjoinr   CONFIGURATIONdirnamesuper__init__r   	from_filelaunchertraingetr.   r   	init_distr(   rankexistsmakedirsloggerinfor   token_tabler   lexicon_tabler'   configsopenyamldumpto_dictwrite)selfr'   r(   r)   r*   r+   kwargsrK   
token_filelexicon_filefeature_transform_filesaved_config_pathfoutdata	__class__s                 o/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/trainers/audio/kws_nearfield_trainer.pyr>   KWSNearfieldTrainer.__init__)   s    eS!!!;;'DN77<<(1(?(?A 'j)jj'WW__X6DN0""8,!#MM--nfE 	

63/0 99>77>>$--00DMM*KK1(<= WW\\$..2DE
ww~~j))Ej\+EE)%j1ww||DNN4GHww~~l++I~[-II+),7!#NND"Fww~~455 	3%&k2	35%;k" 99>77>>$--00DMM* "T]]M J'-yy!23

4  .-	  .-s   6N
N)c           
         UR                  SS5      nUb+  [        R                  R                  U5      (       a  X0l        O/[        R                  R                  U R                  S5      U l        UR                  SS5      U l        US   (       d   S5       eUS   (       d   S	5       eUS
   (       d   S5       eUS   U l        US   U l	        US
   U l
        UR                  SS5      =(       a    U R                  S:X  a  SOSU l        U R                  S   n[        R                  " U5      nSUS'   SUS'   SUS'   [        R                  R                  U R                   S5      n[        R                  R                  U R                   S5      n[#        U R                  U R                  X@R$                  U R&                  U R                  US5      U l        [#        U R                  U R                  XPR$                  U R&                  U R                  US5      U l        [-        U R(                  SUR                  SS5      U R                  R.                  R0                  R2                  U R                  R.                  R0                  R                  SS5      S9U l        [-        U R*                  SUR                  SS5      U R                  R6                  R0                  R2                  U R                  R6                  R0                  R                  SS5      S9U l        U R;                  U R                  5      U l        [?        U R<                  5      nU R                  S:X  a$  [@        RC                  SRE                  U5      5        U R                  b  [        R                  R                  U R                  5      (       a  [G        U R                  U R<                  5        [H        RJ                  " SSU R                  5      n	0 n
[        R                  R                  U	5      (       a9  [M        U	S5       n[N        RP                  " U[N        RR                  S9n
SSS5        OO[@        RC                  S5        0 n
U
R                  S S!5      S"-   U l*        U RT                  U R                  S#   S$'   U
R                  S%U R                  S#   S&   S%   5      nXR                  S#   S&   S%'   UR                  S'S(5      nU RV                  S":  a  S)U RX                   3n[[        U5      U l.        U RV                  S":  a  [^        R`                  Rc                  5       (       d   eU R<                  Re                  U R\                  5      U l        [^        Rf                  Rh                  Rk                  U R<                  5      U l        O*U R<                  Re                  U R\                  5      U l        U R                  S:X  a  [        R                  R                  U R                   5      (       d   [        Rl                  " U R                   5        [        R                  R                  U R                   S*5      n[M        US+5       n[N        Rn                  " U R                  Rq                  5       5      nURs                  U5        SSS5        [@        Ru                  S,5        SnU R                  S:X  a\  [        Rl                  " U R                   SS-9  [w        [        R                  R                  U R                   U R                  5      5      nU R                  S#   R                  S.S/5      nU R                  S#   S&   n[x        Rz                  " U R<                  R}                  5       US%   US0   S19n[x        R~                  R                  US2S3S4S5S6S79nSnU RT                  S:X  aU  U R                  S:X  aE  [        R                  R                  U R                   S85      n[        U R<                  USSSSS5        [@        Ru                  S,5        0 nUS9   US9'   UR                  S:S"5      US:'   UUS.'   U RV                  US;'   U R                  US<'   U RX                  US='   U R                  S#   S>   n[        R                  R                  5       n[        U RT                  U5       GH  nU R(                  R                  U5        UUS '   UR                  S   S%   n[@        Ru                  S?RE                  UU5      5        [        U R<                  UU R4                  U R\                  UU5        [        U R<                  U R8                  U R\                  U5      u  nn[@        Ru                  S@RE                  UUU5      5        U R                  S:X  a  [        R                  R                  U R                   SARE                  U5      5      n[        U R<                  USSSSS5        [H        RJ                  " SSU5      n	[        UUUSB9n[M        U	S+5       n[N        Rn                  " U5      nURs                  U5        SSS5        UR                  SCUU5        UR                  SDUU5        UnUR                  U5        GM     Ub   U R                  S:X  a  UR                  5         [        R                  R                  5       U-
  n[@        Ru                  SERE                  UR                  5       SF-  5      5        g! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       N= f)Ga%  
Args:
    kwargs:
        train_data (int): wave list with kaldi style for training
        cv_data (int): wave list with kaldi style for cross validation
        trans_data (str): transcription list with kaldi style, merge train and cv
        checkpoint (str): basemodel checkpoint, if None, default to use base.pt in model path
        tensorboard_dir (str): path to save tensorboard results,
                               create 'tensorboard_dir' in work_dir by default
        need_dump (bool): wether to dump data with mapping tokens or not

checkpointNztrain/base.pttensorboard_dirtensorboard
train_dataz'please config train data in dict kwargscv_dataz$please config cv data in dict kwargs
trans_dataz/please config transcription data in dict kwargs	need_dumpFr   Tpreprocessorspeed_perturbspec_augshufflezdump_train.txtzdump_cv.txt
pin_memoryprefetch   )
batch_sizerh   num_workersprefetch_factorzthe number of model params: {}z.pt$z.yamlr)Loaderz'Training with random initialized paramsepochr   rA   start_epochlr	optimizerdevicegpucuda:r2   r3   zStart training...)exist_oklog_interval
   weight_decay)rs   r{   ming      ?   gư>g{Gz?)modefactorpatiencemin_lr	thresholdzinit.pt	grad_clip
grad_accum
world_sizerD   
local_rank
max_epochszEpoch {} TRAIN info lr {}z0Epoch {} EVAL info cv_loss {:.6f}, cv_acc {:.2f}z{}.pt)rp   rs   cv_losszepoch/cv_losszepoch/lrTotal time spent: {:.2f} hours      @)NrB   r8   r9   rE   r]   r:   r7   r^   r`   ra   rb   rD   rc   rK   copydeepcopyr(   r   rI   rJ   train_dataset
cv_datasetr	   rA   
dataloaderworkers_per_gputrain_dataloader
evaluationcv_dataloaderbuild_modelr'   r"   rG   warningformatr   resubrL   rM   load
FullLoaderrr   r   r   r   train_devicetorchcudais_availabletor   parallelDistributedDataParallelrF   rN   rO   rP   rH   r   r   Adam
parameterslr_schedulerReduceLROnPlateaur   datetimenowrange	set_epochparam_groupsr   r   dict
add_scalarstepclosetotal_seconds) rQ   argsrR   train_checkpoint
train_confcv_confdump_train_filedump_cv_file
num_params	info_pathinfosfinlr_last_epochdevice_namerV   rW   rX   writerry   
optim_confrt   r   final_epochsave_model_pathtraining_config	max_epoch	totaltimerp   rs   r   cv_acc	info_dicts                                    rZ   rA   KWSNearfieldTrainer.traink   s&	    "::lD9'BGGNN;K,L,L.O ggll4>>?KDO%zz*;]K l#N%NN#i H"HH  	ML	M  .i( .  H-1YY!^T 	 \\.1
--
+#( #
"	'',,t}}6FGww||DMM=A2OOT__j:J:JG 0doo079I9I040B0B0404	6 !+zz,6**55EE LL..99==j!L!N (OOzz,6//::JJ LL33>>BBA  %%dll3
%djj1
99>NN;BB:NO ??&277>>$//+J+JDOOTZZ8vw@IEww~~i(()S)S IIc$//BE *) ) NNDEE 99Wb1A5/3/?/?Wm,		$"&,,w"7"DT"JL3@Wk*40 jj51??Q!$//!23K)+6??QJJ++--.-t'8'89DJ**BB4::NDJt'8'89DJ 99>77>>$--00DMM* "T]]M J'-yy!5!5!78

4  . 	'(99>KK5"T]]D,@,@ACF ||G,00D\\'*;7
JJJJ!!#$#N35	 ));; < 
 q TYY!^ ggll4==)DODJJtT!4) 	'('1+'>$(2|Q(G%*6'(,%"&))(,%LL),7	%%))+	4++Y7E((/',OG$''*40BKK3::5"EF4::y$2G2G,,foG)$**d6H6H*.*;*;_NOGVKKBII7F,- yyA~"$'',,t}}/6~~e/D#F

OT4 %t- FF67OD	 #	
 )S)T99Y/DJJt$ * !!/7EB!!*b%8Kg&E 8H "tyyA~LLN%%))+i7	4;;##%.0 	1k *)> .-P *)s%   >$m	A m(m+
m
m(+
m9	checkpoint_pathreturnc                    SU l         Ub@  [        R                  R                  U5      (       a  [        R                  SU 35        UnGO&U R                   c  UR                  SS5      n[        R                  R                  U R                  SU S35      U l         [        R                  SU R                    35        [        U R                   U R                  SUS	9n[        S:0 UD6U l         U R                  U R                  5      n[        UU R                   U R                  5      n[        R                  S
U 35        U R                   n[        R                  SU R                    35        UR                  SS5      b3  UR                  SS5      b   [        R                  S5        US   n	US   n
O-[        R                  S5        U R                  n	U R                  n
[        R                  SU	 35        [        R                  SU
 35        [         R"                  " U R                  S   5      nSUS   S'   SUS   S'   SUS'   SUS'   SUS'   UR                  SS5      b  US   US   S'   [%        XUU R&                  U R(                  SSS5      n[+        USUR                  SS5      SU R                  R,                  R.                  R0                  U R                  R,                  R.                  R                  S S!5      S"9nUR                  S#S5       c   S$5       eUS#   nUR3                  5       R5                  S%S5      R7                  S&5      n0 nS1nS'1nS'S0nU H  n[9        UU R&                  U R(                  5      u  nn0 UU'   UUU   S('   SR                  S) U 5       5      UU   S*'   U Vs/ s H  nUR;                  U5      PM       nU Vs/ s H  nUR;                  U5      PM       n[=        UU5       H   u  nnUR                  US5      b  M  UUU'   M"     M     SnUR?                  5        H  u  nnUU S+U S,3-  nM     [        R                  S-U 35        UR                  S.S/5      S:  =(       a    [@        RB                  RE                  5       nUR                  S0S15      nU RF                  S2:  a  U(       a  S3U RH                   3n[K        U5      U l&        U R                  U R                  5      U l'        [Q        X@RN                  5        U RN                  RS                  U RL                  5      U l'        0 nUR                  S4S5      b	  US4   US4'   OO[        R                  RU                  U5      n[        R                  R                  U R                  S5U-   5      US4'   US4   U l+        [        R                  R                  U RV                  5      (       d   [        RX                  " U RV                  5        [        R[                  S65        [\        R\                  R_                  5       n[a        U RN                  UU RL                  UUU5      n [\        R\                  R_                  5       U-
  n[        R[                  S7Rc                  URe                  5       S8-  5      5        [        UU	U
U S99n![g        S:0 U!D6n"[i        U"5        gs  snf s  snf );a
  
Args:
    checkpoint_path (str): evaluating with ckpt or default average ckpt
    kwargs:
        test_dir (str): local path for saving test results
        test_data (str): wave list with kaldi style
        trans_data (str): transcription list with kaldi style
        average_num (int): the NO. to do model averaging(checkpoint_path==None)
        batch_size (int): batch size during evaluating
        keywords (str): keyword string, split with ','
        gpu (int): evaluating with cpu/gpu: -1 for cpu; >=0 for gpu
Nz evaluating with specific model: average_numrz   avg_z.ptz!default average model not exist: T)	dst_modelsrc_pathval_bestavg_numz(average model convert to kaldi network: zevaluating with average model: 	test_datarb   z/evaluating with specific data and transcriptionz5evaluating with cross validation data during trainingztest data: ztrans data: rd   i  filter_conf
max_lengthr   
min_lengthFre   rf   rg   rk   
batch_conf rh   ri   rj   )rk   rh   persistent_workersrl   rm   keywordszat least one keyword is needed ,z<blk>token_idc              3   >   #    U  H  nS [        U5      -  v   M     g7f)z%s N)r5   ).0is     rZ   	<genexpr>/KWSNearfieldTrainer.evaluate.<locals>.<genexpr>  s!      ;MDKq <A3q6>DKs   	token_str(z) zToken set is: rv   rq   ru   cpur   rw   test_dirtest_zStart evaluating...r   r   )r   r   rb   
score_file )5avg_checkpointr8   r9   rE   rG   r   rB   r:   r(   r   r    r   rK   r!   ra   rb   r   r   r   rI   rJ   r	   r   r   r   stripreplacesplitr   addzipitemsr   r   r   r   r   r   test_device
test_modelr   r   basenamer   rF   rH   r   r   r   r   r   r   print)#rQ   r   r   rR   eval_checkpointr   
avg_kwargs	model_cvt	kaldi_cvtr   rb   	test_conftest_datasettest_dataloaderkeywords_strkeywords_listkeywords_tokenkeywords_idxsetkeywords_strsetkeywords_tokenmapkeywordstrsindexesr   txtidxtoken_printuse_cudar   testing_config	base_namer   r   
det_kwargsdet_resultss#                                      rZ   evaluateKWSNearfieldTrainer.evaluate-  sn     #&277>>/+J+JNN2?2CDF-O""* **]B7&(ggll4==59'#3F'H#78K8K7LMO!"11!]]!#	
 '4&Aj&A# ,,T\\:	,''MM	
 >ykJL #11ONN1$2E2E1FGI ::k4(4::lD)5NNLM{+I-JNNGIIJYK01j\23 MM$,,~">?	17	- .12	- .%*	/" %	*$	)::lD)54:<4HIl#L1,YI-1-=-=-1-?-?-24 %zz,6#//::JJ LL33>>BBA  zz* '+, 	N-M	N ,j)$**,44S"=CCCH#")$aL$G+GT5E5E,0,>,>@MD'&(N7#29N7#J/3577 ;MDK;M 4MN7#K0-12T_  #T2-45W_  #W5g.S$((d3;-0%c* / % )//1HCcU!C5++K 2}56
 ::eR(A-K%**2I2I2Kjj51??Q8!$//!23K(5**4<<89//,,T-=-=>::j$'3)/
);N:&((9I)+dmm6=	6I*KN:&&z2ww~~dmm,,KK& 	)*%%))+	"4??O#'#3#3^#2ND
 %%))+i7	4;;##%.0 	1 !!!	

 "/J/kk 35s    ['![,c                     [         R                  " U R                  USS9n[        U[        5      (       a  [        US5      (       a  UR                  $ [        U[        R                  5      (       a  U$ g)zInstantiate a pytorch model and return.

By default, we will create a model using config from configuration file. You can
override this method in a subclass.

T)cfg_dicttrainingr'   N)	r   from_pretrainedr7   r4   r   hasattrr'   r   Module)rQ   rK   r'   s      rZ   r   KWSNearfieldTrainer.build_model  s]     %%NNWt=eZ((WUG-D-D;;ryy))L *    c           	         [         R                  " SS 5      c  S[         R                  S'   [         R                  " SS 5      c  S[         R                  S'   [         R                  " SS 5      c  S[         R                  S'   [         R                  " SS 5      c  S[         R                  S'   [         R                  " SS 5      c  S	[         R                  S'   [        [         R                  S   5      U l        [        [         R                  S   5      U l        [        [         R                  S   5      U l        [         R                  S   U l        [         R                  S   U l        US
:X  a^  U R                  S
:  aM  [        R                  SR                  U R
                  5      5        [        R                  " U R                  SS9  O:US
:  a4  [        R                  " U R                  SS9  [        R                  " 5         [        R                  SR                  U R                  U R                  U R
                  U R                  U R                  5      5        g )NRANK0
LOCAL_RANK
WORLD_SIZE1MASTER_ADDR	localhostMASTER_PORT29500r   z'init dist on multiple gpus, this gpu {}zenv://)backendinit_methodz-RANK {}/{}/{}, Master addr:{}, Master port:{})r8   getenvenvironintrD   r   r   master_addrmaster_portrG   rH   r   distinit_process_groupr.   barrierrQ   train_nodess     rZ   rC   KWSNearfieldTrainer.init_dist  s   99VT"*!$BJJv99\4(0'*BJJ|$99\4(0'*BJJ|$99]D)1(3BJJ}%99]D)1(/BJJ}%

6*+	bjj67bjj67::m4::m4!"ELLOO% &'' --8E1_##))xALLNCJJOOTYY9I9I 	r  c                    US:X  aU  U R                   S:  aD  [        R                  SR                  U R                  5      5        [
        R                  " 5         g g US:  a+  [
        R                  " 5         [
        R                  " 5         g g )Nr   z*destory dist on multiple gpus, this gpu {})r   rG   rH   r   r   r$  destroy_process_groupr&  r'  s     rZ   uninit_distKWSNearfieldTrainer.uninit_dist  sm    !"@GG)* **,	 #
 1_LLN&&( r  )r   r]   rK   ra   r   r   r.   r@   rJ   r   r"  r#  r'   r7   rc   rD   rr   r^   r   r   r   rI   r`   r   r   r   rb   r(   r   )r   )__name__
__module____qualname____firstlineno__r   r5   r   r   r>   rA   r   floatr	  r   r  r   rC   r,  __static_attributes____classcell__)rY   s   @rZ   r%   r%   %   s     ,0481G@!@!@! $C=@!  (1	@!
 "*#@! @!D@1D[ ["3:.[zbii B	) 	)r  r%   )>r   r   r8   r   typingr   r   r   r   torch.distributeddistributedr$  rM   tensorboardXr   r   r   torch.utils.datar	   modelscope.metainfor
   modelscope.modelsr   r   Mmodelscope.msdatasets.dataset_cls.custom_datasets.audio.kws_nearfield_datasetr   modelscope.trainers.baser   modelscope.trainers.builderr   modelscope.utils.checkpointr   r   modelscope.utils.configr   modelscope.utils.constantr   r   modelscope.utils.devicer   modelscope.utils.loggerr   modelscope.utils.torch_utilsr   kws_utils.batch_utilsr   r   r   kws_utils.det_utilsr   kws_utils.file_utilsr   r   r   kws_utils.model_utilsr    r!   r"   rG   register_module"speech_kws_fsmn_char_ctc_nearfieldr%   r   r  rZ   <module>rK     s      	 	 + +     &    ' ( / 0 0 H * G 1 . 8 M M , K K6 6 
 
;;=[)+ [)=[)r  