+
    œ°³jqQ  ã                   óš   € R t ^ RIt^ RIHt ^ RIHt ^ RIt^RIHt ^RI	H
t
 ^RIHt ^RIHtHtHtHt ^RIHt R	 R
 lt ! R R4      tR# )uª  Centralized offloading logic for continuous batching.

Handles two offloading strategies when the GPU KV cache is full:
  1. CPU offloading: copy the KV cache to a pre-allocated pinned CPU buffer, preserving exact request state.
  2. Soft reset: discard the KV cache and re-prefill from scratch when the request is re-scheduled. This incurs no data
    transfer overhead, but we need to re-run prefill over all initial + generated tokens (so more compute overhead).

The CPU swap pool is a static set of pinned tensors allocated once at init (like vLLM/SGLang). Blocks are tracked
with a simple free set â€” no dynamic allocation or deallocation of tensors ever happens at runtime.
N)Únullcontext)Úchain)Úis_psutil_available)ÚPagedAttentionCache)ÚDistributedHelper)ÚFutureRequestStateÚRequestStateÚRequestStatusÚlogger)Ú	Schedulerc                óˆ   € V ^8„  d   QhR\         \        ,          R\         \        \        \        \        3,          ,          /# )é   ÚindicesÚreturn)ÚlistÚintÚtuple)Úformats   "Ú/home/luca/screen-checking/.venv/lib/python3.14/site-packages/transformers/generation/continuous_batching/offloading_manager.pyÚ__annotate__r   &   s.   € ÷ ñ œT¤#�Yð ¬4´´c¼3Ä°mÕ0DÕ+Eñ ó    c                ó0  € . pV '       g   V# V ^ ,          ;r#^ p\        ^\        V 4      4       FA  pW,          V^,           8w  d#   VP                  W$WT,
          34       W,          TrBW,          pKC  	  VP                  W$\        V 4      V,
          34       V# )z•Groups an index list into (start_index, offset, length) runs of consecutive values, so scattered block copies
can be performed as a few slice copies.)ÚrangeÚlenÚappend)r   ÚrunsÚstartÚprevÚoffsetÚis   &     r   Úcontiguous_runsr    &   s‰   € ð €DßØˆØ˜1•:Ð€EØ€FÜ�1”c˜'“lÖ#ˆØ�:˜ �Ô!Ø�K‰K˜¨­
Ð3Ô4Ø#�J¨�6Ø�zŠñ	 $ð
 	‡K�K�¤ G£¨vÕ 5Ð6Ô7Ø€Kr   c                   óÐ   a € ] tR t^7t o RtV 3R lR ltV 3R lR ltR tV 3R lR ltV 3R	 lR
 lt	RV 3R lR ll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# )ÚOffloadingManageru#  Manages request offloading and restoration for continuous batching.

Owns a static CPU swap pool (pre-allocated pinned tensors mirroring the GPU cache layout), performs GPUâ†”CPU block
copies, decides between CPU offloading and soft reset, and ensures cleanup on cancellation/failure/reset.
c                ó†   <€ V ^8„  d   QhRS[ RS[RS[R,          RS[RS[P                  P
                  R,          RS[RR/# )	r   ÚcacheÚ	schedulerÚcpu_offload_space_gibNÚsafety_thresholdÚcompute_streamÚdistributed_helperr   )r   r   ÚfloatÚtorchÚcudaÚStreamr   )r   Ú__classdict__s   "€r   r   ÚOffloadingManager.__annotate__>   sd   ø€ ÷ 9
ñ 9
á"ð9
ñ ð9
ñ  % t�|ð	9
ñ
  ð9
ñ Ÿ
™
×)Ñ)¨DÕ0ð9
ñ .ð9
ð 
ñ9
r   c           	     óê  € Wn         W n        WPn        . V n        . V n        . V n        . V n        . V n        / V n        / V n	        V P                  W44      p\        P                  ! V\        P                  R R7      p\        VP                  VRR7      P!                  4       4      V n        VRJ;'       d    V^ 8„  pV P"                  ^ 8X  d&   V'       d   \$        P&                  ! RVR R24       R# V P"                  VP(                  VP*                  VP,                  3p	VP.                   Fy  p
V P                  P1                  \        P2                  ! W‘P4                  RR7      4       V P                  P1                  \        P2                  ! W‘P4                  RR7      4       K{  	  RVP(                  VP*                  VP,                  3p\7        VP.                  VP8                  4       FW  w  rÍV P
                  P1                  VP:                  ! V!  4       V P                  P1                  VP:                  ! V!  4       KY  	  \=        \?        V P"                  4      4      V n        V P                  ^ ,          p^VPA                  4       ,          VPC                  4       ,          \E        VP.                  4      ,          p\$        PF                  ! R	V P"                   R
VR,          R R24       R# )Úcpu©ÚdtypeÚdeviceT)Úon_cpuNúcpu_offload_space=ú.1fz8 GiB is too small for even one block. No CPU offloading.)r3   Ú
pin_memoryzCPU swap pool initialized: z	 blocks (ú.2fz GiB pinned)éÿÿÿÿé   @)$r$   r%   Ú_compute_streamÚ_cpu_key_cacheÚ_cpu_value_cacheÚ_gpu_key_viewsÚ_gpu_value_viewsÚ_free_cpu_blocksÚ_request_id_to_cpu_blocksÚ!_request_id_to_group_block_countsÚ_compute_num_cpu_blocksr+   ÚtensorÚint32r   Útp_all_reduce_minÚitemÚ_num_cpu_blocksr
   ÚwarningÚ
block_sizeÚnum_key_value_headsÚhead_dimÚ	key_cacher   Úemptyr3   ÚzipÚvalue_cacheÚviewr   r   ÚnumelÚelement_sizer   Úinfo)Úselfr$   r%   r&   r'   r(   r)   Únum_cpu_blocksÚoffloading_enabledÚcpu_cache_shapeÚ_Úblock_shapeÚk_cacheÚv_cacheÚcache_tensorÚsize_in_bytess   &&&&&&&         r   Ú__init__ÚOffloadingManager.__init__>   sy  € ð Œ
Ø"Œà-Ôð 35ˆÔØ46ˆÔØ24ˆÔØ46ˆÔØ+-ˆÔØ?AˆÔ&ØGIˆÔ.ð ×5Ñ5Ð6KÓ^ˆÜŸš n¼E¿K¹KÐPUÔVˆÜ"Ð#5×#GÑ#GÈÐ_cÐ#GÓ#d×#iÑ#iÓ#kÓlˆÔà2¸$Ð>×\Ð\ÐCXÐ[\ÑC\ÐØ×Ñ 1Ô$ß!Ü—’Ø(Ð)>¸sÐ(Cð D)ð )ôñ ð  ×/Ñ/°×1AÑ1AÀ5×C\ÑC\Ð^c×^lÑ^lÐmˆØ—”ˆAØ×Ñ×&Ñ&¤u§{¢{°?Ï+É+ÐbfÔ'gÔhØ×!Ñ!×(Ñ(¬¯ª°_ÏKÉKÐdhÔ)iÖjñ !ð
 ˜5×+Ñ+¨U×-FÑ-FÈÏÉÐWˆÜ # E§O¡O°U×5FÑ5FÖ GÑˆGØ×Ñ×&Ñ& w§|¢|°[Ñ'AÔBØ×!Ñ!×(Ñ(¨¯ª°{Ñ)CÖDñ !Hô
 !%¤U¨4×+?Ñ+?Ó%@Ó AˆÔð ×*Ñ*¨1Õ-ˆØ˜L×.Ñ.Ó0Õ0°<×3LÑ3LÓ3NÕNÔQTÐUZ×UdÑUdÓQeÕeˆÜ�ŠØ)¨$×*>Ñ*>Ð)?¸yÈÐZaÕIbÐcfÐHgÐgsÐtö	
r   c                ó:   <€ V ^8„  d   QhRS[ R,          RS[ RS[/# )r   r&   Nr'   r   )r*   r   )r   r.   s   "€r   r   r/   y   s(   ø€ ÷ 30ñ 30¹UÀT½\ð 30Ñ]bð 30Ñgjñ 30r   c                óP  € Ve   \        VR,          4      MRp\        4       '       d1   ^ RIpVP                  4       P                  p\        WR,          4      pMRpVeE   VeA   W68”  d:   VR,          p\
        P                  ! RVR RVR RXR,          R RVR R2	4       TpMOVe   \
        P                  ! R	4       M4Ve&   Tp\
        P                  ! R
VR,          R R24       M\        R4      h^\        V P                  P                  4      ,          V P                  P                  ,          V P                  P                  ,          V P                  P                  ,          V P                  P                  P                  ,          pV^ 8X  d   \!        R4      hW8,          # )z?Returns the number of blocks that can fit in the CPU swap pool.Nr6   r7   z GiB exceeds z.0%z of total RAM (z GiB). Clamping to z GiB.u{   psutil is not available â€” cpu_offload_space_safety_threshold cannot be enforced. Install psutil to enable the safety cap.z1Auto-sizing CPU swap pool from safety threshold: r9   ztcpu_offload_space=None requires psutil to auto-size the CPU swap pool. Install psutil or pass an explicit GiB value.z9The number of bytes per block is 0. This is not possible.r;   )r   r   ÚpsutilÚvirtual_memoryÚ	availabler
   rJ   ÚImportErrorr   r$   rN   rK   rL   rM   r3   ÚitemsizeÚ
ValueError)	rV   r&   r'   Úoffload_bytesrd   Ú	total_ramÚ	max_bytesÚclamped_gibÚbytes_per_blocks	   &&&      r   rD   Ú)OffloadingManager._compute_num_cpu_blocksy   s­  € ð CXÒBcœÐ1°WÕ=Ô>Ðimˆô × Ò Ûà×-Ñ-Ó/×9Ñ9ˆIÜ˜IÕ8Ó9‰IàˆIð Ò$¨Ò)>ØÔ(Ø'¨7Õ3�Ü—’Ø(Ð)>¸sÐ(CÀ=ÐQaÐbeÐPfð gØ! WÕ-¨cÐ2Ð2EÀkÐRUÐEVÐV[ð]ôð !*�øàÒ&Ü�NŠNð;õð
 Ò"Ø%ˆMÜ�NŠNÐNÈyÐ\cÕOdÐehÐNiÐinÐoÕpô ð&óð ð Ü�$—*‘*×&Ñ&Ó'õ(à�j‰j×#Ñ#õ$ð �j‰j×,Ñ,õ-ð �j‰j×!Ñ!õ	"ð
 �j‰j×Ñ×'Ñ'õ(ð 	ð ˜aÔÜÐXÓYÐYØÕ/Ð/r   c                ó„   € V P                   e*   \        P                  P                  V P                   4      # \	        4       # )zdReturns a context manager that runs enclosed ops on the compute stream, or a no-op when none is set.)r<   r+   r,   Ústreamr   ©rV   s   &r   Ú_stream_ctxÚOffloadingManager._stream_ctx®   s1   € à:>×:NÑ:NÒ:ZŒu�z‰z× Ñ  ×!5Ñ!5Ó6ÐmÔ`kÓ`mÐmr   c                ó    <€ V ^8„  d   QhRS[ /# )r   r   )r   )r   r.   s   "€r   r   r/   ²   s   ø€ ÷ >ñ >¡#ñ >r   c                óþ  € V P                   pVP                  pV'       g   ^ # V P                  P                  4       p\	        R V 4       4      p\        VP                  4      p. pWC8”  dx   V'       dp   V\        V4      ,
          ^8”  dY   VP                  4       w  rxVP                  V4       WH,          pW0P                  P                  VP                  4      ,          pK}  V'       g   ^ # VP                  4        V P                  V4      p	V EF:  pVP                  p
W©9   dÞ   ^ Vn        VP                  \        P                   8X  d    VP"                  \        VP$                  4      \        VP&                  4      ,           8X  dJ   V;P"                  ^,          un        VP&                  ;'       g    VP$                  R
,          pV.Vn        MVP*                  R,          Vn        \        P,                  Vn        TpM%VP/                  4       p\        P0                  Vn        VP3                  V
4       VP5                  V4       EK=  	  RVn        \8        P:                  ! \<        P>                  4      '       du   V P                  P                  4       p\8        P@                  ! R\        V4       R\        V	4       R\        V4      \        V	4      ,
           R\        V4       RV R	24       \        V4      # )a³  Evict enough active requests that, at the next batch, every remaining starved request can allocate the
blocks it needs. Victims are taken from the starved requests reported by the scheduler, newest first, so the
batch that was just scheduled is never touched and the demand directly bounds the amount of offloading.
Tries CPU offloading first; victims that do not fit in the pool are soft reset. Returns the number of evicted
requests.c              3   ó*   "  € T F	  w  rVx € K  	  R # 5i)N© )Ú.0rZ   Úblocks_neededs   &  r   Ú	<genexpr>Ú5OffloadingManager.offload_requests.<locals>.<genexpr>À   s   é € ÐC¹7Ñ'7 q•]»7ùs   ‚:NNNTz
Offloaded z requests (z	 to CPU, z soft reset): z starved requests remain for z free blocks.r:   )!r%   Ústarved_requestsr$   Úget_num_free_blocksÚsumr   Úactive_requestsÚpopr   Úblocks_in_useÚ
request_idÚreverseÚ_offload_to_cpuÚallocated_blocksÚ_statusr	   ÚDECODINGÚposition_offsetÚinitial_tokensÚgenerated_tokensÚremaining_prefill_tokensÚtokens_to_processÚPENDINGÚ!create_equivalent_initial_requestÚFINISHEDÚfinish_requestÚadd_waiting_requestÚblock_new_requestsr
   ÚisEnabledForÚloggingÚINFOrU   )rV   r%   ÚstarvedÚfree_blocksÚdemandÚ
num_activeÚvictimsÚstaterz   Úcpu_offloadedrƒ   Úlast_true_tokenÚ	new_states   &            r   Úoffload_requestsÚ"OffloadingManager.offload_requests²   sf  € ð —N‘Nˆ	Ø×,Ñ,ˆßÙð —j‘j×4Ñ4Ó6ˆÜÑC¹7ÓCÓCˆÜ˜×2Ñ2Ó3ˆ
Ø&(ˆØÔ"§w°:ÄÀGÃÕ3LÈqÔ3PØ#*§;¡;£=Ñ ˆEØ�N‰N˜5Ô!ØÕ#ˆFØŸ:™:×3Ñ3°E×4DÑ4DÓEÕEŠKßÙØ�‰Ôð ×,Ñ,¨WÓ5ˆäˆEØ×)Ñ)ˆJØÔ*à)*�Ô&Ø—=‘=¤M×$:Ñ$:Ô:ð ×,Ñ,´°E×4HÑ4HÓ0IÌCÐPU×PfÑPfÓLgÕ0gÔgØ×-Ò-°Õ2Õ-Ø+0×+AÑ+A×+YÐ+YÀU×EYÑEYÐ[]Õ*^˜Ø:IÐ9J˜Õ6ð :?×9PÑ9PÐQRÕ9S˜Ô6ô !.× 5Ñ 5�”Ø!‘	à!×CÑCÓE�	Ü -× 6Ñ 6�”Ø×$Ñ$ ZÔ0Ø×)Ñ)¨)×4ñ1 ð4 (,ˆ	Ô$Ü×ÒœwŸ|™|×,Ò,ØŸ*™*×8Ñ8Ó:ˆKÜ�KŠKØœS ›\˜N¨+´c¸-Ó6HÐ5IÈÔSVÐW^ÓS_ÔbeÐfsÓbtÕStÐRuð v Ü # G£˜~Ð-JÈ;È-ÐWdðfôô �7‹|Ðr   c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Úrequests_in_batchr   N)r   r   )r   r.   s   "€r   r   r/   ò   s&   ø€ ÷ 8Pñ 8P¹DÑASÕ<Tð 8PÐY]ñ 8Pr   c                óÀ  € V P                   p. p. pV EF˜  pVP                  pVP                  '       g   K$  V P                  P	                  VP
                  4      pV P                  P	                  VP
                  4      pVP                  V4       ^ p	\        V4       Fe  w  r«VP                  V
,          P                  P                  VP
                  . 4      pVP                  VRV 4       \        V	\        V4      4      p	Kg  	  RVn        W–n        VP                  '       d5   V;P                   VP"                  VP$                  ,          ,          un        \&        P(                  ! RVP
                   R\        VP*                  4       R\        VP,                  4       R24       EK›  	  V'       g   R# \        V4      p\/        V4      pV P                   pV P1                  4       ;_uu_ 4        \2        P4                  ! V\2        P6                  R7      P9                  VP:                  RR	7      pW²P$                  VP<                  VP>                  3p\2        P@                  ! WòPB                  VP:                  R
7      p\E        V PF                  V PH                  4      p\E        V PJ                  V PL                  4      p\O        VV4       FM  w  ppV F.  w  pppVVVV,            PQ                  VVVV,            RR	7       K0  	  VPS                  ^ VV4       KO  	  RRR4       \U        V PV                  V,           4      V n+        R#   + '       g   i     L3; i)z¸Restore KV caches from CPU for any CPU-offloaded requests in the scheduled batch. Indices are accumulated
per group across all requests, then copied in one batched operation per layer.NFzRestored CPU-offloaded request z with z prefill tokens and z generated tokens.©r3   T©Únon_blockingr2   ),r$   rœ   Úis_cpu_offloadedrB   r�   rƒ   rC   ÚextendÚ	enumerateÚgroup_cache_managersÚblock_tableÚgetÚmaxr   r†   Úallow_block_sharingÚcomplete_blocksr‰   rK   r
   ÚdebugrŠ   r‹   r    rs   r+   Ú	as_tensorÚlongÚtor4   rL   rM   rO   r3   r   r=   r>   r?   r@   rP   Úcopy_Úindex_copy_ÚsortedrA   )rV   r£   r$   Úall_cpu_indicesÚall_gpu_indicesÚfuture_staterœ   Úcpu_indicesÚgroup_countsÚmax_allocated_blocksÚ	group_idxÚnÚ
gpu_blocksr   Úgpu_idsÚstaging_shapeÚstagingÚ
cpu_cachesÚ	gpu_viewsÚ	cpu_cacheÚgpu_viewr   r   Úlengths   &&                      r   Úrestore_scheduled_requestsÚ,OffloadingManager.restore_scheduled_requestsò   sÉ  € ð —
‘
ˆØ%'ˆØ%'ˆä-ˆLà ×&Ñ&ˆEØ×)×)Ð)Ùð ×8Ñ8×<Ñ<¸U×=MÑ=MÓNˆKØ×AÑA×EÑEÀe×FVÑFVÓWˆLØ×"Ñ" ;Ô/ð $%Ð Ü )¨,Ö 7‘�	Ø"×7Ñ7¸	ÕB×NÑN×RÑRÐSX×ScÑScÐegÓh�
Ø×&Ñ& z°"°1 ~Ô6ô (+Ð+?ÄÀZÃÓ'QÒ$ñ !8ð &+ˆEÔ"Ø%9Ô"à×(×(Ð(Ø×,Ò,°×0EÑ0EÈ×IYÑIYÕ0YÕYÕ,Ü�LŠLØ1°%×2BÑ2BÐ1CÀ6Ì#Èe×NbÑNbÓJcÐIdð eÜ˜5×1Ñ1Ó2Ð3Ð3EðG÷ñ3 .÷> Ùô �Ó ˆÜ˜Ó/ˆØ—
‘
ˆØ×Ñ×ÕÜ—o’o o¼U¿Z¹ZÔH×KÑKÈEÏLÉLÐgkÐKÓlˆGØ× 0Ñ 0°%×2KÑ2KÈUÏ^É^Ð\ˆMÜ—k’k -·{±{È5Ï<É<ÔXˆGÜ˜t×2Ñ2°D×4IÑ4IÓJˆJÜ˜d×1Ñ1°4×3HÑ3HÓIˆIÜ'*¨:°yÖ'AÑ#�	˜8Û-1Ñ)�E˜6 6Ø˜F V¨f¥_Ð5×;Ñ;¸IÀeÈeÐV\ÍnÐ<]ÐlpÐ;Öqñ .2à×$Ñ$ Q¨°Ö9ñ (B÷  ô !' t×'<Ñ'<¸Õ'NÓ OˆÖ÷  ×ús   Ç4D.MÍM	c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   rœ   Úkeep_unsortedr   N)r   Úbool)r   r.   s   "€r   r   r/   ,  s#   ø€ ÷ -ñ -©Lð -Éð -ÐZ^ñ -r   c                óº   € VP                   '       dI   V P                  VP                  4       RVn         V'       g   V P                  P	                  4        R# R# R# )z=Free CPU blocks for a single request (e.g., on cancellation).FN)r¨   Ú_return_cpu_blocksrƒ   rA   Úsort)rV   rœ   rÌ   s   &&&r   Úfree_request_cpu_cacheÚ(OffloadingManager.free_request_cpu_cache,  sI   € à×!×!Ð!Ø×#Ñ# E×$4Ñ$4Ô5Ø%*ˆEÔ"ß Ø×%Ñ%×*Ñ*Ö,ñ !ñ "r   c                ó   <€ V ^8„  d   QhRR/# ©r   r   Nrx   )r   r.   s   "€r   r   r/   4  s   ø€ ÷ %ñ %¨Tñ %r   c                ó¶   € V P                   P                  P                  4        F  pV P                  VRR7       K  	  V P                  P                  4        R# )zPFree all CPU-offloaded caches in the waiting queue (e.g., on fail_all or reset).T)rÌ   N)r%   Úwaiting_requestsÚvaluesrÑ   rA   rÐ   )rV   rœ   s   & r   Úfree_all_waiting_cpu_cachesÚ-OffloadingManager.free_all_waiting_cpu_caches4  sD   € à—^‘^×4Ñ4×;Ñ;Ö=ˆEØ×'Ñ'¨¸TÐ'ÖBñ >à×Ñ×"Ñ"Ö$r   c                ó   <€ V ^8„  d   QhRR/# rÔ   rx   )r   r.   s   "€r   r   r/   :  s   ø€ ÷ Bñ B�tñ Br   c                óÔ   € V P                  4        V P                  P                  4        V P                  P                  4        \	        \        V P                  4      4      V n        R# )z8Reset CPU offloading state for a new generation session.N)rØ   rB   ÚclearrC   r   r   rI   rA   rr   s   &r   ÚresetÚOffloadingManager.reset:  sJ   € à×(Ñ(Ô*Ø×&Ñ&×,Ñ,Ô.Ø×.Ñ.×4Ñ4Ô6Ü $¤U¨4×+?Ñ+?Ó%@Ó AˆÖr   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[S[,          /# )r   r›   r   )r   r   ÚsetÚstr)r   r.   s   "€r   r   r/   A  s$   ø€ ÷ 4?ñ 4?¡t©LÕ'9ð 4?¹cÁ#½hñ 4?r   c           
     óº  € . p. p\        V P                  4      pV FÅ  p. p. pV P                  P                   FT  pVP                  P                  VP                  . 4      p	VP                  V	4       VP                  \        V	4      4       KV  	  V'       g   K  \        V4      \        V4      ,           V8:  g   K¡  VP                  WVV34       VP                  V4       KÇ  	  V'       g   \        4       # \        V4      p
V P                  RV
 pV P                  V
R V n        \        V4      pV P                  4       ;_uu_ 4        \        P                  ! V\        P                  R7      P                  V P                  P                   RR7      p\#        V P$                  V P&                  4      p\#        V P(                  V P*                  4      p\-        Wï4       FL  w  ppVP/                  ^ V4      pV F.  w  pppVVVV,            P1                  VVVV,            RR7       K0  	  KN  	  RRR4       ^ pV Fc  w  rVpVVV\        V4      ,            V P2                  VP                  &   WpP4                  VP                  &   RVn        V\        V4      ,          pKe  	  V UUu0 uF  w  p pVP                  kK  	  upp#   + '       g   i     L�; iu uppi )a�  Copy the KV cache blocks of as many victims as fit in the CPU swap pool from GPU to the pool, in one
batched, non-blocking copy per layer. Returns the request ids that were offloaded.

All transfers are enqueued on the compute stream with pinned destinations, so the host never waits on them:
correctness is guaranteed by stream ordering, since restores and cache writes go through the same stream.
Nr¥   Tr¦   )r   rA   r$   r«   r¬   r­   rƒ   r©   r   rà   r    rs   r+   r²   r³   r´   r4   r   r?   r@   r=   r>   rP   Úindex_selectrµ   rB   rC   r¨   )rV   r›   Ú	offloadedr¹   Úfree_pool_blocksrœ   Úgpu_indicesÚgroup_block_countsÚcmÚblocksr¿   r¸   r   rÁ   rÅ   rÄ   rÇ   rÆ   Úgathered_blocksr   r   rÈ   rZ   s   &&                     r   r…   Ú!OffloadingManager._offload_to_cpuA  sˆ  € ð FHˆ	Ø%'ˆÜ˜t×4Ñ4Ó5ÐÛˆEØˆKØ!#ÐØ—j‘j×5Ô5�ØŸ™×+Ñ+¨E×,<Ñ,<¸bÓA�Ø×"Ñ" 6Ô*Ø"×)Ñ)¬#¨f«+Ö6ñ 6÷
 ‰{œs ?Ó3´c¸+Ó6FÕFÐJZÖZØ× Ñ  %Ð6HÐ!IÔJØ×&Ñ& {Ö3ñ ÷ Ü“5ˆLô �Ó ˆØ×/Ñ/°°Ð3ˆØ $× 5Ñ 5°a°bÐ 9ˆÔÜ˜Ó/ˆð ×Ñ×ÕÜ—o’o o¼U¿Z¹ZÔH×KÑKÈDÏJÉJ×L]ÑL]ÐlpÐKÓqˆGÜ˜d×1Ñ1°4×3HÑ3HÓIˆIÜ˜t×2Ñ2°D×4IÑ4IÓJˆJÜ'*¨9Ö'AÑ#�˜)Ø"*×"7Ñ"7¸¸7Ó"C�Û-1Ñ)�E˜6 6Ø˜e e¨f¥nÐ5×;Ñ;Ø'¨°¸&µÐAÐPTð <ö ó .2ñ (B÷	  ð ˆÛ6?Ñ2ˆEÐ 2Ø?NÈvÐX^ÔadÐepÓaqÕXqÐ?rˆD×*Ñ*¨5×+;Ñ+;Ñ<ØGY×2Ñ2°5×3CÑ3CÑDØ%)ˆEÔ"Ø”c˜+Ó&Õ&ŠFñ	 7@ñ
 5>Ô>±I¡[ U¨A¨q�× Ô ±IÒ>Ð>÷%  ×üó$ ?s   ÅC'KÊ'KËK	c                ó\   <€ V ^8„  d   QhRS[ RS[S[S[,          S[S[,          3,          /# )r   rƒ   r   )rá   r   r   r   )r   r.   s   "€r   r   r/   w  s-   ø€ ÷ %ñ %©Sð %±U¹4Á½9ÁdÉ3ÅiÐ;OÕ5Pñ %r   c                óª   € V P                   P                  V4      pV P                  P                  V4      pV P                  P	                  V4       W#3# )z<Return CPU blocks to the free pool without copying anything.)rB   r�   rC   rA   r©   )rV   rƒ   Úcpu_idsr¼   s   &&  r   rÏ   Ú$OffloadingManager._return_cpu_blocksw  sK   € à×0Ñ0×4Ñ4°ZÓ@ˆØ×=Ñ=×AÑAÀ*ÓMˆØ×Ñ×$Ñ$ WÔ-ØÐ$Ð$r   )r<   r=   r>   rA   r?   r@   rI   rB   rC   r$   r%   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r`   rD   rs   r    rÉ   rÑ   rØ   rÝ   r…   rÏ   Ú__static_attributes__Ú__classdictcell__)r.   s   @r   r"   r"   7   ss   ø‡ € ñ÷9
ð 9
÷v30ð 30òjn÷>ð >÷@8Pð 8P÷t-ò -÷%ð %÷Bð B÷4?ð 4?÷l%ö %r   r"   )rô   r•   Ú
contextlibr   Ú	itertoolsr   r+   Úutilsr   r$   r   Údistributedr   Úrequestsr   r   r	   r
   r%   r   r    r"   rx   r   r   Ú<module>rü      s;   ðñ	ó Ý "Ý ã å (Ý &Ý *ß MÓ MÝ  õ÷"E%ó E%r   