o
    Ï¯i)&  ã                   @   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   úd/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/evaluate/eval_zeroshot_classification.pyÚfind_params_value   s   ýÿ
ÿür   c              	   C   s*  |d j }i }t |j¡}|  ¡  | d|i¡ g }g }	t ¡ i t|ƒD ])\}
}|}| |d |ƒ}tj|dd}| 	| 
¡  ¡ ¡ |	 	t |d d¡ ¡ ¡ q&tj|dd}tj|	dd}	|jd |d< |jd	gkrvd
d„ |j ¡ D ƒ}n
dd„ |j ¡ D ƒ}t 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&rzt&d usdJ dƒ‚| %¡ D ]\}}t& 'd|› |d|i¡ qhW d   ƒ d S W d   ƒ d S 1 sŽw   Y  d S ) NÚvalÚepochéÿÿÿÿ)ÚdimÚclass_labelr   r   Únum_samplesÚGTZANc                 S   ó   g | ]}d |› d‘qS )z
This is a z song.r   ©Ú.0Útr   r   r   Ú
<listcomp>2   ó    z%evaluate_zeroshot.<locals>.<listcomp>c                 S   r   )zThis is a sound of Ú.r   r    r   r   r   r#   4   r$   zclass label prompts: Ú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#   V   s   & úPlease install wandb.zval/)(Ú
dataloaderÚtorchÚdeviceÚevalÚupdateÚno_gradÚ	enumerateÚFÚ	normalizeÚappendÚdetachÚcpuÚargmaxÚlongÚcatÚshapeÚval_dataset_namesÚclass_index_dictÚkeysÚloggingÚinfoÚtmodelÚclap_module.tokenizerr   Útraining.datar'   r"   ÚviewÚargsortÚwhereÚnumpyÚmeanÚdatasetnamesÚnpÚfloorÚmedianÚjoinÚitemsÚwandbÚlog)ÚmodelÚdataÚstart_epochÚargsÚwriterr5   Úmetricsr7   Ú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Úpredsr2   Únamer   r   r   r   Úevaluate_zeroshot   sn   


$&0
ÿÿýÌ6$Êrq   Ú__main__zout.logz
params.txtiO  TFÚopenaiÚamodelrJ   z#model type not found in params filer   Úfp32rX   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Útestr8   )Ú	precisionr7   ÚjitÚforce_quick_geluÚopenai_model_cache_dirÚskip_paramsÚenable_fusionÚfusion_type)Ú	model_cfgr4   zStarting wandb.rw   r   Úclap)ÚprojectÚidÚresume)r‰   Únotesrp   ÚtagsÚconfigzFinished loading wandb.Úcheckpointsz*.pt)r   )Úmap_locationr   Ú
state_dictÚmodulec                 C   s"   i | ]\}}|t d ƒd… |“qS )zmodule.N)Úlenr1   r   r   r   Ú
<dictcomp>ö   s   " r”   z=> resuming checkpoint 'z	' (epoch ú))tÚos.pathÚosÚglobÚrandomrP   rS   rH   rX   r6   Útorch.nn.functionalÚnnÚ
functionalr<   Útorch.backends.cudnnÚbackendsÚcudnnÚclap_moduler   r   Útraining.loggerr   rL   r   Útraining.trainr   Úclap_module.utilsr   r	   Útraining.paramsr
   r   rq   Ú__name__r]   ÚpathÚisdirÚ
pretrainedÚdirnameÚlog_dirÚdebugÚDEBUGÚINFOÚ	log_levelrV   Úlog_pathÚparams_fileÚseedÚmanual_seedÚcudaÚmanual_seed_allÚ	benchmarkÚdeterministicrt   rJ   Ú
ValueErrorÚparallel_evalÚrankÚ
local_rankÚ
world_sizeÚval_frequencyÚepochsr€   Ú	save_logsÚ	report_torF   r7   Úis_availableÚ
remotedatarR   Údataset_namer   ÚexistsÚmakedirsÚsystemÚdatasetinfosÚdataset_typeÚdataset_proportionÚdatasetpathÚ
train_dataÚval_dataÚ
expanduserrƒ   r…   r†   rZ   r‡   r[   r^   Úwandb_notesr5   r   Útrain_szÚval_szÚwandb_idÚinitÚvarsÚsortedÚgetmtimeÚall_model_checkpointsÚ
model_pathÚcheckpoint_pathÚloadÚ
checkpointr\   ÚsdÚnextÚiterrW   Ú
startswithÚload_state_dictrI   Útor8   Ú
parametersÚparamÚrequires_gradr   r   r   r   Ú<module>   s4   	
C




ÿý
ûû
õ
ýû
$
õ
ÿ
ÿ


 Ù~