Ë
    S²jA9  ã            
      óä  — U d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZ dd	lmZ e
rdd
lmZ ddlZddlmZ dgZdaded<   e G d„ d«      «       Zed)d„«       Z	 d*	 	 	 d+d„Zed,d„«       Zd-d„Z	 d.	 	 	 	 	 	 	 	 	 d/d„Z	 	 d0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d1d„Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d2d„Zd3d„Z  ed«      Z!d4d„Z"	 	 	 d5	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6d„Z#	 d7	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d8d„Z$ddddddddddœ		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9d„Z%dddddddd œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d:d!„Z&dddd"œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d;d#„Z'	 	 	 d<dd$œ	 	 	 	 	 	 	 	 	 	 	 	 	 d=d%„Z(dd$œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d>d&„Z) ejT                  d'e¬(«       y)?zUBER PROTOTYPE!!!é    )ÚannotationsN)Ú	dataclass)Úcache)ÚAnyÚTYPE_CHECKING)ÚTypeVarTupleÚUnpacké   )Ú	_registry)Ú
ModuleType)ÚLibraryÚregister_flash_attention_fa4ú
str | NoneÚ_FA4_MODULE_PATHc                  ó    — e Zd ZU ded<   dd„Zy)Ú
_FA4HandlezLibrary | NoneÚlibraryc                ó   — d | _         y ©N)r   )Úselfs    úV/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/nn/attention/_fa4.pyÚremovez_FA4Handle.remove"   s	   € Øˆ�ó    N)ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © r   r   r   r      s   … àÓôr   r   c                óJ   — t         j                  j                  | «      \  }}|S r   )ÚtorchÚcudaÚget_device_capability)ÚdeviceÚmajorÚ_s      r   Ú_get_device_majorr(   &   s   € ä�z‰z×/Ñ/°Ó7�H€Eˆ1Ø€Lr   c                óB   — t        | «      }| at        t        «       «      S )z™
    Register FA4 flash attention kernels with the PyTorch dispatcher.

    Args:
        module_path: Python module path to the FA4 implementation.
    )Ú_fa4_import_moduler   r   Ú_fa4_register_kernels)Úmodule_pathr'   s     r   r   r   ,   s#   € ô 	˜;Ó'€AØ"ÐÜÔ+Ó-Ó.Ð.r   c                ó~   — t        j                  | «      }t        |d«      rt        |d«      st        d| › d�«      ‚|S )NÚ_flash_attn_fwdÚ_flash_attn_bwdzModule 'z' does not expose FA4 kernels)Ú	importlibÚimport_moduleÚhasattrÚRuntimeError)r,   Úmodules     r   r*   r*   ;   sA   € ä×$Ñ$ [Ó1€FÜ�6Ð,Ô-´W¸VÐEVÔ5WÜ˜X k ]Ð2OÐPÓQÐQØ€Mr   c                 ó  — t        ddd«      } | j                  dt        d«       | j                  dt        d«       | j                  dt        d«       | j                  dt
        d«       | j                  dt        d«       | S )	NÚatenÚIMPLÚCUDAÚ_flash_attention_forwardÚ+_flash_attention_forward_no_dropout_inplaceÚ_flash_attention_backwardÚ#_scaled_dot_product_flash_attentionÚ,_scaled_dot_product_flash_attention_backward)r   ÚimplÚ!_fa4_flash_attention_forward_implÚ4_fa4_flash_attention_forward_no_dropout_inplace_implÚ"_fa4_flash_attention_backward_implÚ4_fa4_scaled_dot_product_flash_attention_forward_implÚ5_fa4_scaled_dot_product_flash_attention_backward_impl)Úlibs    r   r+   r+   C   s~   € Ü
�&˜& &Ó
)€CØ‡H�HÐ'Ô)JÈFÔSØ‡H�HØ5Ü<Øôð
 ‡H�HÐ(Ô*LÈfÔUØ‡H�HØ-Ü<Øôð
 ‡H�HØ6Ü=Øôð
 €Jr   c                óþ  — t        d„ |D «       «      syt        |D �ch c]  }|j                  ’Œ c}«      dk7  ry| j                  t        j
                  t        j                  fvry|D ])  \  }}|j                  t        j                  k7  sŒ$|› d�c S  |€| j                  «       dk7  ry|�| j                  «       d	k7  ry
t        j                  j                  «       syt        | j                  «      dvryy c c}w )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr   )Úis_cuda©Ú.0Úts     r   ú	<genexpr>z,_fa4_common_support_error.<locals>.<genexpr>_   s   è ø€ Ò*˜Qˆq�y�yÑ*ùs   ‚zinputs must be CUDA tensorsr
   úinputs must share devicez'query dtype must be float16 or bfloat16z dtype must be float32é   zdense query must be 4Dé   zragged query must be 3DzCUDA not available)é	   é
   z+FA4 requires compute capability 9.0 or 10.0)ÚallÚlenr%   Údtyper"   Úfloat16Úbfloat16Úfloat32Údimr#   Úis_availabler(   )ÚqueryÚtensorsÚ	cum_seq_qÚrequire_fp32rJ   ÚnameÚtensors          r   Ú_fa4_common_support_errorr_   Y   sÞ   € ô Ñ* 'Ô*Ô*Ø,Ü
˜gÖ&˜ˆA�H‹HÒ&Ó'¨1Ò,Ø)Ø‡{�{œ5Ÿ=™=¬%¯.©.Ð9Ñ9Ø8Ø$ò 3‰ˆˆfØ�<‰<œ5Ÿ=™=Ó(Ø�VÐ1Ð2Ò2ð3ð Ð˜UŸY™Y›[¨AÒ-Ø'ØÐ §¡£°Ò!1Ø(Ü�:‰:×"Ñ"Ô$Ø#Ü˜Ÿ™Ó&¨gÑ5Ø<Øùò 's   �C:c
                ó  — |dk7  ry|ry|�y|�+|j                   t        j                  k7  ry|j                  syt	        | j
                  «      }
|�|
dk7  rd|
› d	�S |	�|	d
kD  r|
dk7  rd|
› d	�S t        | | ||f|«      }|�|dk(  ry|S y )Nç        údropout_p must be 0zreturn_debug_mask must be Falsezalibi_slopes not supportedzseqused_k must be int32zseqused_k must be CUDArP   z+paged KV (block_table) not supported on SM Ú0r
   z-SplitKV (num_splits > 1) not supported on SM rL   z(query, key, value must be on same device)rS   r"   Úint32rG   r(   r%   r_   )rY   ÚkeyÚvalueÚ	dropout_pÚreturn_debug_maskÚalibi_slopesÚ	seqused_kr[   Úblock_tableÚ
num_splitsr&   Úerrors               r   Ú_fa4_forward_support_errorrn   s   sÃ   € ð �CÒØ$ÙØ0ØÐØ+ØÐØ�?‰?œeŸk™kÒ)Ø,Ø× Ò Ø+Ü˜eŸl™lÓ+€EØÐ 5¨B¢;Ø<¸U¸GÀ1ÐEÐEØÐ *¨q¢.°U¸b²[Ø>¸u¸gÀQÐGÐGÜ%ØØ	��UÐØó€Eð
 ÐØÐ.Ò.Ø=ØˆØr   c           	     óH   — |dk7  ryt        || |||||f|d|ff¬«      }|�|S y )Nra   rb   Ú	logsumexp)r\   )r_   )	Úgrad_outrY   re   rf   Úoutrp   rg   r[   rm   s	            r   Ú_fa4_backward_support_errorrs   ›   sJ   € ð �CÒØ$Ü%ØØ	�5˜#˜u c¨9Ð5ØØ" IÐ.Ð0ô	€Eð ÐØˆØr   c                ó   — | dk(  rdS | S )z"need to convert -1 to None for FA4éÿÿÿÿNr    )Úvals    r   Ú_aten_to_fa4_window_sizerw   ²   s   € à˜"’9ˆ4Ð% #Ð%r   ÚTsc                 ó&   — t        d„ | D «       «      S )Nc              3  ó@   K  — | ]  }|j                  d d«      –— Œ y­w)r
   é   N)Ú	transposerH   s     r   rK   z#_transpose_dense.<locals>.<genexpr>»   s   è ø€ Ò4 q�—‘˜Q ×"Ñ4ùs   ‚)Útuple)rZ   s    r   Ú_transpose_denser~   º   s   € ÜÑ4¨GÔ4Ó4Ð4r   c                ó  — t         €t        d«      ‚t        t         «      }||t        |	«      t        |
«      d|||||�|j	                  «       nd ||xs d|dœ} |j
                  | ||fi |¤Ž\  }}||j	                  «       fS )NúFA4 not registeredTr
   )Úsoftmax_scaleÚcausalÚwindow_size_leftÚwindow_size_rightÚ
return_lseÚcu_seqlens_qÚcu_seqlens_kÚmax_seqlen_qÚmax_seqlen_krj   Ú
page_tablerl   rr   )r   r3   r*   rw   Ú
contiguousr.   )rY   re   rf   Úcu_seq_qÚcu_seq_kÚmax_qÚmax_kÚscaleÚ	is_causalrƒ   r„   rj   rr   rk   rl   r4   ÚkwargsÚlses                     r   Ú_fa4_run_forwardr”   ¾   s¤   € ô" ÐÜÐ/Ó0Ð0ÜÔ 0Ó1€Fð ØÜ4Ð5EÓFÜ5Ð6GÓHØØ Ø ØØØ/8Ð/D�Y×)Ñ)Ô+È$Ø!Ø ’o AØñ€Fð &ˆv×%Ñ% e¨S°%ÑB¸6ÑB�H€CˆØ�—‘Ó Ð Ð r   c                óÐ   — t         €t        d«      ‚t        t         «      }|j                  ||||| |j	                  «       ||	t        |
«      t        |«      |||¬«      \  }}}|||fS )Nr€   )r�   r‚   rƒ   r„   r†   r‡   Údeterministic)r   r3   r*   r/   r‹   rw   )rq   rY   re   rf   rr   rp   rŒ   r�   r�   r‘   rƒ   r„   r–   r4   ÚdqÚdkÚdvs                    r   Ú_fa4_run_backwardrš   æ   s†   € ô ÐÜÐ/Ó0Ð0ÜÔ 0Ó1€FØ×'Ñ'ØØØØØØ×ÑÓØØÜ1Ð2BÓCÜ2Ð3DÓEØØØ#ð (ó �J€BˆˆBð ˆr�2ˆ:Ðr   T©	r�   rƒ   r„   rj   ri   rr   rk   Úcompute_auxiliaryrl   c
       	        óº  — t        | ||||	|||||«
      }|�t        d|› �«      ‚t        | |||||||
|||||||«      \  }}|r�t        j                  dt        j
                  | j                  ¬«      }t        j                  dt        j
                  | j                  ¬«      }t        j                  d| j                  | j                  ¬«      }nd }d }d }|||||fS )Nz)FA4 flash_attention forward unsupported: )r{   )rS   r%   r    r   )	rn   r3   r”   r"   ÚzerosÚuint64r%   ÚemptyrS   )rY   re   rf   r[   Ú	cum_seq_krŽ   r�   rg   r‘   rh   r�   rƒ   r„   rj   ri   rr   rk   rœ   rl   rm   r“   Ú	rng_stateÚphilox_offsetÚ
debug_masks                           r   r?   r?   
  sõ   € ô, 'ØØØØØØØØØØó€Eð ÐÜÐFÀuÀgÐNÓOÐOÜØØØØØØØØØØØØØØØó�H€Cˆñ" Ü—K‘K ¬E¯L©LÀÇÁÔNˆ	ÜŸ™ B¬e¯l©lÀ5Ç<Á<ÔPˆÜ—[‘[ ¨%¯+©+¸e¿l¹lÔK‰
àˆ	ØˆØˆ
Ø��Y ¨zÐ9Ð9r   )r�   rƒ   r„   rj   ri   rk   rl   c               óN   — t        |||||||||	|
|||||| |d|¬«      \  }}}}}|S )NFr›   )r?   )rr   rY   re   rf   r[   r¡   rŽ   r�   rg   r‘   rh   r�   rƒ   r„   rj   ri   rk   rl   r'   r“   s                       r   r@   r@   J  sX   € ô* 8ØØØØØØØØØØØØ)Ø+ØØ!ØØØØô'�O€A€sˆAˆq�!ð* €Jr   )r�   rƒ   r„   c               ó®   — t        | ||||||
|«      }|�t        d|› �«      ‚t        j                  «       }t	        | ||||||||||||«      \  }}}|||fS )Nz*FA4 flash_attention backward unsupported: )rs   r3   r"   Ú$are_deterministic_algorithms_enabledrš   )rq   rY   re   rf   rr   rp   r[   r¡   rŽ   r�   rg   r‘   r¢   Úunusedr�   rƒ   r„   rm   r–   r—   r˜   r™   s                         r   rA   rA   w  s”   € ô( (ØØØØØØØØó	€Eð ÐÜÐGÈÀwÐOÓPÐPÜ×>Ñ>Ó@€MÜ"ØØØØØØØØØØØØØó�J€BˆˆBð ˆr�2ˆ:Ðr   ©r�   c               óŽ  — t        | ||||d d d «      }|�t        d|› �«      ‚t        | ||«      \  }}	}
t        j                  | «      }|j                  dd«      }|j                  d«      }|	j                  d«      }t        ||	|
d d |||||||¬«      \  }}}}}| j                  d«      }|j                  d«      }||d d |||||f	S )NzFA4 SDPA forward unsupported: r
   r{   )r�   rr   )rn   r3   r~   r"   Ú
empty_liker|   Úsizer?   )rY   re   rf   rg   r‘   rh   r�   rm   ÚqÚkÚvÚout_bhsdÚout_bshdÚmax_q_flashÚmax_k_flashr'   r“   r¢   r£   r¤   rŽ   r�   s                         r   rB   rB   ª  s  € ô 'ØØØØØØØØó	€Eð ÐÜÐ;¸E¸7ÐCÓDÐDÜ˜u c¨5Ó1�G€A€qˆ!ô
 ×Ñ Ó&€HØ×!Ñ! ! QÓ'€Hà—&‘&˜“)€KØ—&‘&˜“)€KÜ3TØ	Ø	Ø	ØØØØØØØØØô4Ñ0€A€sˆI�} jð �J‰J�q‹M€EØ�H‰H�Q‹K€EàØØØØØØØØð
ð 
r   c               ó  — t        | ||||||
d «      }|�t        d|› �«      ‚t        ||||| «      \  }}}}}|j                  d«      }|j                  d«      }	t	        ||||||d d ||	|
||||¬«      \  }}}t        |||«      \  }}}|||fS )NzFA4 SDPA backward unsupported: r{   r©   )rs   r3   r~   r¬   rA   )rq   rY   re   rf   rr   rp   r[   r¡   rŽ   r�   rg   r‘   Úphilox_seedr£   r�   rm   r­   r®   r¯   ÚoÚgor—   r˜   r™   s                           r   rC   rC   ç  sÖ   € ô$ (ØØØØØØØØó	€Eð ÐÜÐ<¸U¸GÐDÓEÐEÜ% e¨S°%¸¸hÓG�N€A€qˆ!ˆQ�Ø�J‰J�q‹M€EØ�H‰H�Q‹K€EÜ3Ø
Ø	Ø	Ø	Ø	ØØØØØØØØØØô�J€BˆˆBô" " " b¨"Ó-�J€BˆˆBØˆr�2ˆ:Ðr   ÚFA4)Úregister_fn)r%   ztorch.devicer   Úint)zflash_attn.cute.interface)r,   Ústrr   r   )r,   r»   r   r   )r   r   )r    )
rY   útorch.TensorrZ   ztuple[torch.Tensor, ...]r[   útorch.Tensor | Noner\   z$tuple[tuple[str, torch.Tensor], ...]r   r   )NN)rY   r¼   re   r¼   rf   r¼   rg   Úfloatrh   Úboolri   r½   rj   r½   r[   r½   rk   r½   rl   ú
int | Noner   r   )rq   r¼   rY   r¼   re   r¼   rf   r¼   rr   r¼   rp   r¼   rg   r¾   r[   r½   r   r   )rv   rÀ   r   rÀ   )rZ   z
Unpack[Ts]r   ztuple[Unpack[Ts]])NNN) rY   r¼   re   r¼   rf   r¼   rŒ   r½   r�   r½   rŽ   rÀ   r�   rÀ   r�   úfloat | Noner‘   r¿   rƒ   rÀ   r„   rÀ   rj   r½   rr   r½   rk   r½   rl   rÀ   r   z!tuple[torch.Tensor, torch.Tensor])F)rq   r¼   rY   r¼   re   r¼   rf   r¼   rr   r¼   rp   r¼   rŒ   r½   r�   r½   r�   rÁ   r‘   r¿   rƒ   rÀ   r„   rÀ   r–   r¿   r   z/tuple[torch.Tensor, torch.Tensor, torch.Tensor])&rY   r¼   re   r¼   rf   r¼   r[   r½   r¡   r½   rŽ   rº   r�   rº   rg   r¾   r‘   r¿   rh   r¿   r�   rÁ   rƒ   rÀ   r„   rÀ   rj   r½   ri   r½   rr   r½   rk   r½   rœ   r¿   rl   rÀ   )$rr   r¼   rY   r¼   re   r¼   rf   r¼   r[   r½   r¡   r½   rŽ   rº   r�   rº   rg   r¾   r‘   r¿   rh   r¿   r�   rÁ   rƒ   rÀ   r„   rÀ   rj   r½   ri   r½   rk   r½   rl   rÀ   )"rq   r¼   rY   r¼   re   r¼   rf   r¼   rr   r¼   rp   r¼   r[   r½   r¡   r½   rŽ   rº   r�   rº   rg   r¾   r‘   r¿   r¢   r¼   r¨   r¼   r�   rÁ   rƒ   rÀ   r„   rÀ   )ra   FF)rY   r¼   re   r¼   rf   r¼   rg   r¾   r‘   r¿   rh   r¿   r�   rÁ   )rq   r¼   rY   r¼   re   r¼   rf   r¼   rr   r¼   rp   r¼   r[   r½   r¡   r½   rŽ   rº   r�   rº   rg   r¾   r‘   r¿   rµ   r¼   r£   r¼   r�   rÁ   )+Ú__doc__Ú
__future__r   r0   Údataclassesr   Ú	functoolsr   Útypingr   r   Útyping_extensionsr   r	   Ú r   Útypesr   r"   Útorch.libraryr   Ú__all__r   r   r   r(   r   r*   r+   r_   rn   rs   rw   rx   r~   r”   rš   r?   r@   rA   rB   rC   Úregister_flash_attention_implr    r   r   ú<module>rÍ      sx  ðÚ õ #ã Ý !Ý ß %ß 2å ñ Ý ã Ý !ð #ð€ð
  $Ð �*Ó #ð ÷ð ó ðð òó ðð 3ð/Øð/àó/ð òó ðóð4 :<ð	Øðà%ðð #ðð 7ð	ð
 óðF (,Ø!ð%Øð%à	ð%ð ð%ð ð	%ð
 ð%ð &ð%ð #ð%ð #ð%ð %ð%ð ð%ð ó%ðPØðàðð 
ðð ð	ð
 
ðð ðð ðð #ðð óó.&ñ
 �$Ó€ó5ð"  $Ø'+Ø!ð%!Øð%!à	ð%!ð ð%!ð "ð	%!ð
 "ð%!ð ð%!ð ð%!ð ð%!ð ð%!ð !ð%!ð "ð%!ð #ð%!ð 
ð%!ð %ð%!ð ð%!ð  'ó!%!ðj  ð!Øð!àð!ð 
ð!ð ð	!ð
 
ð!ð ð!ð "ð!ð "ð!ð ð!ð ð!ð !ð!ð "ð!ð ð!ð 5ó!ð` Ø#'Ø$(Ø%)Ø(,Ø#Ø'+Ø"Ø!ñ)=:Øð=:à	ð=:ð ð=:ð #ð	=:ð
 #ð=:ð ð=:ð ð=:ð ð=:ð ð=:ð ð=:ð ð=:ð !ð=:ð "ð=:ð #ð=:ð  &ð!=:ð" 
ð#=:ð$ %ð%=:ð& ð'=:ð( ó)=:ðZ Ø#'Ø$(Ø%)Ø(,Ø'+Ø!ñ'*Ø	ð*àð*ð 
ð*ð ð	*ð
 #ð*ð #ð*ð ð*ð ð*ð ð*ð ð*ð ð*ð ð*ð !ð*ð "ð*ð  #ð!*ð" &ð#*ð$ %ð%*ð& ó'*ðz Ø#'Ø$(ñ%0Øð0àð0ð 
ð0ð ð	0ð
 
ð0ð ð0ð #ð0ð #ð0ð ð0ð ð0ð ð0ð ð0ð ð0ð ð0ð  ð!0ð" !ð#0ð$ "ó%0ðn ØØ#ð:ð ñ:Øð:à	ð:ð ð:ð ð	:ð
 ð:ð ð:ð ó:ðZ ñ!3Øð3àð3ð 
ð3ð ð	3ð
 
ð3ð ð3ð #ð3ð #ð3ð ð3ð ð3ð ð3ð ð3ð ð3ð  ð3ð  ó!3ðl (€	× 'Ñ '¨Ð;WÖ Xr   