U
    9%et                    @   s  d Z ddlZddlZddlZddlZddlZddlZddl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mZ ddlZddlmZ ddlmZmZmZmZmZ ee Z!e rddl"Z"ej#$d	dk	oe%d
d& dkZ'e'rbzPddl(Z(e)e(dre(j*+drdZ'n$e%d
d& dkr<e!,d dZ'W n e-e.fk
r`   dZ'Y nX ej#$ddk	pej#$ddk	Z/ere/rz"ej0dZ1e!2de1 d W n\ ej0j3k
r   z"ej0dZ1e!2de1 d W n ej0j3k
r   dZ/Y nX Y nX ddl4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z< ddlm=Z=m>Z> dd Z?dd Z@dd  ZAd!d" ZBd#d$ ZCd%d& ZDd'd( ZEd)d* ZFd+d, ZGd-d. ZHd/d0 ZId1d2 ZJd3d4 ZKd5d6 ZLd7d8 ZMd9d: ZNd;d< ZOePeQe9d=d>d?ZRePeQe9d=d@dAZSePeQe9d=dBdCZTePeQe9d=dDdEZUdFdG ZVdHdI ZWG dJdK dKe6ZXG dLdM dMe6ZYG dNdO dOe6ZZG dPdQ dQe6Z[G dRdS dSe6Z\G dTdU dUe\Z]G dVdW dWe^Z_G dXdY dYe6Z`G dZd[ d[e6ZaG d\d] d]e6ZbG d^d_ d_e6Zce[eZe\e`eXeYeaebe]ecd`
Zddadb ZedS )cz+
Integrations with other Python libraries.
    N)asdict)Path)TYPE_CHECKINGDictOptional   )__version__)flatten_dictis_datasets_availableis_pandas_availableis_torch_availableloggingcomet_ml
COMET_MODE ZDISABLEDconfigzcomet.api_keyTz5comet_ml is installed but `COMET_API_KEY` is not set.Fneptunezneptune-clientzNeptune version z available.zNeptune-client version )ProgressCallbackTrainerCallback)PREFIX_CHECKPOINT_DIRBestRunIntervalStrategy)ParallelMode)ENV_VARS_TRUE_VALUESis_torch_tpu_availablec                   C   s2   t dd tkr"td dS tjdd k	S )NZWANDB_DISABLEDr   zUsing the `WANDB_DISABLED` environment variable is deprecated and will be removed in v5. Use the --report_to flag to control the integrations used for logging result (for instance --report_to none).Fwandb)	osgetenvupperr   loggerwarning	importlibutil	find_spec r$   r$   j/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/transformers/integrations/integration_utils.pyis_wandb_availableN   s    r&   c                   C   s   t jdd k	S )Nclearmlr!   r"   r#   r$   r$   r$   r%   is_clearml_availableY   s    r)   c                   C   s   t S N)
_has_cometr$   r$   r$   r%   is_comet_available]   s    r,   c                   C   s    t jdd k	pt jdd k	S )NtensorboardtensorboardXr(   r$   r$   r$   r%   is_tensorboard_availablea   s    r/   c                   C   s   t jdd k	S )Noptunar(   r$   r$   r$   r%   is_optuna_availablee   s    r1   c                   C   s   t jdd k	S )Nrayr(   r$   r$   r$   r%   is_ray_availablei   s    r3   c                   C   s   t  s
dS tjdd k	S )NFzray.tune)r3   r!   r"   r#   r$   r$   r$   r%   is_ray_tune_availablem   s    r4   c                   C   s   t jdd k	S )Nsigoptr(   r$   r$   r$   r%   is_sigopt_availables   s    r6   c                   C   s8   t jdd krdS t jdd kr(dS t jdd k	S )NZazuremlFzazureml.corezazureml.core.runr(   r$   r$   r$   r%   is_azureml_availablew   s
    r7   c                   C   s(   t dd dkrdS tjdd k	S )NZDISABLE_MLFLOW_INTEGRATIONFALSETRUEFmlflow)r   r   r   r!   r"   r#   r$   r$   r$   r%   is_mlflow_available   s    r;   c                   C   s   d t jdt jdfkS )Ndagshubr:   r(   r$   r$   r$   r%   is_dagshub_available   s    r=   c                   C   s   t jdd k	S )NZ	fairscaler(   r$   r$   r$   r%   is_fairscale_available   s    r>   c                   C   s   t S r*   )_has_neptuner$   r$   r$   r%   is_neptune_available   s    r@   c                   C   s   t jdd k	S )N
codecarbonr(   r$   r$   r$   r%   is_codecarbon_available   s    rB   c                   C   s   t jdd k	S )Nflytekitr(   r$   r$   r$   r%   is_flytekit_available   s    rD   c                   C   s   t  s
dS tjdd k	S )NFzflytekitplugins.deck)rD   r!   r"   r#   r$   r$   r$   r%    is_flyte_deck_standard_available   s    rE   c                 C   sp   t  r dd l}t| |jr | jS t r4t| tr4| S t rHt| trH| S t r\t| tr\| S t	d| j
 d S )Nr   zUnknown type for trial )r1   r0   
isinstanceZTrialparamsr4   dictr6   r&   RuntimeError	__class__)trialr0   r$   r$   r%   	hp_params   s    


rL   )n_trials	directionreturnc                    s~  dd l } jjdkrd fdd	}|dd }|dd}t|trH|nd }|d k	rXd n|}|jf ||d|}	|	j||||d |	 s|	j	}
t
t|
j|
j|
jS |	j}d	d
 |D S nt|D ]}d  _tt j} jjtjkrtdtjj|dd tt|}t| D ]"\}}|dkr t j|| q  j d d t! dd d krƈ " } #| _qd S d S )Nr   c                    s   d }|r0t |D ]}|trt j||}qd  _ jjdkr jj	t
jkrXtd |  tjjt jdd  j|d n j|| d t dd d kr  } | _ jS )N   Conly support DDP optuna HPO for ParallelMode.DISTRIBUTED currently.r   srcresume_from_checkpointrU   rK   	objective)r   listdir
startswithr   pathjoinrW   args
world_sizeparallel_moder   DISTRIBUTEDrI   _hp_search_setuptorchdistributedbroadcast_object_listpickledumpstraingetattrevaluatecompute_objective)rK   checkpoint_dir
checkpointsubdirmetricstrainerr$   r%   
_objective   s"    

z(run_hp_search_optuna.<locals>._objectivetimeoutn_jobsrP   )rN   
directions)rM   rq   rr   c                 S   s"   g | ]}t t|j|j|jqS r$   )r   strnumbervaluesrG   ).0bestr$   r$   r%   
<listcomp>   s     z(run_hp_search_optuna.<locals>.<listcomp>rQ   rR   
local_rankrT   rW   )N)$r0   r\   process_indexpoprF   listZcreate_studyoptimizeZ_is_multi_objective
best_trialr   rt   ru   valuerG   best_trialsrangerW   rd   re   r^   r   r_   rI   ra   rb   rc   loadsbytesr   itemssetattrrf   rg   rh   ri   )ro   rM   rN   kwargsr0   rp   rq   rr   rs   Zstudyr   r   iargs_main_rankr\   keyr   rm   r$   rn   r%   run_hp_search_optuna   s:    
r   c                    sZ  dd l  d% fdd	}| jjs@ddlm} td |dd| _| t}d | _	d	|krd
di|d	< | j
jdkr|d|d	 d< d| j
jdkrdnd }td| d |d	 dd}|| j
_d|krddlm}	 |	dgd|d< d|kr$|d dkr$d| _|d dkr$td|d  d d|krddlm}
m}m}m} t|d |rh| jshtd t|d |
|||fr| j
jr| j
jtjkrtdjt|d jd j j!|| dt"#fdd }t$d!rj%|_% j j&|f| 'd |d"|}|j(d|d d# | j
j)d$}t*|j+|j,d |j-|}|d k	rV| .| |S )&Nr   c                    s   z$ddl m} ||r"|t W n tk
r8   Y nX d }|rjt|D ]}|t	rLtj
||}qLd |_|j|| d t|dd d kr| }|||_|   jjf d|ji|ddi d S )Nr   )NotebookProgressCallbackrV   rW   doneT)Ztransformers.utils.notebookr   pop_callbackadd_callbackr   ModuleNotFoundErrorr   rX   rY   r   rZ   r[   rW   rf   rg   rh   ri   Z_tune_save_checkpointtunereport)rK   local_trainerrj   r   rk   rl   rm   )r2   r$   r%   rp      s$    

z%run_hp_search_ray.<locals>._objectiver   )TrainerMemoryTrackerzMemory tracking for your Trainer is currently enabled. Automatically disabling the memory tracker since the memory tracker is not serializable.T)skip_memory_metricsZresources_per_trialcpurP   Zgpuz1 CPUz
 and 1 GPUr   zgNo `resources_per_trial` arg was passed into `hyperparameter_search`. Setting it to a default value of z for each trial.Zprogress_reporter)CLIReporterrW   )Zmetric_columnsZkeep_checkpoints_numzCurrently keeping ze checkpoints for each trial. Checkpoints are usually huge, consider setting `keep_checkpoints_num=1`.Z	scheduler)ASHASchedulerHyperBandForBOHBMedianStoppingRulePopulationBasedTraininga/  You are using PopulationBasedTraining but you haven't enabled checkpointing. This means your trials will train from scratch everytime they are exploiting new configurations. Consider enabling checkpointing by passing `keep_checkpoints_num=1` as an additional argument to `Trainer.hyperparameter_search`.a  You are using {cls} as a scheduler but you haven't enabled evaluation during training. This means your trials will not report intermediate results to Ray Tune, and can thus not be stopped early or used to exploit other trials parameters. If this is what you want, do not use {cls}. If you would like to use {cls}, make sure you pass `do_eval=True` and `evaluation_strategy='steps'` in the Trainer `args`.)cls)r   c                     s^   t  rTddl}tj|j d}tj	d|}tj
|}|tj|j< |j|  | |S )a"  
        Wrapper around `tune.with_parameters` to ensure datasets_modules are loaded on each Actor.

        Without this, an ImportError will be thrown. See https://github.com/huggingface/transformers/issues/11565.

        Assumes that `_objective`, defined above, is a function.
        r   Nz__init__.pydatasets_modules)r
   Zdatasets.loadr   rZ   r[   loadZinit_dynamic_modulesr!   r"   spec_from_file_locationmodule_from_specsysmodulesnameloaderexec_module)r\   r   ZdatasetsZdynamic_modules_pathspecr   )	trainabler$   r%    dynamic_modules_import_trainableP  s    	z;run_hp_search_ray.<locals>.dynamic_modules_import_trainable
__mixins__)r   Znum_samples   )metricmodescope)N)/r2   Z_memory_trackerr   trainer_utilsr   r   r    r   TensorBoardCallbackmodelr\   Zn_gpuinfogetZ_n_gpuZray.tuner   Zuse_tune_checkpointsZray.tune.schedulersr   r   r   r   rF   Zdo_evalZevaluation_strategyr   NOrI   formattype__name__r   Zwith_parameters	functoolswrapshasattrr   runhp_spaceZget_best_trialZ	ray_scoper   Ztrial_idZlast_resultr   r   )ro   rM   rN   r   rp   r   Z
_tb_writerZresource_msgZgpus_per_trialr   r   r   r   r   r   Zanalysisr   best_runr$   )r2   r   r%   run_hp_search_ray   s    


 
	

r   c              
   K   s  dd l }| jjdkrtjddkrR|d |jdd| d d|dd	gd
|d}t	
d|j  | D ]}| d | _| jjd
kr| jjtjkrtd| |j tjjt| jdd | jd d n| jd |jd t| dd d kr|  }| || _|d| j W 5 Q R X qrt|  d }t!|j|j"d j#|j$}	nddl m%}
 |
 }|&dd }|d k	r|'| |( j)d| d d|dd	gd
|dd}t	
d|j  |j*j+|j,k r|(|j- ) }d | _| jjd
kr@| jjtjkrtd| | tjjt| jdd | jd d n| jd |d t| dd d krt|  }| || _d| jdg}|(|j. j)|j|d}t	
d|j d|j d |(|j/ }qt|(|j0 / 1 d }t!|j|j#|j$}	|	S t2|D ]}d | _tt| j}| jjtjkr>tdtjj|dd t3t4|}t5|6 D ]"\}}|dkrht7| j|| qh| jd d t| dd d kr|  }| || _qd S d S )Nr   r5   z8.0.0huggingfacezhuggingface-tuneZofflinerW   r~   )r   rW   ZstrategyrP   )r   r   
parametersrm   parallel_bandwidthZbudgetz6created experiment: https://app.sigopt.com/experiment/zConly support DDP Sigopt HPO for ParallelMode.DISTRIBUTED currently.rR   rT   rV   )
Connectionproxies)r   r   rm   r   observation_budgetprojectr   r   )
suggestionrv   z"[suggestion_id, observation_id]: [, ]rz   )8r5   r\   r{   r!   metadataversionZset_projectZcreate_experimentr   r   r   idlooprW   r]   r^   r   r_   rI   r`   r   ra   rb   rc   rd   re   rf   rg   rh   ri   Z
log_metricr}   Zget_best_runsr   rv   r   assignmentsr   r|   Zset_proxiesZexperimentscreateprogressZobservation_countr   ZsuggestionsZobservationsfetchZbest_assignmentsZiterate_pagesr   r   r   r   r   r   )ro   rM   rN   r   r5   
experimentr   rm   rx   r   r   connr   r   rv   Zobsr   r   r\   r   r   r$   r$   r%   run_hp_search_sigoptu  s    
	


 
r   c                    s:  ddl m} | stddd ld}jjD ]}t|tr.d} qFq.|sVt  dgj	_
d d d d |d	d }|d
d }|dd }	|dd }
|ddd }|d d< |d d< |	r|	|d<  fdd}|sj|||
dn|}td|  j|||d t d  d  d S )Nr   )r&   z8This function needs wandb installed: `pip install wandb`r   FTr   )run_idrW   hyperparameterssweep_idr   r   entityr   z	eval/lossZgoalc                     s  j rj n } | jj_| ji d j}d _jd t	|d d t
dd d kr }|_t|}|krtd d|   d} d d k	rވd	krȈj d k }nd
krވj d k}|s d d kr| j d< j d< t| d< jS )N)r   r   Z_itemsrV   rW   zProvided metric zU not found. This might result in unexpected sweeps charts. The available metrics are Fr   ZminimizeZmaximizer   )r   initr   state
trial_namer   updaterW   rf   varsrg   rh   ri   rewrite_logsr   r    keysr   rH   )r   r   rm   Zformat_metricsZ
best_scorer   rN   r   ro   r   r$   r%   rp     s2    


z'run_hp_search_wandb.<locals>._objective)r   r   zwandb sweep id - )functioncountr   rW   r   )integrationsr&   ImportErrorr   callback_handler	callbacksrF   WandbCallbackr   r\   	report_tor|   r   Zsweepr   r   Zagentr   )ro   rM   rN   r   r&   Zreporting_to_wandbcallbackr   r   r   r   Zsweep_configrp   r$   r   r%   run_hp_search_wandb  s8    


!r   c                  C   s   g } t  rt s| d t r*| d t r:| d t rJ| d t rZ| d t rj| d t rz| d t r| d t	 r| d	 | S )
Nazure_mlr   r<   r:   r   r-   r   rA   r'   )
r7   r;   appendr,   r=   r@   r/   r&   rB   r)   )r   r$   r$   r%   $get_available_reporting_integrations  s(    








r   c                 C   s~   i }d}t |}d}t |}|  D ]T\}}||rL||d||d   < q$||rl||d||d   < q$||d| < q$|S )Neval_test_eval/ztest/ztrain/)lenr   rY   )dZnew_deval_prefixeval_prefix_lentest_prefixtest_prefix_lenkvr$   r$   r%   r   3  s    

r   c                   @   s>   e Zd ZdZdddZdddZdd Zdd	d
Zdd ZdS )r   z
    A [`TrainerCallback`] that sends the logs to [TensorBoard](https://www.tensorflow.org/tensorboard).

    Args:
        tb_writer (`SummaryWriter`, *optional*):
            The writer to use. Will instantiate one if not set.
    Nc                 C   s   t  }|std|rvzddlm} || _W q| tk
rr   zddlm} || _W n tk
rl   d | _Y nX Y q|X nd | _|| _d S )NzuTensorBoardCallback requires tensorboard to be installed. Either update your PyTorch version or install tensorboardX.r   )SummaryWriter)r/   rI   Ztorch.utils.tensorboardr   _SummaryWriterr   r.   	tb_writer)selfr   Zhas_tensorboardr   r$   r$   r%   __init__L  s"    

zTensorBoardCallback.__init__c                 C   s&   |p|j }| jd k	r"| j|d| _d S )N)log_dir)logging_dirr   r   )r   r\   r   r$   r$   r%   _init_summary_writerc  s    

z(TensorBoardCallback._init_summary_writerc           	      K   s   |j s
d S d }|jr2|j}|d k	r2tj|j|}| jd krH| || | jd k	r| j	d|
  d|kr|d }t|dr|jd k	r|j
 }| j	d| d S )Nr\   r   r   model_config)is_world_process_zerois_hyper_param_searchr   r   rZ   r[   r   r   r   add_textZto_json_stringr   r   )	r   r\   r   controlr   r   r   r   Zmodel_config_jsonr$   r$   r%   on_train_beginh  s     


z"TensorBoardCallback.on_train_beginc              
   K   s   |j s
d S | jd kr| | | jd k	rt|}| D ]L\}}t|ttfrb| j|||j	 q8t
d| dt| d| d q8| j  d S )N)Trainer is attempting to log a value of "
" of type 
 for key "zn" as a scalar. This invocation of Tensorboard's writer.add_scalar() is incorrect so we dropped this attribute.)r  r   r   r   r   rF   intfloatZ
add_scalarglobal_stepr   r    r   flushr   r\   r   r  logsr   r   r   r$   r$   r%   on_log~  s    


zTensorBoardCallback.on_logc                 K   s   | j r| j   d | _ d S r*   )r   closer   r\   r   r  r   r$   r$   r%   on_train_end  s    
z TensorBoardCallback.on_train_end)N)N)N)	r   
__module____qualname____doc__r   r   r  r  r  r$   r$   r$   r%   r   C  s   


r   c                   @   sF   e Zd ZdZdd Zdd ZdddZdd	d
ZdddZdd Z	dS )r   z{
    A [`TrainerCallback`] that logs metrics, media, model checkpoints to [Weight and Biases](https://www.wandb.com/).
    c                 C   s   t  }|std|r$dd l}|| _d| _tdd t	dhkr|t
dtd d td	td d
 d| _ntdd | _d S )NzFWandbCallback requires wandb to be installed. Run `pip install wandb`.r   FZWANDB_LOG_MODELr8   r9   zSetting `WANDB_LOG_MODEL` as zn is deprecated and will be removed in version 5 of transformers. Use one of `'end'` or `'checkpoint'` instead.zSetting `WANDB_LOG_MODEL` from z to `end` insteadendfalse)r&   rI   r   _wandb_initializedr   r   r   r   unionDeprecationWarningr   r   
_log_modellower)r   Z	has_wandbr   r$   r$   r%   r     s    zWandbCallback.__init__c           
      K   sB  | j dkrdS d| _|jr>td | }t|drV|jdk	rV|j }||}|j}i }|dk	r|||d< |j	|d< n |j	dks|j	|j
ks|j	|d< | j jdkr| j jf dtdd	i| | j jj|dd
 t| j ddr| j d | j jdddd tdd}	t s>|	dkr>| j j||	td|jd dS )u  
        Setup the optional Weights & Biases (*wandb*) integration.

        One can subclass and override this method to customize the setup if needed. Find more information
        [here](https://docs.wandb.ai/guides/integrations/huggingface). You can also override the following environment
        variables:

        Environment:
        - **WANDB_LOG_MODEL** (`str`, *optional*, defaults to `"false"`):
            Whether to log model and checkpoints during training. Can be `"end"`, `"checkpoint"` or `"false"`. If set
            to `"end"`, the model will be uploaded at the end of training. If set to `"checkpoint"`, the checkpoint
            will be uploaded every `args.save_steps` . If set to `"false"`, the model will not be uploaded. Use along
            with [`~transformers.TrainingArguments.load_best_model_at_end`] to upload best model.

            <Deprecated version="5.0">

            Setting `WANDB_LOG_MODEL` as `bool` will be deprecated in version 5 of 🤗 Transformers.

            </Deprecated>
        - **WANDB_WATCH** (`str`, *optional* defaults to `"false"`):
            Can be `"gradients"`, `"all"`, `"parameters"`, or `"false"`. Set to `"all"` to log gradients and
            parameters.
        - **WANDB_PROJECT** (`str`, *optional*, defaults to `"huggingface"`):
            Set this to a custom string to store results in a different project.
        - **WANDB_DISABLED** (`bool`, *optional*, defaults to `False`):
            Whether to disable wandb entirely. Set `WANDB_DISABLED=true` to disable.
        NTz`Automatic Weights & Biases logging enabled, to disable set os.environ["WANDB_DISABLED"] = "true"r   r   groupr   ZWANDB_PROJECTr   )Zallow_val_changedefine_metrictrain/global_step*)Zstep_metricZ	step_syncZWANDB_WATCHr  )allr   Z	gradientsd   )logZlog_freq)r  r  r  r   r   to_dictr   r   r   run_name
output_dirr   r   r   r   r   rg   r  r   watchmaxZlogging_steps)
r   r\   r   r   r   combined_dictr   r   Z	init_argsZ_watch_modelr$   r$   r%   setup  s>    





zWandbCallback.setupNc                 K   sJ   | j d krd S |j}|r.| j   d| _d |_| jsF| j|||f| d S NF)r  r  finishr  r&  r+  )r   r\   r   r  r   r   Z	hp_searchr$   r$   r%   r    s    

zWandbCallback.on_train_beginc                 K   sD  | j d krd S | jdkr@| jr@|jr@ddlm} ||||d}t }	||	 |j	sxdd t
| j j D nd|j |jd|ji}
td	 |jd ks|j|jkrd
| j jj nd
| j jj }| j j|d|
d}t|	dD ]6}| r|j|jdd}||  W 5 Q R X q| j j| W 5 Q R X d S )N)r  rk   r   )Trainer)r\   r   	tokenizerc                 S   s,   i | ]$\}}t |tjr|d s||qS _rF   numbersNumberrY   rw   r   r   r$   r$   r%   
<dictcomp>
  s
    
 z.WandbCallback.on_train_end.<locals>.<dictcomp>r   ztrain/total_flosszLogging model artifacts. ...zmodel-r   r   r   r   r!  wb)r   )r  r  r  r  ro   r.  tempfileTemporaryDirectoryZ
save_modelload_best_model_at_endrH   summaryr   metric_for_best_modelbest_metric
total_flosr   r   r&  r'  r   r   r   Artifactr   globis_filenew_filewrite
read_byteslog_artifact)r   r\   r   r  r   r/  r   r.  Zfake_trainertemp_dirr   Z
model_nameartifactffar$   r$   r%   r     s<    



  

zWandbCallback.on_train_endc                 K   sJ   | j d krd S | js"| ||| |jrFt|}| j |d|ji d S )Nr   )r  r  r+  r  r   r$  r  )r   r\   r   r  r   r  r   r$   r$   r%   r  "  s    
zWandbCallback.on_logc           
      K   s   | j dkr| jr|jrdd t| jj D }d|j }tj	
|j|}td| d |jd kst|j|jkrd| jjj nd| jjj }| jj|d|d}	|	| | jj|	d|j gd	 d S )
Nrk   c                 S   s,   i | ]$\}}t |tjr|d s||qS r0  r2  r5  r$   r$   r%   r6  -  s
    
 z)WandbCallback.on_save.<locals>.<dictcomp>checkpoint- Logging checkpoint artifacts in z. ...r   r7  )aliases)r  r  r  rH   r  r<  r   r  r   rZ   r[   r'  r   r   r&  r   r   r   r@  add_dirrF  )
r   r\   r   r  r   Zcheckpoint_metadatackpt_dirartifact_pathZcheckpoint_namerH  r$   r$   r%   on_save+  s     

zWandbCallback.on_save)N)NN)NN
r   r  r  r  r   r+  r  r  r  rQ  r$   r$   r$   r%   r     s   C

"
	r   c                   @   s<   e Zd ZdZdd Zdd ZdddZdd	d
Zdd ZdS )CometCallbackz^
    A [`TrainerCallback`] that sends the logs to [Comet ML](https://www.comet.ml/site/).
    c                 C   s   t stdd| _d| _d S )NzLCometCallback requires comet-ml to be installed. Run `pip install comet-ml`.F)r+   rI   r  _log_assetsr   r$   r$   r%   r   E  s    zCometCallback.__init__c                 C   s   d| _ tdd }|dkr$d| _|jrtdd }d}dtd	d
i}|dkrztjf |}|dd t	
d n:|dkrtdd|d< tjf |}|dd t	
d |dk	r|j|dd |j|ddd t|dr|j|jddd dS )a  
        Setup the optional Comet.ml integration.

        Environment:
        - **COMET_MODE** (`str`, *optional*, defaults to `ONLINE`):
            Whether to create an online, offline experiment or disable Comet logging. Can be `OFFLINE`, `ONLINE`, or
            `DISABLED`.
        - **COMET_PROJECT_NAME** (`str`, *optional*):
            Comet project name for experiments.
        - **COMET_OFFLINE_DIRECTORY** (`str`, *optional*):
            Folder to use for saving offline experiments when `COMET_MODE` is `OFFLINE`.
        - **COMET_LOG_ASSETS** (`str`, *optional*, defaults to `TRUE`):
            Whether or not to log training assets (tf event logs, checkpoints, etc), to Comet. Can be `TRUE`, or
            `FALSE`.

        For a number of configurable items in the environment, see
        [here](https://www.comet.ml/docs/python-sdk/advanced/#comet-configuration-variables).
        TZCOMET_LOG_ASSETSr8   >   1r9   r   ZONLINENproject_nameZCOMET_PROJECT_NAMEr   zCreated fromtransformersz)Automatic Comet.ml online logging enabledZOFFLINEZCOMET_OFFLINE_DIRECTORYz./Zoffline_directoryzLAutomatic Comet.ml offline logging enabled; use `comet upload` when finished)	frameworkzargs/)prefixrY  r   zconfig/)r  r   r   r   rT  r  r   Z
ExperimentZ	log_otherr   r   ZOfflineExperimentZ_set_model_graph_log_parametersr   r   )r   r\   r   r   Z
log_assetsZ
comet_moder   Zexperiment_kwargsr$   r$   r%   r+  K  s,    

zCometCallback.setupNc                 K   s   | j s| ||| d S r*   r  r+  r   r\   r   r  r   r   r$   r$   r%   r  u  s    zCometCallback.on_train_beginc                 K   sF   | j s| ||| |jrBtj }|d k	rB|j||j|jdd d S )NrX  )stepepochrY  )	r  r+  r  r   r   get_global_experimentZ_log_metricsr  r_  )r   r\   r   r  r   r  r   r   r$   r$   r%   r  y  s    
zCometCallback.on_logc                 K   sT   | j rP|jrPtj }|d k	rP| jdkrHtd |j|j	dd|j
d |  d S )NTz(Logging checkpoints. This may take time.)	recursiveZlog_file_namer^  )r  r  r   r   r`  rT  r   r   Zlog_asset_folderr'  r  r  )r   r\   r   r  r   r   r$   r$   r%   r    s    


   zCometCallback.on_train_end)N)NN)	r   r  r  r  r   r+  r  r  r  r$   r$   r$   r%   rS  @  s   *

rS  c                   @   s,   e Zd ZdZd	ddZdd Zd
ddZdS )AzureMLCallbackzh
    A [`TrainerCallback`] that sends the logs to [AzureML](https://pypi.org/project/azureml-sdk/).
    Nc                 C   s   t  std|| _d S )NzPAzureMLCallback requires azureml to be installed. Run `pip install azureml-sdk`.)r7   rI   azureml_run)r   rc  r$   r$   r%   r     s    zAzureMLCallback.__init__c                 K   s*   ddl m} | jd kr&|jr&| | _d S )Nr   Run)Zazureml.core.runre  rc  r  Zget_context)r   r\   r   r  r   re  r$   r$   r%   on_init_end  s    zAzureMLCallback.on_init_endc                 K   sB   | j r>|jr>| D ](\}}t|ttfr| j j|||d qd S )N)description)rc  r  r   rF   r	  r
  r$  r  r$   r$   r%   r    s    zAzureMLCallback.on_log)N)N)r   r  r  r  r   rf  r  r$   r$   r$   r%   rb    s   
rb  c                   @   sL   e Zd ZdZdd Zdd ZdddZdd	d
Zdd Zdd Z	dd Z
dS )MLflowCallbackz
    A [`TrainerCallback`] that sends the logs to [MLflow](https://www.mlflow.org/). Can be disabled by setting
    environment variable `DISABLE_MLFLOW_INTEGRATION = TRUE`.
    c                 C   sJ   t  stddd l}|jjj| _|jjj| _d| _	d| _
d| _|| _d S )NzIMLflowCallback requires mlflow to be installed. Run `pip install mlflow`.r   F)r;   rI   r:   utilsZ
validationZMAX_PARAM_VAL_LENGTH_MAX_PARAM_VAL_LENGTHZMAX_PARAMS_TAGS_PER_BATCH_MAX_PARAMS_TAGS_PER_BATCHr  _auto_end_run_log_artifacts_ml_flow)r   r:   r$   r$   r%   r     s    zMLflowCallback.__init__c              
   C   s  t dd tk| _t dd tk| _t dd| _t dd tk| _t dd| _t	
d| j d	|j d
| j d| j  |jr| j dks| js| jr| jr| j| j | jj|j| jd t	
d| j jj  d| _| }t|dr$|jdk	r$|j }||}| jr4t|n|}t| D ]<\}}tt|| jkrDt	d| d| d ||= qDt| }tdt|| jD ]$}	| j t!||	|	| j   qt dd}
|
rt"#|
}
| j$|
 d| _%dS )at  
        Setup the optional MLflow integration.

        Environment:
        - **HF_MLFLOW_LOG_ARTIFACTS** (`str`, *optional*):
            Whether to use MLflow `.log_artifact()` facility to log artifacts. This only makes sense if logging to a
            remote server, e.g. s3 or GCS. If set to `True` or *1*, will copy each saved checkpoint on each save in
            [`TrainingArguments`]'s `output_dir` to the local or remote artifact storage. Using it without a remote
            storage will just copy the files to your artifact location.
        - **MLFLOW_EXPERIMENT_NAME** (`str`, *optional*, defaults to `None`):
            Whether to use an MLflow experiment_name under which to launch the run. Default to `None` which will point
            to the `Default` experiment in MLflow. Otherwise, it is a case sensitive name of the experiment to be
            activated. If an experiment with this name does not exist, a new experiment with this name is created.
        - **MLFLOW_TAGS** (`str`, *optional*):
            A string dump of a dictionary of key/value pair to be added to the MLflow run as tags. Example:
            `os.environ['MLFLOW_TAGS']='{"release.candidate": "RC1", "release.version": "2.2.0"}'`.
        - **MLFLOW_NESTED_RUN** (`str`, *optional*):
            Whether to use MLflow nested runs. If set to `True` or *1*, will create a nested run inside the current
            run.
        - **MLFLOW_RUN_ID** (`str`, *optional*):
            Allow to reattach to an existing run which can be usefull when resuming training from a checkpoint. When
            `MLFLOW_RUN_ID` environment variable is set, `start_run` attempts to resume a run with the specified run ID
            and other parameters are ignored.
        - **MLFLOW_FLATTEN_PARAMS** (`str`, *optional*, defaults to `False`):
            Whether to flatten the parameters dictionary before logging.
        ZHF_MLFLOW_LOG_ARTIFACTSr8   ZMLFLOW_NESTED_RUNZMLFLOW_EXPERIMENT_NAMENZMLFLOW_FLATTEN_PARAMSZMLFLOW_RUN_IDzMLflow experiment_name=z, run_name=z	, nested=z, tags=)r&  nestedzMLflow run started with run_id=Tr   r  z" for key "z" as a parameter. MLflow's log_param() only accepts values no longer than 250 characters so we dropped this attribute. You can use `MLFLOW_FLATTEN_PARAMS` environment variable to flatten the parameters and avoid this message.r   ZMLFLOW_TAGS)&r   r   r   r   rm  Z_nested_runZ_experiment_nameZ_flatten_params_run_idr   debugr&  r  rn  
active_runZset_experimentZ	start_runr   r   rl  r%  r   r   r	   r}   r   r   rt   rj  r    r   rk  Z
log_paramsrH   jsonr   Zset_tagsr  )r   r\   r   r   r*  r   r   r   Zcombined_dict_itemsr   Zmlflow_tagsr$   r$   r%   r+    sD    "

"
zMLflowCallback.setupNc                 K   s   | j s| ||| d S r*   r\  r]  r$   r$   r%   r    s    zMLflowCallback.on_train_beginc           
   
   K   s   | j s| ||| |jr|i }| D ]B\}}	t|	ttfrF|	||< q&td|	 dt	|	 d| d q&| j
j||jd d S )Nr  r  r  zc" as a metric. MLflow's log_metric() only accepts float and int types so we dropped this attribute.)rm   r^  )r  r+  r  r   rF   r	  r
  r   r    r   rn  Zlog_metricsr  )
r   r\   r   r  r  r   r   rm   r   r   r$   r$   r%   r    s    
zMLflowCallback.on_logc                 K   s*   | j r&|jr&| jr&| j r&| j  d S r*   )r  r  rl  rn  rr  end_runr  r$   r$   r%   r    s    zMLflowCallback.on_train_endc                 K   sd   | j r`|jr`| jr`d|j }tj|j|}t	d| d | j
jj|d|i| j
j d d S )NrK  rL  . This may take time.Z
model_path)	artifactsZpython_model)r  r  rm  r  r   rZ   r[   r'  r   r   rn  ZpyfuncZ	log_modelZPythonModelr   r\   r   r  r   rO  rP  r$   r$   r%   rQ    s    
zMLflowCallback.on_savec                 C   s4   | j r0tt| jdd r0| j d k	r0| j  d S )Nrr  )rl  callablerg   rn  rr  rt  rU  r$   r$   r%   __del__   s    zMLflowCallback.__del__)N)N)r   r  r  r  r   r+  r  r  r  rQ  ry  r$   r$   r$   r%   rh    s   F

rh  c                       s4   e Zd ZdZ fddZ fddZdd Z  ZS )DagsHubCallbackzh
    A [`TrainerCallback`] that logs to [DagsHub](https://dagshub.com/). Extends [`MLflowCallback`]
    c                    s.   t    t stdddlm} || _d S )NzLDagsHubCallback requires dagshub to be installed. Run `pip install dagshub`.r   )Repo)superr   r=   r   Zdagshub.uploadr{  )r   r{  rJ   r$   r%   r   0  s
    
zDagsHubCallback.__init__c                    s   t dd tk| _t dp"d| _t d| _| j| jt j	d | jt j	d dd	 t d
pldd| _
td| _| jdkrtdt j|| dS )z
        Setup the DagsHub's Logging integration.

        Environment:
        - **HF_DAGSHUB_LOG_ARTIFACTS** (`str`, *optional*):
                Whether to save the data and model artifacts for the experiment. Default to `False`.
        ZHF_DAGSHUB_LOG_ARTIFACTSr8   ZHF_DAGSHUB_MODEL_NAMEmainZMLFLOW_TRACKING_URI.r   BRANCH)ownerr   branchrv  NzpDagsHubCallback requires the `MLFLOW_TRACKING_URI` environment variable to be set. Did you run `dagshub.init()`?)r   r   r   r   log_artifactsr   remoter{  splitseprepor   rZ   rI   r|  r+  )r   r\   r   r}  r$   r%   r+  9  s    	

zDagsHubCallback.setupc                 K   sL   | j rHt| dd r.t| jjtj|j	d | j
t| j|j	 d S )Ntrain_dataloaderz
dataset.pt)r  rg   ra   saver  Zdatasetr   rZ   r[   r'  r  	directoryrt   rN  r  r$   r$   r%   r  T  s    zDagsHubCallback.on_train_end)r   r  r  r  r   r+  r  __classcell__r$   r$   r}  r%   rz  +  s   	rz  c                       s   e Zd Z fddZ  ZS )NeptuneMissingConfigurationc                    s   t  d d S )NaA  
        ------ Unsupported ---- We were not able to create new runs. You provided a custom Neptune run to
        `NeptuneCallback` with the `run` argument. For the integration to work fully, provide your `api_token` and
        `project` by saving them as environment variables or passing them to the callback.
        )r|  r   rU  r}  r$   r%   r   ]  s    z$NeptuneMissingConfiguration.__init__)r   r  r  r   r  r$   r$   r}  r%   r  \  s   r  c                   @   s0  e Zd ZdZdZdZdZdZdZdhZ	dddd	dd
dde
e e
e e
e eee
e dddZdd Zdd Zdd Zdd Zdd Zedd Zedd Zdd Zdd  Zd!d" Zd#d$ Zeed%d&d'Zd(d) Zd9d*d+Zd,d- Zd.d/ Zd0d1 Zd:d2d3Z e!d4d5 Z"d;e
e#ee$f  d6d7d8Z%dS )<NeptuneCallbacka  TrainerCallback that sends the logs to [Neptune](https://app.neptune.ai).

    Args:
        api_token (`str`, *optional*): Neptune API token obtained upon registration.
            You can leave this argument out if you have saved your token to the `NEPTUNE_API_TOKEN` environment
            variable (strongly recommended). See full setup instructions in the
            [docs](https://docs.neptune.ai/setup/installation).
        project (`str`, *optional*): Name of an existing Neptune project, in the form "workspace-name/project-name".
            You can find and copy the name in Neptune from the project settings -> Properties. If None (default), the
            value of the `NEPTUNE_PROJECT` environment variable is used.
        name (`str`, *optional*): Custom name for the run.
        base_namespace (`str`, optional, defaults to "finetuning"): In the Neptune run, the root namespace
            that will contain all of the metadata logged by the callback.
        log_parameters (`bool`, *optional*, defaults to `True`):
            If True, logs all Trainer arguments and model parameters provided by the Trainer.
        log_checkpoints (`str`, *optional*): If "same", uploads checkpoints whenever they are saved by the Trainer.
            If "last", uploads only the most recently saved checkpoint. If "best", uploads the best checkpoint (among
            the ones saved by the Trainer). If `None`, does not upload checkpoints.
        run (`Run`, *optional*): Pass a Neptune run object if you want to continue logging to an existing run.
            Read more about resuming runs in the [docs](https://docs.neptune.ai/logging/to_existing_object).
        **neptune_run_kwargs (*optional*):
            Additional keyword arguments to be passed directly to the
            [`neptune.init_run()`](https://docs.neptune.ai/api/neptune#init_run) function when a new run is created.

    For instructions and examples, see the [Transformers integration
    guide](https://docs.neptune.ai/integrations/transformers) in the Neptune documentation.
    z%source_code/integrations/transformersZmodel_parametersrK   trial_paramsZtrainer_parametersztrain/epochNZ
finetuningT)	api_tokenr   r   base_namespacer   log_parameterslog_checkpoints)r  r   r   r  r  r  c                K   s`  t  stdzddlm}	 ddlm}
 W n, tk
rV   ddlm}
 ddlm}	 Y nX |
d|t	t
d f |
d|t	t
d f |
d|t	t
d f |
d|t	 |
d	||	t
d f |
d
|t |
d|t	t
d f || _|| _|| _|| _d | _d| _d | _d| _|||d|| _d | _| jd k	| _d | _| jdkrPd| j | _d| _nd| _d| _d S )NzwNeptuneCallback requires the Neptune client library to be installed. To install the library, run `pip install neptune`.r   rd  )verify_typer  r   r   r  r   r  r  F)r  r   r   >   rx   lastzcheckpoints/TZcheckpoints)r@   
ValueErrorr   re  Zneptune.internal.utilsr  r   Zneptune.new.internal.utilsZ#neptune.new.metadata_containers.runrt   r   bool_base_namespace_pathr[  _log_checkpoints_initial_run_run_is_monitoring_runrp  _force_reset_monitoring_run_init_run_kwargs_volatile_checkpoints_dir_should_upload_checkpoint_recent_checkpoint_path_target_checkpoints_namespace*_should_clean_recently_uploaded_checkpoint)r   r  r   r   r  r   r  r  Zneptune_run_kwargsre  r  r$   r$   r%   r     sD    zNeptuneCallback.__init__c                 C   s   | j r| j   | ` d | _ d S r*   )r  stoprU  r$   r$   r%   _stop_run_if_exists  s    
z#NeptuneCallback._stop_run_if_existsc              
   K   s   z ddl m} ddlm}m} W n0 tk
rP   ddlm} ddlm}m} Y nX |   z&|f | j	|| _
| j
d  | _W n. ||fk
r } zt |W 5 d }~X Y nX d S )Nr   )init_run)NeptuneMissingApiTokenException"NeptuneMissingProjectNameExceptionsys/id)r   r  Zneptune.exceptionsr  r  r   Zneptune.newZneptune.new.exceptionsr  r  r  r   rp  r  )r   Zadditional_neptune_kwargsr  r  r  er$   r$   r%   _initialize_run  s    zNeptuneCallback._initialize_runc                 C   s(   | j | _d| _| jd  | _d | _ d S )NTr  )r  r  r  r   rp  rU  r$   r$   r%   _use_initial_run  s    z NeptuneCallback._use_initial_runc                 C   s^   | j d k	r|   nF| js$| jr$d S | jrL| jsL| jsL| j| jd d| _n|   d| _d S )N)with_idTF)r  r  r  r  r  r  rp  rU  r$   r$   r%   _ensure_run_with_monitoring  s    

z+NeptuneCallback._ensure_run_with_monitoringc                 C   s:   | j d k	r|   n"| js6| j| jddddd d| _d S )NF)r  Zcapture_stdoutZcapture_stderrZcapture_hardware_metricsZcapture_traceback)r  r  r  r  rp  r  rU  r$   r$   r%   '_ensure_at_least_run_without_monitoring  s    

z7NeptuneCallback._ensure_at_least_run_without_monitoringc                 C   s   | j d kr|   | j S r*   )r  r  rU  r$   r$   r%   r     s    
zNeptuneCallback.runc                 C   s   | j | j S r*   )r   r  rU  r$   r$   r%   _metadata_namespace   s    z#NeptuneCallback._metadata_namespacec                 C   s   t | jtj< d S r*   )r   r   r  integration_version_keyrU  r$   r$   r%   _log_integration_version  s    z(NeptuneCallback._log_integration_versionc                 C   s   |  | jtj< d S r*   )Zto_sanitized_dictr  r  trainer_parameters_key)r   r\   r$   r$   r%   _log_trainer_parameters  s    z'NeptuneCallback._log_trainer_parametersc                 C   s>   ddl m} |r:t|dr:|jd k	r:||j | jtj< d S )Nr   )stringify_unsupportedr   )Zneptune.utilsr  r   r   r%  r  r  model_parameters_key)r   r   r  r$   r$   r%   _log_model_parameters
  s
    z%NeptuneCallback._log_model_parametersc                 C   sF   |rt |dr|j| jtj< |rBt |drB|jd k	rB|j| jtj< d S )Nr   r  )r   r   r  r  trial_name_keyr  trial_params_key)r   r   r$   r$   r%   "_log_hyper_param_search_parameters  s    z2NeptuneCallback._log_hyper_param_search_parameters)source_directoryrk   c           	   
   C   s   t j|| }}| jd k	rt j| j|}z8|ddt jj}t j||}t|| |}W n2 t	k
r } zt
d| W 5 d }~X Y nX | j| j | | jr| jd k	r| j| j | j || _d S )Nz..r   zoNeptuneCallback was unable to made a copy of checkpoint due to I/O exception: '{}'.Could fail trying to upload.)r   rZ   r[   r  replacelstripr  shutilcopytreeIOErrorr   r    r   r  r  Zupload_filesr  r  Zdelete_files)	r   r  rk   target_pathrelative_pathZconsistent_checkpoint_pathZ	cpkt_pathZ	copy_pathr  r$   r$   r%   _log_model_checkpoint  s$    
z%NeptuneCallback._log_model_checkpointc                 K   sD   d | _ | jr(|js|jd k	r(t j| _ | jdkr@|js@tdd S )Nrx   zWTo save the best model checkpoint, the load_best_model_at_end argument must be enabled.)	r  r  Zoverwrite_output_dirZsave_total_limitr9  r:  r   r;  r  r  r$   r$   r%   rf  1  s
    zNeptuneCallback.on_init_endc                 K   sN   |j s
d S |   d| _|   | jr:| | | | |jrJ| | d S )NT)	r  r  r  r  r[  r  r  r  r  r]  r$   r$   r%   r  9  s    

zNeptuneCallback.on_train_beginc                 K   s   |    d S r*   )r  r  r$   r$   r%   r  H  s    zNeptuneCallback.on_train_endc                 C   s&   | j d k	rtj| j dd |   d S )NT)ignore_errors)r  r  rmtreer  rU  r$   r$   r%   ry  K  s    
zNeptuneCallback.__del__c                 K   s    | j r| |jd|j  d S )NrK  )r  r  r'  r  r  r$   r$   r%   rQ  Q  s    zNeptuneCallback.on_savec           	      K   s\   | j dkrX|j}|ds$d| }||}|jr:tjntj}|jd kpT|||j| _	d S )Nrx   r   )
r  r=  rY   r   Zgreater_is_betternpZgreaterlessr>  r  )	r   r\   r   r  rm   r   Zbest_metric_nameZmetric_valueoperatorr$   r$   r%   on_evaluateU  s    



zNeptuneCallback.on_evaluatec                 C   s.   |j jD ]}t|| r|j  S qtdd S )Nz6The trainer doesn't have a NeptuneCallback configured.)r   r   rF   r   	Exception)r   ro   r   r$   r$   r%   get_runa  s    
zNeptuneCallback.get_run)r  c                 K   sf   |j s
d S |d k	rbt| D ]B\}}t|ttfr|tjkrJ|| j|< q| j| j	||j
d qd S )N)r^  )r  r   r   rF   r	  r
  r  flat_metricsr  r$  r  )r   r\   r   r  r  r   r   r   r$   r$   r%   r  i  s    
zNeptuneCallback.on_log)N)N)N)&r   r  r  r  r  r  r  r  r  r  r   rt   r  r   r  r  r  r  r  propertyr   r  r  r  r  r  r  rf  r  r  ry  rQ  r  classmethodr  r   r
  r  r$   r$   r$   r%   r  g  sZ   7




r  c                   @   s2   e Zd ZdZdd Zdd ZdddZd	d
 ZdS )CodeCarbonCallbackzI
    A [`TrainerCallback`] that tracks the CO2 emission of training.
    c                 C   s&   t  stddd l}|| _d | _d S )NzWCodeCarbonCallback requires `codecarbon` to be installed. Run `pip install codecarbon`.r   )rB   rI   rA   _codecarbontracker)r   rA   r$   r$   r%   r   {  s    zCodeCarbonCallback.__init__c                 K   s&   | j d kr"|jr"| jj|jd| _ d S )N)r'  )r  is_local_process_zeror  ZEmissionsTrackerr'  r  r$   r$   r%   rf    s    zCodeCarbonCallback.on_init_endNc                 K   s   | j r|jr| j   d S r*   )r  r  startr]  r$   r$   r%   r    s    z!CodeCarbonCallback.on_train_beginc                 K   s   | j r|jr| j   d S r*   )r  r  r  r  r$   r$   r%   r    s    zCodeCarbonCallback.on_train_end)N)r   r  r  r  r   rf  r  r  r$   r$   r$   r%   r  v  s
   

r  c                   @   sF   e Zd ZdZdd Zdd ZdddZdd	d
ZdddZdd Z	dS )ClearMLCallbacka  
    A [`TrainerCallback`] that sends the logs to [ClearML](https://clear.ml/).

    Environment:
    - **CLEARML_PROJECT** (`str`, *optional*, defaults to `HuggingFace Transformers`):
        ClearML project name.
    - **CLEARML_TASK** (`str`, *optional*, defaults to `Trainer`):
        ClearML task name.
    - **CLEARML_LOG_MODEL** (`bool`, *optional*, defaults to `False`):
        Whether to log models as artifacts during training.
    c                 C   sL   t  rdd l}|| _ntdd| _d | _tdd t	
dhk| _d S )Nr   zNClearMLCallback requires 'clearml' to be installed. Run `pip install clearml`.FZCLEARML_LOG_MODELr8   r9   )r)   r'   _clearmlrI   r  _clearml_taskr   r   r   r   r  r  )r   r'   r$   r$   r%   r     s    zClearMLCallback.__init__c                 K   s   | j d krd S | jrd S |jrtd | jd kr| j j r^| j j | _d| _td n>| j jjt	
ddt	
ddddd	dd
| _d| _td | j|d t|dr|jd k	r| j|jd d S )Nz"Automatic ClearML logging enabled.Tz)External ClearML Task has been connected.ZCLEARML_PROJECTzHuggingFace TransformersZCLEARML_TASKr.  F)r-   Zpytorch)rW  Z	task_nameZauto_connect_frameworksZ
output_uriz"ClearML Task has been initialized.ZArgsr   zModel Configuration)r  r  r  r   r   r  Taskcurrent_taskr   r   r   connectr   r   )r   r\   r   r   r/  r   r$   r$   r%   r+    s,    





zClearMLCallback.setupNc                 K   s8   | j d krd S |jrd| _| js4| j||||f| d S r,  )r  r  r  r+  )r   r\   r   r  r   r/  r   r$   r$   r%   r    s    
zClearMLCallback.on_train_beginc           	      K   s(   | j d krd S | jr$|jr$| j  d S r*   )r  r  r  r  )	r   r\   r   r  r   r/  rm   r  r   r$   r$   r%   r    s    
zClearMLCallback.on_train_endc              
   K   s6  | j d krd S | js(| j||||f| |jr2d}t|}	d}
t|
}ddddddg}| D ]\}}t|ttfr||kr| j	
 j||d	 nv||r| j	
 j||	d  d
||jd nH||
r| j	
 j||d  d||jd n| j	
 j|d||jd q`td| dt| d| d q`d S )Nr   r   Ztrain_runtimeZtrain_samples_per_secondZtrain_steps_per_secondZ
train_lossr?  r_  r   eval)titleZseriesr   	iterationtestrf   r  r  r  zn" as a scalar. This invocation of ClearML logger's  report_scalar() is incorrect so we dropped this attribute.)r  r  r+  r  r   r   rF   r	  r
  r  
get_loggerZreport_single_valuerY   Zreport_scalarr  r   r    r   )r   r\   r   r  r   r/  r  r   r   r   r   r   Zsingle_value_scalarsr   r   r$   r$   r%   r    sV    



   


   
   zClearMLCallback.on_logc                 K   sX   | j rT| jrT|jrTd|j }tj|j|}t	d| d | jj
||jdd d S )NrK  rL  ru  F)r  Zauto_delete_file)r  r  r  r  r   rZ   r[   r'  r   r   Zupdate_output_modelrw  r$   r$   r%   rQ    s
    zClearMLCallback.on_save)NN)NNNN)NNNrR  r$   r$   r$   r%   r    s   


*r  c                       s:   e Zd ZdZd
eed fddZdd Zdd	 Z  ZS )FlyteCallbacka^  A [`TrainerCallback`] that sends the logs to [Flyte](https://flyte.org/).
    NOTE: This callback only works within a Flyte task.

    Args:
        save_log_history (`bool`, *optional*, defaults to `True`):
            When set to True, the training logs are saved as a Flyte Deck.

        sync_checkpoints (`bool`, *optional*, defaults to `True`):
            When set to True, checkpoints are synced with Flyte and can be used to resume training in the case of an
            interruption.

    Example:

    ```python
    # Note: This example skips over some setup steps for brevity.
    from flytekit import current_context, task


    @task
    def train_hf_transformer():
        cp = current_context().checkpoint
        trainer = Trainer(..., callbacks=[FlyteCallback()])
        output = trainer.train(resume_from_checkpoint=cp.restore())
    ```
    T)save_log_historysync_checkpointsc                    sX   t    t stdt r$t s2td d}ddlm	} | j
| _|| _|| _d S )NzLFlyteCallback requires flytekit to be installed. Run `pip install flytekit`.zSyncing log history requires both flytekitplugins-deck-standard and pandas to be installed. Run `pip install flytekitplugins-deck-standard pandas` to enable this feature.Fr   )current_context)r|  r   rD   r   rE   r   r   r    rC   r  rk   cpr  r  )r   r  r  r  r}  r$   r%   r   %  s    

zFlyteCallback.__init__c                 K   sJ   | j rF|jrFd|j }tj|j|}td| d | j	
| d S )NrK  zSyncing checkpoint in z to Flyte. This may take time.)r  r  r  r   rZ   r[   r'  r   r   r  r  rw  r$   r$   r%   rQ  7  s
    zFlyteCallback.on_savec           	      K   sH   | j rDdd l}ddlm} ddlm} ||j}|d| | d S )Nr   )Deck)TableRendererzLog History)	r  ZpandasrC   r  Zflytekitplugins.deck.rendererr  Z	DataFrameZlog_historyZto_html)	r   r\   r   r  r   pdr  r  Zlog_history_dfr$   r$   r%   r  ?  s    zFlyteCallback.on_train_end)TT)	r   r  r  r  r  r   rQ  r  r  r$   r$   r}  r%   r  
  s   r  )
r   r   r:   r   r-   r   rA   r'   r<   Zflytec                 C   s>   | D ]*}|t krt| ddt   dqdd | D S )Nz is not supported, only r   z are supported.c                 S   s   g | ]}t | qS r$   )INTEGRATION_TO_CALLBACK)rw   integrationr$   r$   r%   ry   ^  s     z7get_reporting_integration_callbacks.<locals>.<listcomp>)r  r  r[   r   )r   r  r$   r$   r%   #get_reporting_integration_callbacksW  s    r  )fr  r   importlib.metadatar!   importlib.utilrs  r3  r   rd   r  r   r9  dataclassesr   pathlibr   typingr   r   r   numpyr  r   r   r   ri  r	   r
   r   r   r   r  r   r   ra   r"   r#   r   r   r+   r   r   r   Z
get_configr    r   r  r?   r   Z_neptune_versionr   ZPackageNotFoundErrorZtrainer_callbackr   r   r   r   r   r   Ztraining_argsr   r   r   r&   r)   r,   r/   r1   r3   r4   r6   r7   r;   r=   r>   r@   rB   rD   rE   rL   r	  rt   r   r   r   r   r   r   r   r   rS  rb  rh  rz  r  r  r  r  r  r  r  r  r$   r$   r$   r%   <module>   s   
$

 9 	bEV (M 1  w@