ó
    ‡Ž¡jÿ  ã                   ó´  • S SK r S SKJr  S SKJr  S SKJrJr  S SKJ	r	  S SK
r
S SKJr  SSKJrJrJr   " S	 S
5      r\ " S S5      5       rS\S\4S jrS\S\S\S\4S jrS*S\S\S\S\4S jjrS\S\S\S\4S jr S+S\
R2                  S\\   S\\   S\SS4
S jjrS \S!\S"\S#\S$\	S\\   4S% jrS&\ R:                  S\\   4S' jrS\4S( jr \S) 5       r!g),é    N)Úcontextmanager)Ú	dataclass)ÚceilÚlog2)ÚAny)ÚPretrainedConfigé   )ÚFutureRequestStateÚRequestStateÚRequestStatusc                   ó¾   • \ rS rSrSrSS jrSS jrS\\S4   S\	R                  R                  S-  4S	 jrS\\S4   S
\	R                  R                  SS4S jrSrg)ÚCudaGraphBufferé   z`A dict for CUDA graphs with a special __del__ method to make sure the graphs are properly reset.ÚreturnNc                 ó   • 0 U l         g ©N©Ú_storage)Úselfs    Ú¿C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/generation/continuous_batching/utils.pyÚ__init__ÚCudaGraphBuffer.__init__   s	   € ØEGˆ�ó    c                 ó¦   • U R                   (       a@  U R                   R                  5       u  pUR                  5         U R                   (       a  M?  g g r   )r   ÚpopitemÚreset)r   Ú_Úgraphs      r   Ú__del__ÚCudaGraphBuffer.__del__!   s1   € Ø�m�mØ—}‘}×,Ñ,Ó.‰HˆAØ�K‰KŒMð �m�m‹mr   Úkey.c                 ó8   • U R                   R                  U5      $ r   )r   Úget)r   r!   s     r   Ú	get_graphÚCudaGraphBuffer.get_graph&   s   € Ø�}‰}× Ñ  Ó%Ð%r   r   c                 ó    • X R                   U'   g r   r   )r   r!   r   s      r   Ú	set_graphÚCudaGraphBuffer.set_graph)   s   € Ø"�‰�cÒr   r   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   ÚtupleÚintÚtorchÚcudaÚ	CUDAGraphr$   r'   Ú__static_attributes__© r   r   r   r      sf   † ÙjôHôð
&˜U 3¨ 8™_ð &°·±×1EÑ1EÈÑ1Lô &ð#˜U 3¨ 8™_ð #°U·Z±Z×5IÑ5Ið #Èd÷ #r   r   c                   óD   • \ rS rSr% SrSr\\S'   Sr\\S'   Sr	\\S'   Sr
g)	ÚWorkloadHintsé-   zRA tiny dataclass containing hints to help choose good continuous batching defaultsr   Úmax_prompt_lengthÚmax_generated_lengthÚnum_requestsr4   N)r)   r*   r+   r,   r-   r8   r/   Ú__annotations__r9   r:   r3   r4   r   r   r6   r6   -   s%   ‡ á\àÐ�sÓØ !Ð˜#Ó!Ø€L�#Ör   r6   Úconfigr   c                 ó    • U R                   S;   $ )z:Checks if attention mask is needed for the given (config).)zpaged|eagerz
paged|sdpa)Ú_attn_implementation)r<   s    r   Úattn_mask_is_neededr?   6   s   € à×&Ñ&Ð*GÑGÐGr   ÚsizeÚinterval_sizeÚ	max_valuec                 óX   • US::  a  U$ U S:”  a  [        X-  5      U-  OUn[        X25      $ )zQReturn the smallest multiple of (interval_size) >= (size), capped at (max_value).r   )r   Úmin)r@   rA   rB   Úpaddeds       r   Úpad_to_intervalrF   ;   s5   € à˜ÓØÐØ;?À!»8ŒT�$Ñ&Ó'¨-Ò7È€FÜˆvÓ!Ð!r   ÚvalueÚ	min_valuec                 ó„   • [        U [        SU5      5      n S[        [        [        U 5      5      5      -  n[	        X15      $ )z�Return the smallest power of 2 >= (value), capped at (max_value). If a minimum value is provided, the value is at
least padded to that value.r	   é   )Úmaxr/   r   r   rD   )rG   rB   rH   rE   s       r   Úpad_to_pow2rL   C   s:   € ô �”s˜1˜iÓ(Ó)€EØ”#”dœ4 ›;Ó'Ó(Ñ(€FÜˆvÓ!Ð!r   ÚxÚ	divide_byÚalign_toc                 óV   • [        [        X-  5      5      n X-  (       a	  XX-  -
  -  n U $ r   )r/   r   )rM   rN   rO   s      r   Úaligned_dividerQ   K   s,   € ÜŒD�‘ÓÓ €AØ‡|Ø	˜™Ñ&Ñ&ˆØ€Hr   Úattention_maskÚcumulative_seqlens_qÚcumulative_seqlens_kÚsliding_windowc                 ó*  • [         R                  " U R                  5      R                  n[	        [        U5      S-
  5       HÎ  nXS-      X   -
  nX%S-      X%   -
  nXg:  a  US:¼  a  Xv-
  S-   nOSn[        X   XS-      5      n	[        X%   X%S-      5      n
[         R                  " U SXš4   R                  UU R                  U R                  S9n[         R                  " X¸S9nUS:”  a  Xv-
  U-
  nU[         R                  " X½S9-  nXÀSXš4'   MÐ     g)u~  Builds an attention mask inplace using the cumulative seqlens of the query and key. If given a sliding window, it
will also apply a sliding window mask on top. The attention mask is not boolean, it uses zeroes and -inf (or its
equivalent) so it's more of an attention score bias tensor.
The attention mask is a block-diagonal matrix, with each block an attention mask for a single query-key pair.
Each of those block is built from a causal mask and, if there is a sliding window, a sliding window mask.

An example is represented below, with seqlen_k = 8, seqlen_q = 4 and sliding_window = 6:

CAUSAL MASK:

       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–‘ â–‘ â–‘
       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–‘ â–‘
       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–‘
       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ

SLIDING WINDOW MASK:
     â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ seqlen_k - seqlen_q - sliding_window = 8 - 4 - 6 = -2 offset to the left
   <â”€â”´â”€>
 â–‘ â–ˆ | â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
 â–‘ â–‘ | â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
 â–‘ â–‘ | â–‘ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ
 â–‘ â–‘ | â–‘ â–‘ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ

ATTENTION MASK (sum of causal and sliding window masks):

       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–‘ â–‘ â–‘
       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–‘ â–‘
       â–‘ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–‘
       â–‘ â–‘ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ

Another example with seqlen_k = 5, seqlen_q = 3 and sliding_window = 2:

CAUSAL MASK:

       â–ˆ â–ˆ â–ˆ â–‘ â–‘
       â–ˆ â–ˆ â–ˆ â–ˆ â–‘
       â–ˆ â–ˆ â–ˆ â–ˆ â–ˆ

SLIDING WINDOW MASK:
     â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€ seqlen_k - seqlen_q - sliding_window = 5 - 3 - 2 = 0 offset to the left
    <â”´>
     | â–‘ â–ˆ â–ˆ â–ˆ â–ˆ
     | â–‘ â–‘ â–ˆ â–ˆ â–ˆ
     | â–‘ â–‘ â–‘ â–ˆ â–ˆ

ATTENTION MASK (sum of causal and sliding window masks):

       â–‘ â–ˆ â–ˆ â–‘ â–‘
       â–‘ â–‘ â–ˆ â–ˆ â–‘
       â–‘ â–‘ â–‘ â–ˆ â–ˆ

r	   .)ÚdtypeÚdevice)ÚdiagonalN)r0   ÚfinforW   rD   ÚrangeÚlenÚsliceÚfullÚshaperX   ÚtriuÚtril)rR   rS   rT   rU   rH   ÚiÚseqlen_qÚseqlen_kÚcausal_diagonalÚquery_rangeÚ	key_rangeÚ	minus_infÚmaskedÚsliding_diagonals                 r   Úbuild_attention_maskrk   R   s-  € ôt —’˜N×0Ñ0Ó1×5Ñ5€IÜ”3Ð+Ó,¨qÑ0Ö1ˆØ'¨A©Ñ.Ð1EÑ1HÑHˆØ'¨A©Ñ.Ð1EÑ1HÑHˆØÓ 8¨q£=Ø&Ñ1°AÑ5‰OàˆOÜÐ0Ñ3Ð5IÈaÉ%Ñ5PÓQˆÜÐ.Ñ1Ð3GÈAÉÑ3NÓOˆ	ä—J’JØ˜3 Ð6Ñ7×=Ñ=ØØ ×&Ñ&Ø!×(Ñ(ñ	
ˆ	ô —’˜IÑ@ˆà˜AÓØ'Ñ2°^ÑCÐØ”e—j’j ÑFÑFˆFà6<�s˜KÐ2Ó3ò- 2r   ÚnumÚstatusÚnum_q_tokensÚmax_kv_readÚcachec           
      ó|  • [        U 5       Vs/ s H  nSUR                   SU S3PM     nnX#-   n[        XtR                  -  5      n/ n	U Hg  n
[	        U
S/U-  SS9nXl        S/U-  Ul        X;l        UR                  X‹R                  S5      nUc  U	s  $ U	R                  [        USSUS95        Mi     U	$ s  snf )	zPA utility function to create a list of FutureRequestStates for the warmup of CB.Ú	__warmup_r   Ú__r   r	   )Ú
request_idÚinitial_tokensÚmax_new_tokensT)Úhas_new_tokenÚcomplete_blocksÚquery_length)r[   Únamer   Ú
block_sizer   Ú_statusÚtokens_to_processÚposition_offsetÚallocate_blocksrt   Úappendr
   )rl   rm   rn   ro   rp   rb   Úrequest_idsÚtotal_tokensÚblocks_neededÚfuture_statesÚreq_idÚstateÚ	allocateds                r   Úcreate_warmup_future_statesrˆ   ¦   sÙ   € ô =BÀ#¼JÓGºJ°q�Y˜vŸ{™{˜m¨1¨Q¨C¨rÓ2¹J€KÐGØÑ-€LÜ˜×(8Ñ(8Ñ8Ó9€Mà€MÛˆÜ¨À¸sÀ\Ñ?QÐbcÑdˆØŒØ#$ #¨Ñ"4ˆÔØ +Ôà×)Ñ)¨-×9IÑ9IÈ1ÓMˆ	ØÑØ Ò Ø×ÑÜ˜u°DÈ!ÐZfÑgö	
ñ ð Ðùò# Hs   ŽB9Úrequest_queuec                 óâ   • / nU R                  5       (       d<   U R                  5       nUb  UR                  U5        U R                  5       (       d  M<  U$ ! [        R                   a     U$ f = f)z3Drains a queue and returns a list of RequestStates.)ÚemptyÚ
get_nowaitr€   ÚqueueÚEmpty)r‰   Ú
new_statesr†   s      r   Údrain_queuer�   Ã   st   € à%'€JØ×!Ñ!×#Ñ#ð	Ø!×,Ñ,Ó.ˆEØÑ Ø×!Ñ! %Ô(ð	 ×!Ñ!×#Ó#ð Ðøô �{‰{ó 	ØØÐð	ús   ™$A ÁA.Á-A.c                  ó\   • [         R                  R                  5       n U R                  nX4$ )z=Returns a tuple of (mem_pool, graph_pool_id) for CUDA graphs.)r0   r1   ÚMemPoolÚid)Úmem_poolÚgraph_pool_ids     r   Úget_cuda_poolsr–   Ð   s&   € ä�z‰z×!Ñ!Ó#€HØ—K‘K€MØÐ"Ð"r   c              #   ó†   #   • [         R                  R                  U 5         Sv •  SSS5        g! , (       d  f       g= f7f)z)A context manager to use a CUDA mem pool.N)r0   r1   Úuse_mem_pool)r”   s    r   Úmem_pool_ctxr™   ×   s'   é € ô 
�‰×	 Ñ	  Õ	*Û÷ 
+×	*Ö	*üs   ‚ A¢0§	A°
>ºA)r   )r	   )"r�   Ú
contextlibr   Údataclassesr   Úmathr   r   Útypingr   r0   Ú transformers.configuration_utilsr   Úrequestsr
   r   r   r   r6   Úboolr?   r/   rF   rL   rQ   ÚTensorÚlistrk   rˆ   ÚQueuer�   r.   r–   r™   r4   r   r   Ú<module>r¤      s‰  ðó Ý %Ý !ß Ý ã å =ç EÑ E÷#ñ #ð$ ÷ð ó ððHÐ 0ð H°Tô Hð
"˜#ð "¨cð "¸cð "Àcô "ñ"�sð " sð "°sð "À3õ "ð�cð  cð °Sð ¸Sô ð ñ	Q=Ø—L‘LðQ=à˜s™)ðQ=ð ˜s™)ðQ=ð ð	Q=ð
 
õQ=ðhØ	ðàðð ðð ð	ð
 ðð 
Ð
Ñôð:
˜uŸ{™{ð 
¨t°LÑ/Aô 
ð#˜ô #ð ñó ñr   