o
    h#                     @   s   d 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	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZ ed
Zdd ZG dd deZdS )z;
A trainer class to handle training and testing of models.
    N)nn)Trainer)utilsloss)	load_bertload_bert_with_peftNoTransformerFoundationCache)build_peft_wrapperload_peft_wrapper)Tagger)
MultiVocabstanzac                    sR    fdd| dd D }| d }| d }| d }| d }| d }||||||fS )	z& Unpack a batch from the data loader. c                    s"   g | ]}|d ur|  nd qS N)to).0bdevice T/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/pos/trainer.py
<listcomp>   s   " z unpack_batch.<locals>.<listcomp>N   	   
         r   )batchr   inputsorig_idxword_orig_idxsentlenswordlenstextr   r   r   unpack_batch   s   r#   c                   @   sB   e Zd ZdZdddZdddZdd	d
ZdddZdddZdS )r   z  A trainer for training models. Nc                 C   sD  |d ur| j ||||d n@|| _|| _t| jd \}}d }	| jd r4d| jd< d}	t|| jt|	d}t|||d ur>|jnd |d |||| jd |	d		| _| j	|| _t
j| jd
 | j| jd d| jd fd| jdd | jdd| jddd| _i | _| jdd rdd l}
|
| jd d| jd }|| jd< d S d S )N)argsfoundation_cache
bert_modeluse_peftTbert_finetuneposadapter_name	share_hid
emb_matrixr,   r%   r&   bert_tokenizerforce_bert_saved	peft_nameoptimlrg?beta2gư>initial_weight_decaybert_learning_rate        peftF)betasepsweight_decayr6   is_peftr   bert_optimizer	max_stepsbert_scheduler)loadr$   vocabr   r	   loggerr   embmodelr   r   get_split_optimizerget
optimizers
schedulerstransformersget_linear_schedule_with_warmup)selfr$   rA   pretrain
model_filer   r%   r&   r/   r1   rI   warmup_schedulerr   r   r   __init__   s,   

4R
zTrainer.__init__Fc                 C   s  t | j j}t||\}}}}}}	|\}
}}}}}}}|r%| j  n| j  | j D ]}|	  q/| |
|||||||||||	\}}|dkrN|S |j
 }|rW|S |  tjj| j | jd  | j D ]}|  qn| j D ]}|  qz|S )Nr7   max_grad_norm)nextrD   
parametersr   r#   evaltrainrG   values	zero_graddataitembackwardtorchr   r   clip_grad_norm_r$   steprH   )rK   r   rS   r   r   r   r   r    r!   r"   word	word_mask	wordcharswordchars_maskuposxposufeats
pretrained	optimizerr   _loss_val	schedulerr   r   r   update?   s*   

$


zTrainer.updateTc                    s   t j j}t||\}}}}}|\}	}
}}}}}}j  |	d}|	|
|||||||||\}}fdd|d  D fdd|d  D fdd|d  D   fddt|D }|rvt	
||}|S )	Nr   c                       g | ]
} j d  |qS )ra   rA   unmapr   sentrK   r   r   r   c       z#Trainer.predict.<locals>.<listcomp>c                    rj   )rb   rk   rm   ro   r   r   r   d   rp      c                    rj   )featsrk   rm   ro   r   r   r   e   rp      c                    s,   g | ]  fd dt   D qS )c                    s.   g | ]} |  |   | gqS r   r   )r   j)
feats_seqsi	upos_seqs	xpos_seqsr   r   r   g   s   . z.Trainer.predict.<locals>.<listcomp>.<listcomp>)range)r   )ru   r    rw   rx   )rv   r   r   g   s   , )rQ   rD   rR   r   r#   rS   sizetolistry   r   unsort)rK   r   r|   r   r   r   r   r!   r"   r]   r^   r_   r`   ra   rb   rc   rd   
batch_sizerf   predspred_tokensr   )ru   rK   r    rw   rx   r   predict[   s   

$zTrainer.predictc           	   
      s    j  }|r fdd| D }|D ]}||= q| j  jd} jddr=ddlm} | j j j j	d|d	< zt
j||dd
 td| W d S  ttfyZ     tyu } ztd| d W Y d }~d S d }~ww )Nc                    s&   g | ]}| d d  jjv r|qS ).r   )splitrD   unsaved_modules)r   kro   r   r   r   p   s   & z Trainer.save.<locals>.<listcomp>)rD   rA   configr'   Fr   )get_peft_model_state_dictr*   	bert_lora)_use_new_zipfile_serializationzModel saved to {}zSaving failed... z continuing anyway.)rD   
state_dictkeysrA   r$   rF   r8   r   r&   r1   rZ   saverB   infoformatKeyboardInterrupt
SystemExit	Exceptionwarning)	rK   filenameskip_modulesmodel_stateskippedr   paramsr   er   ro   r   r   l   s*   
 zTrainer.savec                 C   s  zt j|dd dd}W n ty   td|  w |d | _|dur,| j| d| jvr6d| jd< |d	}|rGt	d
 d| jd< d}d}| jddrpd}t
| jd d|\}	}
}t|	|| jt|}	t	d| n$tdd |d  D rt	d| t|}d}t| jd|\}	}
t|d | _d}| jd r|dur|j}tdd |d  D rt	d| t|}t| j| j|| jd ||	|
||d	| _| jj|d dd dS )z
        Load a model from file, with preloaded pretrain embeddings. Here we allow the pretrain to be None or a dummy input,
        and the actual use of pretrain embeddings will depend on the boolean config "pretrain" in the loaded args.
        c                 S   s   | S r   r   )storagelocr   r   r   <lambda>   s    zTrainer.load.<locals>.<lambda>T)weights_onlyzCannot load model from {}r   Nr&   r   z2Found peft weights for POS; loading a peft adapterr'   Fr)   zLoaded peft with name %sc                 s       | ]}| d V  qdS zbert_model.N
startswithr   xr   r   r   	<genexpr>       zTrainer.load.<locals>.<genexpr>rD   zModel %s has a finetuned transformer.  Not using transformer cache to make sure the finetuned version of the transformer isn't accidentally used elsewhererA   rL   c                 s   r   r   r   r   r   r   r   r      r   r,   r-   )strict)rZ   r@   BaseExceptionrB   errorr   r$   ri   rF   debugr   r
   anyr   r   r   r   load_state_dictrA   rC   r   rD   )rK   r   rL   r$   r%   
checkpointlora_weightsr0   r1   r&   r/   r.   r   r   r   r@      sF   





&zTrainer.load)NNNNNN)F)T)NN)	__name__
__module____qualname____doc__rO   ri   r   r   r@   r   r   r   r   r      s    

 

r   )r   sysloggingrZ   r   stanza.models.common.trainerr   BaseTrainerstanza.models.commonr   r   %stanza.models.common.foundation_cacher   r   r    stanza.models.common.peft_configr	   r
   stanza.models.pos.modelr   stanza.models.pos.vocabr   	getLoggerrB   r#   r   r   r   r   <module>   s    

