o
    ॵi                     @   s   d dl Z d dlmZmZm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 d d
lmZ d dlmZ d dlmZmZ d dlmZ dZeeZej ej!dG dd deZ"dS )    N)CallableDictOptional)Trainers)SpaceGenerator)SpaceModelBase)get_sequential_data_loader)IntentBPETextField)intent_preprocess)BaseTrainer)TRAINERS)IntentTrainer)Config	ModelFile)
get_logger)module_namec                       st   e Zd Z		ddee dee f fddZdd Zdefd	d
Z	dd Z
	ddee deeef fddZ  ZS )DialogIntentTrainerNcfg_filecfg_modify_fnc                    s:  t  tj|d |d  dd }|| _| | j| _|| jjj	 t
| jjj| j t| jjj| j| _| jj| jj_| jjd | jj_tj| jjj| jjjg}| jj}t| jjj| j| j||dd| _t| jjj| j| j||dd| _t| jjj| j| j||d	d| _tj| j| jd
| _| jdi | d S )N	model_dircfg_namec                 S   sJ   dd l }dd l}||  |j|  tj |  ||  d|jj_	d S )Nr   T)
randomtorchmanual_seedcudamanual_seed_allnpseedbackendscudnndeterministic)r   r   r    r!   g/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/nlp/space/dialog_intent_trainer.py
setup_seed$   s   

z0DialogIntentTrainer.__init__.<locals>.setup_seed   train)
batch_sizereaderhparams
data_paths
collate_fn	data_typevalidtestr'   r!   ) super__init__ospathjoinr   rebuild_configcfgTrainerr   r
   Modelinit_checkpointr	   bpe
vocab_sizenum_token_embeddingsmax_ctx_turnnum_turn_embeddingsDatasetdata_dirtrigger_datacollate_fn_multi_turnr   batch_size_labeltrain_label_loadervalid_label_loadertest_label_loaderr   create	generator_load_model)selfr   r   argskwargsr#   dataset_pathsr*   	__class__r!   r"   r0      sP   		zDialogIntentTrainer.__init__c                    s    fdd}d|v r|d  _ ntj|d  j j jd _ dd l} jjjdkr9|j	
 dkr9|j j  _ t j | j jd _t j} jj|d	  j  d S )
Nc                    s&   ddl }|| }  jjr|  S | S )z/
            numpy array -> tensor
            r   N)r   tensorr5   use_gpur   )arrayr   rI   r!   r"   	to_tensor[   s   
z2DialogIntentTrainer._load_model.<locals>.to_tensormodelr   )r'   rG   r   r$   r.   )num_training_steps_per_epoch)rT   r   rF   r5   r9   rG   r   r6   gpur   device_countnnDataParallelr   trainerlenrC   set_optimizersload)rI   rK   rS   r   num_batchesr!   rR   r"   rH   Y   s$   	
zDialogIntentTrainer._load_modelr5   c                 C   s   | j d ur
|  |S |S N)r   )rI   r5   r!   r!   r"   r4   z   s   

z"DialogIntentTrainer.rebuild_configc                 O   s"   t d | jj| j| jd d S )NTrain)train_label_itervalid_label_iter)loggerinforZ   r%   rC   rD   )rI   rJ   rK   r!   r!   r"   r%      s
   

zDialogIntentTrainer.traincheckpoint_pathreturnc                 O   sv   t d d| j_|d}||d d  }|d | }|tjks#J ||d< | jdi | | jj	| j
| jd d S )NEvaluateT/r$   r   )	data_iterex_data_iterr!   )rc   rd   r5   do_inferrfindr   TORCH_MODEL_BIN_FILErH   rZ   inferrE   rC   )rI   re   rJ   rK   poscheckpoint_namecheckpoint_dirr!   r!   r"   evaluate   s   


zDialogIntentTrainer.evaluate)NNr_   )__name__
__module____qualname__r   strr   r0   rH   r   r4   r%   r   floatrr   __classcell__r!   r!   rM   r"   r      s"    <!
r   )#r1   typingr   r   r   numpyr   modelscope.metainfor   +modelscope.models.nlp.space.model.generatorr   ,modelscope.models.nlp.space.model.model_baser   .modelscope.preprocessors.nlp.space.data_loaderr   6modelscope.preprocessors.nlp.space.fields.intent_fieldr	   -modelscope.preprocessors.nlp.space.preprocessr
   modelscope.trainers.baser   modelscope.trainers.builderr   4modelscope.trainers.nlp.space.trainer.intent_trainerr   modelscope.utils.configr   r   modelscope.utils.loggerr   PATHrc   register_moduledialog_intent_trainerr   r!   r!   r!   r"   <module>   s$   