o
    ॵi5                     @   s   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mZmZmZmZmZmZmZ d dlmZ d d	lmZ e	jejd
G dd deZdS )    N)Mapping)distributed)Trainers)TRAINERS)EpochBasedTrainer)DEFAULT_MODEL_REVISIONConfigFields
ConfigKeysHubsModeKeys	ModelFileTasksTrainerStages)	to_device)func_receive_dict_inputs)module_namec                       sL   e Zd Z fddZ fddZ fddZdd Zd	d
 Zdd Z  Z	S )ImageInpaintingTrainerc                       t  j|i | d S N)super__init__selfargskwargs	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/cv/image_inpainting_trainer.pyr         zImageInpaintingTrainer.__init__c                    r   r   )r   trainr   r   r   r   r       r   zImageInpaintingTrainer.trainc                    s   t  j|i |}|S r   )r   evaluate)r   r   r   metric_valuesr   r   r   r!      s   zImageInpaintingTrainer.evaluatec                 C   s   d S r   r   )r   modelinputsr   r   r   prediction_step   s   z&ImageInpaintingTrainer.prediction_stepc                 C   s   |  tj d| _| j  t| j| jD ][}|  tj t	|D ]A\}}t
|| j}|| _|| _tdD ]}|  tj | | j|| |  tj q5| `|  jd7  _tj| _|d | jkrb nq!|  tj |  jd7  _q|  tj dS )z; Training loop used by `EpochBasedTrainer.train()`
        r         N)invoke_hookr   
before_run_epochr#   r    range_max_epochsbefore_train_epoch	enumerater   device
data_batch_inner_iterbefore_train_iter
train_stepafter_train_iter_iterr   TRAIN_modeiters_per_epochafter_train_epoch	after_run)r   data_loader_ir0   idxr   r   r   
train_loop!   s,   
z!ImageInpaintingTrainer.train_loopc           
         s(  |   tj| _t|tr t|js |jj	d	i |d|i}n|jj	||d}t|t
s1tdd|vrdg}tg }|D ] | fdd| D  q>i }|D ],}||d}	|	durt rvt rv|	j }	t|	t  |||	 i qS| j| n| j|d  || _dS )
aZ   Perform a training step on a batch of inputs.

        Subclass and override to inject custom behavior.

        Args:
            model (`TorchModel`): The model to train.
            inputs (`Dict[str, Union[torch.Tensor, Any]]`):
                The inputs and targets of the model.

                The dictionary will be unpacked before being fed to the model. Most models expect the targets under the
                argument `labels`. Check your model's documentation for all accepted arguments.

        Return:
            `torch.Tensor`: The tensor with training loss on this batch.
        optimizer_idx)r@   z$"model.forward()" must return a dictlog_varslossc                    s   g | ]} |v r|qS r   r   ).0keykey_pr   r   
<listcomp>a   s    z5ImageInpaintingTrainer.train_step.<locals>.<listcomp>Nr   )r    r   r6   r7   
isinstancer   r   forwardr#   _do_stepdict	TypeErrorsetupdatekeysgetdistis_availableis_initializeddataclone
all_reducediv_get_world_sizeitem
log_buffertrain_outputs)
r   r#   r$   r>   r[   default_keys_pattern
match_keysrA   rD   valuer   rE   r   r3   =   s<   


z!ImageInpaintingTrainer.train_step)
__name__
__module____qualname__r   r    r!   r%   r?   r3   __classcell__r   r   r   r   r      s    r   )timecollections.abcr   torchr   rQ   modelscope.metainfor   modelscope.trainers.builderr   modelscope.trainers.trainerr   modelscope.utils.constantr   r   r	   r
   r   r   r   r   modelscope.utils.data_utilsr   modelscope.utils.file_utilsr   register_moduleimage_inpaintingr   r   r   r   r   <module>   s   (