Ë
    ÛÓ^jù+  ã                   ó¸  — 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                  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 j0                  j2                  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y))é    Né   )Úloggingé   )Úsdpa_attention_forward)é   é   é   é    é€   Úattn_implementationc                 ó  — t         �t         S ddlm} | j                  d«      d   }|j	                  d«      \  }}} |||xs d|rdndd¬	«      }d
D ]*  }t        t        ||d«      «      rŒt        d|› d|› d�«      ‚ |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          úr/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/integrations/msa_attention.pyÚload_and_register_msa_kernelr$       s¯   € ô ÐÜÐå'à!×'Ñ'¨Ó,¨RÑ0€GØ×'Ñ'¨Ó,�O€GˆQ�Ù˜¨#ª+°Ás¹tÐPQÐeiÔj€Fà9ò ˆÜœ ¨°Ó6Õ7ÜØ.¨w¨iÐ7UÐV]ÐU^ð _[ð [óð ðð €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                 óF  — t        |«      }t        j                  j                  | j                  «      5  |j	                  ||||||
|	|¬«      \  }}|j                  | ||||||||	|
|d|¬«      }ddd«       |j                  «       S # 1 sw Y   j                  «       S xY w)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™8Ó	$ñ 
Ø%(×%6Ñ%6ØØØØØØ%Ø%Ø&ð &7ó 	&
Ñ"ˆ�]ð ×+Ñ+ØØØØØØØ%Ø%Ø%Ø%ØØØ!ð ,ó 
ˆ÷
ð4 ×!Ñ!Ó#Ð#÷5
ð4 ×!Ñ!Ó#Ð#ús   µ;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k7  s/t        j                  j	                  |j                   «      d   dk7  rt        d«      ‚|j                  d   t        k7  rt        dt        › d�«      ‚| j                  j                  t        k7  rt        dt        › d�«      ‚|d	k7  rt        d
«      ‚| j                  j                  }|t        vrt        dt        › d|› d�«      ‚y)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¡j×&FÑ&FÀuÇ|Á|Ó&TÐUVÑ&WÐ[]Ò&]ÜðPó
ð 	
ð ‡{�{�2�Ô0Ò0ÜÐMÔNdÐMeÐefÐgÓhÐhØ‡~�~× Ñ Ô$<Ò<ÜÐOÔPhÐOiÐijÐkÓlÐlØ�#‚~ÜÐtÓuÐuØ�>‰>×%Ñ%€DØÔ%Ñ%ÜØ?Ô@RÐ?SÐSZÐ[_ÐZ`ð a<ð <ó
ð 	
ð &r%   c                 ó’  ‡— |j                   \  }}	}
}|j                   d   |j                   d   }}|	|z  }|j                   d   Št        ˆfd„t        D «       «      }|‰k7  rB|j                  g |j                   d d ¢|‰z
  ‘­d«      }t	        j
                  ||gd¬«      }|Š|j                  dd«      j                  ||
z  |	|«      j                  «       }|j                  dd«      j                  ||z  ||«      j                  «       }|j                  dd«      j                  ||z  ||«      j                  «       }t	        j                  d|dz   |
z  |
|j                  t        j                  ¬«      }|dk(  r||�z|d   dz   j                  t        j                  «      j                  d«      }t	        j
                  t	        j                  d|j                  t        j                  ¬«      |g«      }n8t	        j                  d|dz   |z  ||j                  t        j                  ¬«      }|j                  t        j                  «      }|j                  dddd«      j                  |||
z  ‰«      j                  «       }t        ||||||‰|||z  |
|||| j                   j"                  «      }|j                  ||
|	|«      S )	Nr   r   r   c              3   ó.   •K  — | ]  }|‰k\  sŒ	|–— Œ y ­wrF   r&   )Ú.0Útr.   s     €r#   ú	<genexpr>z$_sparse_attention.<locals>.<genexpr>³   s   øè ø€ ÒB˜Q¸¸T»	”qÑBùs   ƒ
Ž)Ú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Ô"4ÔBÓB€KØ�dÒØ×$Ñ$Ð%T }×':Ñ':¸3¸BÐ'?Ð%TÀÈtÑASÑ%TÐVXÓYˆÜŸ	™	 =°#Ð"6¸BÔ?ˆØˆð
 	�‰˜˜1Ó×%Ñ% c¨E¡k°;ÀÓI×TÑTÓV€AØ�‰�a˜Ó×#Ñ# C¨%¡K°¸xÓH×SÑSÓU€AØ�‰˜˜1Ó×%Ñ% c¨E¡k°<ÀÓJ×UÑUÓW€AÜ—<‘<  C¨!¡G¨uÑ#4°eÀAÇHÁHÔTY×T_ÑT_Ô`€Lð ˆa‚x�NÐ.Ø! "Ñ%¨Ñ)×-Ñ-¬e¯k©kÓ:×BÑBÀ1ÓEˆÜ—y‘y¤%§+¡+¨a¸¿¹ÌÏÉÔ"TÐV]Ð!^Ó_‰ä—|‘| A¨¨a©°5Ñ'8¸%ÈÏÉÔX]×XcÑXcÔdˆð
 ×
Ñ
œ5Ÿ;™;Ó
'€CØ
�+‰+�a˜˜A˜qÓ
!×
)Ñ
)¨,¸¸e¹ÀTÓ
J×
UÑ
UÓ
W€Cô 'Ø	Ø	Ø	ØØØØØØˆe‰ØØØØØ�‰×*Ñ*ó€Kð  ×Ñ˜s E¨;¸ÓAÐAr%   rY   ro   rp   Úattention_maskrq   c           
      ó  — |€|j                   d   dz  }|€t        | ||||f||dœ|¤ŽS t        | dd«      st        | ||«       d| _        | j
                  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Ü˜6 5¨'Ô2Ø $ˆÔà—‘×*Ñ*€JØ—Z‘ZÐ 0Ó1€NÜ# F¨E°3¸¸wÈÐWaÐcqÓ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’      s  ðó å Ý 2ð 
ˆ×	Ñ	˜HÓ	%€ð $Ð àÐ àÐ à€ð°có ð8 ‡�×ÑÐ9ÈÐÓKð5$Ø‡|�|ð5$à‡|�|ð5$ð ‡|�|ð5$ð 
�‰ð	5$ð
 —,‘,ð5$ð —,‘,ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ð5$ð ‡\�\ò5$ó Lð5$ðp ×#Ñ#ñó $ðð(
 e§l¡lð 
¸Uð 
Àtó 
ò:<BðH +/ØØ Ø)-ñ Ø�H‰H�O‰Oð à�<‰<ð ð 
�‰ð ð �<‰<ð	 ð
 —L‘L 4Ñ'ð ð ð ð �T‰\ð ð —<‘< $Ñ&ð ð ˆ5�<‰<˜ÐÑô r%   