+
    œ°³jÿ  ã                   ó  € ^ RI t ^ RIHt ^ RIHt ^ RIHtHt ^ RIH	t	 ^ RI
t
^ RIHt ^RIHtHtHt  ! R R	4      t] ! R
 R4      4       tR R ltR R ltRR R lltR R ltRR R lltR R ltR R ltR R lt]R 4       tR# )é    N)Úcontextmanager)Ú	dataclass)ÚceilÚlog2)ÚAny)ÚPretrainedConfig)ÚFutureRequestStateÚRequestStateÚRequestStatusc                   ól   a € ] tR t^t o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltR
t	V t
R# )ÚCudaGraphBufferz`A dict for CUDA graphs with a special __del__ method to make sure the graphs are properly reset.c                ó   <€ V ^8„  d   QhRR/# ©é   ÚreturnN© )ÚformatÚ__classdict__s   "€Úr/home/luca/screen-checking/.venv/lib/python3.14/site-packages/transformers/generation/continuous_batching/utils.pyÚ__annotate__ÚCudaGraphBuffer.__annotate__   s   ø€ ÷ Hñ H˜$ñ Hó    c                ó   € / V n         R # ©N©Ú_storage)Úselfs   &r   Ú__init__ÚCudaGraphBuffer.__init__   s	   € ØEGˆŽr   c                ó   <€ V ^8„  d   QhRR/# r   r   )r   r   s   "€r   r   r   !   s   ø€ ÷ ñ ˜ñ r   c                ó†   € V P                   '       d/   V P                   P                  4       w  rVP                  4        K@  R # r   )r   ÚpopitemÚreset)r   Ú_Úgraphs   &  r   Ú__del__ÚCudaGraphBuffer.__del__!   s-   € Ø�m�mˆmØ—}‘}×,Ñ,Ó.‰HˆAØ�K‰KŽMñ r   c                óp   <€ V ^8„  d   QhRS[ S[R3,          RS[P                  P                  R,          /# )r   Úkey.r   N©ÚtupleÚintÚtorchÚcudaÚ	CUDAGraph)r   r   s   "€r   r   r   &   s2   ø€ ÷ &ñ &™U¡3¨ 8�_ð &±·±×1EÑ1EÈÕ1Lñ &r   c                ó8   € V P                   P                  V4      # r   )r   Úget)r   r)   s   &&r   Ú	get_graphÚCudaGraphBuffer.get_graph&   s   € Ø�}‰}× Ñ  Ó%Ð%r   c                óf   <€ V ^8„  d   QhRS[ S[R3,          RS[P                  P                  RR/# )r   r)   .r%   r   Nr*   )r   r   s   "€r   r   r   )   s4   ø€ ÷ #ñ #™U¡3¨ 8�_ð #±U·Z±Z×5IÑ5Ið #Èdñ #r   c                ó"   € W P                   V&   R # r   r   )r   r)   r%   s   &&&r   Ú	set_graphÚCudaGraphBuffer.set_graph)   s   € Ø"�‰�cÓr   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r&   r2   r6   Ú__static_attributes__Ú__classdictcell__©r   s   @r   r   r      s2   ø‡ € Ùj÷Hð H÷ð ÷
&ð &÷#ö #r   r   c                   ó<   a € ] tR t^-t o Rt^ t^ t^ tV 3R ltRt	V t
R# )ÚWorkloadHintszRA tiny dataclass containing hints to help choose good continuous batching defaultsc                ó>   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   # )r   Úmax_prompt_lengthÚmax_generated_lengthÚnum_requests©r,   )r   r   s   "€r   r   ÚWorkloadHints.__annotate__-   s,   ø‡ ‚ ñ Ññ	 ñ
 Ñ!ñ ñ Ñò r   r   N)r8   r9   r:   r;   r<   rC   rD   rE   Ú__annotate_func__r=   r>   r?   s   @r   rA   rA   -   s    ø‡ € á\àÐØ !ÐØ€L÷ ƒ r   rA   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úconfigr   )r   Úbool)r   s   "r   r   r   6   s   € ÷ Hñ HÔ 0ð H´Tñ Hr   c                ó    € V P                   R9   # )z:Checks if attention mask is needed for the given (config).)zpaged|eagerz
paged|sdpa)Ú_attn_implementation)rJ   s   &r   Úattn_mask_is_neededrN   6   s   € à×&Ñ&Ð*GÑGÐGr   c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r   ÚsizeÚinterval_sizeÚ	max_valuer   rF   )r   s   "r   r   r   ;   s(   € ÷ "ñ "œ#ð "¬cð "¼cð "Äcñ "r   c                ól   € V^ 8:  d   V# V ^ 8”  d   \        W,          4      V,          MTp\        W24      # )zQReturn the smallest multiple of (interval_size) >= (size), capped at (max_value).)r   Úmin)rP   rQ   rR   Úpaddeds   &&& r   Úpad_to_intervalrV   ;   s5   € à˜ÔØÐØ;?À!¼8ŒT�$Õ&Ó'¨-Ö7È€FÜˆvÓ!Ð!r   c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r   ÚvaluerR   Ú	min_valuer   rF   )r   s   "r   r   r   C   s(   € ÷ "ñ "”sð "¤sð "´sð "Ä3ñ "r   c                óŒ   € \        V \        ^V4      4      p ^\        \        \        V 4      4      4      ,          p\	        W14      # )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.)Úmaxr,   r   r   rT   )rX   rR   rY   rU   s   &&& r   Úpad_to_pow2r\   C   s:   € ô �”s˜1˜iÓ(Ó)€EØ”#”dœ4 ›;Ó'Ó(Õ(€FÜˆvÓ!Ð!r   c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r   ÚxÚ	divide_byÚalign_tor   rF   )r   s   "r   r   r   K   s(   € ÷ ñ ”cð ¤cð ´Sð ¼Sñ r   c                 ó€   € \        \        W,          4      4      p W,          '       d   WW,          ,
          ,          p V # r   )r,   r   )r^   r_   r`   s   &&&r   Úaligned_dividerb   K   s.   € ÜŒD�•ÓÓ €AØ‡|„|Ø	˜�Õ&Õ&ˆØ€Hr   c          
      óŒ   € V ^8„  d   QhR\         P                  R\        \        ,          R\        \        ,          R\        RR/# )r   Úattention_maskÚcumulative_seqlens_qÚcumulative_seqlens_kÚsliding_windowr   N)r-   ÚTensorÚlistr,   )r   s   "r   r   r   R   sM   € ÷ Q=ñ Q=Ü—L‘LðQ=äœs�)ðQ=ô œs�)ðQ=ô ð	Q=ð
 
ñQ=r   c                óð  € \         P                  ! V P                  4      P                  p\	        \        V4      ^,
          4       EF+  pW^,           ,          W,          ,
          pW%^,           ,          W%,          ,
          pWg8  d   V^8¼  d   Wv,
          ^,           pM^p\        W,          W^,           ,          4      p	\        W%,          W%^,           ,          4      p
\         P                  ! V RWš3,          P                  VV P                  V P                  R7      p\         P                  ! W¸R7      pV^8”  d.   Wv,
          V,
          pV\         P                  ! W½R7      ,          pWÀRWš3&   EK.  	  R# )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):

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

.)ÚdtypeÚdevice)ÚdiagonalN)r-   Úfinfork   rT   ÚrangeÚlenÚsliceÚfullÚshaperl   ÚtriuÚtril)rd   re   rf   rg   rY   ÚiÚseqlen_qÚseqlen_kÚcausal_diagonalÚquery_rangeÚ	key_rangeÚ	minus_infÚmaskedÚsliding_diagonals   &&&&          r   Úbuild_attention_maskr   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   c                óv   € V ^8„  d   QhR\         R\        R\         R\         R\        R\        \        ,          /# )r   ÚnumÚstatusÚnum_q_tokensÚmax_kv_readÚcacher   )r,   r   r   ri   r	   )r   s   "r   r   r   ¦   sJ   € ÷ ñ Ü	ðäðô ðô ð	ô
 ðô 
Ô
Õñr   c           
     ó¨  € \        V 4       Uu. uF  pRVP                   RV R2NK  	  ppW#,           p\        WtP                  ,          4      p. p	V Fv  p
\	        V
^ .V,          ^R7      pWn        ^ .V,          Vn        W;n        VP                  W‹P                  ^ 4      pVf   V	u # V	P                  \        VR^ VR7      4       Kx  	  V	# u upi )zPA utility function to create a list of FutureRequestStates for the warmup of CB.Ú	__warmup_r$   Ú__)Ú
request_idÚinitial_tokensÚmax_new_tokensT)Úhas_new_tokenÚcomplete_blocksÚquery_length)ro   Únamer   Ú
block_sizer
   Ú_statusÚtokens_to_processÚposition_offsetÚallocate_blocksr‰   Úappendr	   )r�   r‚   rƒ   r„   r…   rv   Ú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   ŽCc                óZ   € V ^8„  d   QhR\         P                  R\        \        ,          /# )r   Úrequest_queuer   )ÚqueueÚQueueri   r
   )r   s   "r   r   r   Ã   s#   € ÷ 
ñ 
œuŸ{™{ð 
¬t´LÕ/Añ 
r   c                óÂ   € . pV P                  4       '       g+    V P                  4       pVe   VP                  V4       K>  K@  V#   \        P                   d     T# i ; i)z3Drains a queue and returns a list of RequestStates.)ÚemptyÚ
get_nowaitr•   r    ÚEmpty)rŸ   Ú
new_statesr›   s   &  r   Údrain_queuer§   Ã   sh   € à%'€JØ×!Ñ!×#Ò#ð	Ø!×,Ñ,Ó.ˆEØÒ Ø×!Ñ! %Ö(ñ !ð Ðøô �{‰{ô 	ØØÐð	ús   š%A ÁAÁAc                ó$   € V ^8„  d   QhR\         /# )r   r   )r+   )r   s   "r   r   r   Ð   s   € ÷ #ñ #œñ #r   c                 ó\   € \         P                  P                  4       p V P                  pW3# )z=Returns a tuple of (mem_pool, graph_pool_id) for CUDA graphs.)r-   r.   ÚMemPoolÚid)Úmem_poolÚgraph_pool_ids     r   Úget_cuda_poolsr®   Ð   s&   € ä�z‰z×!Ñ!Ó#€HØ—K‘K€MØÐ"Ð"r   c              #  óž   "  € \         P                  P                  V 4      ;_uu_ 4        Rx € RRR4       R#   + '       g   i     R# ; i5i)z)A context manager to use a CUDA mem pool.N)r-   r.   Úuse_mem_pool)r¬   s   &r   Úmem_pool_ctxr±   ×   s-   é € ô 
�‰×	 Ñ	  ×	*Õ	*Û÷ 
+×	*×	*Ò	*üs   ‚(Aª9¯
A¹A
	Á	A)r   )é   )r    Ú
contextlibr   Údataclassesr   Úmathr   r   Útypingr   r-   Ú transformers.configuration_utilsr   Úrequestsr	   r
   r   r   rA   rN   rV   r\   rb   r   r�   r§   r®   r±   r   r   r   Ú<module>r¹      s„   ðó Ý %Ý !ß Ý ã å =ç EÑ E÷#ñ #ð$ ÷ð ó ðõHõ
"÷"õ÷Q=õhõ:
õ#ð ñó òr   