Ë
    [^(hŸ`  ã                   ó¬  — d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmc m	Z	 d dl
mZmZmZmZmZ d dlmZ d dlmZmZmZ  G d„ d«      Z G d„ d	e«      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zdee   fd„Z defd„Z!defd„Z"	 	 	 d"de#de#d ee$   fd!„Z%y)#é    N)ÚOptional)Ú
_EventTypeÚ_ExtraFields_PyCallÚ_ExtraFields_PyCCallÚ_ExtraFields_TorchOpÚ_ProfilerEvent)Úprofile)Úindex_of_first_matchÚtraverse_bfsÚtraverse_dfsc                   ó¶   — e Zd ZdZddedefd„Zed„ «       Zde	fd„Z
d„ Zd	ee	   fd
„Zd	ee	   fd„Zde	fd„Zd„ Zde	fd„Zde	fd„Zde	fd„Zde	fd„Zde	fd„Zy)ÚPatternz§
    Base class for all patterns, subclass this class and implement match()
    to define custom patterns.

    In subclass, define description and skip property.
    ÚprofÚshould_benchmarkc                 ó~  — || _         || _        d| _        d| _        d| _        |j
                  �|j
                  j                  €J ‚|j
                  j                  j                  «       | _        i | _	        | j                  D ]7  }| j                  j                  |j                  g «      j                  |«       Œ9 y )Nz!Please specify a name for patternz(Please specify a description for patternÚ )r   r   ÚnameÚdescriptionÚurlÚprofilerÚkineto_resultsÚexperimental_event_treeÚ
event_treeÚtid_rootÚ
setdefaultÚ	start_tidÚappend)Úselfr   r   Úevents       ú]/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/profiler/_pattern_matcher.pyÚ__init__zPattern.__init__   sŸ   € ØˆŒ	Ø 0ˆÔØ7ˆŒ	ØEˆÔØˆŒØ�}‰}Ð(¨T¯]©]×-IÑ-IÐ-UÐUÐUØŸ-™-×6Ñ6×NÑNÓPˆŒØ9;ˆŒØ—_‘_ò 	HˆEØ�M‰M×$Ñ$ U§_¡_°bÓ9×@Ñ@ÀÕGñ	Hó    c                  ó   — y©NF© ©r   s    r    ÚskipzPattern.skip)   s   € àr"   r   c                 ó:   — | j                   › dt        |«      › �}|S )Nz
[Source Code Location] )r   Úsource_code_location)r   r   Úmsgs      r    ÚreportzPattern.report-   s+   € à×ÑÐ Ð 9Ô:NÈuÓ:UÐ9VÐWð 	ð ˆ
r"   c              #   óJ   K  — t        | j                  «      E d{  –—†  y7 Œ­w)z„
        Traverse the event tree and yield all events.
        Override this method in subclass to customize the traversal.
        N)r   r   r&   s    r    ÚeventTreeTraversalzPattern.eventTreeTraversal3   s   è ø€ ô
   §¡Ó0×0Ò0úó   ‚#›!œ#Úeventsc                 ó’   — | j                   › dt        |«      › d�}| j                  rt        | d«      r| j	                  |«      S |S |S )Nú: z events matched.Ú	benchmark)r   Úlenr   ÚhasattrÚbenchmark_summary)r   r/   Údefault_summarys      r    ÚsummaryzPattern.summary:   sY   € Ø!ŸY™Y˜K r¬#¨f«+¨Ð6FÐGˆØ× Ò ô ˜4 Ô-ð ×&Ñ& vÓ.ðð %ðð
 Ðr"   c           
      ó  ‡— dt         fd„}t        | d«      sJ d«       ‚| j                  |«      Št        d„ |D «       «      }t        ˆfd„|D «       «      }| j                  › dt        |«      › d |||z
  «      › d	t        ||z  d
«      › d�S )NÚtime_nsc                 óL   — g d¢}|D ]  }| dk  r
| d›d|› �c S | dz  } Œ | d›d�S )N)ÚnsÚusÚmsiè  z.2fú z sr%   )r9   Úunit_lstÚunits      r    Úformat_timez.Pattern.benchmark_summary.<locals>.format_timeF   sK   € Ú)ˆHØ ò !�Ø˜T’>Ø% c˜]¨!¨D¨6Ð2Ò2Ø˜DÑ ‘ð!ð ˜c�] "Ð%Ð%r"   r2   zPlease implement benchmark()c              3   ó4   K  — | ]  }|j                   –— Œ y ­w©N)Úduration_time_ns)Ú.0r   s     r    ú	<genexpr>z,Pattern.benchmark_summary.<locals>.<genexpr>P   s   è ø€ ÒG°u˜E×2Õ2ÑGùs   ‚c              3   óT   •K  — | ]  }‰t        |«         |j                  z  –— Œ! y ­wrC   )Úinput_shapesrD   )rE   r   Úshapes_factor_maps     €r    rF   z,Pattern.benchmark_summary.<locals>.<genexpr>Q   s.   øè ø€ ò 
àð œl¨5Ó1Ñ2°U×5KÑ5KÕKñ
ùs   ƒ%(r1   z* events matched. Total Estimated Speedup: z (é   zX))Úintr4   r2   Úsumr   r3   Úround)r   r/   rA   Úoriginal_timeÚnew_timerI   s        @r    r5   zPattern.benchmark_summaryE   s¬   ø€ ð	&¤ó 	&ô �t˜[Ô)ÐIÐ+IÓIÐ)Ø ŸN™N¨6Ó2ÐÜÑGÀÔGÓGˆÜó 
àô
ó 
ˆð
 �y‰yˆk˜œC ›K˜=ð )(Ù(3°MÀHÑ4LÓ(MÐ'NÈbÔQVÐWdÐgoÑWoÐqrÓQsÐPtÐtvðxð	
r"   c                 ó   — t         ‚)zt
        Return True if the event matches the pattern.
        This method should be overriden in subclass.
        )ÚNotImplementedError©r   r   s     r    ÚmatchzPattern.matchZ   s
   € ô
 "Ð!r"   c                 óŠ   — | j                   rg S | j                  «       D �cg c]  }| j                  |«      sŒ|‘Œ }}|S c c}w rC   )r'   r-   rS   )r   r   Úmatched_eventss      r    rU   zPattern.matched_eventsa   sI   € Ø�9Š9ØˆIà#×6Ñ6Ó8ö
Ø¸D¿J¹JÀuÕ<MŠEð
ˆð 
ð Ðùò
s
   ¡A ¸A c                 óP   — |j                   r|j                   }|j                   rŒ|S rC   ©ÚparentrR   s     r    Úroot_ofzPattern.root_ofi   s    € Ø�lŠlØ—L‘LˆEð �l‹làˆr"   c                 ó¶   — |j                   r|j                   j                  }n| j                  |j                     }|j	                  |«      }|d | ||dz   d  fS )Né   )rX   Úchildrenr   r   Úindex)r   r   r\   r]   s       r    Úsiblings_ofzPattern.siblings_ofn   sU   € Ø�<Š<Ø—|‘|×,Ñ,‰Hà—}‘} U§_¡_Ñ5ˆHØ—‘˜uÓ%ˆØ˜˜Ð ¨%°!©)¨+Ð!6Ð6Ð6r"   c                 ó<   — | j                  |«      \  }}|r|d   S d S )Nr   ©r^   )r   r   Ú_Únext_eventss       r    Únext_ofzPattern.next_ofv   s'   € Ø×)Ñ)¨%Ó0‰ˆˆ;Ù!,ˆ{˜1‰~Ð6°$Ð6r"   c                 ó<   — | j                  |«      \  }}|r|d   S d S )Néÿÿÿÿr`   )r   r   Úprev_eventsra   s       r    Úprev_ofzPattern.prev_ofz   s'   € Ø×)Ñ)¨%Ó0‰ˆ�QÙ"-ˆ{˜2‰Ð7°4Ð7r"   c                 óv   — |sy |j                   r) ||«      s!|j                   }|j                   r	 ||«      sŒ!|S rC   rW   )r   r   Ú	predicates      r    Úgo_up_untilzPattern.go_up_until~   s4   € ÙØØ�lŠl¡9¨UÔ#3Ø—L‘LˆEð �lŠl¡9¨UÕ#3àˆr"   N©F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   Úboolr!   Úpropertyr'   r   r+   r-   Úlistr7   r5   rS   rU   rY   r^   rc   rg   rj   r%   r"   r    r   r      s±   „ ññ
H˜Wð 
H¸ó 
Hð ñó ðð˜Nó ò1ð	˜d >Ñ2ó 	ð
¨¨^Ñ(<ó 
ð*"˜>ó "òð˜^ó ð
7 ó 7ð7˜^ó 7ð8˜^ó 8ð ô r"   r   c                   ó:   ‡ — e Zd Zddededefˆ fd„Zdefd„Zˆ xZ	S )ÚNamePatternr   r   r   c                 óH   •— t         ‰| �  ||«       d|› �| _        || _        y )NzMatched Name Event: )Úsuperr!   r   r   )r   r   r   r   Ú	__class__s       €r    r!   zNamePattern.__init__Š   s)   ø€ Ü‰Ñ˜Ð/Ô0Ø1°$°Ð8ˆÔØˆ�	r"   r   c                 óZ   — t        j                  | j                  |j                  «      d uS rC   )ÚreÚsearchr   rR   s     r    rS   zNamePattern.match�   s    € Ü�y‰y˜Ÿ™ E§J¡JÓ/°tÐ;Ð;r"   rk   )
rl   rm   rn   r	   Ústrrp   r!   r   rS   Ú__classcell__©rw   s   @r    rt   rt   ‰   s)   ø„ ñ˜Wð ¨Cð À4õ ð
<˜>÷ <r"   rt   c                   óV   ‡ — e Zd ZdZd	dedefˆ fd„Zed„ «       Zd„ Z	de
e   fd„Zˆ xZS )
ÚExtraCUDACopyPatternas  
    This pattern identifies if we creates a constant tensor on CPU and immediately moves it to GPU.
    example: torch.zeros((100, 100)).to("cuda")

    Pattern:
    build-in method                 |build-in method
        ...                         |    aten::to
            aten::fill_/aten::zero_ |        aten::_to_copy

    Algorithm:
    We start at node aten::to, go parent events' previous events,
    and check if we have a aten::fill_/aten::zero_ as we keep going down the tree.
    We always select the last child in the children list when we go down the tree.
    If at any step we failed, it is not a match.
    r   r   c                 ób   •— t         ‰| �  ||«       d| _        d| _        d| _        h d£| _        y )NzExtra CUDA Copy PatternzQFilled a CPU tensor and immediately moved it to GPU. Please initialize it on GPU.zlhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#create-tensors-directly-on-the-target-device>   úaten::fill_úaten::normal_úaten::uniform_úaten::zero_)rv   r!   r   r   r   Úinit_ops©r   r   r   rw   s      €r    r!   zExtraCUDACopyPattern.__init__¤   s5   ø€ Ü‰Ñ˜Ð/Ô0Ø-ˆŒ	ØnˆÔð BˆŒò
ˆ�r"   c                 ób   — | j                   j                   xs | j                   j                   S rC   ©r   Ú
with_stackÚrecord_shapesr&   s    r    r'   zExtraCUDACopyPattern.skip°   ó'   € à—9‘9×'Ñ'Ð'ÒF¨t¯y©y×/FÑ/FÐ+FÐFr"   c                 ó(  — |j                   dk7  ry|}|j                  sy|j                  d   }|j                   dk7  ry|j                  sy|j                  d   }|j                   dk7  ryt        |«      }t        |«      dk  ry|d   �|d   |d   k7  ry|}|j                  }|€y| j                  |«      }|€y|j                  r5|j                  d   }|j                   | j                  v ry	|j                  rŒ5|j                   | j                  v S )
Nzaten::toFre   zaten::_to_copyzaten::copy_rJ   r   r[   T)r   r\   Úinput_dtypesr3   rX   rg   r…   )r   r   Úto_eventÚdtypess       r    rS   zExtraCUDACopyPattern.match´   s  € à�:‰:˜Ò#ØØˆØ�~Š~ØØ—‘˜rÑ"ˆØ�:‰:Ð)Ò)ØØ�~Š~ØØ—‘˜rÑ"ˆØ�:‰:˜Ò&Øä˜eÓ$ˆÜˆv‹;˜Š?ØØ�!‰9Ð  q¡	¨V°A©YÒ 6ØØˆà—‘ˆØˆ=Øà—‘˜UÓ#ˆØˆ=ØØ�nŠnØ—N‘N 2Ñ&ˆEà�z‰z˜TŸ]™]Ñ*Øð	 �n‹nð
 �z‰z˜TŸ]™]Ð*Ð*r"   r/   c                 ó:  — |D �ci c]  }t        |«      d“Œ }}|D ]w  }|d   }t        j                  dd|i¬«      }t        j                  dd|i¬«      }|j                  d«      j                  }|j                  d«      j                  }	|	|z  ||<   Œy |S c c}w )Nç        r   ztorch.ones(size).to("cuda")Úsize©ÚstmtÚglobalsztorch.ones(size, device="cuda")é
   )rH   r2   ÚTimerÚtimeitÚmean)
r   r/   r   rI   Úshaper’   Úto_timerÚde_timerÚto_timeÚde_times
             r    r2   zExtraCUDACopyPattern.benchmarkÚ   s°   € ØCIÖJ¸%œ\¨%Ó0°#Ñ5ÐJÐÐJØ&ò 
	9ˆEØ˜‘8ˆDÜ —‘Ø2¸VÀT¸NôˆHô !—‘Ø6ÀÈÀôˆHð —o‘o bÓ)×.Ñ.ˆGØ—o‘o bÓ)×.Ñ.ˆGØ'.°Ñ'8Ð˜eÒ$ð
	9ð !Ð ùò Ks   …Brk   )rl   rm   rn   ro   r	   rp   r!   rq   r'   rS   rr   r   r2   r|   r}   s   @r    r   r   “   sH   ø„ ññ 

˜Wð 

¸õ 

ð ñGó ðGò#+ðL!  ^Ñ 4÷ !r"   r   c                   ó@   ‡ — e Zd ZdZddedefˆ fd„Zd„ Zdefd„Z	ˆ xZ
S )	ÚForLoopIndexingPatternaº  
    This pattern identifies if we use a for loop to index a tensor that
    can be vectorized.
    example:
    tensor = torch.empty((100, 100))
    for i in range(100):
        tensor[i] = i

    Pattern:
    aten::select | ... | aten::select | ... (Repeat)

    Algorithm:
    We start at node aten::select, and we check if we can find this alternating patterns.
    We also keep a dictionary to avoid duplicate match in the for loop.
    r   r   c                 ó`   •— t         ‰| �  ||«       d| _        d| _        t	        «       | _        y )NzFor Loop Indexing Patternz6For loop indexing detected. Vectorization recommended.)rv   r!   r   r   ÚsetÚvisitedr†   s      €r    r!   zForLoopIndexingPattern.__init__û   s+   ø€ Ü‰Ñ˜Ð/Ô0Ø/ˆŒ	ØSˆÔÜ!$£ˆ�r"   c              #   óJ   K  — t        | j                  «      E d{  –—†  y7 Œ­w)zN
        We need to use BFS traversal order to avoid duplicate match.
        N)r   r   r&   s    r    r-   z)ForLoopIndexingPattern.eventTreeTraversal  s   è ø€ ô   §¡Ó0×0Ò0úr.   r   c           
      óà  — |j                   dk7  ry|j                  | j                  v ryd}| j                  |«      \  }}t	        |«      dk  ryd„ }t        |d„ «      }|€y|g|d | z   }|t	        |«      dz
  d  }t        dt	        |«      t	        |«      «      D ]M  } |||||t	        |«      z    «      r.|dz  }| j                  j                  ||   j                  «       ŒI |dk\  S  |dk\  S )Núaten::selectFr[   c                 ó’   — t        | «      t        |«      k7  ryt        | |«      D ]   \  }}|j                  |j                  k7  sŒ  y y)NFT)r3   Úzipr   )Úlist1Úlist2Úop1Úop2s       r    Úsame_opsz.ForLoopIndexingPattern.match.<locals>.same_ops  sG   € Ü�5‹zœS ›ZÒ'ØÜ  uÓ-ò !‘��SØ—8‘8˜sŸx™xÓ'Ù ð!ð r"   c                 ó    — | j                   dk(  S )Nr¦   )r   ©Úes    r    ú<lambda>z.ForLoopIndexingPattern.match.<locals>.<lambda>  s   € ¸q¿v¹vÈÑ?W€ r"   r   r–   )r   Úidr£   r^   r3   r
   ÚrangeÚadd)	r   r   Úrepeat_countra   Únextr­   Únext_select_idxÚindexing_opsÚis	            r    rS   zForLoopIndexingPattern.match  s  € Ø�:‰:˜Ò'ØØ�8‰8�t—|‘|Ñ#ØØˆØ×"Ñ" 5Ó)‰ˆˆ4Üˆt‹9˜Š>Øò	ô /¨tÑ5WÓXˆØÐ"ØØ�w Ð&6 Ð!7Ñ7ˆØ”C˜Ó%¨Ñ)Ð+Ð,ˆÜ�qœ#˜d›)¤S¨Ó%6Ó7ò 	ˆAÙ˜ d¨1¨q´3°|Ó3DÑ/DÐ&EÔFØ Ñ!�Ø—‘× Ñ   a¡§¡Õ,àØ˜rÑ!Ð!ð	ð ˜rÑ!Ð!r"   rk   )rl   rm   rn   ro   r	   rp   r!   r-   r   rS   r|   r}   s   @r    r    r    ê   s,   ø„ ññ '˜Wð '¸õ 'ò1ð"˜>÷ "r"   r    c                   óh   ‡ — e Zd Zd
dedefˆ fd„Zeˆ fd„«       Zdefd„Z	defd„Z
dee   fd	„Zˆ xZS )ÚFP32MatMulPatternr   r   c                 óP   •— t         ‰| �  ||«       d| _        d| _        d| _        y )NzFP32 MatMul Patternz|You are currently using GPU that supports TF32. Please enable TF32 by setting 'torch.backends.cuda.matmul.allow_tf32 = True'zUhttps://pytorch.org/docs/stable/notes/cuda.html#tensorfloat-32-tf32-on-ampere-devices©rv   r!   r   r   r   r†   s      €r    r!   zFP32MatMulPattern.__init__*  s2   ø€ Ü‰Ñ˜Ð/Ô0Ø)ˆŒ	ð[ð 	Ôð kˆ�r"   c                 óì   •— t         j                  j                  �d}n.t        d„ t         j                  j                  «       D «       «      }|du xs# t        ‰| �  xs | j                  j                   S )NFc              3   ó>   K  — | ]  }t        |d d «      dk\  –— Œ y­w)é   NéP   )rK   )rE   Úarchs     r    rF   z)FP32MatMulPattern.skip.<locals>.<genexpr>9  s   è ø€ ÒV°4œ3˜t A B˜x›=¨BÕ.ÑVùs   ‚)
ÚtorchÚversionÚhipÚallÚcudaÚget_arch_listrv   r'   r   rŠ   )r   Úhas_tf32rw   s     €r    r'   zFP32MatMulPattern.skip3  s]   ø€ ä�=‰=×ÑÐ(Ø‰Hô ÑV¼5¿:¹:×;SÑ;SÓ;UÔVÓVˆHØ˜5Ð ÒO¤E¡G¡LÒO¸¿	¹	×8OÑ8OÐ4OÐOr"   r   c                 óÈ   — |j                   t        j                  k7  ryt        |j                  t
        «      sJ ‚|j                  dk(  r|j                  j                  du ryy)NFúaten::mmT)Útagr   ÚTorchOpÚ
isinstanceÚextra_fieldsr   r   Úallow_tf32_cublasrR   s     r    rS   zFP32MatMulPattern.match<  sT   € à�9‰9œ
×*Ñ*Ò*ØÜ˜%×,Ñ,Ô.BÔCÐCÐCØ�:‰:˜Ò#Ø×!Ñ!×3Ñ3°uÑ<ØØr"   c                 ó   — | j                   S rC   )r   rR   s     r    r+   zFP32MatMulPattern.reportF  s   € Ø×ÑÐr"   r/   c                 ó,  — |D �ci c]  }t        |«      d“Œ }}|D ]ð  }t        j                  |d   dt        j                  ¬«      }t        j                  |d   dt        j                  ¬«      }t	        j
                  d||dœ¬«      }t	        j
                  dd	||dœ¬
«      }dt        j                  j                  j                  _	        |j                  d«      j                  }	|j                  d«      j                  }
|
|	z  ||<   Œò |S c c}w )Nr‘   r   rÇ   ©ÚdeviceÚdtyper[   útorch.mm(matrixA, matrixB)©ÚmatrixAÚmatrixBr“   z,torch.backends.cuda.matmul.allow_tf32 = True)r”   Úsetupr•   Fr–   )rH   rÃ   ÚrandnÚfloat32r2   r—   ÚbackendsrÇ   ÚmatmulÚ
allow_tf32r˜   r™   )r   r/   r   rI   rš   rØ   rÙ   Ú
fp32_timerÚ
tf32_timerÚ	fp32_timeÚ	tf32_times              r    r2   zFP32MatMulPattern.benchmarkI  sþ   € ØCIÖJ¸%œ\¨%Ó0°#Ñ5ÐJÐÐJØ&ò 	=ˆEÜ—k‘k %¨¡(°6ÄÇÁÔOˆGÜ—k‘k %¨¡(°6ÄÇÁÔOˆGÜ"Ÿ™Ø1Ø$+¸Ñ@ôˆJô #Ÿ™Ø1ØDØ$+¸Ñ@ôˆJð
 5:ŒE�N‰N×Ñ×&Ñ&Ô1Ø"×)Ñ)¨"Ó-×2Ñ2ˆIØ"×)Ñ)¨"Ó-×2Ñ2ˆIØ'0°9Ñ'<Ð˜eÒ$ð	=ð  !Ð ùò# Ks   …Drk   )rl   rm   rn   r	   rp   r!   rq   r'   r   rS   r+   rr   r2   r|   r}   s   @r    r»   r»   )  sX   ø„ ñk˜Wð k¸õ kð óPó ðPð˜>ó ð ˜Nó  ð!  ^Ñ 4÷ !r"   r»   c                   ó:   ‡ — e Zd ZdZddedefˆ fd„Zdefd„Zˆ xZ	S )ÚOptimizerSingleTensorPatterna{  
    This pattern identifies if we are using the single-tensor version of an optimizer.
    example:
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    By adding foreach=True to enable multi-tensor optimizer, we can gain speedup when
    the kernels are relatively small.

    Pattern:
    XXXXX: _single_tenser_<OPTIMIZER_NAME>

    Algorithm:
    String match
    r   r   c                 ób   •— t         ‰| �  ||«       d| _        g d¢| _        d| _        d| _        y )NzOptimizer Single Tensor Pattern)ÚadamÚsgdÚadamwz�Deteced optimizer running with single tensor implementation. Please enable multi tensor implementation by passing 'foreach=True' into optimizer.r   )rv   r!   r   Úoptimizers_with_foreachr   r   r†   s      €r    r!   z%OptimizerSingleTensorPattern.__init__m  s9   ø€ Ü‰Ñ˜Ð/Ô0Ø5ˆŒ	Ú'?ˆÔ$ðbð 	Ôð ˆ�r"   r   c                 óf   — | j                   D ]"  }|j                  j                  d|› �«      sŒ" y y)NÚ_single_tensor_TF)rê   r   Úendswith)r   r   Ú	optimizers      r    rS   z"OptimizerSingleTensorPattern.matchw  s8   € Ø×5Ñ5ò 	ˆIØ�z‰z×"Ñ" _°Y°KÐ#@ÕAÙð	ð r"   rk   ©
rl   rm   rn   ro   r	   rp   r!   r   rS   r|   r}   s   @r    rå   rå   ^  s'   ø„ ññ˜Wð ¸õ ð˜>÷ r"   rå   c                   ó:   ‡ — e Zd ZdZddedefˆ fd„Zdefd„Zˆ xZ	S )ÚSynchronizedDataLoaderPatterna  
    This pattern identifies if we are using num_workers=0 in DataLoader.
    example:
    torch.utils.data.DataLoader(dataset, batch_size=batch_size)
    Add num_workers=N to the arguments. N depends on system configuration.

    Pattern:
    dataloader.py(...): __iter__
        dataloader.py(...): _get_iterator
            NOT dataloader.py(...): check_worker_number_rationality

    Algorithm:
    If we don't see check_worker_number_rationality call in the dataloader __iter__,
    It is not an asynchronous dataloader.

    r   r   c                 óP   •— t         ‰| �  ||«       d| _        d| _        d| _        y )NzSynchronized DataLoader Patternz�Detected DataLoader running with synchronized implementation. Please enable asynchronous dataloading by setting num_workers > 0 when initializing DataLoader.zjhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#enable-async-data-loading-and-augmentationr½   r†   s      €r    r!   z&SynchronizedDataLoaderPattern.__init__�  s4   ø€ Ü‰Ñ˜Ð/Ô0Ø5ˆŒ	ðnð 	Ôð
:ð 	�r"   r   c                 óB  — dt         dt         fd„}	 |j                    ||j                  d«      sy|j                  sy|j                  d   } ||j                  d«      sy|j                  sy|j                  d   } ||j                  d«       S # t        $ r Y yw xY w)	Nr   Úfunction_namec                 óŠ   — | j                  t        j                  j                  dddd«      «      xr | j	                  |«      S )NrÃ   ÚutilsÚdatazdataloader.py)Ú
startswithÚosÚpathÚjoinrí   )r   rô   s     r    Úis_dataloader_functionzCSynchronizedDataLoaderPattern.match.<locals>.is_dataloader_function�  s:   € Ø—?‘?Ü—‘—‘˜W g¨v°ÓGóò /à—-‘- Ó.ð/r"   FÚ__iter__r   Ú_get_iteratorÚcheck_worker_number_rationality)r{   r   ÚUnicodeDecodeErrorr\   )r   r   rü   s      r    rS   z#SynchronizedDataLoaderPattern.matchœ  sž   € ð	/¬ð 	/¼Só 	/ð	Ø�JŠJñ & e§j¡j°*Ô=ØØ�~Š~ØØ—‘˜qÑ!ˆÙ% e§j¡j°/ÔBØØ�~Š~ØØ—‘˜qÑ!ˆÙ)¨%¯*©*Ð6WÓXÐXÐXøô "ò 	Ùð	ús   ’B Â	BÂBrk   rï   r}   s   @r    rñ   rñ   ~  s)   ø„ ññ"

˜Wð 

¸õ 

ðY˜>÷ Yr"   rñ   c                   ó:   ‡ — e Zd ZdZddedefˆ fd„Zdefd„Zˆ xZ	S )ÚGradNotSetToNonePatterna�  
    This pattern identifies if we are not setting grad to None in zero_grad.
    example:
    optimizer.zero_grad()
    By setting set_to_none=True, we can gain speedup

    Pattern:
    XXXXX: _zero_grad
        NOT aten::zeros
            aten::zero_

    aten::zero_ is called on each parameter in the model.
    We also want to make sure it is not called by aten::zeros.

    Algorithm:
    String match
    r   r   c                 óP   •— t         ‰| �  ||«       d| _        d| _        d| _        y )Nz,Gradient Set To Zero Instead of None PatternzfDetected gradient set to zero instead of None. Please add 'set_to_none=True' when calling zero_grad().zxhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#disable-gradient-calculation-for-validation-or-inferencer½   r†   s      €r    r!   z GradNotSetToNonePattern.__init__Ë  s5   ø€ Ü‰Ñ˜Ð/Ô0ØBˆŒ	ðFð 	Ôð
Hð 	�r"   r   c                 óà   — |j                   j                  d«      sy|j                  syt        |j                  «      D ]-  }|j                   dk(  sŒ|j                  j                   dk7  sŒ- y y)Nz: zero_gradFr„   zaten::zerosT)r   rí   r\   r   rX   )r   r   Ú	sub_events      r    rS   zGradNotSetToNonePattern.match×  sa   € Ø�z‰z×"Ñ" =Ô1ØØ�~Š~Øä% e§n¡nÓ5ò 	ˆIà—‘ -Ó/Ø×$Ñ$×)Ñ)¨]Ó:áð	ð r"   rk   rï   r}   s   @r    r  r  ¸  s'   ø„ ññ$

˜Wð 

¸õ 

ð˜>÷ r"   r  c                   óN   ‡ — e Zd ZdZddedefˆ fd„Zeˆ fd„«       Zde	fd„Z
ˆ xZS )	Ú&Conv2dBiasFollowedByBatchNorm2dPatternau  
    This pattern identifies if we are enabling bias in Conv2d which is followed by BatchNorm2d.
    Bias doesn't do anything when followed by batchnorm.
    Pattern:
    nn.Module: Conv2d            | nn.Module: BatchNorm2d
        ...
            aten::conv2d AND dtype of third argument is not null
    The third argument is the bias
    Algorithm:
    String match
    r   r   c                 óP   •— t         ‰| �  ||«       d| _        d| _        d| _        y )Nz5Enabling Bias in Conv2d Followed By BatchNorm PatternzcDetected bias enabled in Conv2d that is followed by BatchNorm2d. Please set 'bias=False' in Conv2d.zhttps://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#disable-bias-for-convolutions-directly-followed-by-a-batch-normr½   r†   s      €r    r!   z/Conv2dBiasFollowedByBatchNorm2dPattern.__init__ô  s2   ø€ Ü‰Ñ˜Ð/Ô0ØKˆŒ	ð AˆÔðOð 	�r"   c                 óL   •— | j                   j                  du xs
 t        ‰| �  S r$   )r   rŠ   rv   r'   )r   rw   s    €r    r'   z+Conv2dBiasFollowedByBatchNorm2dPattern.skipý  s!   ø€ à�y‰y×&Ñ&¨%Ð/Ò?´5±7±<Ð?r"   r   c                 óø   — |j                   dk7  ryt        t        |«      «      dk  st        |«      d   €y| j                  |d„ «      }|sy| j	                  |«      }|sy|j                   j                  d«      S )Nzaten::conv2dFrÀ   rJ   c                 ó8   — | j                   j                  d«      S )Nznn.Module: Conv2d)r   rø   r¯   s    r    r±   z>Conv2dBiasFollowedByBatchNorm2dPattern.match.<locals>.<lambda>  s   € ˜QŸV™V×.Ñ.Ð/BÓC€ r"   znn.Module: BatchNorm2d)r   r3   r�   rj   rc   rø   rR   s     r    rS   z,Conv2dBiasFollowedByBatchNorm2dPattern.match  s}   € Ø�:‰:˜Ò'ØÜŒ|˜EÓ"Ó# aÒ'¬<¸Ó+>¸qÑ+AÐ+IØà× Ñ ØÑCó
ˆñ ØØ—‘˜UÓ#ˆÙØØ�z‰z×$Ñ$Ð%=Ó>Ð>r"   rk   )rl   rm   rn   ro   r	   rp   r!   rq   r'   r   rS   r|   r}   s   @r    r  r  ç  s=   ø„ ñ
ñ
˜Wð 
¸õ 
ð ó@ó ð@ð?˜>÷ ?r"   r  c                   óX   ‡ — e Zd Zd	dedefˆ fd„Zed„ «       Zdefd„Z	de
e   fd„Zˆ xZS )
ÚMatMulDimInFP16Patternr   r   c                 óP   •— t         ‰| �  ||«       d| _        d| _        d| _        y )Nz3Matrix Multiplication Dimension Not Aligned PatternzUDetected matmul with dimension not aligned. Please use matmul with aligned dimension.z[https://pytorch.org/tutorials/recipes/recipes/tuning_guide.html#use-mixed-precision-and-ampr½   r†   s      €r    r!   zMatMulDimInFP16Pattern.__init__  s)   ø€ Ü‰Ñ˜Ð/Ô0ØIˆŒ	ØrˆÔØpˆ�r"   c                 ób   — | j                   j                   xs | j                   j                   S rC   rˆ   r&   s    r    r'   zMatMulDimInFP16Pattern.skip  r‹   r"   r   c                 óÆ   — d„ }|j                   dvryt        |«      syt        |«      d   }|t        j                  t        j                  fv r |t        |«      d«      syy)Nc                 ó,   ‡— t        ˆfd„| D «       «      S )Nc              3   óB   •K  — | ]  }|d d D ]  }|‰z  dk(  –— Œ Œ y­w)éþÿÿÿNr   r%   )rE   rš   ÚdimÚmultiples      €r    rF   zCMatMulDimInFP16Pattern.match.<locals>.mutiple_of.<locals>.<genexpr>  s/   øè ø€ ÒU¨uÈ%ÐPRÐPSÈ*ÒUÀ3�s˜X‘~¨Õ*ÐUÐ*ÑUùs   ƒ)rÆ   )Úshapesr  s    `r    Ú
mutiple_ofz0MatMulDimInFP16Pattern.match.<locals>.mutiple_of  s   ø€ ÜÓU¸ÔUÓUÐUr"   )rË   z	aten::bmmzaten::addmmFr   é   T)r   r�   rÃ   Úbfloat16ÚhalfrH   )r   r   r  Ú	arg_dtypes       r    rS   zMatMulDimInFP16Pattern.match  sb   € ò	Vð �:‰:ÐEÑEØÜ˜EÔ"ØÜ  Ó'¨Ñ*ˆ	ØœŸ™¬¯©Ð4Ñ4¹ZÜ˜Ó ô>
ð Ør"   r/   c                 ó¢  — d„ }|D �ci c]  }t        |«      d“Œ }}|D �]'  }t        j                  |d   dt        j                  ¬«      }t        j                  |d   dt        j                  ¬«      }t	        j
                  d||dœ¬	«      }t        j                   ||d   d
«      dt        j                  ¬«      }t        j                   ||d   d
«      dt        j                  ¬«      }t	        j
                  d||dœ¬	«      }	|j                  d«      j                  }
|	j                  d«      j                  }||
z  ||<   �Œ* |S c c}w )Nc                 ó^   — | D �cg c]  }|t        j                  ||z  «      z  ‘Œ c}S c c}w rC   )ÚmathÚceil)r  r  rš   s      r    Úclosest_multiplez:MatMulDimInFP16Pattern.benchmark.<locals>.closest_multiple-  s)   € ØHNÖO¸u�HœtŸy™y¨°Ñ)9Ó:Ó:ÒOÐOùÒOs   …"*r‘   r   rÇ   rÓ   r[   rÖ   r×   r“   r  r–   )rH   rÃ   rÛ   Úfloat16r2   r—   r˜   r™   )r   r/   r   r   rI   rš   rØ   rÙ   Únot_aligned_dim_timerÚaligned_dim_timerÚnot_aligned_dim_timeÚaligned_dim_times               r    r2   z MatMulDimInFP16Pattern.benchmark,  s@  € ò	Pð DJÖJ¸%œ\¨%Ó0°#Ñ5ÐJÐÐJØ&ó 	OˆEÜ—k‘k %¨¡(°6ÄÇÁÔOˆGÜ—k‘k %¨¡(°6ÄÇÁÔOˆGÜ$-§O¡OØ1Ø$+¸Ñ@ô%Ð!ô —k‘kÙ   q¡¨1Ó-°fÄEÇMÁMôˆGô —k‘kÙ   q¡¨1Ó-°fÄEÇMÁMôˆGô !*§¡Ø1Ø$+¸Ñ@ô!Ðð $9×#?Ñ#?ÀÓ#C×#HÑ#HÐ Ø0×7Ñ7¸Ó;×@Ñ@ÐØ'7Ð:NÑ'NÐ˜eÓ$ð'	Oð( !Ð ùò+ Ks   ˆErk   )rl   rm   rn   r	   rp   r!   rq   r'   r   rS   rr   r2   r|   r}   s   @r    r  r    sL   ø„ ñq˜Wð q¸õ qð ñGó ðGð˜>ó ð!  ^Ñ 4÷ !r"   r  r   c                 óä  — | rî| j                   t        j                  k(  s| j                   t        j                  k(  r¥t	        | j
                  t        t        f«      sJ ‚| j
                  j                  j                  j                  dt        j                  z   «      sC| j
                  j                  j                  › d| j
                  j                  j                  › �S | j                  } | rŒîy)NrÃ   ú:zNo source code location found)rÌ   r   ÚPyCallÚPyCCallrÎ   rÏ   r   r   ÚcallerÚ	file_namerø   rù   ÚsepÚline_numberrX   ©r   s    r    r)   r)   H  sÁ   € Ù
Ø�9‰9œ
×)Ñ)Ò)¨U¯Y©Y¼*×:LÑ:LÒ-LÜØ×"Ñ"Ô%8Ô:NÐ$Oôð ð ð ×%Ñ%×,Ñ,×6Ñ6×AÑAÀ'ÌBÏFÉFÑBRÔSØ×,Ñ,×3Ñ3×=Ñ=Ð>¸aÀ×@RÑ@R×@YÑ@Y×@eÑ@eÐ?fÐgÐgØ—‘ˆò ð +r"   c                 ó†   — t        | j                  t        «      sJ ‚t        d„ | j                  j                  D «       «      S )Nc              3   óH   K  — | ]  }t        t        |d d«      «      –— Œ y­w)Úsizesr%   N)ÚtupleÚgetattr©rE   r¹   s     r    rF   zinput_shapes.<locals>.<genexpr>V  s   è ø€ ÒS°A””w˜q '¨2Ó.×/ÑSùs   ‚ "©rÎ   rÏ   r   r2  Úinputsr.  s    r    rH   rH   T  s6   € Ü�e×(Ñ(Ô*>Ô?Ð?Ð?ÜÑS¸×9KÑ9K×9RÑ9RÔSÓSÐSr"   c                 ó†   — t        | j                  t        «      sJ ‚t        d„ | j                  j                  D «       «      S )Nc              3   ó6   K  — | ]  }t        |d d«      –— Œ y­w)rÕ   N)r3  r4  s     r    rF   zinput_dtypes.<locals>.<genexpr>[  s   è ø€ ÒN¨q”˜˜G T×*ÑNùs   ‚r5  r.  s    r    r�   r�   Y  s6   € Ü�e×(Ñ(Ô*>Ô?Ð?Ð?ÜÑN°E×4FÑ4F×4MÑ4MÔNÓNÐNr"   r   Úprint_enableÚjson_report_dirc           
      óÌ  — i }t        | |«      t        | |«      t        | |«      t        | |«      t	        | |«      t        | |«      t        | |«      g}t        «       }g }d› dd› �g}|j                  d«       |D ]Þ  }	|	j                  «       }
|
sŒ|j                  |	j                  |
«      «       |
D ]¤  }|	j                  |«      }||vsŒ|j                  |«       |j                  |«       t        |«      j                  d«      \  }}|j                  |g «      j                  t!        |«      |	j"                  |	j$                  |	j&                  dœ«       Œ¦ Œà |�¨t(        j*                  j-                  |d«      }t(        j*                  j/                  |«      r<t1        |«      5 }t3        j4                  |«      }|j7                  |«       |}d d d «       t1        |d«      5 }t3        j8                  ||d¬	«       d d d «       |j                  d
«       ||z  }|j                  d› dd› �«       |rt;        dj-                  |«      «       y y # 1 sw Y   Œ€xY w# 1 sw Y   Œ_xY w)Nz(----------------------------------------zTorchTidy ReportzMatched Events:r'  )r-  r   r   Úmessageztorchtidy_report.jsonÚwé   )ÚindentzSummary:ú
)r   r»   rå   rñ   r  r  r  r¢   r   rU   r7   r+   r´   r)   Úsplitr   rK   r   r   r   rù   rú   rû   ÚexistsÚopenÚjsonÚloadÚupdateÚdumpÚprint)r   r   r9  r:  Úreport_dictÚanti_patternsÚreportedÚ	summariesÚmessage_listÚanti_patternrU   r   Ú
report_msgÚsrc_locationÚline_noÚjson_report_pathÚfÚexisiting_reports                     r    Úreport_all_anti_patternsrU  ^  sX  € ð €Kä˜TÐ#3Ó4ä˜$Ð 0Ó1Ü$ TÐ+;Ó<Ü% dÐ,<Ó=Ü Ð&6Ó7Ü.¨tÐ5EÓFÜ˜tÐ%5Ó6ð	€Mô ‹u€HØ€IØ�jÐ 0°°
Ð;Ð<€LØ×ÑÐ)Ô*à%ò ˆØ%×4Ñ4Ó6ˆÙØØ×Ñ˜×-Ñ-¨nÓ=Ô>Ø#ò 	ˆEØ%×,Ñ,¨UÓ3ˆJØ Ò)Ø×#Ñ# JÔ/Ø—‘˜ZÔ(Ü(<¸UÓ(C×(IÑ(IÈ#Ó(NÑ%�˜gØ×&Ñ& |°RÓ8×?Ñ?ä'*¨7£|Ø ,× 1Ñ 1Ø+×/Ñ/Ø#/×#;Ñ#;ñ	õñ	ðð( Ð"ÜŸ7™7Ÿ<™<¨Ð9PÓQÐÜ�7‰7�>‰>Ð*Ô+ÜÐ&Ó'ð /¨1Ü#'§9¡9¨Q£<Ð Ø ×'Ñ'¨Ô4Ø.�÷/ô Ð" CÓ(ð 	0¨AÜ�I‰I�k 1¨QÕ/÷	0ð ×Ñ˜
Ô#Ø�IÑ€LØ×Ñ˜8˜*Ð$4°X°JÐ?Ô@ÙÜˆd�i‰i˜Ó%Õ&ð ÷/ð /ú÷	0ð 	0ús   Æ&)IÇ#IÉIÉI#)FTN)&rD  r  rù   ry   Útypingr   rÃ   Útorch.utils.benchmarkrö   r2   Útorch._C._profilerr   r   r   r   r   Útorch.profilerr	   Útorch.profiler._utilsr
   r   r   r   rt   r   r    r»   rå   rñ   r  r  r  r)   rH   r�   rp   r{   rU  r%   r"   r    ú<module>r[     s  ðã Û Û 	Û 	Ý ã ß )Ð )÷õ õ #ß RÑ R÷nñ nôh<�'ô <ôT!˜7ô T!ôn<"˜Wô <"ô~2!˜ô 2!ôj 7ô ô@6Y Gô 6Yôt,˜gô ,ô^(?¨Wô (?ôV3!˜Wô 3!ðl	+ ¨Ñ 8ó 	+ðT˜ó Tð
O˜ó Oð #ØØ%)ñ	8'àð8'ð ð8'ð ˜c‘]ô	8'r"   