o
    *j%                     @   sJ  d dl Z d dlZd dlmZmZ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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 dl$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0 dd Z1dd Z2ej3ej4dG dd deZ5dS )    N)CallableDictOptionalTupleUnion)distributed)nn)Dataset)Trainers)Model
TorchModel)convert_models_to_fp32)	MsDataset)Preprocessor)CLIPPreprocessor)EpochBasedTrainer)TRAINERS)	merge_cfg
update_cfg)build_optimizer)Config)DEFAULT_MODEL_REVISION
ConfigKeysInvokeModeKeys	ModelFile
ThirdParty   )get_lossget_optimizer_paramsget_schedulec                 C   s    d| v pd| v pd| v pd| v S )NZbnlnZbiaslogit_scale nr#   r#   r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/trainers/multi_modal/clip/clip_trainer.pyexclude   s    r'   c                 C   s
   t |  S )N)r'   r$   r#   r#   r&   include    s   
r(   )module_namec                       s   e Zd Zdddddddddedfdeeeeje	f  dee	 dee
 dee
 deee
ee	e
f f  d	eeeef  d
eeeef  deeeee	ef f  deejjejjjf dee	 def fddZdd Z  ZS )CLIPTrainerN)NN*   modelcfg_filecfg_modify_fnarg_parse_fndata_collatortrain_dataseteval_datasetpreprocessor
optimizersmodel_revisionseedc                    s  t |tr,|tjd }|d ur|tj | ||
|| _|d u r+tj	
| jtj}n|d us4J dtj	|| _t|| _|| _t| j | | j| _d|v r\| j|d  t| j| _| j}tj||
tjd}t| d|vs~t|d dkr|jj}n|d }|jj}t tj!dd}t"#t||jj$j%|  }||jj& |jj'_(|	d d u rt)|* }dd	 |D }d
d	 |D }t+||}|dd||d dg|d |d |d f|d d}t,||jj-|d}n|	d }|	d d u rt.||jj'}n|	d }||f}	t/0 }t/0 }|1t tj!dd| _2|1t tj!dd| _3|jj4| _4d|vrD|jdd rD|jj5|d< d|vrW|jddrW|jj6|d< |d u rzt7jt8|t9j:|j;|j<d dt7j=t8|t9j>|j;|j<d di}|j?| _@tA| j@dr| j@d dd}|t7j B| |t7j= B| | j@d dd}|t7j C| |t7j= C| |jj$j%| | _DtE jFd|||||||||	|d
| d S )Nz?Config file should not be None if model is not from pretrained!Zcfg_options)revisionZ
invoked_bywork_dirr   Z
WORLD_SIZEr   c                 S   "   g | ]\}}t |r|jr|qS r#   )r'   requires_grad.0r%   pr#   r#   r&   
<listcomp>j       z(CLIPTrainer.__init__.<locals>.<listcomp>c                 S   r9   r#   )r(   r:   r;   r#   r#   r&   r>   n   r?   g        )paramsweight_decayrA   lrZbeta1Zbeta2eps)r@   rB   ZbetasrC   )cfgZdefault_argsZ
LOCAL_RANKlauncheruse_fp16FZimage_resolution)	model_dirmode	tokenizer
resolutionZ
column_mapZimgtext)
r,   r-   r.   r/   r0   r1   r2   r3   r4   r6   r#   )G
isinstancestrgetr   ZKEYpopZget_or_download_model_dirrG   ospathjoinr   ZCONFIGURATIONdirnamer   	from_filerD   r.   r   Zrebuild_configZmerge_from_dictr   r   Zfrom_pretrainedr   ZTRAINERr   lentrainr8   Zpretrained_model
model_nameintenvironmathceilZ
dataloaderZbatch_size_per_gpuZ
max_epochslr_schedulerZnum_train_stepslistnamed_parametersr   r   	optimizerr    r   ZCrossEntropyLosscudaloss_imgloss_txtloss_cfgrE   rF   r   r   r   TRAINrI   Z
model_infovalZEVALZdatasetZdataset_cfghasattrZset_input_img_keyZset_input_text_keyglobal_batch_sizesuper__init__)selfr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   kwargsZthird_partyrD   r8   rW   Z
world_sizeZepoch_stepsr^   Zgain_or_bias_paramsZrest_paramsZoptimizer_hparamsZoptimizer_argsr_   r\   ra   rb   Zimg_key_nameZtext_key_name	__class__r#   r&   ri   '   s   







zCLIPTrainer.__init__c                    s.  |   tj|d< ||}t|| j| j| j}d|i}d|vrdg}tg }|D ] |	 fdd|
 D  q)i }|D ],}	||	d }
|
d urjt rat ra|
j }
t|
t  |	|	|
 i q>t|d|}|jjj  |d< t| j|d< | j	| n| j	|d  || _d S )	NrH   losslog_varsc                    s   g | ]} |v r|qS r#   r#   )r<   keyZkey_pr#   r&   r>      s    z*CLIPTrainer.train_step.<locals>.<listcomp>moduler"   rg   )rV   r   rd   forwardr   ra   rb   rc   setupdatekeysrN   distZis_availableZis_initializeddatacloneZ
all_reduceZdiv_Zget_world_sizeitemgetattrZ
clip_modelr"   rX   rg   Z
log_buffertrain_outputs)rj   r,   ZinputsZmodel_outputsrn   r|   Zdefault_keys_patternZ
match_keysro   rp   valueZunwrapped_modelr#   rq   r&   
train_step   sF   


zCLIPTrainer.train_step)__name__
__module____qualname__r   r   r   r   r   ModulerM   r   r   r   r	   r   r   torchZoptimZ	Optimizerr\   Z_LRSchedulerrX   ri   r~   __classcell__r#   r#   rl   r&   r*   $   sV    

	

 #r*   )6rZ   rP   typingr   r   r   r   r   r   r   rw   r   Ztorch.utils.datar	   Zmodelscope.metainfor
   Zmodelscope.models.baser   r   Z(modelscope.models.multi_modal.clip.modelr   Z modelscope.msdatasets.ms_datasetr   Zmodelscope.preprocessors.baser   Z$modelscope.preprocessors.multi_modalr   Zmodelscope.trainersr   Zmodelscope.trainers.builderr   Z"modelscope.trainers.default_configr   r   Z%modelscope.trainers.optimizer.builderr   Zmodelscope.utils.configr   Zmodelscope.utils.constantr   r   r   r   r   r   Zclip_trainer_utilsr   r   r    r'   r(   Zregister_moduleZclip_multi_modal_embeddingr*   r#   r#   r#   r&   <module>   s0    