o
    XεiH                     @   s$  d dl Z d dlZd dlZd dlmZmZmZ d dlZd dl	Z	d dl
mZ d dlmZmZ d dlmZ dd Zdd	 Zd
d Zdd Zdd Zdd Z				d*dddedededededeeef fddZdeded e	jjde	jjjfd!d"Z		d+d#ed$e d%e!d&e	j"j#d'ede	jjfd(d)Z$dS ),    N)DictListTuple)logger)NoamLRStepwiseGradualLR)rank_zero_logger_infoc                   C      t jdd uS )Napex	importlibutil	find_spec r   r   I/home/ubuntu/.local/lib/python3.10/site-packages/trainer/trainer_utils.pyis_apex_available      r   c                   C   r	   )Nmlflowr   r   r   r   r   is_mlflow_available   r   r   c                   C   r	   )Naimr   r   r   r   r   is_aim_available   r   r   c                   C   r	   )Nwandbr   r   r   r   r   is_wandb_available   r   r   c                   C   r	   )Nclearmlr   r   r   r   r   is_clearml_available   r   r   c                 C   s<  t dt | jrt dt nt dt |jr%t dt t d|j t n
t dt t dt tj rQtj dkrQt d	tj	  t t d
tj  t t dt
  t t dt  t t dt  t t dtjjj t t dtjjj t t dtjjj t t dtjjjj t dS )zPrint training environment.z > Training Environment:z | > Backend: Acceleratez | > Backend: Torchz | > Mixed precision: Truez | > Precision: z | > Mixed precision: Falsez | > Precision: float32r   z | > Current device: z | > Num. of GPUs: z | > Num. of CPUs: z | > Num. of Torch Threads: z | > Torch seed: z | > Torch CUDNN: z  | > Torch CUDNN deterministic: z | > Torch CUDNN benchmark: z | > Torch TF32 MatMul: N)r   r   use_acceleratemixed_precision	precisiontorchcudais_availabledevice_countcurrent_deviceos	cpu_countget_num_threadsinitial_seedbackendscudnnenableddeterministic	benchmarkmatmul
allow_tf32)argsconfigr   r   r   print_training_env"   s&   




r0   F1  r.   TrainerArgscudnn_enablecudnn_benchmarkcudnn_deterministicuse_ddpr-   returnc           
      C   s  t j  dtjd< dtjvr|durt jt| d}nt j }|dkr4|s4| js4t	d| dt
| t|tjd< tj
| t | t j| |pWt jjjt jj_|pat jjjt jj_|pkt jjjt jj_|pvt jjjjt jjj_t j }	|	|fS )	a  Setup PyTorch environment for training.

    Args:
        cudnn_enable (bool): Enable/disable CUDNN.
        cudnn_benchmark (bool): Enable/disable CUDNN benchmarking. Better to set to False if input sequence length is
            variable between batches.
        cudnn_deterministic (bool): Enable/disable CUDNN deterministic mode.
        use_ddp (bool): DDP flag. True if DDP is enabled, False otherwise.
        allow_tf32 (bool): Enable/disable TF32. TF32 is only available on Ampere GPUs.
        torch_seed (int): Seed for torch random number generator.

    Returns:
        Tuple[bool, int]: is cuda on or off and number of GPUs in the environment.
    
PCI_BUS_IDCUDA_DEVICE_ORDERCUDA_VISIBLE_DEVICESN   z [!] zr active GPUs. Define the target GPU by `CUDA_VISIBLE_DEVICES`. For multi-gpu training use `TTS/bin/distribute.py`.PYTHONHASHSEED)r   r   empty_cacher#   environ
set_deviceintr!   r   RuntimeErrorrandomseedstrnpmanual_seedr'   r(   r*   r)   r+   r,   r-   r    )
r.   r3   r4   r5   r6   training_seedr-   gpunum_gpususe_cudar   r   r   setup_torch_training_env?   s*   






rK   lr_schedulerlr_scheduler_params	optimizerc                 C   sN   | du rdS |   dkrt}n|   dkrt}nttjj| }||fi |S )aF  Find, initialize and return a Torch scheduler.

    Args:
        lr_scheduler (str): Scheduler name.
        lr_scheduler_params (Dict): Scheduler parameters.
        optimizer (torch.optim.Optimizer): Optimizer to pass to the scheduler.

    Returns:
        torch.optim.lr_scheduler._LRScheduler: Functional scheduler.
    Nnoamlrstepwisegraduallr)lowerr   r   getattrr   optimrL   )rL   rM   rN   	schedulerr   r   r   get_schedulery   s   rU   optimizer_nameoptimizer_paramslrmodel
parametersc                 C   sR   |   dkrtd}t|d}nttj| }|dur| }||fd|i|S )aR  Find, initialize and return a Torch optimizer.

    Args:
        optimizer_name (str): Optimizer name.
        optimizer_params (dict): Optimizer parameters.
        lr (float): Initial learning rate.
        model (torch.nn.Module): Model to pass to the optimizer.

    Returns:
        torch.optim.Optimizer: Functional optimizer.
    radamzTTS.utils.radamRAdamNrX   )rQ   r   import_modulerR   r   rS   rZ   )rV   rW   rX   rY   rZ   modulerN   r   r   r   get_optimizer   s   
r_   )Fr1   FN)NN)%r   r#   rB   typingr   r   r   numpyrE   r   trainer.loggerr   trainer.torchr   r   trainer.utils.distributedr   r   r   r   r   r   r0   boolr@   rK   rD   rS   	OptimizerrL   _LRSchedulerrU   dictfloatnnModuler_   r   r   r   r   <module>   st    "
	
:
