§
    Ó˜ºhgp  ã                   ó€  — 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 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 d dlZddgZ ed¦  «        Z ed¦  «        Ze j        j        Zd„ Zi Z e!eef         e"d<   d„ Z#d;deeeef         geeef         f         fd„Z$ e$ej%        ¦  «        ddœde&fd„¦   «         Z' e$ej(        ¦  «        d<de&fd„¦   «         Z) e$ej*        ¦  «        d<de&fd„¦   «         Z+ e$ej,        ¦  «        d<de&fd„¦   «         Z- e$ej.        ¦  «        	 	 	 	 	 d=de&fd„¦   «         Z/	 d;de0e&         de0e&         de0e&         de1de&f
d „Z2 e$ej3        ej4        g¦  «        ddœde&fd!„¦   «         Z5 e$ej6        ¦  «        de&fd"„¦   «         Z7d#„ Z8 e$ej9        ej:        ej;        g¦  «        ddœde&fd$„¦   «         Z<d%„ Z=dd&œdee>e>e&d'f         e>e&d'f         e>e&d'f         e	e>e&d'f                  f                  fd(„Z?dd&œdee>e>e&d'f         e>e&d'f         e>e&d'f         e	e>e&d'f                  f                  fd)„Z@ e$ejA        d*¬+¦  «        ddœde&fd,„¦   «         ZB e$ejC        d*¬+¦  «        de&fd-„¦   «         ZDd.„ ZE e$ejF        ejG        ejH        g¦  «        ddœde&fd/„¦   «         ZI e$ejJ        d*¬+¦  «        de&fd0„¦   «         ZK e$ejL        d*¬+¦  «        de&fd1„¦   «         ZMi ej%        e'“ej(        e)“ej*        e+“ej,        e-“ej.        e/“ej3        e5“ej4        e5“ej6        e7“ej9        e<“ej:        e<“ej;        e<“ejF        eI“ejG        eI“ejH        eI“ejA        eB“ejC        eD“ejJ        eK“ejL        eMi¥Z d2„ ZNg d3¢ZOd4„ ZPd5„ ZQd6„ ZRd7„ ZS G d8„ d¦  «        ZT G d9„ d:e¦  «        ZUdS )>é    N)Útree_mapÚtree_flattenÚtree_unflattené   )ÚModuleTracker)ÚAnyÚOptionalÚUnionÚTypeVarÚCallable)ÚIterator)Ú	ParamSpec)Údefaultdict)ÚTorchDispatchMode©Úprod©ÚwrapsÚFlopCounterModeÚregister_flop_formulaÚ_TÚ_Pc                 óH   — t          | t          j        ¦  «        r| j        S | S ©N)Ú
isinstanceÚtorchÚTensorÚshape)Úis    ú`/var/www/html/services/rag-service/venv/lib/python3.11/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"   FÚreturnc                 ó|   ‡ ‡— dt           t          t          f         dt           t          t          f         fˆˆ fd„}|S )NÚflop_formular.   c                 ó€   •‡ — ‰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)Útargetr0   s    €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_)r0   r9   Ú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   )r>   r=   r?   s   `` r    r   r   #   sO   øø€ ð¥8­Bµ¨FÔ#3ð ½ÅÅRÀÔ8Hð ð ð ð ð ð ð ð& Ðr"   )r'   c                ó<   — | \  }}|\  }}||k    sJ ‚||z  dz  |z  S )zCount flops for matmul.é   © )	Úa_shapeÚb_shaper'   r(   r)   ÚmÚkÚk2Úns	            r    Úmm_floprI   9   s5   € ð
 �D€A€qØ�E€BˆØ�Š7ˆ7ˆ7ˆ7àˆq‰5�1‰9�q‰=Ðr"   c                 ó"   — t          ||¦  «        S )zCount flops for addmm.©rI   ©Ú
self_shaperC   rD   r'   r)   s        r    Ú
addmm_floprN   D   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.rA   rB   )rC   rD   r'   r)   ÚbrE   rF   Úb2rG   rH   Úflops              r    Úbmm_floprS   I   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.©rS   rL   s        r    Úbaddbmm_floprV   V   s   € õ
 �G˜WÑ%Ô%Ð%r"   c	                 ó"   — t          | |¦  «        S )zCount flops for _scaled_mm.rK   )
rC   rD   Úscale_a_shapeÚscale_b_shapeÚ
bias_shapeÚscale_result_shapeÚ	out_dtypeÚuse_fast_accumr'   r)   s
             r    Ú_scaled_mm_flopr^   ]   s   € õ �7˜GÑ$Ô$Ð$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   rA   Nr   )
r_   r`   r'   ra   Ú
batch_sizeÚ
conv_shapeÚc_outÚc_inÚfilter_sizerR   s
             r    Úconv_flop_countrh   n   sj   € ð* ˜”€JØ'Ð6�'�'¨Y¸¸¸Ô;€JØ 'Ð€Eˆ4�+ðõ �
ÑÔ�d ;Ñ/Ô/Ñ/°*Ñ<¸uÑDÀtÑKÈaÑO€DØ€Kr"   c                ó(   — t          | |||¬¦  «        S )zCount flops for convolution.©ra   )rh   )
r_   r`   Ú_biasÚ_strideÚ_paddingÚ	_dilationra   r'   r(   r)   s
             r    Ú	conv_flopro   •   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   rA   )Úlist)r   s    r    Útzconv_backward_flop.<locals>.tª   s(   € Ø�a”˜% œ(Ð#¥d¨5°°°¬9¡o¤oÑ5Ð5r"   r   r   Frj   )r!   rh   )Úgrad_out_shaper_   r`   rk   rl   rm   rn   ra   Ú_output_paddingÚ_groupsÚoutput_maskr'   rs   Ú
flop_countÚgrad_input_shapeÚgrad_weight_shapes                   r    Úconv_backward_flopr{   ›   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   rU   )Úquery_shapeÚ	key_shapeÚvalue_shaperP   Ú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[Ð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Œ   )r}   r~   r   r'   r(   r)   s         r    Ú	sdpa_flopr�     s   € õ ˜;¨	°;Ñ?Ô?Ð?r"   c                 óâ   — ddl m} ddlm} t	          | ||f¦  «        s6| j        j        dk    r&|                      ¦   «                              ¦   «         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)ÚFunctionalTensorÚmetar   )
Útorch._subclasses.fake_tensorr’   Ú#torch._subclasses.functional_tensorr“   r   Údevicer6   ÚdiffÚtolistÚsize)ÚoffsetsÚmax_lenr’   r“   s       r    Ú_offsets_to_lengthsr�     s†   € ð
 9Ð8Ð8Ð8Ð8Ð8ØDÐDÐDÐDÐDÐDÝ�g 
Ð,<Ð=Ñ>Ô>ð 'À7Ä>ÔCVÐZ`ÒC`ÐC`Ø�|Š|‰~Œ~×$Ò$Ñ&Ô&Ð&Øˆ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_qr‚   Ú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¬   r‚   r­   r®   r¯   rŠ   Ú	seqlens_qÚ	seqlens_kÚlen_qÚlen_kr´   rµ   r¶   r·   s                          r    Ú)_unpack_efficient_attention_nested_shapesrÃ   X  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�   ©Ú.0r}   r~   r   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Í   ˆ  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   rU   )rt   r}   r~   r   r‹   rP   r€   r�   r‚   rƒ   r„   r…   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ð •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Ø   )rt   r}   r~   r   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Ç   r}   r~   r   rt   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ê   A  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   rA   r    )ÚmaxÚminr¢   ÚsuffixesÚstr)ÚnumberÚindexs     r    Úget_suffix_strr÷   J  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ú   Q  s6   € Ý�NŠN˜6Ñ"Ô"€Eà˜ ™Ñ%Ð+Ð+€Eà•8˜E”?Ñ"Ð"r"   c                 ó    — |dk    rdS | |z  d›S )Nr   ú0%z.2%rB   )ÚnumÚdenoms     r    Úconvert_to_percent_strrÿ   X  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>.nf^  s/   ø€ å& tÑ,Ô,‰ˆ	�4Øˆa�ˆmˆÝ˜c 4Ñ(Ô(Ð(r"   r   r,   s   ` r    Ú_pytreeify_preserve_structurer  ]  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()

    NrA   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   ÚintrB   r"   r    ú<lambda>z*FlopCounterMode.__init__.<locals>.<lambda>‚  s   € Í+ÕVYÑJZÔJZ€ r"   z<mods argument is not needed anymore, you can stop passing itrA   )Ú
stacklevelc                 óZ   — i | ](\  }}|t          |d d¦  «        r|nt          |¦  «        “Œ)S )Ú_get_rawF)Úgetattrr-   ©rÇ   rF   Úvs      r    ú
<dictcomp>z,FlopCounterMode.__init__.<locals>.<dictcomp>Œ  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__{  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 rB   )Ú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!  rF   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Úrightr7  )ÚheadersÚcolalign)r  ÚtabulateÚPRESERVE_WHITESPACEr#  r÷   Úsortedr  ÚkeysÚcountÚextendr¢   )r  r  r:  Úheaderr!  r3  ÚmodÚ	mod_depthÚ
cur_valuesr¦   r0  r1  r2  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    rG  zFlopCounterMode.__enter__Ü  sT   € ØÔ×ÒÑ Ô Ð ØÔ×"Ò"Ñ$Ô$Ð$Ý$ TÑ*Ô*ˆŒ	ØŒ	×ÒÑÔÐØˆr"   c                 óÒ   — | j         €J ‚ | j         j        |Ž }d | _         | j                             ¦   «          | j        r't	          |                      | j        ¦  «        ¦  «         |S r   )r  Ú__exit__r  r  ÚprintrD  r  )r  r(   rP   s      r    rJ  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_funcrx   Ú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"   )NrA   TNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r
   r   Únnr)  rr   r  Úboolr&  r   r  r#  rô   r'  rD  rG  rJ  rR  Ú__classcell__)r  s   @r    r   r   g  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 )rH  Úcounterc                 ó   — || _         d S r   )r[  )r  r[  s     r    r  z_FlopCounterMode.__init__÷  s   € ØˆŒˆˆr"   rB   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ÚNotImplementedr[  r#   r—   Ú	decomposerR  Ú_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!)rB   N)rS  rT  rU  r   r  ru  rB   r"   r    rH  rH  ö  sI   € € € € € ð ð ð ð ð ðRð Rð Rð Rð Rð Rr"   rH  )Fr   )NNNFN)Vr   Útorch.utils._pytreer   r   r   Úmodule_trackerr   Útypingr   r	   r
   r   r   Úcollections.abcr   Útyping_extensionsr   Úcollectionsr   Útorch.utils._python_dispatchr   Úmathr   Ú	functoolsr   r  Ú__all__r   r   r^  r_  r!   r#   r&  Ú__annotations__r-   r   Úmmr  rI   ÚaddmmrN   ÚbmmrS   ÚbaddbmmrV   Ú
_scaled_mmr^   rr   rX  rh   ÚconvolutionÚ_convolutionro   Úconvolution_backwardr{   rŒ   Ú'_scaled_dot_product_efficient_attentionÚ#_scaled_dot_product_flash_attentionÚ#_scaled_dot_product_cudnn_attentionr�   r�   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   rH  rB   r"   r    ú<module>r“     s†  ðà €€€€Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ )Ð )Ð )Ð )Ð )Ð )Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø $Ð $Ð $Ð $Ð $Ð $Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø #Ð #Ð #Ð #Ð #Ð #Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€àÐ5Ð
6€à€WˆT�]„]€Ø€Yˆt�_„_€à„y„~€ðð ð ð
 !#€ˆt�C˜�HŒ~Ð "Ð "Ñ "ðð ð ðð °X¸xÈÈBÈÔ?OÐ>PÐRZÐ[]Ð_aÐ[aÔRbÐ>bÔ5cð ð ð ð ð, Ð�t”wÑÔØ/3ð ð ð À#ð ð ð ñ  Ôðð Ð�t”zÑ"Ô"ð%ð %È#ð %ð %ð %ñ #Ô"ð%ð Ð�t”xÑ Ô ð
ð 
¸Cð 
ð 
ð 
ñ !Ô ð
ð Ð�t”|Ñ$Ô$ð&ð &ÈCð &ð &ð &ñ %Ô$ð&ð Ð�t”Ñ'Ô'ð ØØØØð%ð %ð 	ð%ð %ð %ñ (Ô'ð%ð( ð	%ð %Ø�#Œ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�,ð	ð
 	„O�_ðð 	Ô�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"   