o
    Ï¯iU%  ã                   @   s  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
  mZ d dlm  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mZ d dlmZ d	d
„ Zdd„ Ze dkrŠeƒ Z!ej" #e!j$¡ryej" %e!j$¡Z&nej" %ej" %e!j$¡¡Z&e!j'rŠej(nej)e!_*ej" +e&d¡Z,ee,e!j*ƒ ej" +e&d¡Z-dZ.e .e.¡ e /e.¡ ej0 /e.¡ ej0 1e.¡ ej .e.¡ de_2de_3dZ$ee-dƒZ4ee-dƒZ5e4du sÚe5du rÞe6dƒ‚de!_7d e!_8d e!_9de!_:de!_;de!_<de!_=de!_>e!j?dke!_de!_@e Aej0 B¡ r	dnd¡ZAeAe!_Ae!jCrLe!jDD ]5ZEeeE D ]-ZFej" GdeE› deF› ¡s6e HdeE› deF› ¡ e IdeE› deF› deE› deF› d 	¡ qqe!jJdu rWg d!¢e!_Je!jKd"kr}ee!jDe!jJe!jC e!jLe!jMd#e!_Nee!jDg d$¢e!jC de!jMd#e!_Oee4e5e$deAddej" Pe!jQ¡de!jRe!jSd%\ZTZUee!eUd&ZVdZWe!jrçedusªJ d'ƒ‚e!jXZXe 'd(¡ eVd) jYjZe!_[e!jOdurÆeVd* jYjZe!_\e!j]durÖej^d+e!j]dd, nej^d+eXeXg e_e!ƒd- e 'd.¡ ej" #e!j$¡re`e ej" +e&d/d0¡¡ej"jad1Zbne!j$gZbebD ]„Zcej" %ec¡e!_dee4e5e$deAddej" Pe!jQ¡de!jRe!jSd%\ZTZUejeeceAd2Zfd3efv reefd3 Zgefd4 Zheiejeh k¡ ƒƒd   ld5¡rSd6d7„ eh k¡ D ƒZheT meh¡ e nd8ec› d9eg› d:¡ neT mef¡ d ZgeT oeA¡ eT p¡  eT q¡ D ]Zrder_sqyeeTeVege!eWƒ qdS dS );é    N)Úcreate_model©Útokenize)Úsetup_logging)Úget_data)Úevaluate)Úget_tar_path_from_dataset_nameÚdataset_split)Ú
parse_argsc                 C   sj   t | dƒ&}|D ]}|d |v r"| d¡d  ¡   W  d   ƒ S qW d   ƒ d S 1 s.w   Y  d S )NÚrú: é   )ÚopenÚsplitÚstrip)ÚfileÚkeyÚfÚline© r   ú[/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/evaluate/eval_retrieval_main.pyÚfind_params_value   s   ýÿ
ÿür   c              	   C   sö  |d j }i }t |j¡}|  ¡  | d|i¡ g }g }	t ¡ O t|ƒD ])\}
}|}| |d |ƒ}tj|dd}| 	| 
¡  ¡ ¡ |	 	t |d d¡ ¡ ¡ q&tj|dd}tj|	dd}	|jd |d< d	d
„ |j ¡ D ƒ}|jdkrddlm} ||ƒ}n
ddlm} ||ƒ}| d ||ƒ}tj|dd 
¡  ¡ }| d d |ƒ\}}| ¡ }|| | ¡   
¡  ¡ }| ¡  
¡  ¡ }|	 dd¡}|}tj|dd}t ||k¡d }| 
¡  ¡  ¡ }| ¡ d ||jd › d< t t  |¡¡d ||jd › d< dD ]}t ||k ¡||jd › d|› < qüt t |dk d|d  d¡¡||jd › d< t! "d|› dd #dd
„ | $¡ D ƒ¡ ¡ |j%r`t%d usJJ dƒ‚| $¡ D ]\}}t% &d|› |d|i¡ qNW d   ƒ d S W d   ƒ d S 1 stw   Y  d S )NÚvalÚepochéÿÿÿÿ)ÚdimÚclass_labelr   r   Únum_samplesc                 S   s   g | ]}d | ‘qS )zThis is a sound of r   )Ú.0Útr   r   r   Ú
<listcomp>1   s    z%evaluate_zeroshot.<locals>.<listcomp>Útransformerr   )Ú	tokenizerT)Ú
descendingÚ
_mean_rankÚ_median_rank)r   é   é
   z_R@r'   g        z_mAP@10zEval Epoch: ú ú	c                 S   s&   g | ]\}}|› d t |dƒd›‘qS )r   é   z.4f)Úround©r   ÚkÚvr   r   r   r    R   s   & úPlease install wandb.zval/)'Ú
dataloaderÚtorchÚdeviceÚevalÚupdateÚno_gradÚ	enumerateÚFÚ	normalizeÚappendÚdetachÚcpuÚargmaxÚlongÚcatÚshapeÚclass_index_dictÚkeysÚtmodelÚclap_module.tokenizerr   Útraining.datar"   r   ÚviewÚargsortÚwhereÚnumpyÚmeanÚdatasetnamesÚnpÚfloorÚmedianÚloggingÚinfoÚjoinÚitemsÚwandbÚlog)ÚmodelÚdataÚstart_epochÚargsÚwriterr0   Úmetricsr2   Úall_audio_featuresÚall_class_labelsÚiÚbatchÚaudiosÚaudio_featuresÚ	all_textsr   r"   Úall_text_featuresÚlogit_scale_aÚlogit_scale_tÚlogits_per_audioÚlogits_per_textÚground_truthÚlogitÚrankingÚpredsr-   Únamer   r   r   r   Úevaluate_zeroshot   sh   


$$0
ÿÿýÐ2$Îrk   Ú__main__zout.logz
params.txtiO  TFÚopenaiÚamodelrB   z#model type not found in params filer   Úfp32rR   zcuda:0r;   z./json_files/ú/z,aws s3 cp s3://s-laion-audio/webdataset_tar/z/sizes.json ./json_files/z/sizes.json)ÚtrainÚunbalanced_trainÚbalanced_trainÚ
webdataset)ÚislocalÚ
proportionÚdataset_path)ÚvalidÚtestr3   )Ú	precisionr2   ÚjitÚforce_quick_geluÚopenai_model_cache_dirÚskip_paramsÚenable_fusionÚfusion_type)Ú	model_cfgr/   zStarting wandb.rq   r   Úclap)ÚprojectÚidÚresume)rƒ   Únotesrj   ÚtagsÚconfigzFinished loading wandb.Úcheckpointsz*.pt)r   )Úmap_locationr   Ú
state_dictÚmodulec                 C   s"   i | ]\}}|t d ƒd… |“qS )zmodule.N)Úlenr,   r   r   r   Ú
<dictcomp>ò   s   " rŽ   z=> resuming checkpoint 'z	' (epoch ú))tÚos.pathÚosÚglobÚrandomrH   rK   rN   rR   r1   Útorch.nn.functionalÚnnÚ
functionalr7   Útorch.backends.cudnnÚbackendsÚcudnnÚclap_moduler   r   Útraining.loggerr   rD   r   Útraining.trainr   Úclap_module.utilsr   r	   Útraining.paramsr
   r   rk   Ú__name__rW   ÚpathÚisdirÚ
pretrainedÚdirnameÚlog_dirÚdebugÚDEBUGÚINFOÚ	log_levelrP   Úlog_pathÚparams_fileÚseedÚmanual_seedÚcudaÚmanual_seed_allÚ	benchmarkÚdeterministicrn   rB   Ú
ValueErrorÚparallel_evalÚrankÚ
local_rankÚ
world_sizeÚval_frequencyÚepochsrz   Ú	save_logsÚ	report_tor@   r2   Úis_availableÚ
remotedatarJ   Údataset_namer   ÚexistsÚmakedirsÚsystemÚdatasetinfosÚdataset_typeÚdataset_proportionÚdatasetpathÚ
train_dataÚval_dataÚ
expanduserr}   r   r€   rT   r   rU   rX   Úwandb_notesr0   r   Útrain_szÚval_szÚwandb_idÚinitÚvarsÚsortedÚgetmtimeÚall_model_checkpointsÚ
model_pathÚcheckpoint_pathÚloadÚ
checkpointrV   ÚsdÚnextÚiterrQ   Ú
startswithÚload_state_dictrO   Útor3   Ú
parametersÚparamÚrequires_gradr   r   r   r   Ú<module>   s4   	
?




ÿý
ûû
õ
ýû
$
õ
ÿ
ÿ


 Ù~