
    gx                        d Z ddlZddlZddlmZ ddlmZmZmZm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  ej        e          Ze G d
 d                      Z G d d          Ze G d de                      Z G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d dee          ZdS )zJ
Callbacks to use with the Trainer class and customize the training loop.
    N)	dataclass)DictListOptionalUnion)tqdm   )IntervalStrategy
has_length)TrainingArguments)loggingc                      e Zd ZU dZdZee         ed<   dZe	ed<   dZ
e	ed<   dZe	ed<   dZe	ed	<   dZe	ed
<   dZe	ed<   dZe	ed<   dZe	ed<   dZeed<   dZeeeef                  ed<   dZee         ed<   dZee         ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeeeeee	ef         f         ed<   dZed         ed<   d Z defdZ!e"defd            Z#dS )TrainerStatea  
    A class containing the [`Trainer`] inner state that will be saved along the model and optimizer when checkpointing
    and passed to the [`TrainerCallback`].

    <Tip>

    In all this class, one step is to be understood as one update step. When using gradient accumulation, one update
    step may require several forward and backward passes: if you use `gradient_accumulation_steps=n`, then one update
    step requires going through *n* batches.

    </Tip>

    Args:
        epoch (`float`, *optional*):
            Only set during training, will represent the epoch the training is at (the decimal part being the
            percentage of the current epoch completed).
        global_step (`int`, *optional*, defaults to 0):
            During training, represents the number of update steps completed.
        max_steps (`int`, *optional*, defaults to 0):
            The number of update steps to do during the current training.
        logging_steps (`int`, *optional*, defaults to 500):
            Log every X updates steps
        eval_steps (`int`, *optional*):
            Run an evaluation every X steps.
        save_steps (`int`, *optional*, defaults to 500):
            Save checkpoint every X updates steps.
        train_batch_size (`int`, *optional*):
            The batch size for the training dataloader. Only needed when
            `auto_find_batch_size` has been used.
        num_input_tokens_seen (`int`, *optional*, defaults to 0):
            The number of tokens seen during training (number of input tokens, not the number of prediction tokens).
        total_flos (`float`, *optional*, defaults to 0):
            The total number of floating operations done by the model since the beginning of training (stored as floats
            to avoid overflow).
        log_history (`List[Dict[str, float]]`, *optional*):
            The list of logs done since the beginning of training.
        best_metric (`float`, *optional*):
            When tracking the best model, the value of the best metric encountered so far.
        best_model_checkpoint (`str`, *optional*):
            When tracking the best model, the value of the name of the checkpoint for the best model encountered so
            far.
        is_local_process_zero (`bool`, *optional*, defaults to `True`):
            Whether or not this process is the local (e.g., on one machine if training in a distributed fashion on
            several machines) main process.
        is_world_process_zero (`bool`, *optional*, defaults to `True`):
            Whether or not this process is the global main process (when training in a distributed fashion on several
            machines, this is only going to be `True` for one process).
        is_hyper_param_search (`bool`, *optional*, defaults to `False`):
            Whether we are in the process of a hyper parameter search using Trainer.hyperparameter_search. This will
            impact the way data will be logged in TensorBoard.
        stateful_callbacks (`List[StatefulTrainerCallback]`, *optional*):
            Callbacks attached to the `Trainer` that should have their states be saved or restored.
            Relevent callbacks should implement a `state` and `from_state` function.
    Nepochr   global_step	max_stepsi  logging_steps
eval_steps
save_stepstrain_batch_sizenum_train_epochsnum_input_tokens_seen
total_floslog_historybest_metricbest_model_checkpointTis_local_process_zerois_world_process_zeroFis_hyper_param_search
trial_nametrial_paramsTrainerCallbackstateful_callbacksc                     | j         g | _         | j        	i | _        d S t          | j        t                    rd S i }| j        D ]}t          |t                    st          dt          |                     |j        j        }||v rUt          ||         t                    s||         g||<   ||         
                    |                                           |                                ||<   || _        d S )NzNAll callbacks passed to be saved must inherit `ExportableState`, but received )r   r#   
isinstancedictExportableState	TypeErrortype	__class____name__listappendstate)selfr#   callbacknames       Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/transformers/trainer_callback.py__post_init__zTrainerState.__post_init__p   s,   #!D"*&(D###/66 	9D "$ 3 @ @!(_>> #yimnviwiwyy    )2--- &&8&>EE N4Ft4L3M*40&t,33HNN4D4DEEEE/7~~/?/?&t,,&8D###    	json_pathc                     t          j        t          j        |           dd          dz   }t	          |dd          5 }|                    |           ddd           dS # 1 swxY w Y   dS )	zDSave the content of this instance in JSON format inside `json_path`.   T)indent	sort_keys
wutf-8encodingN)jsondumpsdataclassesasdictopenwrite)r/   r5   json_stringfs       r2   save_to_jsonzTrainerState.save_to_json   s    j!3D!9!9!tTTTW[[)S7333 	!qGGK   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   A""A&)A&c                     t          |dd          5 }|                                }ddd           n# 1 swxY w Y    | di t          j        |          S )z3Create an instance from the content of `json_path`.rr<   r=   N )rC   readr?   loads)clsr5   rF   texts       r2   load_from_jsonzTrainerState.load_from_json   s     )S7333 	q6688D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s&&TZ%%&&&s   488)$r+   
__module____qualname____doc__r   r   float__annotations__r   intr   r   r   r   r   r   r   r   r   r   r   strr   r   r   boolr   r   r    r!   r   r#   r3   rG   classmethodrO   rJ   r4   r2   r   r   #   s        5 5n "E8E?!!!KIsM3JJ c   c!"3"""J*.Kd3:&'...#'K%'''+/8C=///"&4&&&"&4&&&"'4'''J<@L$sE#uc4"7889@@@26./6669 9 96!c ! ! ! ! 's ' ' ' [' ' 'r4   r   c                   4    e Zd ZdZdefdZed             ZdS )r'   aj  
    A class for objects that include the ability to have its state
    be saved during `Trainer._save_checkpoint` and loaded back in during
    `Trainer._load_from_checkpoint`.

    These must implement a `state` function that gets called during the respective
    Trainer function call. It should only include parameters and attributes needed to
    recreate the state at a particular time, to avoid utilizing pickle/maintain standard
    file IO writing.

    Example:

    ```python
    class EarlyStoppingCallback(TrainerCallback, ExportableState):
        def __init__(self, early_stopping_patience: int = 1, early_stopping_threshold: Optional[float] = 0.0):
            self.early_stopping_patience = early_stopping_patience
            self.early_stopping_threshold = early_stopping_threshold
            # early_stopping_patience_counter denotes the number of times validation metrics failed to improve.
            self.early_stopping_patience_counter = 0

        def state(self) -> dict:
            return {
                "args": {
                    "early_stopping_patience": self.early_stopping_patience,
                    "early_stopping_threshold": self.early_stopping_threshold,
                },
                "attributes": {
                    "early_stopping_patience_counter": self.early_stopping_patience_counter,
                }
            }
    ```returnc                      t          d          )Nz<You must implement a `state` function to utilize this class.)NotImplementedErrorr/   s    r2   r.   zExportableState.state   s    !"`aaar4   c                      | di |d         }|d                                          D ]\  }}t          |||           |S )Nargs
attributesrJ   )itemssetattr)rM   r.   instancekvs        r2   
from_statezExportableState.from_state   sY    3''v'','--// 	$ 	$DAqHa####r4   N)r+   rP   rQ   rR   r&   r.   rX   rf   rJ   r4   r2   r'   r'      sZ         @bt b b b b   [  r4   r'   c                   x    e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   dZ
eed<   d Zd	 Zd
 ZdefdZdS )TrainerControlaA  
    A class that handles the [`Trainer`] control flow. This class is used by the [`TrainerCallback`] to activate some
    switches in the training loop.

    Args:
        should_training_stop (`bool`, *optional*, defaults to `False`):
            Whether or not the training should be interrupted.

            If `True`, this variable will not be set back to `False`. The training will just stop.
        should_epoch_stop (`bool`, *optional*, defaults to `False`):
            Whether or not the current epoch should be interrupted.

            If `True`, this variable will be set back to `False` at the beginning of the next epoch.
        should_save (`bool`, *optional*, defaults to `False`):
            Whether or not the model should be saved at this step.

            If `True`, this variable will be set back to `False` at the beginning of the next step.
        should_evaluate (`bool`, *optional*, defaults to `False`):
            Whether or not the model should be evaluated at this step.

            If `True`, this variable will be set back to `False` at the beginning of the next step.
        should_log (`bool`, *optional*, defaults to `False`):
            Whether or not the logs should be reported at this step.

            If `True`, this variable will be set back to `False` at the beginning of the next step.
    Fshould_training_stopshould_epoch_stopshould_saveshould_evaluate
should_logc                     d| _         dS )z<Internal method that resets the variable for a new training.FN)ri   r]   s    r2   _new_trainingzTrainerControl._new_training   s    $)!!!r4   c                     d| _         dS )z9Internal method that resets the variable for a new epoch.FN)rj   r]   s    r2   
_new_epochzTrainerControl._new_epoch   s    !&r4   c                 0    d| _         d| _        d| _        dS )z8Internal method that resets the variable for a new step.FN)rk   rl   rm   r]   s    r2   	_new_stepzTrainerControl._new_step   s     $r4   rZ   c                 J    | j         | j        | j        | j        | j        di dS )Nri   rj   rk   rl   rm   r_   r`   ru   r]   s    r2   r.   zTrainerControl.state   s?     )-(A%)%;#/#'#7"o  	
 	
 		
r4   N)r+   rP   rQ   rR   ri   rW   rT   rj   rk   rl   rm   ro   rq   rs   r&   r.   rJ   r4   r2   rh   rh      s          6 "'$&&&#t###K!OT!!!J* * *' ' '     

t 

 

 

 

 

 

r4   rh   c                   >   e Zd ZdZdededefdZdededefdZdededefdZ	dededefdZ
dededefd	Zdededefd
ZdededefdZdededefdZdededefdZdededefdZdededefdZdededefdZdededefdZdededefdZdededefdZdS )r"   a	  
    A class for objects that will inspect the state of the training loop at some events and take some decisions. At
    each of those events the following arguments are available:

    Args:
        args ([`TrainingArguments`]):
            The training arguments used to instantiate the [`Trainer`].
        state ([`TrainerState`]):
            The current state of the [`Trainer`].
        control ([`TrainerControl`]):
            The object that is returned to the [`Trainer`] and can be used to make some decisions.
        model ([`PreTrainedModel`] or `torch.nn.Module`):
            The model being trained.
        tokenizer ([`PreTrainedTokenizer`]):
            The tokenizer used for encoding the data. This is deprecated in favour of `processing_class`.
        processing_class ([`PreTrainedTokenizer` or `BaseImageProcessor` or `ProcessorMixin` or `FeatureExtractionMixin`]):
            The processing class used for encoding the data. Can be a tokenizer, a processor, an image processor or a feature extractor.
        optimizer (`torch.optim.Optimizer`):
            The optimizer used for the training steps.
        lr_scheduler (`torch.optim.lr_scheduler.LambdaLR`):
            The scheduler used for setting the learning rate.
        train_dataloader (`torch.utils.data.DataLoader`, *optional*):
            The current dataloader used for training.
        eval_dataloader (`torch.utils.data.DataLoader`, *optional*):
            The current dataloader used for evaluation.
        metrics (`Dict[str, float]`):
            The metrics computed by the last evaluation phase.

            Those are only accessible in the event `on_evaluate`.
        logs  (`Dict[str, float]`):
            The values to log.

            Those are only accessible in the event `on_log`.

    The `control` object is the only one that can be changed by the callback, in which case the event that changes it
    should return the modified version.

    The argument `args`, `state` and `control` are positionals for all events, all the others are grouped in `kwargs`.
    You can unpack the ones you need in the signature of the event using them. As an example, see the code of the
    simple [`~transformers.PrinterCallback`].

    Example:

    ```python
    class PrinterCallback(TrainerCallback):
        def on_log(self, args, state, control, logs=None, **kwargs):
            _ = logs.pop("total_flos", None)
            if state.is_local_process_zero:
                print(logs)
    ```r_   r.   controlc                     dS )zS
        Event called at the end of the initialization of the [`Trainer`].
        NrJ   r/   r_   r.   rx   kwargss        r2   on_init_endzTrainerCallback.on_init_end8  	     	r4   c                     dS )z<
        Event called at the beginning of training.
        NrJ   rz   s        r2   on_train_beginzTrainerCallback.on_train_begin>  r}   r4   c                     dS )z6
        Event called at the end of training.
        NrJ   rz   s        r2   on_train_endzTrainerCallback.on_train_endD  r}   r4   c                     dS )z<
        Event called at the beginning of an epoch.
        NrJ   rz   s        r2   on_epoch_beginzTrainerCallback.on_epoch_beginJ  r}   r4   c                     dS )z6
        Event called at the end of an epoch.
        NrJ   rz   s        r2   on_epoch_endzTrainerCallback.on_epoch_endP  r}   r4   c                     dS )z
        Event called at the beginning of a training step. If using gradient accumulation, one training step might take
        several inputs.
        NrJ   rz   s        r2   on_step_beginzTrainerCallback.on_step_beginV  	    
 	r4   c                     dS )zv
        Event called before the optimizer step but after gradient clipping. Useful for monitoring gradients.
        NrJ   rz   s        r2   on_pre_optimizer_stepz%TrainerCallback.on_pre_optimizer_step]  r}   r4   c                     dS )z}
        Event called after the optimizer step but before gradients are zeroed out. Useful for monitoring gradients.
        NrJ   rz   s        r2   on_optimizer_stepz!TrainerCallback.on_optimizer_stepc  r}   r4   c                     dS )zU
        Event called at the end of an substep during gradient accumulation.
        NrJ   rz   s        r2   on_substep_endzTrainerCallback.on_substep_endi  r}   r4   c                     dS )z
        Event called at the end of a training step. If using gradient accumulation, one training step might take
        several inputs.
        NrJ   rz   s        r2   on_step_endzTrainerCallback.on_step_endo  r   r4   c                     dS )z9
        Event called after an evaluation phase.
        NrJ   rz   s        r2   on_evaluatezTrainerCallback.on_evaluatev  r}   r4   c                     dS )z=
        Event called after a successful prediction.
        NrJ   )r/   r_   r.   rx   metricsr{   s         r2   
on_predictzTrainerCallback.on_predict|  r}   r4   c                     dS )z7
        Event called after a checkpoint save.
        NrJ   rz   s        r2   on_savezTrainerCallback.on_save  r}   r4   c                     dS )z;
        Event called after logging the last logs.
        NrJ   rz   s        r2   on_logzTrainerCallback.on_log  r}   r4   c                     dS )z7
        Event called after a prediction step.
        NrJ   rz   s        r2   on_prediction_stepz"TrainerCallback.on_prediction_step  r}   r4   N)r+   rP   rQ   rR   r   r   rh   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r4   r2   r"   r"     s       1 1f 1 , Q_    #4 \ Tb    !2 < R`    #4 \ Tb    !2 < R`    "3 L Sa    *; L [i    &7  We    #4 \ Tb     1 , Q_     1 , Q_    0  P^    - l ^    , \ N    '8  Xf      r4   r"   c                   r   e Zd ZdZd Zd Zd Zd Zed             Z	de
ded	efd
Zde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZde
ded	efdZd ZdS )CallbackHandlerz>Internal class that just calls the list of callbacks in order.c                     g | _         |D ]}|                     |           || _        || _        || _        || _        d | _        d | _        t          d | j         D                       s$t          
                    d| j        z              d S d S )Nc              3   @   K   | ]}t          |t                    V  d S N)r%   DefaultFlowCallback.0cbs     r2   	<genexpr>z+CallbackHandler.__init__.<locals>.<genexpr>  s-      PP2:b"566PPPPPPr4   zThe Trainer will not work properly if you don't have a `DefaultFlowCallback` in its callbacks. You
should add one before training with `trainer.add_callback(DefaultFlowCallback). The current list ofcallbacks is
:)	callbacksadd_callbackmodelprocessing_class	optimizerlr_schedulertrain_dataloadereval_dataloaderanyloggerwarningcallback_list)r/   r   r   r   r   r   r   s          r2   __init__zCallbackHandler.__init__  s     	" 	"Bb!!!!
 0"( $#PPPPPPP 	NN$ $%    	 	r4   c                 0   t          |t                    r
 |            n|}t          |t                    r|n|j        }|d | j        D             v r)t                              d| ddz   | j        z              | j                            |           d S )Nc                     g | ]	}|j         
S rJ   )r*   )r   cs     r2   
<listcomp>z0CallbackHandler.add_callback.<locals>.<listcomp>  s    <<<<<<r4   zYou are adding a zH to the callbacks of this Trainer, but there is already one. The currentzlist of callbacks is
:)r%   r)   r*   r   r   r   r   r-   )r/   r0   r   cb_classs       r2   r   zCallbackHandler.add_callback  s    %h55CXXZZZ8)(D99Q88x?Q<<T^<<<<<NNvHvvv+,$%  
 	b!!!!!r4   c                     t          |t                    r:| j        D ]0}t          ||          r| j                            |           |c S 1d S | j        D ]&}||k    r| j                            |           |c S 'd S r   r%   r)   r   remover/   r0   r   s      r2   pop_callbackzCallbackHandler.pop_callback  s    h%% 		n  b(++ N))"---III 
 n  >>N))"---III " r4   c                     t          |t                    r9| j        D ]/}t          ||          r| j                            |            d S 0d S | j                            |           d S r   r   r   s      r2   remove_callbackzCallbackHandler.remove_callback  s    h%% 	,n  b(++ N))"---FF 
 N!!(+++++r4   c                 J    d                     d | j        D                       S )Nr:   c              3   .   K   | ]}|j         j        V  d S r   )r*   r+   r   s     r2   r   z0CallbackHandler.callback_list.<locals>.<genexpr>  s'      HH2.HHHHHHr4   )joinr   r]   s    r2   r   zCallbackHandler.callback_list  s%    yyHHHHHHHHr4   r_   r.   rx   c                 2    |                      d|||          S )Nr|   
call_eventr/   r_   r.   rx   s       r2   r|   zCallbackHandler.on_init_end      }dE7CCCr4   c                 @    d|_         |                     d|||          S )NFr   )ri   r   r   s       r2   r   zCallbackHandler.on_train_begin  s#    ',$/ugFFFr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   zCallbackHandler.on_train_end      ~tUGDDDr4   c                 @    d|_         |                     d|||          S )NFr   )rj   r   r   s       r2   r   zCallbackHandler.on_epoch_begin  s#    $)!/ugFFFr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   zCallbackHandler.on_epoch_end  r   r4   c                 \    d|_         d|_        d|_        |                     d|||          S )NFr   )rm   rl   rk   r   r   s       r2   r   zCallbackHandler.on_step_begin  s2    ""'#eWEEEr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   z%CallbackHandler.on_pre_optimizer_step  s    6eWMMMr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   z!CallbackHandler.on_optimizer_step  s    2D%IIIr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   zCallbackHandler.on_substep_end  s    /ugFFFr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   zCallbackHandler.on_step_end  r   r4   c                 D    d|_         |                     d||||          S )NFr   r   )rl   r   r/   r_   r.   rx   r   s        r2   r   zCallbackHandler.on_evaluate  s&    "'}dE7GTTTr4   c                 6    |                      d||||          S )Nr   r   r   r   s        r2   r   zCallbackHandler.on_predict  s    |T5'7SSSr4   c                 @    d|_         |                     d|||          S )NFr   )rk   r   r   s       r2   r   zCallbackHandler.on_save  s"    #y$w???r4   c                 D    d|_         |                     d||||          S )NFr   )logs)rm   r   )r/   r_   r.   rx   r   s        r2   r   zCallbackHandler.on_log  s&    "xugDIIIr4   c                 2    |                      d|||          S )Nr   r   r   s       r2   r   z"CallbackHandler.on_prediction_step  s    3T5'JJJr4   c                     | j         D ]D} t          ||          |||f| j        | j        | j        | j        | j        | j        d|}||}E|S )N)r   r   r   r   r   r   )r   getattrr   r   r   r   r   r   )r/   eventr_   r.   rx   r{   r0   results           r2   r   zCallbackHandler.call_event  s     	! 	!H-WXu-- j!%!6.!.!%!6 $ 4   F ! r4   N)r+   rP   rQ   rR   r   r   r   r   propertyr   r   r   rh   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   r4   r2   r   r     so       HH  &	" 	" 	"
 
 
, , , I I XID 1 D, DQ_ D D D DG#4 G\ GTb G G G GE!2 E< ER` E E E EG#4 G\ GTb G G G GE!2 E< ER` E E E EF"3 FL FSa F F F FN*; NL N[i N N N NJ&7 J JWe J J J JG#4 G\ GTb G G G GD 1 D, DQ_ D D D DU 1 U, UQ_ U U U UT0 T TP^ T T T T@- @l @^ @ @ @ @J, J\ JN J J J JK'8 K KXf K K K K    r4   r   c                   :    e Zd ZdZdededefdZdededefdZdS )r   zx
    A [`TrainerCallback`] that handles the default flow of the training loop for logs, evaluation and checkpoints.
    r_   r.   rx   c                    |j         dk    r|j        rd|_        |j        t          j        k    r|j         |j        z  dk    rd|_        |j        t          j        k    r*|j         |j        z  dk    r|j	        |j         k    rd|_
        |j        t          j        k    r%|j        dk    r|j         |j        z  dk    rd|_        |j         |j        k    r#d|_        |j        t          j        k    rd|_        |S )Nr	   Tr   )r   logging_first_steprm   logging_strategyr
   STEPSr   eval_strategyr   
eval_delayrl   save_strategyr   rk   r   ri   NOrz   s        r2   r   zDefaultFlowCallback.on_step_end  s   !!d&=!!%G $4$:::u?PSXSf?fjk?k?k!%G "2"888!E$44995#444&*G# "2"888 1$$!E$4499"&G //+/G(!%5%888&*#r4   c                     |j         t          j        k    rd|_        |j        t          j        k    r|j        |j        k    rd|_        |j        t          j        k    rd|_	        |S )NT)
r   r
   EPOCHrm   r   r   r   rl   r   rk   rz   s        r2   r   z DefaultFlowCallback.on_epoch_end=  sg     $4$:::!%G !1!777DOu{<Z<Z&*G# !1!777"&Gr4   N)	r+   rP   rQ   rR   r   r   rh   r   r   rJ   r4   r2   r   r     su          1 , Q_    @!2 < R`      r4   r   c                   F    e Zd ZdZd Zd Zd ZddZd Zd Z	dd	Z
d
 ZdS )ProgressCallbackzU
    A [`TrainerCallback`] that displays the progress of training or evaluation.
    c                 "    d | _         d | _        d S r   )training_barprediction_barr]   s    r2   r   zProgressCallback.__init__R  s     "r4   c                 X    |j         rt          |j        d          | _        d| _        d S )NT)totaldynamic_ncolsr   )r   r   r   r   current_steprz   s        r2   r   zProgressCallback.on_train_beginV  s3    & 	P $5?$ O O ODr4   c                 ~    |j         r5| j                            |j        | j        z
             |j        | _        d S d S r   )r   r   updater   r   rz   s        r2   r   zProgressCallback.on_step_end[  sJ    & 	2$$U%69J%JKKK % 1D	2 	2r4   Nc                     |j         r]t          |          rP| j        +t          t	          |          | j        d u d          | _        | j                            d           d S d S d S )NT)r   leaver   r	   )r   r   r   r   lenr   r   )r/   r_   r.   rx   r   r{   s         r2   r   z#ProgressCallback.on_prediction_step`  s    & 	*:o+F+F 	*"*&*o..d6G46O_c' ' '# &&q)))))	* 	* 	* 	*r4   c                 f    |j         r)| j        | j                                         d | _        d S d S r   r   r   closerz   s        r2   r   zProgressCallback.on_evaluateh  C    & 	'".#))+++"&D	' 	'r4   c                 f    |j         r)| j        | j                                         d | _        d S d S r   r   rz   s        r2   r   zProgressCallback.on_predictn  r   r4   c                     |j         r| j        i }|                                D ]
\  }}|||<   |                    dd           }	d|v rt	          |d         d          |d<   | j                            t          |                     d S d S d S )Nr   r   r7   )r   r   ra   poproundrD   rV   )
r/   r_   r.   rx   r   r{   shallow_logsrd   re   _s
             r2   r   zProgressCallback.on_logt  s    & 
	74+<+H L

 $ $1"#Q  t44A,&&(-l7.CQ(G(GW%##C$5$566666
	7 
	7+H+Hr4   c                 X    |j         r"| j                                         d | _        d S d S r   )r   r   r   rz   s        r2   r   zProgressCallback.on_train_end  s:    & 	%##%%% $D	% 	%r4   r   )r+   rP   rQ   rR   r   r   r   r   r   r   r   r   rJ   r4   r2   r   r   M  s         # # #  
2 2 2
* * * *' ' '' ' '7 7 7 7% % % % %r4   r   c                       e Zd ZdZddZdS )PrinterCallbackz?
    A bare [`TrainerCallback`] that just prints the logs.
    Nc                 b    |                     dd           }|j        rt          |           d S d S )Nr   )r   r   print)r/   r_   r.   rx   r   r{   r   s          r2   r   zPrinterCallback.on_log  s9    HH\4((& 	$KKKKK	 	r4   r   )r+   rP   rQ   rR   r   rJ   r4   r2   r  r    s2              r4   r  c                   N    e Zd ZdZddedee         fdZd Zd Z	d	 Z
d
efdZdS )EarlyStoppingCallbacka1  
    A [`TrainerCallback`] that handles early stopping.

    Args:
        early_stopping_patience (`int`):
            Use with `metric_for_best_model` to stop training when the specified metric worsens for
            `early_stopping_patience` evaluation calls.
        early_stopping_threshold(`float`, *optional*):
            Use with TrainingArguments `metric_for_best_model` and `early_stopping_patience` to denote how much the
            specified metric must improve to satisfy early stopping conditions. `

    This callback depends on [`TrainingArguments`] argument *load_best_model_at_end* functionality to set best_metric
    in [`TrainerState`]. Note that if the [`TrainingArguments`] argument *save_steps* differs from *eval_steps*, the
    early stopping will not occur until the next save step.
    r	           early_stopping_patienceearly_stopping_thresholdc                 0    || _         || _        d| _        d S )Nr   r	  r
  early_stopping_patience_counter)r/   r	  r
  s      r2   r   zEarlyStoppingCallback.__init__  s     '>$(@%/0,,,r4   c                     |j         rt          j        nt          j        }|j        1 |||j                  r)t          ||j        z
            | j        k    r	d| _        d S | xj        dz  c_        d S )Nr   r	   )greater_is_betternpgreaterlessr   absr
  r  )r/   r_   r.   rx   metric_valueoperators         r2   check_metric_valuez(EarlyStoppingCallback.check_metric_value  s}    !%!7D2::RW$H\5#455 %L5#44558UUU34D00000A50000r4   c                     |j         s
J d            |j        
J d            |j        t          j        k    s
J d            d S )Nz<EarlyStoppingCallback requires load_best_model_at_end = Truez?EarlyStoppingCallback requires metric_for_best_model is definedzAEarlyStoppingCallback requires IntervalStrategy of steps or epoch)load_best_model_at_endmetric_for_best_modelr   r
   r   rz   s        r2   r   z$EarlyStoppingCallback.on_train_begin  s_    *jj,jjjj&22L 322 "2"5555N 65555r4   c                    |j         }|                    d          sd| }|                    |          }| t                              d| d           d S |                     ||||           | j        | j        k    r	d|_        d S d S )Neval_z@early stopping required metric_for_best_model, but did not find z so early stopping is disabledT)	r  
startswithgetr   r   r  r  r	  ri   )r/   r_   r.   rx   r   r{   metric_to_checkr  s           r2   r   z!EarlyStoppingCallback.on_evaluate  s    4))'22 	87o77O{{?33NNSb      FeWlCCC/43OOO+/G((( POr4   rZ   c                 4    | j         | j        dd| j        idS )N)r	  r
  r  rv   r  r]   s    r2   r.   zEarlyStoppingCallback.state  s8     ,0+G,0,I 
 243W
 
 	
r4   N)r	   r  )r+   rP   rQ   rR   rU   r   rS   r   r  r   r   r&   r.   rJ   r4   r2   r  r    s          1 1 1S[\aSb 1 1 1 1	6 	6 	6O O O0 0 0"	
t 	
 	
 	
 	
 	
 	
r4   r  ) rR   rA   r?   r   typingr   r   r   r   numpyr  	tqdm.autor   trainer_utilsr
   r   training_argsr   utilsr   
get_loggerr+   r   r   r'   rh   r"   r   r   r   r  r  rJ   r4   r2   <module>r'     s         ! ! ! ! ! ! . . . . . . . . . . . .           7 7 7 7 7 7 7 7 , , , , , ,       
	H	%	% r' r' r' r' r' r' r' r'j) ) ) ) ) ) ) )X :
 :
 :
 :
 :
_ :
 :
 :
zO O O O O O O Od@ @ @ @ @o @ @ @F2 2 2 2 2/ 2 2 2j7% 7% 7% 7% 7% 7% 7% 7%t    o   E
 E
 E
 E
 E
O_ E
 E
 E
 E
 E
r4   