Ë
    [^(h´†  ã                   ó>  — d dl Z d dlmZ d dlZd dlZd dlmc mZ d dl	m
Z
mZmZmZmZmZmZmZ d dlmZ ddlmZ  e j,                  e«      Z	 	 	 	 d,dej2                  dej2                  d	ej2                  d
eej2                     fd„Zd-dedefd„Zd-dedefd„Zd-dedefd„Z	 d-dej2                  dedefd„Z d-defd„Z!d-dedefd„Z"d-dedefd„Z#d-dedefd„Z$d-dedefd„Z%d„ Z&dej2                  de'ej2                  e(e(f   fd„Z)dej2                  fd„Z*dej2                  de(de(d e(dej2                  f
d!„Z+d"„ Z,dej2                  d#e(d$edej2                  fd%„Z-d&„ Z.d'ej2                  fd(„Z/d)„ Z0dej2                  dej2                  d	ej2                  d
eej2                     de'ej2                  ej2                  ej2                  eej2                     f   f
d*„Z1	 	 	 	 	 d.dej2                  dej2                  d	ej2                  d
eej2                     fd+„Z2y)/é    N)ÚOptional)Úcan_use_cudnn_attentionÚcan_use_efficient_attentionÚcan_use_flash_attentionÚcudnn_sdp_enabledÚflash_sdp_enabledÚmath_sdp_enabledÚmem_efficient_sdp_enabledÚ
SDPAParams)Ú
SDPBackendé   )ÚNestedTensorÚqueryÚkeyÚvalueÚ	attn_maskc           	      ó2  — t        | t        «      r t        |t        «      rt        |t        «      s3t        d| j                  › d|j                  › d|j                  › d�«      ‚| j                  |j                  k7  s| j                  |j                  k7  r3t        d| j                  › d|j                  › d|j                  › d�«      ‚| j
                  |j
                  k7  s| j
                  |j
                  k7  r3t        d| j
                  › d	|j
                  › d
|j
                  › d�«      ‚| j                  «       dk  s&|j                  «       dk  s|j                  «       dk  r?t        d| j                  «       › d|j                  «       › d|j                  «       › d�«      ‚| j                  |j                  k7  s| j                  |j                  k7  r3t        d| j                  › d|j                  › d|j                  › d�«      ‚|�t        d«      ‚y )NzNExpected query, key, and value to be nested tensors, but got query.is_nested: z, key.is_nested: z, and value.is_nested: z	 instead.zLExpected query, key, and value to have the same dtype, but got query.dtype: z, key.dtype: z, and value.dtype: zSExpected query, key, and value to have the same device type, but got query.device: z, key.device: z, and value.device: é   zUExpected query, key, and value to all be  at least 3 dimensional, but got query.dim: z, key.dim: z and value.dim: z[Expected query, key, and value to all be ragged on the same dimension, but got ragged dims z, z, and z, respectively.zMasks are not yet supported!)
Ú
isinstancer   Ú
ValueErrorÚ	is_nestedÚdtypeÚdeviceÚdimÚ_ragged_idxÚtorchÚbool)r   r   r   r   Ú	dropout_pÚ	is_causalÚscales          úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/nested/_internal/sdpa.pyÚ_validate_sdpa_inputr"      sú  € ô �uœlÔ+Ü˜#œ|Ô,Ü˜%¤Ô.äð(Ø(-¯©Ð'8Ð8IÈ#Ï-É-Èð Y$Ø$)§O¡OÐ#4°Ið?ó
ð 	
ð
 ‡{�{�c—i‘iÒ 5§;¡;°%·+±+Ò#=Üð$Ø$)§K¡K =°¸c¿i¹i¸[ð I Ø %§¡˜}¨Ið7ó
ð 	
ð
 ‡|�|�s—z‘zÒ! U§\¡\°U·\±\Ò%AÜð%Ø%*§\¡\ N°.ÀÇÁÀð M!Ø!&§¡ ¨ið9ó
ð 	
ð
 ‡y�yƒ{�Q‚˜#Ÿ'™'›) aš-¨5¯9©9«;¸ª?ÜØcØ�y‰y‹{ˆm˜; s§w¡w£y kÐ1AÀ%Ç)Á)Ã+ÀÈiðYó
ð 	
ð ×Ñ˜CŸO™OÒ+¨u×/@Ñ/@ÀE×DUÑDUÒ/UÜðØ×%Ñ%Ð& b¨¯©Ð(9¸À×@QÑ@QÐ?RÐRaðcó
ð 	
ð ÐäÐ7Ó8Ð8ð ó    ÚparamsÚreturnc                 ó¼   — | j                   j                  d«      }| j                  j                  d«      }| j                  j                  d«      }||k(  xr ||k(  S )Nr   )r   Úsizer   r   )r$   ÚdebugÚq_batch_sizeÚk_batch_sizeÚv_batch_sizes        r!   Ú_check_batch_size_nestedr,   M   sU   € ð —<‘<×$Ñ$ QÓ'€LØ—:‘:—?‘? 1Ó%€LØ—<‘<×$Ñ$ QÓ'€Lð
 ˜<Ñ'ÒH¨L¸LÑ,HÐHr#   c                 ó  — d}| j                   j                  d«      }| j                  j                  d«      }| j                  j                  d«      }||k(  xr ||k(  }|r|dz  dk(  r||k  s|rt        j                  d|||«       yy)Né   éÿÿÿÿé   r   zÖFor NestedTensor inputs, Flash attention requires q,k,v to have the same last dimension and to be a multiple of 8 and less than or equal to 256. Got Query.size(-1): %d, Key.size(-1): %d, Value.size(-1): %d instead.FT©r   r'   r   r   ÚlogÚwarning©r$   r(   Úmax_sizeÚquery_size_lastÚkey_size_lastÚvalue_size_lastÚsame_head_dim_sizes          r!   Ú!_check_head_dim_size_flash_nestedr:   Z   óš   € Ø€HØ—l‘l×'Ñ'¨Ó+€OØ—J‘J—O‘O BÓ'€MØ—l‘l×'Ñ'¨Ó+€Oà˜=Ñ(ÒO¨_ÀÑ-Oð ñ 	Ø˜qÑ  AÒ%Ø Ò(áÜ�K‰KðXð  ØØôð Ør#   c                 ó  — d}| j                   j                  d«      }| j                  j                  d«      }| j                  j                  d«      }||k(  xr ||k(  }|r|dz  dk(  r||k  s|rt        j                  d|||«       yy)Né€   r/   r0   r   zÖFor NestedTensor inputs, cuDNN attention requires q,k,v to have the same last dimension and to be a multiple of 8 and less than or equal to 128. Got Query.size(-1): %d, Key.size(-1): %d, Value.size(-1): %d instead.FTr1   r4   s          r!   Ú!_check_head_dim_size_cudnn_nestedr>   t   r;   r#   ÚparamÚ
param_namec                 óÚ   — t        | t        «      sJ d«       ‚| j                  dk(  r|rt        j	                  d|«       y| j                  «       dk(  r|rt        j	                  d|«       yy)Nzparam should be a jagged NTr   zMFused kernels do not support ragged num_head_dims, %s has a ragged num_heads.Fr   zAFused kernels do not support seq_len == 0, %s has a seq len of 0.T)r   r   r   r2   r3   Ú_get_min_seqlen)r?   r@   r(   s      r!   Ú:_check_for_seq_len_0_and_consistent_head_dim_nested_helperrC   Ž   sr   € ô �eœ\Ô*ÐIÐ,IÓIÐ*à×Ñ˜AÒáÜ�K‰KØ_Øôð ð ×ÑÓ !Ò#ÙÜ�K‰KØSØôð àr#   c           
      ó˜   — t        | ||«      }| |k7  r| dk7  s||k7  r|dk7  s
||k7  r$|dk7  r|rt        j                  d||| ||||«       yy)Nr   zzBoth fused kernels require query, key and value to have broadcastable %s, got Query %s %d, Key %s %d, Value %s %d instead.FT)Úmaxr2   r3   )Úq_sizeÚk_sizeÚv_sizer@   r(   r5   s         r!   Ú_try_broadcast_param_sizerI   ¨   sl   € Ü�6˜6 6Ó*€Hà	�8Ò	 ¨!¢Ø�hÒ 6¨Q¢;Ø�hÒ 6¨Q¢;áÜ�K‰KðCàØØØØØØô
ð Ør#   c                 óÀ  — | j                   j                  rt        | j                   d|«      nd}|sy| j                  j                  rt        | j                  d|«      nd}|sy| j                  j                  rt        | j                  d|«      nd}|sy| j                   j                  d«      }| j                  j                  d«      }| j                  j                  d«      }||k(  xr ||k(  }|si| j                   j                  s,| j                  j                  s| j                  j                  r|rt        j                  d«       yt        |||d|«      S y)	Nr   TFr   r   r   zFBoth fused kernels do not support training with broadcasted NT inputs.z	num heads)
r   r   rC   r   r   r'   Úrequires_gradr2   r3   rI   )	r$   r(   Ú	q_is_safeÚ	k_is_safeÚ	v_is_safeÚq_num_headsÚk_num_headsÚv_num_headsÚsame_num_headss	            r!   Ú_check_for_seq_len_0_nestedrS   ¿   sU  € ð �<‰<×!Ò!ô 	CØ�L‰L˜' 5ô	
ð ð ñ Øð �:‰:×Òô 	CØ�J‰J˜˜uô	
ð ð ñ Øð �<‰<×!Ò!ô 	CØ�L‰L˜' 5ô	
ð ð ñ Øð —,‘,×#Ñ# AÓ&€KØ—*‘*—/‘/ !Ó$€KØ—,‘,×#Ñ# AÓ&€KØ  KÑ/ÒN°KÀ;Ñ4N€Náà�L‰L×&Ò&Ø�z‰z×'Ò'Ø�|‰|×)Ò)áÜ—‘Ø\ôð Ü(Ø˜ k°;Àó
ð 	
ð r#   c                 óJ   — t         t        t        f}|D ]  } || |«      rŒ y y©NFT)r,   r:   rS   ©r$   r(   ÚconstraintsÚ
constraints       r!   Ú_can_use_flash_sdpa_jaggedrY   ú   s5   € ä Ü)Ü#ð€Kð
 "ò ˆ
Ù˜& %Õ(Ùðð r#   c                 ó@   — t         t        f}|D ]  } || |«      rŒ y yrU   )r,   rS   rV   s       r!   Ú_can_use_efficient_sdpa_jaggedr[     s2   € ä Ü#ð€Kð "ò ˆ
Ù˜& %Õ(Ùðð r#   c                 óx  — | j                   j                  dd«      j                  «       rT| j                  j                  dd«      j                  «       r*| j                  j                  dd«      j                  «       s|rt
        j                  d«       y| j                  r|rt
        j                  d«       yy)Nr   é   zGIf inputs are nested tensors they must be contiguous after transposing.FzENested tensors for query / key are not supported when is_causal=True.T)r   Ú	transposeÚis_contiguousr   r   r2   r3   r   )r$   r(   s     r!   Ú_can_use_math_sdpa_jaggedr`     s“   € à�L‰L×"Ñ" 1 aÓ(×6Ñ6Ô8Ø�z‰z×#Ñ# A qÓ)×7Ñ7Ô9Ø�|‰|×%Ñ% a¨Ó+×9Ñ9Ô;áÜ�K‰KØYôð Ø×ÒÙÜ�K‰KØWôð Ør#   c           	      óF  — t        «       s.t        «       s$t        «       st        «       st        j
                  S t        j                  t        j                  t        j                  t        j                  f}t        | ||||||«      }|D ]ä  }	|	t        j                  k(  rt        |«      rt        j                  c S |	t        j                  k(  r(t        |«      rt        |«      rt        j                  c S |	t        j                  k(  r(t        |«      rt        |«      rt        j                  c S |	t        j                  k(  sŒ½t        «       sŒÈt!        |«      sŒÔt        j                  c S  t"        j%                  d«       t        |d¬«       t        |d¬«       t"        j%                  d«       t        |d¬«       t        |d¬«       t"        j%                  d«       t!        |d¬«       t"        j%                  d«       t        |d¬«       t        j
                  S )Nz)Memory efficient kernel not used because:T)r(   z(Flash attention kernel not used because:z'Math attention kernel not used because:z(cuDNN attention kernel not used because:)r   r
   r	   r   r   ÚERRORÚFLASH_ATTENTIONÚEFFICIENT_ATTENTIONÚMATHÚCUDNN_ATTENTIONr   r   r   rY   r   r[   r`   r2   r3   )
r   r   r   r   Údropoutr   Ú
enable_gqaÚorderingr$   Úbackends
             r!   Ú_select_sdp_backendrk   %  s•  € äÔÜ)Ô+Ü Ô"Ü!Ô#ä×ÑÐô 	×"Ñ"Ü×&Ñ&Ü�‰Ü×"Ñ"ð	€Hô ˜˜s E¨9°g¸yÈ*ÓU€Fàò 'ˆØ”j×0Ñ0Ò0Ü& vÔ.Ü!×1Ñ1Ò1Ø”j×0Ñ0Ò0Ü& vÔ.Ô3MÈfÔ3UÜ!×1Ñ1Ò1Ø”j×4Ñ4Ò4Ü*¨6Ô2Ô7UØô8ô "×5Ñ5Ò5Ø”j—o‘oÓ%ÜÕ!Ô&?ÀÕ&GÜ!—‘Ò&ð'ô  ‡K�KÐ;Ô<Ü ¨dÕ3Ü" 6°Õ6Ü‡K�KÐ:Ô;Ü˜F¨$Õ/Ü˜v¨TÕ2Ü‡K�KÐ9Ô:Ü˜f¨DÕ1Ü‡K�KÐ:Ô;Ü˜F¨$Õ/Ü×ÑÐr#   Úqkvc                 ó  — t        | t        «      st        d«      ‚| j                  «       €g| j	                  «       j                  t        j                  | j                  ¬«      }| j                  «       }| j                  «       j                  d   }nt| j                  «       j                  d«      j                  t        j                  | j                  ¬«      }| j                  «       }t        |d   j                  «       «      }|||fS )Nz<QKV must be nested for flash cumulative_seq_len calculation.)r   r   r   r/   )r   r   r   ÚlengthsÚoffsetsÚtor   Úint32r   Ú_get_max_seqlenÚvaluesÚshapeÚcumsumÚintÚitem)rl   Úcumulative_seqlenÚ
max_seqlenÚn_elems       r!   Ú_cumulative_and_max_seq_len_nnzr{   T  s×   € ô �cœ<Ô(ÜÐWÓXÐXà
‡{�{ƒ}ÐàŸK™K›M×,Ñ,´5·;±;ÀsÇzÁzÐ,ÓRÐØ×(Ñ(Ó*ˆ
Ø—‘“×#Ñ# AÑ&‰ð �K‰K‹M× Ñ  Ó#×&Ñ&¬U¯[©[ÀÇÁÐ&ÓLð 	ð ×(Ñ(Ó*ˆ
äÐ& rÑ*×/Ñ/Ó1Ó2ˆØ˜j¨&Ð0Ð0r#   Útensorc                 óÄ   — t        | t        «      sJ ‚| j                  «       }| j                  }|j	                  d«      dz
  }|dk  ry|d   }|dd  D ]  }||k  r y|}Œ y)Nr   r   Tr]   F)r   r   ro   Ú_stridesr'   )r|   ro   ÚstridesÚ	n_tensorsÚprev_strideÚstrides         r!   Ú!_is_safe_to_get_storage_as_tensorrƒ   o  s|   € ô �fœlÔ+Ð+Ð+Ø�n‰nÓ€GØ�o‰o€Gà—‘˜Q“ !Ñ#€IØ�A‚~Øð ˜!‘*€KØ˜!˜"�+ò ˆØ˜&Ò ñ Ø‰ðð r#   ÚNnzÚ	num_headsÚhead_dimc                 ó`   — | j                   r| j                  «       S | j                  |||«      S ©N)r   rs   Úview)r|   r„   r…   r†   s       r!   Ú_view_as_denserŠ   Ž  s,   € ð ×ÒØ�}‰}‹ÐØ�;‰;�s˜I xÓ0Ð0r#   c                 ó  — | j                  d«      }|j                  d«      }|j                  d«      }| j                  d«      }|j                  d«      }|j                  d«      }||k(  r||k(  r
||k(  r||k(  st        d«      ‚| j                  d«      }	| j                  d«      }
|j                  d«      }| j                  dd«      }|j                  dd«      }|j                  dd«      }t        |«      \  }}}t        |«      \  }}}|j	                  «       st        |«      s|j                  «       }|j	                  «       st        |«      s|j                  «       }|j	                  «       st        |«      s|j                  «       }t        |||	|
«      }t        |||	|
«      }t        |||	|«      }|j                  «       |j                  «       |j                  «       |j                  «       dœ}||||||||fS )Nr   r   z<This path is currently not implemented for jagged layout NT.r   r]   )ro   rn   ry   Ú
min_seqlen)r'   ÚRuntimeErrorr^   r{   r_   rƒ   Ú
contiguousrŠ   ro   rn   rr   rB   )r   r   r   r)   r*   r+   rO   rP   rQ   r…   Úhead_dim_qkÚ
head_dim_vÚq_tÚk_tÚv_tÚcumulative_sequence_length_qÚmax_seqlen_batch_qÚNnz_qÚcumulative_sequence_length_kvÚmax_seqlen_batch_kvÚNnz_kvÚquery_buffer_reshapedÚkey_buffer_reshapedÚvalue_buffer_reshapedÚoutput_nt_infos                            r!   Ú_sdpa_nested_preprocessingrž   $  sõ  € ð —:‘:˜a“=€LØ—8‘8˜A“;€LØ—:‘:˜a“=€Là—*‘*˜Q“-€KØ—(‘(˜1“+€KØ—*‘*˜Q“-€Kà˜LÒ(¨\¸\Ò-IØ�{Ò" {°kÒ'AäØJó
ð 	
ð
 —
‘
˜1“€IØ—*‘*˜Q“-€KØ—‘˜A“€JØ
�/‰/˜!˜QÓ
€CØ
�-‰-˜˜1Ó
€CØ
�/‰/˜!˜QÓ
€Cô 	(¨Ó,ñ	Ø$ØØô 	(¨Ó,ñ	Ø%ØØð ×ÑÔÔ'HÈÔ'MØ�n‰nÓˆØ×ÑÔÔ'HÈÔ'MØ�n‰nÓˆØ×ÑÔÔ'HÈÔ'MØ�n‰nÓˆä*¨3°°yÀ+ÓNÐÜ(¨¨f°iÀÓMÐÜ*¨3°¸	À:ÓNÐð —;‘;“=Ø—;‘;“=Ø×)Ñ)Ó+Ø×)Ñ)Ó+ñ	€Nð 	ØØØ$Ø%ØØØð	ð 	r#   Úalignment_sizeÚslicec                 óº   — | j                  d«      }||z  dk(  r| S |||z  z
  }t        j                  j                  j	                  | d|g«      } |r	| dd|…f   S | S )Nr/   r   .)r'   r   ÚnnÚ
functionalÚpad)r|   rŸ   r    Úlast_dim_sizeÚ	pad_counts        r!   Ú_pad_last_dimr§   n  sn   € ð —K‘K “O€MØ�~Ñ%¨Ò*ØˆØ -°.Ñ"@ÑA€IÜ�X‰X× Ñ ×$Ñ$ V¨a°¨^Ó<€FÙØ�c˜1˜]˜?Ð*Ñ+Ð+Ø€Mr#   c                 ó`   — |�|}|S t        j                  d| j                  d«      z  «      }|S )Ng      ð?r/   )r   Úsym_sqrtr'   )r   r    Úsoftmax_scales      r!   Ú_calculate_scaler«   �  s6   € à"Ð.�E€MØÐô 5:·N±NÀ3ÈÏÉÐTVËÑCWÓ4X€MØÐr#   Úoutc                 óX   — | j                   s| j                  d«      |k7  r	| dd|…f   } | S )Nr/   .r   )r   r'   )r¬   Úog_sizes     r!   Ú_post_process_flash_outputr¯   ‡  s/   € Ø�=Š=˜SŸX™X b›\¨WÒ4Ø�#�q˜�y�.Ñ!ˆØ€Jr#   c                 óæ   — t         j                  j                  «       sS| j                  j                  dk(  r:t         j
                  j                  j                  «       }t        d„ |D «       «      S y)NÚmetac              3   ó|   K  — | ]4  }t        |«      t        j                  j                  j                  k(  –— Œ6 y ­wrˆ   )Útyper   ÚutilsÚflop_counterÚ_FlopCounterMode)Ú.0Úxs     r!   ú	<genexpr>z+_is_computing_meta_flops.<locals>.<genexpr>”  s1   è ø€ ò 
àô �‹G”u—{‘{×/Ñ/×@Ñ@Õ@ñ
ùs   ‚:<F)	r   ÚjitÚis_scriptingr   r³   r´   Ú_python_dispatchÚ _get_current_dispatch_mode_stackÚany)r¸   Útorch_dispatch_mode_stacks     r!   Ú_is_computing_meta_flopsrÀ   �  s_   € ô �9‰9×!Ñ!Ô#¨¯©¯©¸Ò(?ä�K‰K×(Ñ(×IÑIÓKð 	"ô ñ 
à.ô
ó 
ð 	
ð r#   c                 óÂ   ‡— | j                   j                  Št        | «      st        j                  ‰«      s| |||fS ˆfd„} || «       ||«       ||«       ||«      fS )a*  
    [Autocasting SDPA for NJT]

    Normal autocasting doesn't work for NJT+SDPA right now:
    * NJT intercepts the __torch_function__ call for scaled_dot_product_attention, which happens
      before we get to any aten ops or dispatcher logic; then the torch_function logic calls into
      efficient attention or flash attention. So, autocasting on the scaled_dot_product_attention
      op won't work because we never see that aten op.
    * If we put autocasting on `_flash_attention_forward`, then we'll get autocasting to run, but
      the kernel selection logic in torch_function handling (ie. jagged_scaled_dot_product_attention)
      won't work correctly: the kernel selection logic will run before autocasting, and choose
      a kernel based on the un-autocasted dtypes; but then autocasting will run and the actual
      attention computation will happen in a different dtype.

    An alternative is to just change the backend selection logic for SDPA+NJT to be autocast-aware
    and rely on autocasting to do the actual conversions for flash attention / efficient attention.
    However, by manually doing the actual autocast before the backend selection, we ensure that the
    autocast handling for backend selection doesn't diverge from the autocast handling for the
    actual dtype conversions.
    c                 óà   •— | €| S t        j                  ‰«      }| j                  j                  r,| j                  |k(  s| j                  t         j                  k(  r| S | j                  |«      S rˆ   )r   Úget_autocast_dtyper   Úis_floating_pointÚfloat64rp   )r¸   Útarget_dtypeÚdevice_types     €r!   Úcvtz_autocast.<locals>.cvtº  sZ   ø€ Øˆ9ØˆHÜ×/Ñ/°Ó<ˆà—‘×*Ò*Ø�w‰w˜,Ò&Ø�w‰wœ%Ÿ-™-Ò'àˆHØ�t‰t�LÓ!Ð!r#   )r   r³   rÀ   r   Úis_autocast_enabled)r   r   r   r   rÈ   rÇ   s        @r!   Ú	_autocastrÊ   ›  s^   ø€ ð4 —,‘,×#Ñ#€Kä Ô&¬e×.GÑ.GÈÔ.TØ�c˜5 )Ð+Ð+ô
"ñ ˆu‹:‘s˜3“x¡ U£©S°«^Ð;Ð;r#   c                 óv	  — t        | |||«      \  } }}}t        | ||||||«       t        | t        «      r t        |t        «      rt        |t        «      sJ ‚ddlm} | j                  «       dkD  rØ|j                  «       dkD  rÅ|j                  «       dkD  r²| j                  dk(  r£t        j                  | j                  «       |j                  «       |j                  «       t        |t        «      r|j                  «       n||||¬«      }	 ||	| j                  «       | j                  «       | j                  | j                  ¬«      S | j                  xs |j                  xs |j                  }
t!        | ||||||«      }t#        | «      rt$        j&                  }|t$        j&                  k(  r¹| j)                  d«      }t+        | dd	«      }t+        |dd	«      }t+        |dd	«      }t-        | |«      }t/        |||«      \  }}}}}}}}t0        j2                  j4                  j7                  |||||||||d	|¬
«      \  }}}}} ||fi |¤Žj9                  dd«      }t;        ||«      S |t$        j<                  k(  r°t/        | ||«      \  }}} }}}}}t0        j2                  j4                  j?                  |jA                  d«      |jA                  d«      | jA                  d«      d |||||tC        |«      |
|¬
«      \  }}!}"}#}$} ||jE                  d«      fi |¤Žj9                  dd«      S |t$        jF                  k(  rot/        | ||«      \  }}} }}}}}t0        j2                  j4                  jI                  ||| ||||||
||d	|¬
«      \	  }}%}&}'}$}(}"}#}) ||fi |¤Žj9                  dd«      S |t$        jJ                  k(  rð| j                  «       }*| j                  «       }+| j                  },| j                  }-| jL                  d   }.|jL                  d   }/d„ }0 |0| «      }  |0|«      } |0|«      }t1        jN                  | ||||||¬
«      d   }1|1j9                  dd«      jQ                  «       j                  «       }1|1jS                  d|.|/«      }1 ||1|*|+|,|-¬«      j9                  dd«      }1|1S tU        d«      ‚)Nr   )Ú'nested_view_from_values_offsets_lengthsr   r   )r   r   r   r    )rŒ   ry   r/   r0   F)r    r]   c                 óV  — | j                   dd  | j                   d d z
  }t        j                  | dd«      }|j                  «       j	                  t        |«      d¬«      }t        j                  j                  t        |«      «      }|j                  dd«      j                  «       }|S )Nr   r/   r]   r   )r   )	Ú_offsetsr   r^   rs   ÚsplitÚlistÚnestedÚas_nested_tensorrŽ   )Újagged_layout_ntrn   r^   Útensor_listÚ
strided_nts        r!   Ú get_strided_layout_nested_tensorzMjagged_scaled_dot_product_attention.<locals>.get_strided_layout_nested_tensor‡  s˜   € Ø&×/Ñ/°°Ð3Ð6F×6OÑ6OÐPSÐQSÐ6TÑTˆGÜŸ™Ð(8¸!¸QÓ?ˆIØ#×*Ñ*Ó,×2Ñ2´4¸³=ÀaÐ2ÓHˆKÜŸ™×6Ñ6´t¸KÓ7HÓIˆJØ#×-Ñ-¨a°Ó3×>Ñ>Ó@ˆJØÐr#   )rn   rŒ   ry   z=No viable backend for scaled_dot_product_attention was found.)+rÊ   r"   r   r   Ú$torch.nested._internal.nested_tensorrÌ   r   r   ÚFÚscaled_dot_product_attentionrs   ro   rn   Ú_maybe_min_seqlenÚ_maybe_max_seqlenrK   rk   rÀ   r   rc   r'   r§   r«   rž   r   ÚopsÚatenÚ_flash_attention_forwardr^   r¯   rd   Ú_efficient_attention_forwardÚ	unsqueezerv   Úsqueezerf   Ú_cudnn_attention_forwardre   Ú_sizeÚ"_scaled_dot_product_attention_mathrŽ   r‰   r�   )2r   r   r   r   r   r   r    rh   rÌ   ÚoutputÚcompute_logsumexpÚbackend_choicer®   Úquery_paddedÚ
key_paddedÚvalue_paddedÚog_scalerš   r›   rœ   r”   r—   r•   r˜   r�   Ú	attentionÚ
_logsumexpÚ_philox_seedÚ_philox_offsetÚ_debug_attn_maskÚquery_reshapedÚkey_reshapedÚvalue_reshapedÚ
log_sumexpÚseedÚoffsetÚmax_seqlen_qÚ	logsumexpÚcum_seqlen_qÚcum_seqlen_kvÚmax_seqlen_kvÚ_ro   Ú	q_lengthsrŒ   ry   Úd1Úd2rÖ   Úattn_outs2                                                     r!   Ú#jagged_scaled_dot_product_attentionr  É  s6  € ô $-¨U°C¸À	Ó#JÑ €Eˆ3��yÜ˜  U¨I°yÀ)ÈUÔSô 	�5œ,Ô'Ü�sœLÔ)Ü�uœlÔ+ðð	,õð ‡y�yƒ{�Q‚˜3Ÿ7™7›9 qš=¨U¯Y©Y«[¸1ª_À×ARÑARÐVWÒAWÜ×/Ñ/Ø�L‰L‹NØ�J‰J‹LØ�L‰L‹Nä&0°¼LÔ&I�	× Ñ Ô"ÈyàØØô

ˆñ 7ØØ�M‰M‹OØ�M‰M‹OØ×.Ñ.Ø×.Ñ.ô
ð 	
ð ×+Ñ+ÒW¨s×/@Ñ/@ÒWÀE×DWÑDWÐä(Øˆs�E˜9 i°¸Jó€Nô   Ô&ô
 $×3Ñ3ˆàœ×3Ñ3Ò3Ø—*‘*˜R“.ˆÜ$ U¨A¨uÓ5ˆÜ" 3¨¨5Ó1ˆ
Ü$ U¨A¨uÓ5ˆä# E¨5Ó1ˆô ' |°ZÀÓNñ		
Ø!ØØ!Ø(Ø)ØØØô �I‰I�N‰N×3Ñ3Ø!ØØ!Ø(Ø)ØØØØØØð 4ó 
ñ	
ØØØØØñ <Øñ
àñ
÷ ‰)�A�q‹/ð 	ô *¨)°WÓ=Ð=Ø	œ:×9Ñ9Ò	9ô ' u¨c°5Ó9ñ		
ØØØØ(Ø)ØØØô �I‰I�N‰N×7Ñ7Ø×$Ñ$ QÓ'Ø×"Ñ" 1Ó%Ø×$Ñ$ QÓ'ØØ(Ø)ØØØÜ�	‹NØØð 8ó 
ñ	
ØØØØØØñ  7Ø×Ñ˜aÓ ñ
àñ
÷ ‰)�A�q‹/ð	ð 
œ:×5Ñ5Ò	5ô ' u¨c°5Ó9ñ		
ØØØØ(Ø)ØØØô �I‰I�N‰N×3Ñ3ØØØØØ(Ø)ØØØØØØØð 4ó 
ñ
	
ØØØØØØØØØñ  7Øñ
àñ
÷ ‰)�A�q‹/ð	ð 
œ:Ÿ?™?Ò	*ð —-‘-“/ˆØ—M‘M“Oˆ	Ø×,Ñ,ˆ
Ø×,Ñ,ˆ
Ø�[‰[˜‰^ˆØ�[‰[˜‰_ˆò	ñ 1°Ó7ˆÙ.¨sÓ3ˆÙ0°Ó7ˆä×;Ñ;Ø�3˜˜y¨)°YÀeô
à
ñˆð
 ×%Ñ% a¨Ó+×6Ñ6Ó8×?Ñ?ÓAˆØ—=‘=  R¨Ó,ˆÙ:ØØØØ!Ø!ô
÷ ‰)�A�q‹/ð 	ð ˆäØKó
ð 	
r#   )Nç        FN)F)Nr  FNF)3ÚloggingÚtypingr   r   Útorch.nnÚtorch.nn.functionalr¢   r£   rØ   Útorch.backends.cudar   r   r   r   r   r	   r
   r   Útorch.nn.attentionr   Únested_tensorr   Ú	getLoggerÚ__name__r2   ÚTensorr"   r   r,   r:   r>   ÚstrrC   rI   rS   rY   r[   r`   rk   Útuplerv   r{   rƒ   rŠ   rž   r§   r«   r¯   rÀ   rÊ   r  © r#   r!   ú<module>r     sÍ  ðã Ý ã Û ß Ð ÷	÷ 	ó 	õ *å 'ð €g×Ñ˜Ó!€ð )-ØØØ
ñ0Ø�<‰<ð0à	�‰ð0ð �<‰<ð0ð ˜Ÿ™Ñ%ó	0ñf
I Zð 
IÀó 
Iñ¨jð È$ó ñ4¨jð È$ó ð6 16ñØ�<‰<ðØ%(ðà	óñ4ÐRVó ñ.8¨
ð 8ÀDó 8ñv	 zð 	À4ó 	ñ¨:ð Àtó ñ jð À$ó ò(,ð^1¨¯©ð 1¸%ÀÇÁÈcÐSVÐ@VÑ:Wó 1ð6¨e¯l©ló ð>1Ø�L‰Lð1Ø"ð1Ø/2ð1Ø>Að1à
‡\�\ó1òlGðTØ�L‰LðØ*-ðØ6:ðà
‡\�\óò&ð E§L¡Ló òð+<Ø�<‰<ð+<à	�‰ð+<ð �<‰<ð+<ð ˜Ÿ™Ñ%ð	+<ð
 ˆ5�<‰<˜Ÿ™ u§|¡|°X¸e¿l¹lÑ5KÐKÑLó+<ðd )-ØØØ
Øñ]
Ø�<‰<ð]
à	�‰ð]
ð �<‰<ð]
ð ˜Ÿ™Ñ%ô	]
r#   