ó
    óó�jA5  ã                   ó  • S r SSKrSSKJrJr  SSKrSSKJr  SSKr	SSK
JrJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJrJrJ r J!r!     S)S\"S\"S\"S\RF                  S\\"   4
S jjr$ S*S jr%S\\\"      S\\"   S\\"   4S jr&   S+S jr'\(S:X  aÏ  \	RR                  " \RT                  SS 5      u  r+r,r-\	R\                  R^                  Ra                  \,5        \1" \+SS 9 r2\" \2\-SS!9r3SSS5        SS"/SS"/SSSS#.r4S$\3;   a;  \5" \3S$   \65      (       a*  \3S$   Ro                  5        H  u  r8r9\8\4;   d  M  \9\4\8'   M     \3S%   S&   r:\3S%   S   r;S'\; 3r<\'" S,\:\;\<S(.\4D6  gg! , (       d  f       N~= f)-a€  Example recipe to benchmark SpeechBrain using PyTorch profiling.

A pretrained interference is benchmarked for real-time factors and memory peaks across audio durations and batch sizes.
Profiling is carried out either on random data (pure noise) or on an example file that is truncated and repeated to
be representative of a benchmark setting (duration vs batch size). The setup is defined in: profile.yaml.
@profile_optimiser is used: the last two/six batches are recorded for profiling.

Run from within this directory (yaml defines an example audio w/ relative path):
`python profile.py profile.yaml`

Author:
    * Andreas Nautsch 2022
é    N)ÚListÚOptional)Úload_hyperpyyaml)Ú
EncoderASRÚEncoderDecoderASR)ÚEncoderClassifier)ÚSpectralMaskEnhancement)Ú
Pretrained)ÚSNREstimator)ÚSepformerSeparation)ÚEndToEndSLU)ÚSpeakerRecognition)ÚVAD)ÚexportÚprofile_reportÚreport_memoryÚreport_timeÚ	call_funcÚsourceÚsave_dirÚdeviceÚlengths_labelc                 ó¼   ^^^^^• [        U [        5      (       d   eU R                  X#ST0S9nU(       a  UR                  U5      OSmSUUUU4S jjn	U4S jn
XšU4$ )z.Implement get_funcs_to_unary_input_classifier.r   ©r   ÚsavedirÚrun_optsNc                 óª   >• TTb  TSX-   R                  U S5      O[        R                  " XU-  4TS90nTb  [        R                  " U 5      UT'   U$ )úPrepares input data.Né   ©r   )ÚrepeatÚtorchÚrandÚones)Ú
batch_sizeÚdurationÚsampling_rateÚunary_inputÚbatch_labelr   Úexampler   s       €€€€Ú¥C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\tools/profiling/profile.pyÚprepareÚ4get_funcs_to_unary_input_classifier.<locals>.prepare8   sl   ø€ ð àÑ&ð Ð2˜(Ñ2Ð3×:Ñ:¸:ÀqÔIä—Z’ZØ¨MÑ!9Ð:À6ñð	
ˆð Ñ$Ü).¯ª°JÓ)?ˆK˜Ñ&ØÐó    c                 ó*   >• [        U T5      " S0 UD6  g)zCalls the specified function.N© )Úgetattr)ÚmodelÚkwargsr   s     €r+   ÚcallÚ1get_funcs_to_unary_input_classifier.<locals>.callG   s   ø€ ä��yÔ!Ñ+ FÓ+r.   )é€>  )Ú
issubclassr
   Úfrom_hparamsÚ
load_audio)Úclsr   r   r   r   Úexample_audior)   r   Ú
pretrainedr,   r4   r*   s    `  ` ``   @r+   Ú#get_funcs_to_unary_input_classifierr=   '   sj   ü€ ô �cœ:×&Ñ&Ð&Ð&Ø×!Ñ!Ø°8¸VÐ2Dð "ð €Jö 7Dˆj×#Ñ# MÔ2È€G÷ò õ,ð ˜*Ð$Ð$r.   c                 óø  ^^• [         R                  " [         R                  R                  5       (       a  SOS5      mU S:X  a  [	        [
        UUSUTS9$ U S:X  a  [	        [        UUSUTS9$ U S:X  a  [	        [        UUSUTS9$ U S	:X  a  [	        [        UUS
UTS9$ U S:X  a;  [        R                  " XST0S9nU(       a  UR                  U5      mSU4S jjnS nO™U S:X  a  [	        [        UUSUTS9$ U S:X  a  [	        [        UUSUTSSS9$ U S:X  a  [	        [        UUSUTSSS9$ U S:X  a<  [        R                  " XST0S9nU(       a  UR                  U5      mS UU4S jjnS nO[!        S5      eXgU4$ )!a   Creates per pretrained interface:

pretrained - loaded model, to device
prepare(batch_size, duration, sampling_rate=16000) - function handle to create dimensioned batch input
call(model, **kwargs) - function handle to the inference function to be profiled
ÚcudaÚcpur   Útranscribe_batch)r:   r   r   r   r;   r   r   r   Údecode_batchr   Úclassify_batchr   r   r   c                 ó¾   >• [         R                  " XU-  4TS9[         R                  " X!U-  4TS9[         R                  " U 5      [         R                  " U5      S.$ )r   r    )Úwavs1Úwavs2Ú	wav1_lensÚ	wav2_lens)r"   r#   r$   )r%   r&   Ú	num_wavs2r'   r   s       €r+   r,   Ú%get_funcs_to_profile.<locals>.prepareŠ   s]   ø€ ô ŸšØ¨MÑ!9Ð:À6ñô ŸšØ¨=Ñ 8Ð9À&ñô #ŸZšZ¨
Ó3Ü"ŸZšZ¨	Ó2ñ	ð 	r.   c                 ó(   • U R                   " S0 UD6  g)zCalls verify_batch.Nr0   )Úverify_batch©r2   r3   s     r+   r4   Ú"get_funcs_to_profile.<locals>.call—   s   € à×ÒÑ( Ó(r.   r   Úget_speech_prob_chunkr   Úseparate_batchÚmixN)r:   r   r   r   r;   r   r)   r   r	   Úenhance_batchÚnoisyÚlengthsr   c                 ó    >• Tb  TSX-   R                  U S5      O[        R                  " XU-  4TS9[        R                  " XU-  U4TS9S.$ )r   Nr   r    )rQ   Úpredictions)r!   r"   r#   )r%   r&   Únum_spksr'   r   r*   s       €€r+   r,   rJ   Å   si   ø€ ð
 Ñ*ð Ð6˜hÑ6Ð7×>Ñ>¸zÈ1ÔMäŸšØ#°Ñ%=Ð>Àvñô  %ŸzšzØ¨MÑ!9¸8ÐDØ!ñ ñð r.   c                 ó(   • U R                   " S0 UD6  g)zCalls estimate_batchNr0   )Úestimate_batchrM   s     r+   r4   rN   Õ   s   € à× Ò Ñ* 6Ó*r.   zUnknown pretrained model.)é
   r6   )é   r6   )r"   r   r?   Úis_availabler=   r   r   r   r   r   r8   r9   r   r   r	   r   Ú	TypeError)	Úpretrained_typer   r   r;   r*   r<   r,   r4   r   s	       `   @r+   Úget_funcs_to_profiler_   N   sû  ù€ ô �\Š\¤E§J¡J×$;Ñ$;×$=Ñ$=™&À5ÓI€Fð Ð-Ó-Ü2Ü!ØØØ(Ø'Øñ
ð 	
ð 
˜LÓ	(Ü2ÜØØØ(Ø'Øñ
ð 	
ð 
˜MÓ	)Ü2ÜØØØ$Ø'Øñ
ð 	
ð 
Ð/Ó	/Ü2Ü!ØØØ&Ø'Øñ
ð 	
ð 
Ð0Ó	0Ü'×4Ò4Ø°xÀÐ6Hñ
ˆ
ö Ø ×+Ñ+¨MÓ:ˆG÷	ó	)ð 
˜EÓ	!ä2ÜØØØ-Ø'Øñ
ð 	
ð 
Ð1Ó	1Ü2Ü#ØØØ&Ø'ØØØñ	
ð 		
ð 
Ð5Ó	5Ü2Ü'ØØØ%Ø'ØØØ#ñ	
ð 		
ð 
˜NÓ	*Ü!×.Ò.Ø°xÀÐ6Hñ
ˆ
ö Ø ×+Ñ+¨MÓ:ˆG÷	ð 	ó 	+ô
 Ð3Ó4Ð4à˜*Ð$Ð$r.   Ú	benchmarkÚcolumnsÚrowsc           	      óò  • [        U S    Vs/ s H  n[        U5      PM     sn5      nSU-  nSUR                  S5      -   SR                  U Vs/ s H  o5R                  U5      PM     sn5      -   S-   nSUS-  -   S	-   nUS
[        U5      -   U-  S-   -  n[	        U5       H;  u  p‰USUR                  SU	-  5      -   -  nUSSR                  X   5      -   S-   -  nM=     [        U5        U$ s  snf s  snf )z Implement benchmark to markdown.r   z{: >%d} z|   Ú|z| z|
z|:Ú-Ú:r   z%ds z | z |
)ÚmaxÚlenÚformatÚjoinÚ	enumerateÚprint)
r`   ra   rb   ÚxÚ
cell_widthÚfmtÚoutÚsepÚiÚrs
             r+   Úbenchmark_to_markdownrt   ß   s  € ô  i°¢lÓ3¢l ”c˜!–f¡lÑ3Ó4€JØ
�zÑ
!€CàØ
�*‰*�S‹/ñ	à
�)‰)©GÓ4ªG q—Z‘Z –]©GÑ4Ó
5ñ	6ð ñ	ð ð �˜cÑ!Ñ
! CÑ
'€CØˆA”�G“Ñ Ñ# eÑ+Ñ+€CÜ˜$–‰ˆØˆt�c—j‘j ¨!¡Ó,Ñ,Ñ,ˆØˆt�e—j‘j ¡Ó.Ñ.°Ñ7Ñ7Šñ  ô 
ˆ#„JØ€Jùò 4ùò
 5s   �C/ÁC4
TFc           	      ó,  • [        XX&5      u  p‰n
/ n/ nSnSn[        U5       GHÙ  u  nn/ n/ n[        U5       GHœ  u  nnU(       ad  UU-   [        U5      [        U5      -   S-  :¼  aC  US:”  a=  US:”  a7  [        SUS SUS 35        UR	                  S5        UR	                  S5        Mr  [        S	US SUS 35        U" UUS
9nUU-  U-  nU(       a  [        [        5       5      O	[        5       nSn[        U5       H  nU	" SSU
0UD6  UR                  5         M     [        UR                  5       R                  SSS95        [        USSS9u  nn[        USS9u  nnUS:X  a1  UR	                  UU-  S 5        UR	                  UU-  S S35        GM_  UR	                  UU-  S SUU-  S 35        UR	                  UU-  S SUU-  S S35        GMŸ     UR	                  U5        UR	                  U5        GMÜ     [        S5        [        SSSS9 nUR                  [        UUUS95        SSS5        [        S5        [        SSSS9 nUR                  [        UUUS95        SSS5        g! , (       d  f       NH= f! , (       d  f       g= f) aM  Loops through the profiler settings and benchmarks the inference of a pretrained model.

Reporting:
- real time factor
- peak memory (inference only)

Logs:
- shell w/ tabular profiler summary and targeted reporting
- if export_logs: traces are stored in `log` folder
- benchmark_real_time (file output)
- memory_peaks (file output)
g    €„.Ag      ÐAr[   r   z	skipped - duration: Údz, batch_size: Ú_skip_z
Duration: )r%   r&   rZ   r2   Úcpu_time_total)Úsort_byÚ	row_limitT)ÚverboseÚupper_control_limit)r{   z.2Ez.2fz Gbz + z
	Real-time factorzbenchmark_realtime_factors.mdÚwúutf-8©Úencoding)r`   ra   rb   Nz
	Peak memoryzbenchmark_memory_peaks.mdr0   )r_   rk   rh   rl   Úappendr   r   ÚrangeÚstepÚkey_averagesÚtabler   r   ÚopenÚwritert   )r^   r   r   Úaudio_mockup_secsÚbatch_sizesÚtriangle_onlyr;   Úexport_logsÚcreate_batch_datar4   r<   Úrealtime_factorÚmemory_peaksÚus_in_sÚ
byte_in_GBrv   r&   Úrealtime_factor_rowÚmemory_peaks_rowÚbÚbsr3   ÚrealtimeÚprofÚ	num_stepsÚ_Úcpu_timeÚ	cuda_timeÚcpu_memÚcuda_memÚfs                                  r+   Úprofile_pretrainedrž   ô   só  € ô. +?Ø ó+Ñ'Ð˜Zð
 €OØ€LØ€GØ€Jô !Ð!2×3‰ˆˆ8Ø ÐØÐÜ˜{×+‰EˆAˆræà˜‘UœsÐ#4Ó5¼¸KÓ8HÑHÈAÑMÓMØ˜Q›Ø˜Q›äØ0°¸!°¸NÈ2ÈaÈ&ÐQôð (×.Ñ.¨xÔ8Ø$×+Ñ+¨HÔ5Ùô �L ¨! ¨N¸2¸a¸&ÐAÔBñ '°"¸xÑHˆFà�W‘˜xÑ'ð ö
 0;”6œ.Ó*Ô+ÄÓ@PˆDØˆIÜ˜9Ö%�ÙÑ0˜:Ð0¨Ò0Ø—	‘	–ñ &ô
 Ø×!Ñ!Ó#×)Ñ)Ø,¸ð *ð ôô #.Ø˜d¸ñ#ÑˆH�iô !.¨d¸DÑ AÑˆG�Xà˜A‹~Ø#×*Ñ*¨h¸Ñ.AÀ#Ð-FÔHØ ×'Ñ'¨7°ZÑ+?ÀÐ*DÀCÐ(H×Ià#×*Ñ*Ø (Ñ*¨3Ð/¨s°9¸xÑ3GÈÐ2LÐMôð !×'Ñ'Ø Ñ+¨CÐ0°°H¸zÑ4IÈ#Ð3NÈcÐR÷ñe ,ðj 	×ÑÐ2Ô3Ø×ÑÐ,×-ñs 4ôx 
Ð
 Ô!Ü	Ð-¨s¸WÒ	EÈØ	�‰Ü!Ø)Ø#Ø&ñô	
÷ 
Fô 
Ð
ÔÜ	Ð)¨3¸Ò	AÀQØ	�‰Ü!Ø&Ø#Ø&ñô	
÷ 
BÐ	A÷ 
FÕ	Eú÷ 
BÕ	Aús   ÈI4ÉJÉ4
JÊ
JÚ__main__r   r~   r   )Úoverrides_must_matchr[   )rˆ   r‰   rŠ   r;   r‹   Úprofiling_dimensionsÚpretrained_modelÚtypezpretrained_models/)r^   r   r   )NÚwavsÚwav_lens)NN)TNFr0   )=Ú__doc__ÚsysÚtypingr   r   r"   Úhyperpyyamlr   ÚspeechbrainÚsbÚspeechbrain.inference.ASRr   r   Ú!speechbrain.inference.classifiersr   Ú!speechbrain.inference.enhancementr	   Ú speechbrain.inference.interfacesr
   Úspeechbrain.inference.metricsr   Ú speechbrain.inference.separationr   Úspeechbrain.inference.SLUr   Úspeechbrain.inference.speakerr   Úspeechbrain.inference.VADr   Úspeechbrain.utils.profilingr   r   r   r   Ústrr   r=   r_   rt   rž   Ú__name__Úparse_argumentsÚargvÚhparams_filer   Ú	overridesÚutilsÚdistributedÚddp_init_groupr†   ÚfinÚhparamsÚprofiling_setupÚ
isinstanceÚdictÚitemsÚargÚspecificationr^   r   r   r0   r.   r+   Ú<module>rÇ      s  ðñó ß !ã Ý (ã ß CÝ ?Ý EÝ 7Ý 6Ý @Ý 1Ý <Ý )÷ó ð ØØ#-ñ$%àð$%ð ð$%ð ð	$%ð
 �L‰Lð$%ð ˜C‘=õ$%ðP DHôN%ðbØ�D˜‘I‰ðØ)-¨c©ðØ:>¸s¹)ôð6 ØØôp
ðf ˆzÓà(*×(:Ò(:¸3¿8¹8ÀAÀB¸<Ó(HÑ%€L�(˜Ið ‡H�H×Ñ×'Ñ'¨Ô1ñ 
ˆl WÒ	-°Ù" 3¨	ÈÑNˆ÷ 
.ð
   ˜VØ˜1�vØØØñ€Oð  Ó(Ù�gÐ4Ñ5°t×<Ñ<Ø&-Ð.DÑ&E×&KÑ&KÖ&MÑ"��]Ø˜/Õ)Ø+8�O CÓ(ñ 'Nð
 Ð0Ñ1°&Ñ9€OØÐ'Ñ(¨Ñ2€FØ# F 8Ð,€Háð Ø'ØØñð ó	ð= ÷ 
.Õ	-ús   Ã<	E=Å=
F