o
    9wi                     @   s|  d Z ddlZddlZddlmZ ddlZddlmZ ddlZddl	m
Z
 ddlmZ ddlZddlmZ ddlZddlmZ d	d
lmZ d	dlmZmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlm Z  d	dl!m"Z" d	dl#m$Z$ e%e&Z'G dd dej(Z)dd Z*dd Z+dd Z,d(ddZ-d(ddZ.ed d!d"d#d$d% Z/d&ej0v reej0d& e/j_1e&d'kre/  dS dS ))z Main training script entry point    N)Path)
hydra_main)GlobalHydra)	OmegaConf)nn)ConcatDataset   )distrib)get_wav_datasetsget_musdb_wav_datasets)DemucsHDemucs)HTDemucs)RepitchedWrapper)Solver)capture_init)random_subsetc                       s,   e Zd ZdZe fddZdd Z  ZS )TorchHDemucsWrapperzWrapper around torchaudio HDemucs implementation to provide the proper metadata
    for model evaluation.
    See https://pytorch.org/audio/stable/tutorials/hybrid_demucs_tutorial.htmlc                    sh   t    zddlm} W n ty   tdw |d| _|d| _|d | _|di || _	d S )Nr   r   zAPlease upgrade torchaudio for using its implementation of HDemucs
sampleratesegmentsources )
super__init__torchaudio.modelsr   ImportErrorpopr   r   r   torch_hdemucs)selfkwargsTorchHDemucs	__class__r   I/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/demucs/train.pyr   )   s   

zTorchHDemucsWrapper.__init__c                 C   s   | j |S N)r   forward)r   mixr   r   r$   r&   5   s   zTorchHDemucsWrapper.forward)__name__
__module____qualname____doc__r   r   r&   __classcell__r   r   r"   r$   r   $   s
    r   c                 C   sl   t | jj| jj| jj| jpd| jj d}ttt	t
d| j }tjt| | jdd}|di ||}|S )N   )r   audio_channelsr   r   )demucshdemucshtdemucsr   T)resolver   )listdsetr   channelsr   model_segmentr   r   r   r   r   modelr   to_containergetattr)argsextraklasskwr7   r   r   r$   	get_model9   s   
r>   c                 C   s  t  }g }g }|  D ]%\}}t|dr0| }t |d }||s%J |t |O }|| q|  D ]}	|	|vr@||	 q5|dd|i |}
|jjdkret	jj
|
|jj|jj|jjf|jjdS |jjdkrt	jj|
|jj|jj|jjf|jjdS td|jj)Nmake_optim_groupparamsr   adam)lrbetasweight_decayadamwzInvalid optimizer %s)setnamed_moduleshasattrr?   
isdisjointappend
parametersinsertoptimtorchAdamrB   momentumbeta2rD   AdamW
ValueError	optimizer)r7   r:   seen_paramsother_paramsgroupsnmodulegroupr@   paramrK   r   r   r$   get_optimizerK   s@   


r\   c           
      C   sz  | j jrt| j j | j jrt| j \}}ng g }}| j jr@t| j \}}t| j j	dkr<t
||g}t
||g}n|}|}| j jrt| j d\}}| j j}|d urlt|}t|}tdt|| d| d  }nd}t
|g| |g }| j jr|d urt|}tt|| d|  }	t
|t||	g}nt
||g}| j jd urt|| j j}t|sJ t|sJ ||fS )Nr-   wav2r   )r4   backend
torchaudioset_audio_backend	use_musdbr   wavr
   lenr   r   r]   wav2_weightmaxround
wav2_validintr   valid_samples)
r:   	train_set	valid_setextra_train_setextra_valid_setweightberepsn_keptr   r   r$   get_datasetsm   sD   
 rs   Fc                 C   s  t   t| j t| }| jjrGt	| t
dd | D d d }t	d| t|drB|d}t	d|| jj d	  td
 tj rP|  t|| }| jt j d
ks_J |  jt j  _|rptd ||| S t| \}}| jjjrg }d| jjv r|| jjd ntd | jjjrt |fd|i| jj}t	dt!|t!| t j"|| jd| jj#dd}	| jj$rt j"|dd| jj#d}
nt j"|| jd| jj#dd}
|	|
d}t|||| S )Nc                 s   s    | ]}|  V  qd S r%   )numel).0pr   r   r$   	<genexpr>   s    zget_solver.<locals>.<genexpr>r-   i   zSize: %.1f MBvalid_lengthr   zField: %.1f msi  r   vocalszNo vocal source foundztrain/valid set size: %d %dT)
batch_sizeshufflenum_workers	drop_lastF)rz   r{   r|   )trainvalid)%r	   initrN   manual_seedseedr>   miscshowloggerinfosumrK   rH   rx   r4   r   sysexitcudais_availabler\   rz   
world_sizer   rs   augmentrepitchprobar   rJ   indexwarningr   rc   loaderr|   full_cv)r:   
model_onlyr7   mbfieldrT   rj   rk   ry   train_loadervalid_loaderloadersr   r   r$   
get_solver   sT   









r   c                 C   s   t  }d }| r|j}|  t| }|d ur#|  || |jdd t	|j
|W  d    S 1 s:w   Y  d S )NT)stack)r   instanceis_initializedhydraclearmainget_xp_from_sig
initializeenterr   cfg)sigr   insthydxpr   r   r$   get_solver_from_sig   s   


$r   z../confconfigz1.1)config_pathconfig_nameversion_basec                 C   s   t jtadD ]}t| j|}|d urt| j|t j| qdtjd< dtjd< | j	j
r4ttj tdt  t|  ddlm} t| j t| }|  d S )N)musdbrb   metadata1OMP_NUM_THREADSMKL_NUM_THREADSz*For logs, checkpoints and samples check %sr   )get_xp)r   utilsto_absolute_path__file__r9   r4   setattrosenvironr   verboser   setLevelloggingDEBUGr   getcwddebugdorar   r   r   r~   )r:   attrvalr   solverr   r   r$   r      s    


r   _DORA_TEST_PATH__main__)F)2r+   r   r   pathlibr   r   r   r   r   hydra.core.global_hydrar   	omegaconfr   rN   r   r_   torch.utils.datar    r	   rb   r
   r   r/   r   r0   r   r1   r   r   r   r   r   statesr   r   r   	getLoggerr(   r   Moduler   r>   r\   rs   r   r   r   r   dirr   r   r   r$   <module>   sH   
"
*
8


