o
    }oi42                     @   s   d dl mZ d dlmZmZmZmZ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mZ d dlm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m Z m!Z!m"Z"m#Z# d dl$m%Z% dgZ&eG dd dZ'G dd deeZ(dS )    )	dataclass)AnyDictListOptionalUnionN)instantiate)Trainer)
DictConfig	OmegaConf)AutoTokenizerT5ForConditionalGeneration)word_error_rate)T5G2PDataset)G2PModel)PretrainedModelInfo	typecheck)
Exportable)
LabelsTypeLossTypeMaskType
NeuralType
TokenIndex)logging
T5G2PModelc                   @   sV   e Zd ZU dZeeeef  ed< dZeeeef  ed< dZ	eeeef  ed< dS )T5G2PConfigNtrain_dsvalidation_dstest_ds)
__name__
__module____qualname__r   r   r   r   __annotations__r   r    r#   r#   V/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/tts/g2p/models/t5.pyr   #   s   
 r   c                       s  e Zd ZdZedeeeef  fddZ	edeeeef  fddZ
dBded	ef fd
dZe dd Zdd Z fddZdCddZe dedee fddZdDddZdEddZdDddZdEd d!Ze dFd#ejd$efd%d&Zd'd( Zd)d* Zd+d, Z d-d. Z!dBd/e"eef f fd0d1Z#dBd2e"eef f fd3d4Z$e%dGd6d7Z& fd8d9Z'd:d; Z(dHd>d?Z)d@dA Z*  Z+S )Ir   z-
    T5-based grapheme-to-phoneme model.
    returnc                 C   s8   | j d u rtdt tdt ddtdt dS | j S )NBTT)optional	input_idsattention_masklabels)_input_typesr   r   r   r   selfr#   r#   r$   input_types/   s   


zT5G2PModel.input_typesc                 C   s    | j d u rdtdt iS | j S )Nlossr#   )_output_typesr   r   r/   r#   r#   r$   output_types9   s   
zT5G2PModel.output_typesNcfgtrainerc                    s   d | _ d | _d| _|d ur|j|j | _|j| _t| j| _|	d| jj
| _|	d| jj
| _|	dd| _tt}t|trHt|}nt|tsWtdt| dt|| t || t| j| _d S )N   max_source_lenmax_target_lendo_lowerFzcfg was type: z(. Expected either a dict or a DictConfig)r.   r3   
world_size	num_nodesnum_devices
model_namer   from_pretrained
_tokenizergetmodel_max_lengthr8   r9   r:   r   
structuredr   
isinstancedictcreater
   
ValueErrortypemergesuper__init__r   model)r0   r5   r6   schema	__class__r#   r$   rK   ?   s$   


zT5G2PModel.__init__c                 C   s   | j |||d}|jS )Nr*   )rL   r2   )r0   r+   r,   r-   outputsr#   r#   r$   forward\   s   zT5G2PModel.forwardc                 C   s*   |\}}}| j |||d}| d| |S )Nr*   
train_loss)rQ   log)r0   batch	batch_idxr+   r,   r-   rR   r#   r#   r$   training_stepb   s   
zT5G2PModel.training_stepc                    s
   t   S N)rJ   on_train_epoch_endr/   rN   r#   r$   rX   m   s   
zT5G2PModel.on_train_epoch_endtorch.utils.data.DataLoaderc              
   C   sH   t |j| j| jjd| j|dddd}tjjj	||j
|jd|jddS )zl
        Setup function for a infer data loader.
        Returns:
            A pytorch DataLoader.
        grapheme_fieldtext_graphemesF)manifest_filepath	tokenizerr8   r9   r:   r[   with_labels)
collate_fn
batch_sizeshufflenum_workers	drop_last)r   r]   r@   rB   r:   rA   torchutilsdata
DataLoaderr`   ra   rc   )r0   r5   datasetr#   r#   r$   _setup_infer_dataloaderp   s"   

z"T5G2PModel._setup_infer_dataloaderconfigc           
   	   C   s   g }| j }z=tj rdnd}|   | | | t|}|D ]}|\}}| j||d\}	}}|	|	 ~q!W | j
|d |S | j
|d w )z
        Runs model inference.

        Args:
            Config: configuration file to set up DataLoader
        Returns:
            all_preds: model predictions
        cudacpu)r+   )mode)trainingre   rl   is_availableevaltorj   r
   _generate_predictionsextendtrain)
r0   rk   	all_predsrn   deviceinfer_datalayerrT   r+   _generated_strr#   r#   r$   _infer   s    

zT5G2PModel._inferr   valc                 C   s
  |\}}}| j |||d}| jjt||dkd  | dd}	| j|| jd\}
}}t|
|	dd}| d|d	|i}|d
krbt| j	j
ttfrZt| j	j
dkrZ| j| | |S | j| |S t| j	jttfr}t| j	jdkr}| j| | |S | j| |S )Nr*   id   Tskip_special_tokens)r+   model_max_target_len)
hypotheses
referencesuse_cer_lossperr|   r7   )rQ   r@   batch_decodere   	ones_likers   r9   r   rD   r6   val_dataloaderslisttuplelenvalidation_step_outputsappendtest_dataloaderstest_step_outputs)r0   rT   rU   dataloader_idxsplitr+   r,   r-   val_loss
labels_strrz   ry   r   outputr#   r#   r$   validation_step   s0   
""zT5G2PModel.validation_stepc                 C   s   | j |||ddS )z
        Lightning calls this inside the test loop with the data from the test dataloader
        passed in as `batch`.
        testr   )r   )r0   rT   rU   r   r#   r#   r$   	test_step   s   zT5G2PModel.test_stepc              	      s   t  fdd|D  }| j  d|dd  dkr%| j|  }n| j|  }tdd |D t| }|   d| |   d	| | t	
d
t|d d d| dt| d d|iS )zm
        Called at the end of validation to aggregate outputs (reduces across batches, not workers).
        c                    s   g | ]	}|  d  qS )r   r#   .0xr   r#   r$   
<listcomp>   s    z9T5G2PModel.multi_validation_epoch_end.<locals>.<listcomp>r   T)	sync_distr   c                 S   s   g | ]}|d  qS )r   r#   r   r#   r#   r$   r      s    _per_per_zPER: r}      z% z, examplesr2   )re   stackmeanrS   _test_namesupper_validation_namessumr   r   inforound)r0   rP   r   r   avg_lossdataloader_nameavg_perr#   r   r$   multi_validation_epoch_end   s   ,z%T5G2PModel.multi_validation_epoch_endc                 C   s   | j ||dd d S )Nr   r   )r   )r0   rP   r   r#   r#   r$   multi_test_epoch_end      zT5G2PModel.multi_test_epoch_end   r+   r   c                 C   s@   | j j|dd|d}|d |d }}| jj|dd}|||fS )zA
        Generates predictions and converts IDs to text.
        Toutput_scoresreturn_dict_in_generate
max_length	sequencesscoresr~   )rL   generater@   r   )r0   r+   r   rP   generated_idssequence_toks_scoresgenerated_textsr#   r#   r$   rs      s   
z T5G2PModel._generate_predictionsc                 C   sv   d|vs
t |jtstd| t|j|j| j| j| j	| j
|dd|dddd	}tjjj|fd	|ji|jS )
Ndataloader_paramszNo dataloader_params for r[   r\   phoneme_fieldtextT)r]   r^   r8   r9   r:   r[   r   r_   r`   )rD   r   r
   rG   r   ri   r]   r@   r8   r9   r:   rA   re   rf   rg   rh   r`   )r0   r5   nameri   r#   r#   r$   _setup_dataloader_from_config   s   

z(T5G2PModel._setup_dataloader_from_configc                 C      | j |dd| _d S )Nru   r   )r   	_train_dlr0   r5   r#   r#   r$   setup_training_data  r   zT5G2PModel.setup_training_datac                 C   r   )N
validationr   )r   _validation_dlr   r#   r#   r$   setup_validation_data  r   z T5G2PModel.setup_validation_datac                 C   r   )Nr   r   )r   _test_dlr   r#   r#   r$   setup_test_data  r   zT5G2PModel.setup_test_dataval_data_configc                    $   |r|j d u rd | _d S t |S rW   )r]   r   rJ   setup_multiple_validation_data)r0   r   rN   r#   r$   r        z)T5G2PModel.setup_multiple_validation_datatest_data_configc                    r   rW   )r]   r   rJ   setup_multiple_test_data)r0   r   rN   r#   r$   r     r   z#T5G2PModel.setup_multiple_test_dataList[PretrainedModelInfo]c                 C   s   g S rW   r#   )clsr#   r#   r$   list_available_models!  s   z T5G2PModel.list_available_modelsc                    s>   t  jdi | d}dt|t i| _dt|t i| _d S )Nr&   r+   	preds_strr#   )rJ   _prepare_for_exportr   r   r.   r   r3   )r0   kwargstensor_shaperN   r#   r$   r   %  s   
zT5G2PModel._prepare_for_exportc                 C   s   d | _ d | _d S rW   )r.   r3   r/   r#   r#   r$   _export_teardown2  s   
zT5G2PModel._export_teardownr7   ,   c                 C   s(   d}|g}| j |d| jddd}|jfS )zs
        Generates input examples for tracing etc.
        Returns:
            A tuple of input examples.
        z)Kupil sem si bicikel in mu zamenjal stol.longestTpt)paddingr   
truncationreturn_tensors)r@   r8   r+   )r0   	max_batchmax_dimsentencer+   input_encodingr#   r#   r$   input_example6  s   zT5G2PModel.input_examplec                 C   s0   | j j|dd| jd}|d |d }}t|S )NTr   r   r   )rL   r   r8   r   )r0   r+   rP   r   r   r#   r#   r$   forward_for_exportH  s
   
zT5G2PModel.forward_for_exportrW   )r%   rY   )r   r|   )r   )r   )r%   r   )r7   r   ),r   r    r!   __doc__propertyr   r   strr   r1   r4   r
   r	   rK   r   rQ   rV   rX   rj   re   no_gradr   intr{   r   r   r   r   Tensorrs   r   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__r#   r#   rN   r$   r   *   sH    	


"



))dataclassesr   typingr   r   r   r   r   re   hydra.utilsr   lightning.pytorchr	   	omegaconfr
   r   transformersr   r    nemo.collections.asr.metrics.werr    nemo.collections.tts.g2p.data.t5r    nemo.collections.tts.models.baser   nemo.core.classes.commonr   r   nemo.core.classes.exportabler   nemo.core.neural_typesr   r   r   r   r   
nemo.utilsr   __all__r   r   r#   r#   r#   r$   <module>   s$   