o
    *jw                     @   s   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	 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eZG dd deZdS )    N)OrderedDict)AdamW)tqdm)get_linear_schedule_with_warmup)MetricsTracker)	ModelFile)
get_logger)ontologyc                   @   sj   e Zd Z					dddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dddZdd ZdS )TrainerNc	           	      C   sX  || _ |j| _|j| _| jr>|jjd dk| _|jjdd  | _|jj| _|jj| _|jj| _|jj	| _	|jj
| _
|jj| _|jj| _|jj| _|jj| _|jj| _|jj| _|jj| _|| _|| _|| _| jdkrq|jrq| jjn| j| _|| _|| _|j| _|pt | _t | _t | _ | jrt!j"#| jst!$| j t%| jrdnd| _&d| _'d S )Nr   -   infz-inf)(	to_tensordo_traindo_inferr
   valid_metric_nameis_decreased_valid_metric
num_epochssave_dir	log_stepsZvalid_stepssave_checkpointZsave_summaryZModellrweight_decay
batch_sizegradient_accumulation_stepswarmup_stepsgpulr_scheduler	optimizermodeluse_gpumodule
func_modelreader	evaluator	tokenizerr   loggerr   batch_metrics_trackertoken_metrics_trackerospathexistsmakedirsfloatbest_valid_metricepoch	selfr   r   configr&   r   r   r#   r$    r3   r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/trainers/nlp/space/trainer/gen_trainer.py__init__   sN   	











 
zTrainer.__init__c                 C   sn   i }| j j}| j j}||v r||}nt|d }||}|d|d  |d< ||d |d  |d< |S )zJ
        decode generated
        return decoded ('bspn', 'resp')
        r   Nbspnresp)r#   eos_r_ideos_b_idindexlen)r1   	generateddecodedr8   r9   	eos_r_idx	eos_b_idxr3   r3   r4   decode_generated_bspn_respJ   s   
z"Trainer.decode_generated_bspn_respc                 C   s   i }| j j}| j j}||v r||}nt|d }d| j| }| j| | j j	r8|d|d  |d< |S ||}|d|d  |d< ||d |d  |d< |S )zR
        decode generated
        return decoded['resp'] ('bspn', 'aspn')
        r   zeos_r not in generated: Nr7   aspn)
r#   eos_a_idr8   r:   r;   r%   decoder&   infouse_true_curr_aspn)r1   r<   r=   rB   r8   r>   msgZ	eos_a_idxr3   r3   r4   decode_generated_act_resp`   s   
z!Trainer.decode_generated_act_respc                 C   s8   | j j}||v r||}nt|d }|d |d  S )Nr   )r#   r9   r:   r;   )r1   r<   r9   r?   r3   r3   r4   decode_generated_bspnz   s
   zTrainer.decode_generated_bspnc                    s   ddg  fdd| j  D | jd fdd| j  D ddg}t|| jd}| jjd	 d
 | j | j }| j	dkr@| j	nt
|d }t|||d}|| _|| _dS )z
        Setup the optimizer and the learning rate scheduler.

        from transformers.Trainer

        parameters from cfg: lr (1e-3); warmup_steps
        Zbiasznorm.weightc                    s*   g | ]\ }t  fd dD s|qS )c                 3       | ]}| v V  qd S Nr3   .0ndnr3   r4   	<genexpr>       4Trainer.set_optimizers.<locals>.<listcomp>.<genexpr>anyrL   pZno_decayrN   r4   
<listcomp>       z*Trainer.set_optimizers.<locals>.<listcomp>)paramsr   c                    s*   g | ]\ }t  fd dD r|qS )c                 3   rI   rJ   r3   rK   rN   r3   r4   rP      rQ   rR   rS   rU   rW   rN   r4   rX      rY           )r   trainnum_training_steps_per_epochr   g?)num_warmup_stepsnum_training_stepsN)r   named_parametersr   r   r   r#   	set_statsr   r   r   intr   r   r   )r1   Zoptimizer_grouped_parametersr   r_   r^   r   r3   rW   r4   set_optimizers   s:   	

	
zTrainer.set_optimizersc                 C   s   | j jd }| jd | jd|d  | jd|d  | jd|d  | jd	| j | jd
| j | jd| j |d | j | j }d| }| j| | j| j }t|D ]	}| j	||d q]d S )Nr\   z***** Running training *****zC  Num Training steps(one turn in a batch of dialogs) per epoch = %dr]     Num Turns = %d	num_turnsz  Num Dialogs = %dZ	num_dialsz  Num Epochs = %dz  Batch size  = %dz"  Gradient Accumulation steps = %dz  Total optimization steps = %d)
train_datadev_data)
r#   ra   r&   rD   r   r   r   r/   rangetrain_epoch)r1   rf   rg   ra   ZstepsrF   r   r/   r3   r3   r4   r\      s4   zTrainer.trainc                 C      t )!
        Train an epoch.
        NotImplementedError)r1   rf   rg   r3   r3   r4   ri         zTrainer.train_epochc                 C   rj   )&
        Inference interface.
        rl   )r1   	data_typer3   r3   r4   infer   rn   zTrainer.inferFc              	   C   s*  | j | j| j d}| jdur| j |d< | jrWtj| j	d| j  d}t
| j | | jd| d tj| j	d| j  d}t
|| | jd	| d |rtj| j	tj}t
| j | tj| j	d
tj}t
|| | jd| d| j  d| jd dS dS )z save )r/   r.   r   Nr   Zstate_epoch_z.modelzSaved model state to ''.trainzSaved train state to 'z{}.trainzSaved best model state to 'z' with new best valid metric =.3f)r/   r.   r   Z
state_dictr   r   r)   r*   joinr   torchsaver   r&   rD   r   ZTORCH_MODEL_BIN_FILEformatr   upper)r1   is_bestZtrain_stateZ
model_file
train_fileZbest_model_fileZbest_train_filer3   r3   r4   rx      sF   




zTrainer.savec                    s^    fdd} fdd} j jdu r jd dS  jr"|  dS  jr-|  |  dS dS )z load c                     sd  t j jj dd d} dt|  d v r6t }|  D ]\}}|d d dks+J |||dd  < q|} t }dd  j D }|  D ]\}}||v r|j	|| j	krt
|d	s^J | }tjj jj|| j	d
d}|dkr|||j	d  d < td| d n-|j	d |j	d k r|d |j	d  }td| d n||d |j	d < td| d |j|j}	}
t j||	|
d}|||< qG|||< qGtd| d qG|} |D ]A}|| vr|| jrtd| d tjj jj|| j	d
d}|| j|| j}	}
t j||	|
d| |< q|| | |< q܈ j|   jd jj d d S )Nc                 S      | S rJ   r3   Zstoragelocr3   r3   r4   <lambda>       z9Trainer.load.<locals>._load_model_state.<locals>.<lambda>Zmap_locationzmodule.r      c                 S   s   i | ]\}}||qS r3   r3   )rL   nameparamr3   r3   r4   
<dictcomp>  s    z;Trainer.load.<locals>._load_model_state.<locals>.<dictcomp>numpy)scalesizeZfloat32zembedder.token_embedding.weightzpart of parameter(z) random normalize initializez) are dropped)dtypedevicez
parameter(zLoaded model state from 'rr   )rw   loadr"   init_checkpointlistkeysr   itemsr`   shapehasattrr   nprandomnormalZinitializer_rangeZastypeprintr   r   tensorZrequires_gradload_state_dictr&   rD   )Zmodel_state_dictZnew_model_state_dictkv
parametersr   r   Zarrzr   r   r1   r3   r4   _load_model_state   s   





z'Trainer.load.<locals>._load_model_statec               	      s    j j d} tj| rWtj| dd d}|d  _|d  _ j	d ur1d|v r1 j	
|d   jd urBd|v rB j
|d   jd	|  d
 j d jdd d S  jd d S )Nrs   c                 S   r}   rJ   r3   r~   r3   r3   r4   r   >  r   z9Trainer.load.<locals>._load_train_state.<locals>.<lambda>r   r/   r.   r   r   zLoaded train state from 'z' with (epoch-z best_valid_metric=ru   )zLoaded no train state)r"   r   r)   r*   r+   rw   r   r/   r.   r   r   r   r&   rD   )r|   Ztrain_state_dictr   r3   r4   _load_train_state:  s*   

z'Trainer.load.<locals>._load_train_stateNzLoaded no model !!!)r"   r   r&   rD   r   r   )r1   r   r   r3   r   r4   r      s   B
zTrainer.loadNNNNN)F)__name__
__module____qualname__r5   r@   rG   rH   rc   r\   ri   rq   rx   r   r3   r3   r3   r4   r
      s     
3,
$r
   c                       sJ   e Zd Z					d fdd	Zdd ZdddZd	d
 Zdd Z  ZS )MultiWOZTrainerNc	           	   
      s"   t t| |||||||| d S rJ   )superr   r5   r0   	__class__r3   r4   r5   \  s   	zMultiWOZTrainer.__init__c           &   	      s  g }d}d}d}d}  j d7  _  j   j   jjd d  j } j   jj	|d}	t
|	D ]Q\}
}g }t
|D ]E\}}|dk} j|||\}} jj|d\}}t|t fdd	| }t } j|d
d} jdkr|D ]}|durt| jksJ q~|\}}}i }t|}t|| j  | }t|}||d< ||d< ||d<  jjr|n|}||d< n|d } jj|d jd dd | D }|dd}t | }|| |d7 }||d 7 }||d 7 }dd | D }dd | D } j||  j|| | j dks/| jjd d kr j   j   j  |d7 } jdkr| j dkr j  } j  }d j  d| d| d}dt| j d  j d} d!|||| g}! j"#|! qAq6 j"#d || }"|| }# j$ } j$ }d j  d}d!|||t%|"t%|#g}! j"#|!  j& j'}$ j(r|$ j)k }%n|$ j)k}%|%r|$ _) *|%  j"#d dS ) rk   r   r[   r   r\   r]   )Zall_batchessamplesc                       | d   | d fS Nr   r   r   kvr   r3   r4   r         z-MultiWOZTrainer.train_epoch.<locals>.<lambda>T)Zis_trainingN	token_num	token_nllnlllossF)Z	do_updater   c                 S   s2   i | ]\}}|t |tjr|   n|qS r3   )
isinstancerw   ZTensorcpudetachr   rL   r   r   r3   r3   r4   r     s    
z/MultiWOZTrainer.train_epoch.<locals>.<dictcomp>c                 S   s   i | ]\}}d |vr||qS tokenr3   r   r3   r3   r4   r         c                 S   s   i | ]\}}d |v r||qS r   r3   r   r3   r3   r4   r     r   z[Train][z][/]z	AVG_Time-ru      z------------------------------------------------------------------------------------------------------------------------------------------------------z[Valid][)+r/   r'   clearr(   r#   ra   r   r   Z	zero_gradZget_data_iterator	enumerateZconvert_batch_turncollate_fn_multi_turntypemapr   timer   r;   rw   summeanr"   Z
token_loss	_optimizer   popappendupdatestepr   r   valuerv   r&   rD   summarystrgetr   r   r.   rx   )&r1   rf   rg   timesZ
epoch_stepZglobal_stepZtr_batch_lossZtr_token_lossr_   Zdata_iteratorZ	batch_idxZ
dial_batchZpv_batchZturn_numZ
turn_batch
first_turnr   batchr   
start_timeZmetricsZmetricr   r   r   r   elapsedZbatch_metricsZtoken_metricsZbatch_metrics_messageZtoken_metrics_messagemessage_prefixZavg_timemessageZavg_batch_lossZavg_token_lossZcur_valid_metricr{   r3   r   r4   ri   i  s   














"O



zMultiWOZTrainer.train_epochtestc           .         s   j d tj jd j d}tj jd j d}i }t } j	|} jj
| } j d  j d|d  t  t|}t|D ]\}	}
i }t|
D ]\}}|dk} j|||\}} jj|gd	\}}t|t fd
d| } jjrd} jjsd} jj|| jj|d}|d    }z |}W n ty } z j t|  j  j | g g g d}W Y d}~nd}~ww  jj|| jj!dd}|d    } "|} jj#r|d }n5 j$ j ||d }t%|d dksJ t&|tsJ  jj'g j(|g  jj)g } jj*}t+|| } jj,rC|- } jj|| jjd|d}|d    }z |}||d< W n+ ty } z j t|  j  j | g g g d}W Y d}~nd}~ww |d |d<  jjr|d n|d |d<  jjr|d n|d |d< |d |d< |d |d<  jj.r|d n|d |d<  jjs jj/r|d n|d |d<  jj/r|d n||d<  jj0r|d n|d |d< qZ j1|
}|2|  j3|\} }! j45| \}"}#}$d|#|$  |" }%|6d|$|#|"|%f  qOW d   n	1 s<w   Y   j3|\} }! j45| \}"}#}$d|#|$  |" }%d|$|#|"|%f }&d  j d!}'d"t | d#}(d$|'|&|(g}) j |) |"|#|$|%|)d%}*t7|d&}+t8j9|*|+d'd( W d   n	1 sw   Y   j d)|  t7|d&}+| D ]},t8:|,}-|+;|- |+;d* qW d   n	1 sw   Y   j d+|  dS ),ro   zGeneration starts ...Zinfer_z.result.jsonZinfer_samples_z***** Running Evaluation *****rd   re   r   r   c                    r   r   r   r   r   r3   r4   r     r   z'MultiWOZTrainer.infer.<locals>.<lambda><   P   inputsstart_ideos_idmax_gen_len)r7   r6   rA   Ndbturn_domain   r   r   r   r   
prev_inputr6   r7   Zresp_genbspn_genrA   Zaspn_genZdspnZdspn_genlabelsg      ?z6match: %2.2f  success: %2.2f  bleu: %2.2f  score: %.2fz[Infer][r   zTIME-ru   r   )bleusuccessmatchscoreresultw   )indentzSaved inference results to 
zSaved inference samples to )<r&   rD   r)   r*   rv   r   r/   r   r#   Zget_eval_datara   rw   no_gradr   r   Zconvert_turn_evalr   r   r   r   Zuse_true_curr_bspnrE   r"   rq   r8   r   r   tolistrG   
ValueErrorr   r%   rC   r9   rH   Zuse_true_db_pointerbspan_to_DBpointerr;   r   	sos_db_idconvert_tokens_to_ids	eos_db_idsos_a_idr   r    cudaZuse_true_prev_respZuse_true_prev_bspnZuse_true_prev_aspnZinverse_transpose_turnr   Zwrap_result_lmr$   Zvalidation_metricset_descriptionopenjsondumpdumpswrite).r1   rp   Zinfer_save_fileZinfer_samples_save_fileZresult_collectionZ
begin_timeZ	eval_datara   ZpbarZdial_idxZdialogpv_turnZturn_idxZturnr   r   	prompt_idr   r   max_lenoutputsr<   r=   	exceptiongenerated_bsr   r   	db_resultr   
outputs_dbgenerated_arZtmp_dialog_resultresults_r   r   r   r   Zmetrics_messager   Z	time_costr   Zeval_resultsfpsampleliner3   r   r4   rq     s  










n


zMultiWOZTrainer.inferc                 C   s   dd }g }|rt |dkrdg}|S | j|}||}|r%t| S d|v s+J | j|d    }||}	| D ]"\}
}|
|	v rM|	|
 nt	 }t || dks^t || rc|
|
 qAt |dkrpt| }|S )Nc                 S   sX   d}i }| D ]#}|t jv rq|t jv r|}t ||< q|t jv s"J || | q|S )N )r	   Zplaceholder_tokensZall_domains_with_bracketsetadd)
constraintZdomain_nameslotsitemr3   r3   r4   
_get_slots  s   

z4MultiWOZTrainer._get_turn_domain.<locals>._get_slotsr   z	[general]r6   )r;   r%   Zconvert_ids_to_tokensr   r   r   r   r   r   r  r   )r1   old_pv_turnZbspn_gen_idsr   r  r   Z
bspn_tokenZ
turn_slotsZpv_bspn_tokenZpv_turn_slotsdomainr   Zpv_valuer3   r3   r4   _get_turn_domain  s6   
z MultiWOZTrainer._get_turn_domainc                    s~  t   t|t fdd| }i } jj|| jjdd}|d 	 
  } |}	 ||	|}
 j j|	|
}t|tsJJ  jjg j|g  jjg } jj}t |	| } jjrn| } jj|| jjd|d}|d 	 
  } |}|	|d< d	d
 |D |d< |d |d< |d |d< ||d< |d |d< W d    |S 1 sw   Y  |S )Nc                    r   r   r   r   r   r3   r4   r     r   z)MultiWOZTrainer.forward.<locals>.<lambda>r   r   r   r   r   r6   c                 S   s   g | ]
}|    qS r3   )r   r   r   )rL   labelr3   r3   r4   rX     s    z+MultiWOZTrainer.forward.<locals>.<listcomp>r   r7   r   rA   )rw   r   r   r   r   r"   rq   r#   r9   r   r   r   rH   r  r   r%   rC   r   r   r   r   r   r   r   r    r   r8   rG   )r1   r   r   r   r   r  r   r  r  r   r   r  r   r   r  r  r=   r3   r   r4   forward  sf   




--zMultiWOZTrainer.forwardr   )r   )	r   r   r   r5   ri   rq   r  r  __classcell__r3   r3   r   r4   r   Z  s    
~ #(r   )r)   r   collectionsr   r   r   r   rw   Ztorch.optimr   r   Ztransformers.optimizationr   Z5modelscope.trainers.nlp.space.metrics.metrics_trackerr   Zmodelscope.utils.constantr   Zmodelscope.utils.loggerr   Zmodelscope.utils.nlp.spacer	   objectr
   r   r3   r3   r3   r4   <module>   s"     G