§
    ‚Štjù+  ã                   ó  — d dl Z ddlmZ ddlmZ  ej        e¦  «        ZdZdZ	dZ
dadefd	„Ze j                             d
d¬¦  «        de j        de j        de j        de j        de j        de j        dedededededededede j        fd„¦   «         Zej        d„ ¦   «         Zde j        deddfd „Zd!„ Z	 	 	 	 d)d#e j        j        de j        d$e j        d%e j        d&e j        dz  dededz  d'e j        dz  dee j        df         fd(„ZdS )*é    Né   )Úloggingé   )Úsdpa_attention_forward)é   é   é   é    é€   Úattn_implementationc                 ó@  — t           �t           S ddlm} |                      d¦  «        d         }|                     d¦  «        \  }}} |||pd|rdndd¬	¦  «        }d
D ]6}t          t          ||d¦  «        ¦  «        st          d|› d|› d�¦  «        ‚Œ7|a t           S )aw  Load the MSA hub kernel once and verify the expected callables are present.

    The ``attn_implementation`` string may carry a ``paged|`` prefix and/or an ``@<revision>`` pin
    (e.g. ``kernels-staging/msa@v0``); the build currently lives on the repo's ``v0`` branch. The
    loaded module is cached in a module-level global so registration happens once, not per call.
    Nr   )Ú
get_kernelú|éÿÿÿÿú@r   T)ÚrevisionÚversionÚallow_all_kernels)Úsparse_atten_funcÚbuild_k2q_csrzThe MSA kernel loaded from `z` does not expose a callable `zK`. Make sure you request a compatible build, e.g. `kernels-staging/msa@v0`.)Ú_MSA_KERNELÚhub_kernelsr   ÚsplitÚ	partitionÚcallableÚgetattrÚImportError)r   r   Úrepo_idÚ_ÚrevÚkernelÚfn_names          úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/integrations/msa_attention.pyÚload_and_register_msa_kernelr$       sò   € õ ÐÝÐà'Ð'Ð'Ð'Ð'Ð'à!×'Ò'¨Ñ,Ô,¨RÔ0€GØ×'Ò'¨Ñ,Ô,�O€GˆQ�ØˆZ˜¨#¨+°ÀsÐ?Q¸t¸tÐPQÐeiÐjÑjÔj€Fà9ð ð ˆÝ� ¨°Ñ6Ô6Ñ7Ô7ð 	Ýð[¨wð [ð [ÐV]ð [ð [ð [ñô ð ð	ð €KÝÐó    ztransformers_msa::sparse_atten© )Úmutates_argsÚqÚkÚvÚq2kÚcu_seqlens_qÚcu_seqlens_kÚtopkÚ
block_sizeÚtotal_kÚmax_seqlen_qÚmax_seqlen_kÚqheads_per_kvÚscalingÚimplÚreturnc                 óD  — t          |¦  «        }t          j                             | j        ¦  «        5  |                     ||||||
|	|¬¦  «        \  }}|                     | ||||||||	|
|d|¬¦  «        }ddd¦  «         n# 1 swxY w Y   |                     ¦   «         S )a$  Opaque wrapper around the CuTe-DSL CSR build + block-sparse kernel.

    Registered as a ``torch.library`` custom op so ``torch.compile(fullgraph=True)`` treats the
    whole CSR-build + attention as a single opaque node (no graph break) and ``reduce-overhead``
    CUDA graphs can capture it. The internal ``build_k2q_csr`` output is data-dependent in shape,
    but it never escapes this op (only the fixed-shape ``[total_q, Hq, D]`` attention output does),
    so the fake/meta impl below is exact. The op is functional (no input mutation).
    )r0   r2   r1   Úqhead_per_kvT)r,   r-   r1   r2   Úblk_kvÚcausalÚsoftmax_scaleN)r$   ÚtorchÚcudaÚdevicer   r   Ú
contiguous)r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   ÚmsaÚk2q_row_ptrÚk2q_q_indicesÚattn_outputs                     r#   Ú_msa_sparse_atten_oprD   <   s  € õ2 ' tÑ
,Ô
,€Cõ 
Œ×	Ò	˜1œ8Ñ	$Ô	$ð 
ð 
Ø%(×%6Ò%6ØØØØØØ%Ø%Ø&ð &7ñ 	&
ô 	&
Ñ"ˆ�]ð ×+Ò+ØØØØØØØ%Ø%Ø%Ø%ØØØ!ð ,ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð4 ×!Ò!Ñ#Ô#Ð#s   ´ABÂBÂ
Bc                 ó*   — t          j        | ¦  «        S ©N)r<   Ú
empty_like)r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   s                 r#   Ú_msa_sparse_atten_fakerH   u   s   € õ$ Ô˜AÑÔÐr%   ÚqueryÚdropoutc                 óà  — |j         j        dk    s.t          j                             |j         ¦  «        d         dk    rt          d¦  «        ‚|j        d         t          k    rt          dt          › d�¦  «        ‚| j	        j
        t          k    rt          dt          › d�¦  «        ‚|d	k    rt          d
¦  «        ‚| j	        j        }|t          vrt          dt          › d|› d�¦  «        ‚dS )a  Validate kernel capability, dropout and configured topk once per attention module.

    Mirrors the flash-attention integration, which checks capability/dropout at model init rather
    than on every forward. The check is cached on the module so the hot path never re-runs it.

    There is no SDPA fallback: a sparse layer either runs the MSA kernel or this raises. Serves both
    prefill (q_len > 1) and single-token decode (q_len == 1) -- decode is just a varlen call with one
    query slot, so there is no context-length threshold.
    r=   r   é
   z‡MSA block-sparse attention requires an SM100 / Blackwell CUDA device. Select a different `attn_implementation` on unsupported hardware.r   z2MSA block-sparse attention only supports head_dim ú.z4MSA block-sparse attention only supports block_size ç        zYMSA block-sparse attention does not support attention dropout; set `attention_dropout=0`.z1MSA block-sparse attention only supports topk in z, got `z0`. Set `index_topk_blocks` to a supported value.N)r>   Útyper<   r=   Úget_device_capabilityÚRuntimeErrorÚshapeÚMSA_SUPPORTED_HEAD_DIMÚ
ValueErrorÚindexerr/   ÚMSA_SUPPORTED_BLOCK_SIZEÚtopk_blocksÚMSA_SUPPORTED_TOPK)ÚmodulerI   rJ   r.   s       r#   Ú_validate_msa_initrZ   Š   s  € ð „|Ô˜FÒ"Ð"¥e¤j×&FÒ&FÀuÄ|Ñ&TÔ&TÐUVÔ&WÐ[]Ò&]Ð&]ÝðPñ
ô 
ð 	
ð „{�2„Õ0Ò0Ð0ÝÐgÕNdÐgÐgÐgÑhÔhÐhØ„~Ô Õ$<Ò<Ð<ÝÐkÕPhÐkÐkÐkÑlÔlÐlØ�#‚~€~ÝÐtÑuÔuÐuØŒ>Ô%€DØÕ%Ð%Ð%Ýð<Õ@Rð <ð <Ð[_ð <ð <ð <ñ
ô 
ð 	
ð &Ð%r%   c                 óÂ  ‡— |j         \  }}	}
}|j         d         |j         d         }}|	|z  }|j         d         Št          ˆfd„t          D ¦   «         ¦  «        }|‰k    rE|                     g |j         d d…         ¢|‰z
  ‘R d¦  «        }t	          j        ||gd¬¦  «        }|Š|                     dd¦  «                             ||
z  |	|¦  «                             ¦   «         }|                     dd¦  «                             ||z  ||¦  «                             ¦   «         }|                     dd¦  «                             ||z  ||¦  «                             ¦   «         }t	          j	        d|dz   |
z  |
|j
        t          j        ¬¦  «        }|dk    rx|�v|d         dz                        t          j        ¦  «                             d¦  «        }t	          j        t	          j        d|j
        t          j        ¬¦  «        |g¦  «        }n.t	          j	        d|dz   |z  ||j
        t          j        ¬¦  «        }|                     t          j        ¦  «        }|                     dddd¦  «                             |||
z  ‰¦  «                             ¦   «         }t          ||||||‰|||z  |
|||| j        j        ¦  «        }|                     ||
|	|¦  «        S )	Nr   r   r   c              3   ó(   •K  — | ]}|‰k    ¯|V — Œd S rF   r&   )Ú.0Útr.   s     €r#   ú	<genexpr>z$_sparse_attention.<locals>.<genexpr>³   s'   øè è € ÐBÐB˜Q¸¸Tº	¸	�q¸	¸	¸	¸	ÐBÐBr%   )Údimr   )r>   Údtypeé   )rR   ÚnextrX   Únew_fullr<   ÚcatÚ	transposeÚreshaper?   Úaranger>   Úint32ÚtoÚzerosÚpermuterD   ÚconfigÚ_attn_implementation)rY   rI   ÚkeyÚvaluer4   Úblock_indicesr/   Úcache_positionÚbszÚnum_q_headsÚq_lenÚhead_dimÚnum_kv_headsÚk_lenr3   Úpadded_topkÚpadr(   r)   r*   r,   Úvalid_kr-   r+   rC   r.   s                            @r#   Ú_sparse_attentionr|   §   sÎ  ø€ Ø(-¬Ñ%€Cˆ�e˜XØœ) Aœ,¨¬	°!¬�%€LØ <Ñ/€MØÔ˜rÔ"€Dõ ÐBÐBÐBÐBÕ"4ÐBÑBÔBÑBÔB€KØ�dÒÐØ×$Ò$Ð%T }Ô':¸3¸B¸3Ô'?Ð%TÀÈtÑASÐ%TÐ%TÐVXÑYÔYˆÝœ	 =°#Ð"6¸BÐ?Ñ?Ô?ˆØˆð
 	�Š˜˜1ÑÔ×%Ò% c¨E¡k°;ÀÑIÔI×TÒTÑVÔV€AØ�Š�a˜ÑÔ×#Ò# C¨%¡K°¸xÑHÔH×SÒSÑUÔU€AØ�Š˜˜1ÑÔ×%Ò% c¨E¡k°<ÀÑJÔJ×UÒUÑWÔW€AÝ”<  C¨!¡G¨uÑ#4°eÀAÄHÕTYÔT_Ð`Ñ`Ô`€Lð ˆa‚x€x�NÐ.Ø! "Ô%¨Ñ)×-Ò-­e¬kÑ:Ô:×BÒBÀ1ÑEÔEˆÝ”y¥%¤+¨a¸¼ÍÌÐ"TÑ"TÔ"TÐV]Ð!^Ñ_Ô_ˆˆå”| A¨¨a©°5Ñ'8¸%ÈÌÕX]ÔXcÐdÑdÔdˆð
 ×
Ò
�5œ;Ñ
'Ô
'€CØ
�+Š+�a˜˜A˜qÑ
!Ô
!×
)Ò
)¨,¸¸e¹ÀTÑ
JÔ
J×
UÒ
UÑ
WÔ
W€Cõ 'Ø	Ø	Ø	ØØØØØØˆe‰ØØØØØŒÔ*ñô €Kð  ×Ò˜s E¨;¸ÑAÔAÐAr%   rN   rY   ro   rp   Úattention_maskrq   c           
      ó  — |€|j         d         dz  }|€t          | ||||f||dœ|¤ŽS t          | dd¦  «        st          | ||¦  «         d| _        | j        j        }	|                     d¦  «        }
t          | ||||||	|
¦  «        }|dfS )	zn
    TODO: this opens a door to per-layer attn implementation which is something we might want lalter on.
    Nr   g      à¿)rJ   r4   Ú_msa_validatedFTrr   )	rR   r   r   rZ   r   rU   r/   Úgetr|   )rY   rI   ro   rp   r}   rJ   r4   rq   Úkwargsr/   rr   rC   s               r#   Úmsa_attention_forwardr‚   æ   sË   € ð €Ø”+˜b”/ TÑ)ˆð ÐÝ%Ø�E˜3  ~ð
Ø?FÐPWð
ð 
Ø[að
ð 
ð 	
õ �6Ð+¨UÑ3Ô3ð %Ý˜6 5¨'Ñ2Ô2Ð2Ø $ˆÔà”Ô*€JØ—Z’ZÐ 0Ñ1Ô1€NÝ# F¨E°3¸¸wÈÐWaÐcqÑrÔr€KØ˜ÐÐr%   )NrN   NN)r<   Úutilsr   Úsdpa_attentionr   Ú
get_loggerÚ__name__ÚloggerrX   rV   rS   r   Ústrr$   ÚlibraryÚ	custom_opÚTensorÚintÚfloatrD   Úregister_fakerH   rZ   r|   ÚnnÚModuleÚtupler‚   r&   r%   r#   ú<module>r’      sa  ðð €€€à Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð 
ˆÔ	˜HÑ	%Ô	%€ð $Ð àÐ àÐ à€ð°cð ð ð ð ð8 „×ÒÐ9ÈÐÑKÔKð5$Ø„|ð5$à„|ð5$ð „|ð5$ð 
Œð	5$ð
 ”,ð5$ð ”,ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð „\ð5$ð 5$ð 5$ñ LÔKð5$ðp Ô#ðð ñ $Ô#ðð(
 e¤lð 
¸Uð 
Àtð 
ð 
ð 
ð 
ð:<Bð <Bð <BðH +/ØØ Ø)-ð ð  ØŒHŒOð àŒ<ð ð 
Œð ð Œ<ð	 ð
 ”L 4Ñ'ð ð ð ð �T‰\ð ð ”< $Ñ&ð ð ˆ5Œ<˜ÐÔð ð  ð  ð  ð  ð  r%   