o
    ॵigw                     @   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
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)tqdm)AdamW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_stepsvalid_stepssave_checkpointsave_summary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'    r6   e/home/ubuntu/.local/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)r4   	generateddecodedr;   r<   	eos_r_idx	eos_b_idxr6   r6   r7   decode_generated_bspn_respI   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: Nr:   aspn)
r&   eos_a_idr;   r=   r>   r(   decoder)   infouse_true_curr_aspn)r4   r?   r@   rE   r;   rA   msg	eos_a_idxr6   r6   r7   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&   r<   r=   r>   )r4   r?   r<   rB   r6   r6   r7   decode_generated_bspny   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
        biasznorm.weightc                    s*   g | ]\ }t  fd dD s|qS )c                 3       | ]}| v V  qd S Nr6   .0ndnr6   r7   	<genexpr>       4Trainer.set_optimizers.<locals>.<listcomp>.<genexpr>anyrQ   pno_decayrS   r7   
<listcomp>       z*Trainer.set_optimizers.<locals>.<listcomp>)paramsr   c                    s*   g | ]\ }t  fd dD r|qS )c                 3   rN   rO   r6   rP   rS   r6   r7   rU      rV   rW   rX   rZ   r\   rS   r7   r^      r_           )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    )r4   optimizer_grouped_parametersr!   re   rd   r    r6   r\   r7   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 )Nrb   z***** Running training *****zC  Num Training steps(one turn in a batch of dialogs) per epoch = %drc     Num Turns = %d	num_turnsz  Num Dialogs = %d	num_dialsz  Num Epochs = %dz  Batch size  = %dz"  Gradient Accumulation steps = %dz  Total optimization steps = %d)
train_datadev_data)
r&   rg   r)   rG   r   r   r   r2   rangetrain_epoch)r4   rn   ro   rg   stepsrI   r   r2   r6   r6   r7   rb      s4   zTrainer.trainc                 C      t )!
        Train an epoch.
        NotImplementedError)r4   rn   ro   r6   r6   r7   rq         zTrainer.train_epochc                 C   rs   )&
        Inference interface.
        ru   )r4   	data_typer6   r6   r7   infer   rw   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 )r2   r1   r!   Nr    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)r2   r1   r!   
state_dictr    r   r,   r-   joinr   torchsaver"   r)   rG   r   TORCH_MODEL_BIN_FILEformatr   upper)r4   is_besttrain_state
model_file
train_filebest_model_filebest_train_filer6   r6   r7   r      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 rO   r6   storagelocr6   r6   r7   <lambda>       z9Trainer.load.<locals>._load_model_state.<locals>.<lambda>map_locationzmodule.r      c                 S   s   i | ]\}}||qS r6   r6   )rQ   nameparamr6   r6   r7   
<dictcomp>  s    z;Trainer.load.<locals>._load_model_state.<locals>.<dictcomp>numpy)scalesizefloat32zembedder.token_embedding.weightzpart of parameter(z) random normlize initializez) are dropped)dtypedevicez
parameter(zLoaded model state from 'r|   )r   loadr%   init_checkpointlistkeysr   itemsrf   shapehasattrr   nprandomnormalinitializer_rangeastypeprintr   r   tensorrequires_gradload_state_dictr)   rG   )model_state_dictnew_model_state_dictkv
parametersr   r   arrzr   r   r4   r6   r7   _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 )Nr}   c                 S   r   rO   r6   r   r6   r6   r7   r   =  r   z9Trainer.load.<locals>._load_train_state.<locals>.<lambda>r   r2   r1   r!   r    zLoaded train state from 'z' with (epoch-z best_valid_metric=r   )zLoaded no train state)r%   r   r,   r-   r.   r   r   r2   r1   r!   r   r    r)   rG   )r   train_state_dictr   r6   r7   _load_train_state9  s*   

z'Trainer.load.<locals>._load_train_stateNzLoaded no model !!!)r%   r   r)   rG   r   r   )r4   r   r   r6   r   r7   r      s   B
zTrainer.loadNNNNN)F)__name__
__module____qualname__r8   rC   rK   rL   rj   rb   rq   rz   r   r   r6   r6   r6   r7   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 rO   )superr   r8   r3   	__class__r6   r7   r8   [  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 ) rt   r   ra   r   rb   rc   )all_batchessamplesc                       | d   | d fS Nr   r   r   kvr   r6   r7   r         z-MultiWOZTrainer.train_epoch.<locals>.<lambda>T)is_trainingN	token_num	token_nllnlllossF)	do_updater!   c                 S   s2   i | ]\}}|t |tjr|   n|qS r6   )
isinstancer   Tensorcpudetachr   rQ   r   r   r6   r6   r7   r     s    
z/MultiWOZTrainer.train_epoch.<locals>.<dictcomp>c                 S   s   i | ]\}}d |vr||qS tokenr6   r   r6   r6   r7   r         c                 S   s   i | ]\}}d |v r||qS r   r6   r   r6   r6   r7   r     r   z[Train][z][/]z	AVG_Time-r      z------------------------------------------------------------------------------------------------------------------------------------------------------z[Valid][)+r2   r*   clearr+   r&   rg   r   r"   	zero_gradget_data_iterator	enumerateconvert_batch_turncollate_fn_multi_turntypemapr   timer   r>   r   summeanr%   
token_loss	_optimizer!   popappendupdatestepr    r   valuer   r)   rG   summarystrgetr   r   r1   r   )&r4   rn   ro   times
epoch_stepglobal_steptr_batch_losstr_token_lossre   data_iterator	batch_idx
dial_batchpv_batchturn_num
turn_batch
first_turnr   batchr   
start_timemetricsmetricr   r   r   r   elapsedbatch_metricstoken_metricsbatch_metrics_messagetoken_metrics_messagemessage_prefixavg_timemessageavg_batch_lossavg_token_losscur_valid_metricr   r6   r   r7   rq   h  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 ),rx   zGeneration starts ...infer_z.result.jsoninfer_samples_z***** Running Evaluation *****rk   rl   r   r   c                    r   r   r   r   r   r6   r7   r     r   z'MultiWOZTrainer.infer.<locals>.<lambda><   P   inputsstart_ideos_idmax_gen_len)r:   r9   rD   Ndbturn_domain   r  r  r  r  
prev_inputr9   r:   resp_genbspn_genrD   aspn_gendspndspn_genlabelsg      ?z6match: %2.2f  success: %2.2f  bleu: %2.2f  score: %.2fz[Infer][r   zTIME-r   r   )bleusuccessmatchscoreresultw   )indentzSaved inference results to 
zSaved inference samples to )<r)   rG   r,   r-   r   r   r2   r   r&   get_eval_datarg   r   no_gradr   r   convert_turn_evalr   r   r   r   use_true_curr_bspnrH   r%   rz   r;   r   r   tolistrK   
ValueErrorr   r(   rF   r<   rL   use_true_db_pointerbspan_to_DBpointerr>   r   	sos_db_idconvert_tokens_to_ids	eos_db_idsos_a_idr   r#   cudause_true_prev_respuse_true_prev_bspnuse_true_prev_aspninverse_transpose_turnr   wrap_result_lmr'   validation_metricset_descriptionopenjsondumpdumpswrite).r4   ry   infer_save_fileinfer_samples_save_fileresult_collection
begin_time	eval_datarg   pbardial_idxdialogpv_turnturn_idxturnr   r  	prompt_idr   r   max_lenoutputsr?   r@   	exceptiongenerated_bsr  r  	db_resultr  
outputs_dbgenerated_artmp_dialog_resultresults_r"  r#  r$  r%  metrics_messager  	time_costr	  eval_resultsfpsampleliner6   r   r7   rz     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	   placeholder_tokensall_domains_with_bracketsetadd)
constraintdomain_nameslotsitemr6   r6   r7   
_get_slots  s   

z4MultiWOZTrainer._get_turn_domain.<locals>._get_slotsr   z	[general]r9   )r>   r(   convert_ids_to_tokensr   r   r   r   r/  r   rc  r   )r4   old_pv_turnbspn_gen_idsr   ri  r  
bspn_token
turn_slotspv_bspn_tokenpv_turn_slotsdomainr   pv_valuer6   r6   r7   _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   r6   r7   r     r   z)MultiWOZTrainer.forward.<locals>.<lambda>r  r  r   r  r  r9   c                 S   s   g | ]
}|    qS r6   )r   r   r/  )rQ   labelr6   r6   r7   r^     s    z+MultiWOZTrainer.forward.<locals>.<listcomp>r!  r:   r  rD   )r   r,  r   r   r   r%   rz   r&   r<   r   r   r/  rL   rs  r2  r(   rF   r   r   r3  r4  r5  r6  r   r#   r7  r;   rK   )r4   r   r   rO  r!  rk  rL  rQ  rS  r  r  rT  r  r  rU  rV  r@   r6   r   r7   forward  sf   




--zMultiWOZTrainer.forwardr   )r  )	r   r   r   r8   rq   rz   rs  ru  __classcell__r6   r6   r   r7   r   Y  s    
~ #(r   )r,   r   collectionsr   r@  r   r   r   r   transformers.optimizationr   r   5modelscope.trainers.nlp.space.metrics.metrics_trackerr   modelscope.utils.constantr   modelscope.utils.loggerr   modelscope.utils.nlp.spacer	   objectr
   r   r6   r6   r6   r7   <module>   s      G