§
    Ë²Åj.q  ã                   ó¶  — U d dl Z d dlmZmZmZ ddlmZ d dlmZm	Z	m
Z
mZmZmZ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Zd
dgZe j        j        Zd„ Zi Ze
e	e	f         ed<   d„ Zd6d„Z eej         ¦  «        ddœde!fd„¦   «         Z" eej#        ¦  «        d7de!fd„¦   «         Z$ eej%        ¦  «        d7de!fd„¦   «         Z& eej'        ¦  «        d7de!fd„¦   «         Z(	 d6dee!         dee!         dee!         de)de!f
d„Z* eej+        ej,        g¦  «        ddœde!fd„¦   «         Z- eej.        ¦  «        de!fd„¦   «         Z/d„ Z0 eej1        ej2        ej3        g¦  «        ddœde!fd„¦   «         Z4d „ Z5dd!œdeeee!d"f         ee!d"f         ee!d"f         eee!d"f                  f                  fd#„Z6dd!œdeeee!d"f         ee!d"f         ee!d"f         eee!d"f                  f                  fd$„Z7 eej8        d%¬&¦  «        ddœde!fd'„¦   «         Z9 eej:        d%¬&¦  «        de!fd(„¦   «         Z;d)„ Z< eej=        ej>        ej?        g¦  «        ddœde!fd*„¦   «         Z@ eejA        d%¬&¦  «        de!fd+„¦   «         ZB eejC        d%¬&¦  «        de!fd,„¦   «         ZDi ej         e"“ej#        e$“ej%        e&“ej'        e(“ej+        e-“ej,        e-“ej.        e/“ej1        e4“ej2        e4“ej3        e4“ej=        e@“ej>        e@“ej?        e@“ej8        e9“ej:        e;“ejA        eB“ejC        eD“Zd-„ ZEg d.¢ZFd/„ ZGd0„ ZHd1„ ZId2„ ZJ G d3„ d
¦  «        ZK G d4„ d5e¦  «        ZLdS )8é    N)Útree_mapÚtree_flattenÚtree_unflattené   )ÚModuleTracker)ÚListÚAnyÚDictÚOptionalÚUnionÚTupleÚIterator)Údefaultdict)ÚTorchDispatchMode©Úprod©ÚwrapsÚFlopCounterModeÚregister_flop_formulac                 óH   — t          | t          j        ¦  «        r| j        S | S ©N)Ú
isinstanceÚtorchÚTensorÚshape)Úis    úIC:\Projects\Historical\venv\Lib\site-packages\torch/utils/flop_counter.pyÚ	get_shaper      s"   € Ý�!•U”\Ñ"Ô"ð ØŒwˆØ€Hó    Úflop_registryc                 óB   ‡ — t          ‰ ¦  «        d dœˆ fd„
¦   «         }|S )N)Úout_valc                 óP   •— t          t          ||| f¦  «        \  }}} ‰|d|i|¤ŽS )NÚ	out_shape)r   r   )r#   ÚargsÚkwargsr%   Úfs       €r   Únfzshape_wrapper.<locals>.nf   s:   ø€ å"*­9°t¸VÀWÐ6MÑ"NÔ"NÑˆˆf�iØˆq�$Ð6 )Ð6¨vÐ6Ð6Ð6r    r   ©r(   r)   s   ` r   Úshape_wrapperr+      s@   ø€ Ý
ˆ1�X„XØð 7ð 7ð 7ð 7ð 7ð 7ñ „Xð7ð €Ir    Fc                 ó   ‡ ‡— ˆˆ fd„}|S )Nc                 ó€   •‡ — ‰st          ‰ ¦  «        Š ˆ fd„}t          j        j                             |‰¦  «         ‰ S )Nc                 óÔ   •— t          | t          j        j        ¦  «        s"t	          d| › dt          | ¦  «        › �¦  «        ‚| t          v rt          d| › �¦  «        ‚‰t          | <   d S )Nzlregister_flop_formula(targets): expected each target to be OpOverloadPacket (i.e. torch.ops.mylib.foo), got z which is of type zduplicate registrations for )r   r   Ú_opsÚOpOverloadPacketÚ
ValueErrorÚtyper!   ÚRuntimeError)ÚtargetÚflop_formulas    €r   Úregisterz=register_flop_formula.<locals>.register_fun.<locals>.register&   sŽ   ø€ Ý˜f¥e¤jÔ&AÑBÔBð AÝ ð@àð@ð @å15°f±´ð@ð @ñAô Að Að �Ð&Ð&Ý"Ð#JÀ&Ð#JÐ#JÑKÔKÐKØ$0�M˜&Ñ!Ð!Ð!r    )r+   r   ÚutilsÚ_pytreeÚ	tree_map_)r5   r6   Úget_rawÚtargetss   ` €€r   Úregister_funz+register_flop_formula.<locals>.register_fun"   sU   øø€ Øð 	7Ý(¨Ñ6Ô6ˆLð	1ð 	1ð 	1ð 	1ð 	1õ 	ŒÔ×%Ò% h°Ñ8Ô8Ð8àÐr    © )r;   r:   r<   s   `` r   r   r   !   s*   øø€ ðð ð ð ð ð ð& Ðr    )r%   Úreturnc                ó<   — | \  }}|\  }}||k    sJ ‚||z  dz  |z  S )zCount flops for matmul.é   r=   )	Úa_shapeÚb_shaper%   r&   r'   ÚmÚkÚk2Úns	            r   Úmm_floprG   7   s5   € ð
 �D€A€qØ�E€BˆØ�Š7ˆ7ˆ7ˆ7àˆq‰5�1‰9�q‰=Ðr    c                 ó"   — t          ||¦  «        S )zCount flops for addmm.)rG   ©Ú
self_shaperA   rB   r%   r'   s        r   Ú
addmm_floprK   B   s   € õ �7˜GÑ$Ô$Ð$r    c                 óZ   — | \  }}}|\  }}}	||k    sJ ‚||k    sJ ‚||z  |	z  dz  |z  }
|
S )z"Count flops for the bmm operation.r@   r=   )rA   rB   r%   r'   ÚbrC   rD   Úb2rE   rF   Úflops              r   Úbmm_floprP   G   sO   € ð
 �G€A€qˆ!Ø�I€BˆˆAØ�Š7ˆ7ˆ7ˆ7Ø�Š7ˆ7ˆ7ˆ7àˆq‰5�1‰9�q‰=˜1Ñ€DØ€Kr    c                 ó"   — t          ||¦  «        S )z&Count flops for the baddbmm operation.©rP   rI   s        r   Úbaddbmm_floprS   T   s   € õ
 �G˜WÑ%Ô%Ð%r    Úx_shapeÚw_shaper%   Ú
transposedc                 ó”   — | d         }|r| n|dd…         }|^}}}	 t          |¦  «        t          |¦  «        z  |z  |z  |z  dz  }	|	S )a  Count flops for convolution.

    Note only multiplication is
    counted. Computation for bias are ignored.
    Flops for a transposed convolution are calculated as
    flops = (x_shape[2:] * prod(w_shape) * batch_size).
    Args:
        x_shape (list(int)): The input shape before convolution.
        w_shape (list(int)): The filter shape.
        out_shape (list(int)): The output shape after convolution.
        transposed (bool): is the convolution transposed
    Returns:
        int: the number of flops
    r   r@   Nr   )
rT   rU   r%   rV   Ú
batch_sizeÚ
conv_shapeÚc_outÚc_inÚfilter_sizerO   s
             r   Úconv_flop_countr]   \   sj   € ð* ˜”€JØ'Ð6�'�'¨Y¸¸¸Ô;€JØ 'Ð€Eˆ4�+ðõ �
ÑÔ�d ;Ñ/Ô/Ñ/°*Ñ<¸uÑDÀtÑKÈaÑO€DØ€Kr    c                ó(   — t          | |||¬¦  «        S )zCount flops for convolution.©rV   )r]   )
rT   rU   Ú_biasÚ_strideÚ_paddingÚ	_dilationrV   r%   r&   r'   s
             r   Ú	conv_floprd   ƒ   s   € õ ˜7 G¨YÀ:ÐNÑNÔNÐNr    c                 ó|  — d„ }d}	 |
d         r+t          |d         ¦  «        }|t          | ||| ¦  «        z  }|
d         rzt          |d         ¦  «        }|r2|t           || ¦  «         ||¦  «         ||¦  «        d¬¦  «        z  }n1|t           ||¦  «         || ¦  «         ||¦  «        d¬¦  «        z  }|S )Nc                 óR   — | d         | d         gt          | dd …         ¦  «        z   S )Nr   r   r@   )Úlist)r   s    r   Útzconv_backward_flop.<locals>.t˜   s(   € Ø�a”˜% œ(Ð#¥d¨5°°°¬9¡o¤oÑ5Ð5r    r   r   Fr_   )r   r]   )Úgrad_out_shaperT   rU   r`   ra   rb   rc   rV   Ú_output_paddingÚ_groupsÚoutput_maskr%   rh   Ú
flop_countÚgrad_input_shapeÚgrad_weight_shapes                   r   Úconv_backward_floprp   ‰   sÿ   € ð6ð 6ð 6à€JðDðL �1„~ð aÝ$ Y¨q¤\Ñ2Ô2ÐØ•o n°gÐ?OÐU_ÐQ_Ñ`Ô`Ñ`ˆ
à�1„~ð qÝ% i°¤lÑ3Ô3ÐØð 	qà�/¨!¨!¨NÑ*;Ô*;¸Q¸Q¸w¹Z¼ZÈÈÐK\ÑI]ÔI]ÐjoÐpÑpÔpÑpˆJˆJð �/¨!¨!¨G©*¬*°a°a¸Ñ6GÔ6GÈÈÐK\ÑI]ÔI]ÐjoÐpÑpÔpÑpˆJàÐr    c                 ó  — | \  }}}}|\  }}}	}
|\  }}}}||cxk    r|k    r%n n"||cxk    r|k    rn n||
k    r|	|k    r||
k    sJ ‚d}|t          ||z  ||f||z  ||	f¦  «        z  }|t          ||z  ||	f||z  |	|f¦  «        z  }|S )z^
    Count flops for self-attention.

    NB: We can assume that value_shape == key_shape
    r   rR   )Úquery_shapeÚ	key_shapeÚvalue_shaperM   ÚhÚs_qÚd_qÚ_b2Ú_h2Ús_kÚ_d2Ú_b3Ú_h3Ú_s3Úd_vÚtotal_flopss                   r   Úsdpa_flop_countr�   ñ   sß   € ð !�N€A€qˆ#ˆsØ"Ñ€Cˆˆc�3Ø$Ñ€Cˆˆc�3Ø�ˆ?ˆ?Š?ˆ?�sŠ?ˆ?ˆ?ˆ?ˆ?˜q C˜˜š˜¨3š˜˜˜˜°3¸#²:°:À#ÈÂ*À*ÐQTÐX[ÒQ[ÐQ[ÐQ[Ð[Ø€Kà•8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€Kà•8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€KØÐr    c                ó$   — t          | ||¦  «        S )úCount flops for self-attention.©r�   )rr   rs   rt   r%   r&   r'   s         r   Ú	sdpa_flopr…     s   € õ ˜;¨	°;Ñ?Ô?Ð?r    c                 óÂ   — ddl m} ddlm} t	          | ||f¦  «        s&|                      ¦   «                              ¦   «         S |g|                      d¦  «        dz
  z  S )zŸ
    If the offsets tensor is fake, then we don't know the actual lengths.
    In that case, we can just assume the worst case; each batch has max length.
    r   )Ú
FakeTensor)ÚFunctionalTensorr   )Útorch._subclasses.fake_tensorr‡   Ú#torch._subclasses.functional_tensorrˆ   r   ÚdiffÚtolistÚsize)ÚoffsetsÚmax_lenr‡   rˆ   s       r   Ú_offsets_to_lengthsr�     sv   € ð
 9Ð8Ð8Ð8Ð8Ð8ØDÐDÐDÐDÐDÐDÝ�g 
Ð,<Ð=Ñ>Ô>ð 'Ø�|Š|‰~Œ~×$Ò$Ñ&Ô&Ð&Øˆ9˜Ÿš Q™œ¨!Ñ+Ñ,Ð,r    )Úgrad_out.c              #   ó  K  — |�Ût          |j        ¦  «        dk    sJ ‚t          |j        ¦  «        dk    sJ ‚|�|j        | j        k    sJ ‚| j        \  }}	}
|j        \  }}}|j        \  }}}|€J ‚|€J ‚|j        |j        k    sJ ‚t          ||¦  «        }t          ||¦  «        }t          ||¦  «        D ]%\  }}d|	||
f}d|||f}d|||f}|�|nd}||||fV — Œ&dS | j        |j        |j        |�|j        ndfV — dS )a;  
    Given inputs to a flash_attention_(forward|backward) kernel, this will handle behavior for
    NestedTensor inputs by effectively unbinding the NestedTensor and yielding the shapes for
    each batch element.

    In the case that this isn't a NestedTensor kernel, then it just yields the original shapes.
    Né   r   ©Úlenr   r�   Úzip)ÚqueryÚkeyÚvaluer‘   Ú	cum_seq_qÚ	cum_seq_kÚmax_qÚmax_kÚ_Úh_qrw   Úh_kÚd_kÚh_vr   Úseq_q_lengthsÚseq_k_lengthsÚ	seq_q_lenÚ	seq_k_lenÚnew_query_shapeÚnew_key_shapeÚnew_value_shapeÚnew_grad_out_shapes                          r   Ú%_unpack_flash_attention_nested_shapesr«     st  è è € ð$ Ðõ �3”9‰~Œ~ Ò"Ð"Ð"Ð"Ý�5”;ÑÔ 1Ò$Ð$Ð$Ð$ØÐ 8¤>°U´[Ò#@Ð#@Ð#@Ð@Ø”k‰ˆˆ3�Ø”i‰ˆˆ3�Ø”k‰ˆˆ3�ØÐ$Ð$Ð$ØÐ$Ð$Ð$ØŒ )¤/Ò1Ð1Ð1Ð1Ý+¨I°uÑ=Ô=ˆÝ+¨I°uÑ=Ô=ˆÝ&)¨-¸Ñ&GÔ&Gð 	Vð 	VÑ"ˆY˜	Ø  # y°#Ð6ˆOØ  Y°Ð4ˆMØ  # y°#Ð6ˆOØ4<Ð4H  ÈdÐØ! =°/ÐCUÐUÐUÐUÐUÐUØˆà
Œ+�s”y %¤+ÀÐAU¨x¬~¨~Ð[_Ð
_Ð_Ð_Ð_Ð_Ð_r    c              #   ó
  K  — |�Þt          |j        ¦  «        dk    sJ ‚t          |j        ¦  «        dk    sJ ‚|�|j        | j        k    sJ ‚| j        \  }}}	}
|j        \  }}}}|j        \  }}}}|€J ‚|€J ‚|j        |j        k    sJ ‚t          ||¦  «        }t          ||¦  «        }t          ||¦  «        D ]%\  }}d|	||
f}d|||f}d|||f}|�|nd}||||fV — Œ&dS | j        |j        |j        |�|j        ndfV — dS )a?  
    Given inputs to a efficient_attention_(forward|backward) kernel, this will handle behavior for
    NestedTensor inputs by effectively unbinding the NestedTensor and yielding the shapes for
    each batch element.

    In the case that this isn't a NestedTensor kernel, then it just yields the original shapes.
    Né   r   r”   )r—   r˜   r™   r‘   Úcu_seqlens_qÚcu_seqlens_kÚmax_seqlen_qÚmax_seqlen_krž   rŸ   rw   r    r¡   r¢   r   Ú	seqlens_qÚ	seqlens_kÚlen_qÚlen_kr§   r¨   r©   rª   s                          r   Ú)_unpack_efficient_attention_nested_shapesr¶   F  s{  è è € ð$ Ðõ �3”9‰~Œ~ Ò"Ð"Ð"Ð"Ý�5”;ÑÔ 1Ò$Ð$Ð$Ð$ØÐ 8¤>°U´[Ò#@Ð#@Ð#@Ð@Øœ‰ˆˆ1ˆc�3Øœ‰ˆˆ1ˆc�3Øœ‰ˆˆ1ˆc�3ØÐ'Ð'Ð'ØÐ'Ð'Ð'ØÔ! \Ô%7Ò7Ð7Ð7Ð7Ý'¨°lÑCÔCˆ	Ý'¨°lÑCÔCˆ	Ý 	¨9Ñ5Ô5ð 	Vð 	V‰LˆE�5Ø  # u¨cÐ2ˆOØ  U¨CÐ0ˆMØ  # u¨cÐ2ˆOØ4<Ð4H  ÈdÐØ! =°/ÐCUÐUÐUÐUÐUÐUØˆà
Œ+�s”y %¤+ÀÐAU¨x¬~¨~Ð[_Ð
_Ð_Ð_Ð_Ð_Ð_r    T)r:   c          	      ó`   — t          | ||||||¬¦  «        }
t          d„ |
D ¦   «         ¦  «        S )rƒ   )r—   r˜   r™   rš   r›   rœ   r�   c              3   óB   K  — | ]\  }}}}t          |||¦  «        V — Œd S r   r„   ©Ú.0rr   rs   rt   rž   s        r   ú	<genexpr>z0_flash_attention_forward_flop.<locals>.<genexpr>�  óJ   è è € ð ð á2ˆK˜ K°õ 	˜ Y°Ñ<Ô<ðð ð ð ð ð r    ©r«   Úsum)r—   r˜   r™   rš   r›   rœ   r�   r%   r&   r'   Úsizess              r   Ú_flash_attention_forward_floprÀ   v  s]   € õ" 2ØØØØØØØðñ ô €Eõ ð ð à6;ðñ ô ñ ô ð r    c           	      ó`   — t          | ||||||¬¦  «        }
t          d„ |
D ¦   «         ¦  «        S )rƒ   )r—   r˜   r™   r®   r¯   r°   r±   c              3   óB   K  — | ]\  }}}}t          |||¦  «        V — Œd S r   r„   r¹   s        r   r»   z4_efficient_attention_forward_flop.<locals>.<genexpr>°  r¼   r    ©r¶   r¾   )r—   r˜   r™   Úbiasr®   r¯   r°   r±   r&   r'   r¿   s              r   Ú!_efficient_attention_forward_floprÅ   –  s]   € õ" 6ØØØØ!Ø!Ø!Ø!ðñ ô €Eõ ð ð à6;ðñ ô ñ ô ð r    c                 ó  — d}|\  }}}}|\  }	}
}}|\  }}}}| \  }}}}||	cxk    r|cxk    r|k    r n n||
cxk    r|cxk    r|k    r	n n||k    sJ ‚||k    r||k    r||k    sJ ‚d}|t          ||z  ||f||z  ||f¦  «        z  }|t          ||z  ||f||z  ||f¦  «        z  }|t          ||z  ||f||z  ||f¦  «        z  }|t          ||z  ||f||z  ||f¦  «        z  }|t          ||z  ||f||z  ||f¦  «        z  }|S )Nr   rR   )ri   rr   rs   rt   r€   rM   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   Ú_b4Ú_h4Ú_s4Ú_d4s                        r   Úsdpa_backward_flop_countrË   ¶  s«  € Ø€KØ �N€A€qˆ#ˆsØ"Ñ€Cˆˆc�3Ø$Ñ€Cˆˆc�3Ø'Ñ€Cˆˆc�3Ø�Ð!Ð!Ò!Ð!�sÐ!Ð!Ò!Ð!˜cÒ!Ð!Ð!Ð!Ð! a¨3Ð&<Ð&<Ò&<Ð&<°#Ð&<Ð&<Ò&<Ð&<¸Ò&<Ð&<Ð&<Ð&<Ð&<ÀÈÂÀÀÐKØ�#Š:ˆ:˜# š*˜*¨°ª¨¨Ð3Ø€Kð •8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€Kð •8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€Kà•8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€Kð •8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€Kà•8˜Q ™U C¨Ð-°°A±°s¸CÐ/@ÑAÔAÑA€KØÐr    c                ó&   — t          | |||¦  «        S )z(Count flops for self-attention backward.©rË   )ri   rr   rs   rt   r%   r&   r'   s          r   Úsdpa_backward_floprÎ   Ñ  s   € õ
 $ N°KÀÈKÑXÔXÐXr    c
           
      ób   — t          |||| ||||	¬¦  «        }t          d„ |D ¦   «         ¦  «        S )N)r—   r˜   r™   r‘   rš   r›   rœ   r�   c              3   óD   K  — | ]\  }}}}t          ||||¦  «        V — Œd S r   rÍ   ©rº   rr   rs   rt   ri   s        r   r»   z1_flash_attention_backward_flop.<locals>.<genexpr>ó  óL   è è € ð ð á?ˆK˜ K°õ 	! °¸iÈÑUÔUðð ð ð ð ð r    r½   )r‘   r—   r˜   r™   ÚoutÚ	logsumexprš   r›   rœ   r�   r&   r'   Úshapess                r   Ú_flash_attention_backward_floprÖ   Ø  s`   € õ" 3ØØØØØØØØð	ñ 	ô 	€Fõ ð ð àCIðñ ô ñ ô ð r    c
           
      ób   — t          |||| ||||	¬¦  «        }t          d„ |D ¦   «         ¦  «        S )N)r—   r˜   r™   r‘   r®   r¯   r°   r±   c              3   óD   K  — | ]\  }}}}t          ||||¦  «        V — Œd S r   rÍ   rÑ   s        r   r»   z5_efficient_attention_backward_flop.<locals>.<genexpr>  rÒ   r    rÃ   )r‘   r—   r˜   r™   rÄ   rÓ   r®   r¯   r°   r±   r&   r'   rÕ   s                r   Ú"_efficient_attention_backward_floprÙ   ù  s`   € õ" 7ØØØØØ!Ø!Ø!Ø!ð	ñ 	ô 	€Fõ ð ð àCIðñ ô ñ ô ð r    c                 ó6   — t          | t          ¦  «        s| fS | S r   )r   Útuple)Úxs    r   Únormalize_tuplerÝ   .  s    € Ý�a�ÑÔð ØˆtˆØ€Hr    )Ú ÚKÚMÚBÚTc                 óÂ   — t          dt          t          t          ¦  «        dz
  t          t	          | ¦  «        ¦  «        dz
  dz  ¦  «        ¦  «        }t          |         S )Nr   r   r@   r“   )ÚmaxÚminr•   ÚsuffixesÚstr)ÚnumberÚindexs     r   Úget_suffix_strrê   7  sJ   € õ �•3•s�8‘}”} qÑ(­3­s°6©{¬{Ñ+;Ô+;¸aÑ+?ÀAÑ*EÑFÔFÑGÔG€EÝ�EŒ?Ðr    c                 ój   — t                                |¦  «        }| d|z  z  d›}|t           |         z   S )Niè  z.3f)ræ   ré   )rè   Úsuffixré   r™   s       r   Úconvert_num_with_suffixrí   >  s6   € Ý�NŠN˜6Ñ"Ô"€Eà˜ ™Ñ%Ð+Ð+€Eà•8˜E”?Ñ"Ð"r    c                 ó    — |dk    rdS | |z  d›S )Nr   ú0%z.2%r=   )ÚnumÚdenoms     r   Úconvert_to_percent_strrò   E  s    € Ø�‚z€zØˆtØ�E‰kÐÐÐr    c                 ó<   ‡ — t          ‰ ¦  «        ˆ fd„¦   «         }|S )Nc                 óR   •— t          | ¦  «        \  }} ‰|Ž }t          ||¦  «        S r   )r   r   )r&   Ú	flat_argsÚspecrÓ   r(   s       €r   r)   z)_pytreeify_preserve_structure.<locals>.nfK  s/   ø€ å& tÑ,Ô,‰ˆ	�4Øˆa�ˆmˆÝ˜c 4Ñ(Ô(Ð(r    r   r*   s   ` r   Ú_pytreeify_preserve_structurer÷   J  s3   ø€ Ý
ˆ1�X„Xð)ð )ð )ð )ñ „Xð)ð
 €Ir    c                   óü   ‡ — e Zd ZdZ	 	 	 	 ddeeej        j        e	ej        j                 f                  de
dedeeeef                  fˆ fd	„Zd
e
fd„Zd
eeeee
f         f         fd„Zdd„Zd„ Zd„ Zd„ Zˆ xZS )r   aþ  
    ``FlopCounterMode`` is a context manager that counts the number of flops within its context.

    It does this using a ``TorchDispatchMode``.

    It also supports hierarchical output by passing a module (or list of
    modules) to FlopCounterMode on construction. If you do not need hierarchical
    output, you do not need to use it with a module.

    Example usage

    .. code-block:: python

        mod = ...
        with FlopCounterMode(mod) as flop_counter:
            mod.sum().backward()

    Nr@   TÚmodsÚdepthÚdisplayÚcustom_mappingc                 óR  •— t          ¦   «                              ¦   «          t          d„ ¦  «        | _        || _        || _        d | _        |€i }|�t          j        dd¬¦  «         i t          ¥d„ | 
                    ¦   «         D ¦   «         ¥| _	        t          ¦   «         | _        d S )Nc                  ó*   — t          t          ¦  «        S r   )r   Úintr=   r    r   ú<lambda>z*FlopCounterMode.__init__.<locals>.<lambda>o  s   € Í+ÕVYÑJZÔJZ€ r    z<mods argument is not needed anymore, you can stop passing itr@   )Ú
stacklevelc                 óZ   — i | ](\  }}|t          |d d¦  «        r|nt          |¦  «        “Œ)S )Ú_get_rawF)Úgetattrr+   ©rº   rD   Úvs      r   ú
<dictcomp>z,FlopCounterMode.__init__.<locals>.<dictcomp>y  s<   € ÐnÐnÐnÉtÈqÐRSˆq•w˜q *¨eÑ4Ô4ÐJ�!�!½-ÈÑ:JÔ:JÐnÐnÐnr    )ÚsuperÚ__init__r   Úflop_countsrú   rû   ÚmodeÚwarningsÚwarnr!   Úitemsr   Úmod_tracker)Úselfrù   rú   rû   rü   Ú	__class__s        €r   r	  zFlopCounterMode.__init__h  sµ   ø€ õ 	‰Œ×ÒÑÔÐÝ6AÐBZÐBZÑ6[Ô6[ˆÔØˆŒ
ØˆŒØ04ˆŒ	ØÐ!ØˆNØÐÝŒMÐXÐefÐgÑgÔgÐgð
Ýð
ànÐnÐWe×WkÒWkÑWmÔWmÐnÑnÔnð
ˆÔõ )™?œ?ˆÔÐÐr    r>   c                 óZ   — t          | j        d                              ¦   «         ¦  «        S )NÚGlobal)r¾   r
  Úvalues©r  s    r   Úget_total_flopszFlopCounterMode.get_total_flops}  s$   € Ý�4Ô# HÔ-×4Ò4Ñ6Ô6Ñ7Ô7Ð7r    c                 óH   — d„ | j                              ¦   «         D ¦   «         S )a  Return the flop counts as a dictionary of dictionaries.

        The outer
        dictionary is keyed by module name, and the inner dictionary is keyed by
        operation name.

        Returns:
            Dict[str, Dict[Any, int]]: The flop counts as a dictionary.
        c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r=   )Údictr  s      r   r  z3FlopCounterMode.get_flop_counts.<locals>.<dictcomp>Š  s$   € Ð@Ð@Ð@™t˜q !�•4˜‘7”7Ð@Ð@Ð@r    )r
  r  r  s    r   Úget_flop_countszFlopCounterMode.get_flop_counts€  s(   € ð AÐ@ tÔ'7×'=Ò'=Ñ'?Ô'?Ð@Ñ@Ô@Ð@r    c                 ó@  ‡ ‡
‡‡— |€‰ j         }|€d}dd l}d|_        g d¢}g }‰                      ¦   «         Š
t	          ‰
¦  «        ŠdŠˆ
ˆˆˆ fd„}t          ‰ j                             ¦   «         ¦  «        D ]L}|dk    rŒ	|                     d¦  «        d	z   }||k    rŒ( |||d	z
  ¦  «        }| 	                    |¦  «         ŒMd‰ j        v r$‰s"|D ]}	d
|	d         z   |	d<   Œ |dd¦  «        |z   }t          |¦  «        dk    rg d¢g}|                     ||d¬¦  «        S )Ni?B r   T)ÚModuleÚFLOPz% TotalFc           	      óÆ  •— t          ‰
j        |                               ¦   «         ¦  «        }‰	|‰k    z  Š	d|z  }g }|                     || z   t	          |‰¦  «        t          |‰¦  «        g¦  «         ‰
j        |                               ¦   «         D ]L\  }}|                     |dz   t          |¦  «        z   t	          |‰¦  «        t          |‰¦  «        g¦  «         ŒM|S )Nú z - )r¾   r
  r  Úappendrí   rò   r  rç   )Úmod_namerú   r€   Úpaddingr  rD   r  Úglobal_flopsÚglobal_suffixÚis_global_subsumedr  s          €€€€r   Úprocess_modz.FlopCounterMode.get_table.<locals>.process_modš  sý   ø€ õ ˜dÔ.¨xÔ8×?Ò?ÑAÔAÑBÔBˆKà +°Ò"=Ñ=Ðà˜E‘kˆGØˆFØ�MŠMØ˜(Ñ"Ý'¨°]ÑCÔCÝ& {°LÑAÔAðñ ô ð ð
 Ô(¨Ô2×8Ò8Ñ:Ô:ð ð ‘��1Ø—’Ø˜e‘O¥c¨!¡f¤fÑ,Ý+¨A¨}Ñ=Ô=Ý*¨1¨lÑ;Ô;ðñ ô ð ð ð
 ˆMr    r  ú.r   r  )r  Ú0rï   )ÚleftÚrightr*  )ÚheadersÚcolalign)rú   ÚtabulateÚPRESERVE_WHITESPACEr  rê   Úsortedr
  ÚkeysÚcountÚextendr•   )r  rú   r-  Úheaderr  r&  ÚmodÚ	mod_depthÚ
cur_valuesr™   r#  r$  r%  s   `         @@@r   Ú	get_tablezFlopCounterMode.get_tableŒ  s’  øøøø€ Øˆ=Ø”JˆEØˆ=ØˆEàˆˆˆØ'+ˆÔ$Ø.Ð.Ð.ˆØˆØ×+Ò+Ñ-Ô-ˆÝ& |Ñ4Ô4ˆØ"Ðð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	õ, ˜$Ô*×/Ò/Ñ1Ô1Ñ2Ô2ð 	&ð 	&ˆCØ�hŠˆØØŸ	š	 #™œ¨Ñ*ˆIØ˜5Ò Ð Øà$˜ S¨)°a©-Ñ8Ô8ˆJØ�MŠM˜*Ñ%Ô%Ð%Ð%ð
 �tÔ'Ð'Ð'Ð0BÐ'Øð *ð *�Ø  q¤™>��a‘�à �[ ¨1Ñ-Ô-°Ñ6ˆFåˆv‰;Œ;˜!ÒÐØ+Ð+Ð+Ð,ˆFà× Ò  °ÐB\Ð Ñ]Ô]Ð]r    c                 óÄ   — | j                              ¦   «          | j                             ¦   «          t	          | ¦  «        | _        | j                             ¦   «          | S r   )r
  Úclearr  Ú	__enter__Ú_FlopCounterModer  r  s    r   r:  zFlopCounterMode.__enter__É  sT   € ØÔ×ÒÑ Ô Ð ØÔ×"Ò"Ñ$Ô$Ð$Ý$ TÑ*Ô*ˆŒ	ØŒ	×ÒÑÔÐØˆr    c                 óÒ   — | j         €J ‚ | j         j        |Ž }d | _         | j                             ¦   «          | j        r't	          |                      | j        ¦  «        ¦  «         |S r   )r  Ú__exit__r  rû   Úprintr7  rú   )r  r&   rM   s      r   r=  zFlopCounterMode.__exit__Ð  sh   € ØŒyÐ$Ð$Ð$ØˆDŒIÔ Ð%ˆØˆŒ	ØÔ×!Ò!Ñ#Ô#Ð#ØŒ<ð 	.Ý�$—.’. ¤Ñ,Ô,Ñ-Ô-Ð-Øˆr    c                 ó¸   — || j         v rP| j         |         } ||i |¤d|i¤Ž}t          | j        j        ¦  «        D ]}| j        |         |xx         |z  cc<   Œ|S )Nr#   )r!   Úsetr  Úparentsr
  )r  Úfunc_packetrÓ   r&   r'   Úflop_count_funcrm   Úpars           r   Ú_count_flopszFlopCounterMode._count_flopsÙ  s‡   € Ø˜$Ô,Ð,Ð,Ø"Ô0°Ô=ˆOØ(˜¨$ÐF°&ÐFÐFÀ#ÐFÐFÐFˆJÝ˜4Ô+Ô3Ñ4Ô4ð Að A�ØÔ  Ô% kÐ2Ð2Ô2°jÑ@Ð2Ð2Ñ2Ð2àˆ
r    )Nr@   TNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Únnr  r   rÿ   Úboolr
   r	   r	  r  rç   r  r7  r:  r=  rE  Ú__classcell__)r  s   @r   r   r   T  s>  ø€ € € € € ðð ð* MQØØ Ø7;ð+ð +à˜5 ¤¤°$°u´x´Ô2GÐ!GÔHÔIð+ð ð+ð ð	+ð
 % T¨#¨s¨(¤^Ô4ð+ð +ð +ð +ð +ð +ð*8 ð 8ð 8ð 8ð 8ð
A  c¨4°°S°¬>Ð&9Ô!:ð 
Að 
Að 
Að 
Að:^ð :^ð :^ð :^ðzð ð ðð ð ðð ð ð ð ð ð r    c                   ó"   — e Zd Zdefd„Zdd„ZdS )r;  Úcounterc                 ó   — || _         d S r   )rN  )r  rN  s     r   r	  z_FlopCounterMode.__init__ä  s   € ØˆŒˆˆr    r=   Nc                 ó$  — |r|ni }|t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j	        j        t           j        j        j
        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        t           j        j        j        j        hv rt&          S || j        j        vr\|t           j        j        j        j        ur?| 5   |j        |i |¤Ž}|t&          ur|cd d d ¦  «         S 	 d d d ¦  «         n# 1 swxY w Y    ||i |¤Ž}| j                             |j        |||¦  «        S r   )r   ÚopsÚatenÚis_contiguousÚdefaultÚmemory_formatÚis_strides_like_formatÚis_non_overlapping_and_denser�   Úsym_sizeÚstrideÚ
sym_strideÚstorage_offsetÚsym_storage_offsetÚnumelÚ	sym_numelÚdimÚprimÚlayoutÚNotImplementedrN  r!   ÚdeviceÚ	decomposerE  Ú_overloadpacket)r  ÚfuncÚtypesr&   r'   ÚrrÓ   s          r   Ú__torch_dispatch__z#_FlopCounterMode.__torch_dispatch__ç  sæ  € Ø!Ð)�� rˆð •E”I”NÔ0Ô8Ý”I”NÔ0Ô>Ý”I”NÔ9ÔAÝ”I”NÔ?ÔGÝ”I”NÔ'Ô/Ý”I”NÔ+Ô3Ý”I”NÔ)Ô1Ý”I”NÔ-Ô5Ý”I”NÔ1Ô9Ý”I”NÔ5Ô=Ý”I”NÔ(Ô0Ý”I”NÔ,Ô4Ý”I”NÔ&Ô.Ý”I”NÔ)Ô1ð3ð 3ð 3õ "Ð!ð �t”|Ô1Ð1Ð1°dÅ%Ä)Ä.ÔBWÔB_Ð6_Ð6_Øð ð Ø"�D”N DÐ3¨FÐ3Ð3�Ø�NÐ*Ð*Øðð ð ð ñ ô ð ð à*ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ˆd�DÐ#˜FÐ#Ð#ˆØŒ|×(Ò(¨Ô)=¸sÀDÈ&ÑQÔQÐQs   Æ+GÇG!Ç$G!)r=   N)rF  rG  rH  r   r	  ri  r=   r    r   r;  r;  ã  sI   € € € € € ð ð ð ð ð ðRð Rð Rð Rð Rð Rr    r;  )Fr   )Mr   Útorch.utils._pytreer   r   r   Úmodule_trackerr   Útypingr   r	   r
   r   r   r   r   Úcollectionsr   Útorch.utils._python_dispatchr   Úmathr   Ú	functoolsr   r  Ú__all__rQ  rR  r   r!   Ú__annotations__r+   r   Úmmrÿ   rG   ÚaddmmrK   ÚbmmrP   ÚbaddbmmrS   rK  r]   ÚconvolutionÚ_convolutionrd   Úconvolution_backwardrp   r�   Ú'_scaled_dot_product_efficient_attentionÚ#_scaled_dot_product_flash_attentionÚ#_scaled_dot_product_cudnn_attentionr…   r�   r«   r¶   Ú_flash_attention_forwardrÀ   Ú_efficient_attention_forwardrÅ   rË   Ú0_scaled_dot_product_efficient_attention_backwardÚ,_scaled_dot_product_flash_attention_backwardÚ,_scaled_dot_product_cudnn_attention_backwardrÎ   Ú_flash_attention_backwardrÖ   Ú_efficient_attention_backwardrÙ   rÝ   ræ   rê   rí   rò   r÷   r   r;  r=   r    r   ú<module>r„     sÈ  ðð €€€€Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ )Ð )Ð )Ð )Ð )Ð )Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ #Ð #Ð #Ð #Ð #Ð #Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€ð Ð5Ð
6€à„y„~€ðð ð ð
 !#€ˆt�C˜�HŒ~Ð "Ð "Ñ "ðð ð ðð ð ð ð, Ð�t”wÑÔØ/3ð ð ð À#ð ð ð ñ  Ôðð Ð�t”zÑ"Ô"ð%ð %È#ð %ð %ð %ñ #Ô"ð%ð Ð�t”xÑ Ô ð
ð 
¸Cð 
ð 
ð 
ñ !Ô ð
ð Ð�t”|Ñ$Ô$ð&ð &ÈCð &ð &ð &ñ %Ô$ð&ð ð	%ð %Ø�#ŒYð%à�#ŒYð%ð �CŒyð%ð ð	%ð
 	ð%ð %ð %ð %ðN Ð˜Ô(¨$Ô*;Ð<Ñ=Ô=Øbfð Oð Oð OÐuxð Oð Oð Oñ >Ô=ðOð
 Ð�tÔ0Ñ1Ô1ðeð ðeð eð eñ 2Ô1ðeðNð ð ð$ Ð˜ÔDØÔ@ØÔ@ðBñ Cô Cð EIð @ð @ð @ÐWZð @ð @ð @ñCô Cð@ð	-ð 	-ð 	-ð" ð+`ð +`ð +`ð ˆe�E˜#˜s˜(”O U¨3°¨8¤_°e¸CÀ¸H´oÀxÐPUÐVYÐ[^ÐV^ÔP_ÔG`Ð`ÔaÔbð+`ð +`ð +`ð +`ðf ð-`ð -`ð -`ð ˆe�E˜#˜s˜(”O U¨3°¨8¤_°e¸CÀ¸H´oÀxÐPUÐVYÐ[^ÐV^ÔP_ÔG`Ð`ÔaÔbð-`ð -`ð -`ð -`ð` Ð�tÔ4¸dÐCÑCÔCð ðð ð ð 	ðð ð ñ DÔCðð> Ð�tÔ8À$ÐGÑGÔGðð 	ðð ð ñ HÔGðð>ð ð ð6 Ð˜ÔMØÔIØÔIðKñ Lô Lð ^bð Yð Yð YÐpsð Yð Yð YñLô LðYð Ð�tÔ5¸tÐDÑDÔDðð 	ðð ð ñ EÔDðð@ Ð�tÔ9À4ÐHÑHÔHðð 	ðð ð ñ IÔHðð@Ø„GˆWðà„J�
ðð 	„Hˆhðð 	„L�,ð	ð
 	Ô�iðð 	Ô�yðð 	ÔÐ1ðð 	Ô0°)ðð 	Ô,¨iðð 	Ô,¨iðð 	Ô9Ð;Mðð 	Ô5Ð7Iðð 	Ô5Ð7Iðð 	Ô!Ð#@ðð 	Ô%Ð'Hðð  	Ô"Ð$Bð!ð" 	Ô&Ð(Jð#€ð(ð ð ð $Ð#Ð#€ðð ð ð#ð #ð #ð ð  ð  ð
ð ð ðLð Lð Lð Lð Lñ Lô Lð Lð^"Rð "Rð "Rð "Rð "RÐ(ñ "Rô "Rð "Rð "Rð "Rr    