Ë
    )täi=  ã                   ó2  — d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ ddl	m
Z
  G d„ de«      Z e
«       rd d	lmZ d d
lmZmZmZ dZndZdd„Z	 dddddœdeeeeeeegef   z  f      dz  fd„Z ej0                  e«      Z e«        G d„ d«      «       Zy)é    N)ÚCallable)ÚEnum)ÚAnyé   )Úis_opentelemetry_availablec                   ó,   — e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
ÚRequestStatusz5Status of a generation request through its lifecycle.ÚpendingÚ
prefillingÚprefilling_splitÚsplit_pending_remainderÚdecodingÚfinishedÚfailedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚPENDINGÚ
PREFILLINGÚPREFILLING_SPLITÚSPLIT_PENDING_REMAINDERÚDECODINGÚFINISHEDÚFAILED© ó    úi/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/transformers/utils/metrics.pyr	   r	      s*   „ Ù?à€GØ€JØ)ÐØ7ÐØ€HØ€HØ�Fr   r	   )Úmetrics)ÚStatusÚ
StatusCodeÚ
get_tracerTFc                 ó$   ‡ — t         sd„ S ˆ fd„}|S )a÷  
    Decorator that attaches a tracer to a class.

    This decorator should be applied to classes that need OpenTelemetry tracing.
    It adds a tracer attribute to the class instance that can be used by the traced decorator.

    Args:
        tracer_name_template: Optional template string for the tracer name.
            If provided, it should contain {module} which will be replaced with the class's full module path
            and {class_name} for the class name.
            If None, a default naming scheme will be used where:
              - If the module already starts with "transformers.", it will use that directly
              - Otherwise, it will prepend "transformers." to the module name

    Returns:
        Class decorator function
    c                 ó   — | S ©Nr   )Úclss    r   Ú<lambda>zattach_tracer.<locals>.<lambda>3   s   € ™3r   c                 óp   •‡ ‡— ‰ j                   Št        j                  ‰«      ˆ ˆˆfd„«       }|‰ _         ‰ S )Nc                 óÜ   •—  ‰| g|¢­i |¤Ž ‰j                   }‰j                  }‰€"|j                  d«      r|› d|› �}nd|› d|› �}n‰j                  ||¬«      }t	        |«      | _        y )Nútransformers.Ú.)ÚmoduleÚ
class_name)r   r   Ú
startswithÚformatr"   Útracer)	ÚselfÚargsÚkwargsÚmodule_namer-   Útracer_namer&   Úoriginal_initÚtracer_name_templates	         €€€r   Úinit_with_tracerz:attach_tracer.<locals>.decorator.<locals>.init_with_tracer8   s�   ø€ á˜$Ð0 Ò0¨Ò0àŸ.™.ˆKØ×)Ñ)ˆJà#Ð+Ø×)Ñ)¨/Ô:Ø%0 M°°:°,Ð"?‘Kà$1°+°¸aÀ
¸|Ð"L‘Kà2×9Ñ9ÀÐYcÐ9Ód�ä$ [Ó1ˆD�Kr   )Ú__init__Ú	functoolsÚwraps)r&   r8   r6   r7   s   ` @€r   Ú	decoratorz attach_tracer.<locals>.decorator5   s5   ú€ ØŸ™ˆä	�‰˜Ó	'õ	2ó 
(ð	2ð  (ˆŒØˆ
r   )Ú_has_opentelemetry)r7   r<   s   ` r   Úattach_tracerr>       s   ø€ õ$ ÙÐôð. Ðr   )Ú	span_nameÚ
standaloneÚadditional_attributesrA   c                ó.   ‡‡‡— ˆˆˆfd„}| €|S  || «      S )až  
    Decorator to trace function calls with OpenTelemetry.

    Can be used as @traced or @traced(span_name="custom_name")

    Args:
        func: The function to trace
        span_name: Optional custom name for the span (defaults to function name)
        standalone: If True, creates a parentless span
        additional_attributes: Optional list of additional attributes to set on the span.
          Each item is a tuple of (instance_attribute_name, span_attribute_key, value_or_transform_function)
          where:
            - instance_attribute_name: Name of the attribute to get from the class instance
            - span_attribute_key: Key to use when setting the attribute on the span
            - value_or_transform_function: Either a raw value to use directly, or a function to transform
              the attribute value before setting it on the span

    Returns:
        Decorated function with tracing
    c                 óZ   •‡ — t         s‰ S t        j                  ‰ «      ˆˆ ˆˆfd„«       }|S )Nc            
      ó@  •— | rt        ‰d«      r‰j                  �| d   nd }|d u}|rt        |d«      r|j                  }n%t        d‰j                  › d‰j
                  › �«      }‰xs ‰j
                  }‰r|j                  n|j                  } ||«      5 }|j                  d‰j
                  «       |j                  d‰j                  «       |j                  d|«       | r{t        | «      D ]m  \  }}	t        |	t        t        t        t        f«      s|	€|j                  d	|› �t        |	«      «       ŒG|j                  d	|› �t        t        |	«      «      «       Œo |r€|j!                  «       D ]m  \  }
}t        |t        t        t        t        f«      s|€|j                  d
|
› �t        |«      «       ŒG|j                  d
|
› �t        t        |«      «      «       Œo ‰rP|rN‰D ]I  }|\  }}}t        ||«      sŒt#        ||«      }t%        |«      r	 ||«      }n|}|j                  ||«       ŒK 	  ‰| i |¤Ž}|cd d d «       S # t&        $ r?}|j)                  t+        t,        j.                  «      «       |j1                  |«       ‚ d }~ww xY w# 1 sw Y   y xY w)NÚ__self__r   r0   r*   r+   zfunction.namezfunction.modulezfunction.is_methodzargs.zkwargs.)ÚhasattrrE   r0   r"   r   r   Ú
start_spanÚstart_as_current_spanÚset_attributeÚ	enumerateÚ
isinstanceÚstrÚintÚfloatÚboolÚtypeÚitemsÚgetattrÚcallableÚ	ExceptionÚ
set_statusr    r!   ÚERRORÚrecord_exception)r2   r3   ÚinstanceÚ	is_methodr0   ÚnameÚspan_fnÚspanÚiÚargÚkeyÚvalueÚattr_configÚinstance_attribute_nameÚspan_attribute_keyÚvalue_or_transform_functionÚattribute_valueÚtransformed_valueÚresultÚerA   Úfuncr?   r@   s                       €€€€r   Úwrapperz*traced.<locals>.decorator.<locals>.wrappero   s\  ø€ á"&¬G°D¸*Ô,EÈ$Ï-É-ÐJc�t˜A’wÐjnˆHØ ¨Ð,ˆIáœW X¨xÔ8Ø!Ÿ™‘ä# m°D·O±OÐ3DÀAÀdÇmÁmÀ_Ð$UÓV�àÒ- §¡ˆDÙ+5�f×'Ò'¸6×;WÑ;WˆGÙ˜” $Ø×"Ñ" ?°D·M±MÔBØ×"Ñ"Ð#4°d·o±oÔFØ×"Ñ"Ð#7¸ÔCáÜ"+¨D¦/™˜˜3Ü% c¬C´´e¼TÐ+BÔCÀsÀ{Ø ×.Ñ.°°q°c¨{¼CÀ»HÕEà ×.Ñ.°°q°c¨{¼CÄÀSÃ	»NÕKð	 #2ñ
 Ø&,§l¡l¦n™
˜˜UÜ% e¬c´3¼¼tÐ-DÔEÈÈØ ×.Ñ.°¸¸¨ÄÀEÃ
ÕKà ×.Ñ.°¸¸¨ÄÄDÈÃKÓ@PÕQð	 '5ñ )©YÛ'<˜ØcnÑ`Ð/Ð1CÐE`Ü" 8Ð-DÕEÜ.5°hÐ@WÓ.X˜OÜ'Ð(CÔDÙ4OÐP_Ó4`Ñ 1à4OÐ 1Ø ×.Ñ.Ð/AÐCTÕUð (=ðÙ! 4Ð2¨6Ñ2�FØ!÷? ‘øô@ !ò Ø—O‘O¤F¬:×+;Ñ+;Ó$<Ô=Ø×)Ñ)¨!Ô,Øûðú÷A �ús1   ÂE%JÇ?6JÈ6	I	É		JÉ:JÊJÊJÊJ)r=   r:   r;   )ri   rj   rA   r?   r@   s   ` €€€r   r<   ztraced.<locals>.decoratork   s.   ù€ Ý!ØˆKä	�‰˜Ó	ö.	ó 
ð.	ð` ˆr   r   )ri   r?   r@   rA   r<   s    ``` r   Útracedrk   O   s    ú€ ö85ðn €|ØÐÙ�T‹?Ðr   c                   ó¨   — e Zd ZdZdefd„Zd„ Zedede	ddfd	„«       Z
ed
eddfd„«       Zedd„«       Zedededdfd„«       Zedede	ddfd„«       Zy)ÚContinuousBatchProcessorMetricsz0Metrics collection for ContinuousBatchProcessor.Úmax_batch_tokensc                 ó2   — || _         | j                  «        y)zŒInitialize metrics for continuous batch processor.

        Args:
            max_batch_tokens: Maximum number of tokens in a batch
        N)rn   Ú_setup_metrics)r1   rn   s     r   r9   z(ContinuousBatchProcessorMetrics.__init__®   s   € ð !1ˆÔà×ÑÕr   c                 óJ  — t         st        j                  d«       yt        j                  d«      | _        g d¢}| j
                  j                  ddd|¬«      | _        | j
                  j                  d	d
d¬«      | _	        | j
                  j                  ddd¬«      | _
        g d¢}| j
                  j                  ddd|¬«      | _        | j
                  j                  ddd¬«      | _        | j
                  j                  ddd¬«      | _        | j
                  j                  ddd¬«      | _        g d¢}| j
                  j                  ddd|¬«      | _        | j
                  j                  ddd ¬«      | _        | j
                  j                  d!d"d ¬«      | _        y)#zIInitialize OpenTelemetry metrics and tracing if the library is available.zˆOpenTelemetry is not installed. Metrics and tracing will not be recorded.You can install it with `pip install opentelemetry-api>=1.30.0`Nz2transformers.generation.continuous_batch_processor)é
   é   é2   éK   éd   é–   éÈ   i,  éô  iî  éè  éÐ  éˆ  é'  Úttft_millisecondsz#Time to first token in millisecondsÚms)rZ   ÚdescriptionÚunitÚ#explicit_bucket_boundaries_advisoryÚactive_requests_countz3Number of active requests currently being processedÚrequests)rZ   r€   r�   Úwaiting_requests_countz*Number of requests waiting to be processed)rt   rv   éú   ry   rz   r{   r|   r}   i N  i0u  i`ê  Úrequest_latency_millisecondsz9End-to-end latency for completed requests in millisecondsÚdecode_prefill_ratioz3Ratio of decode tokens to prefill tokens in a batchÚratioÚprefill_tokens_processedz"Number of prefill tokens processedÚtokensÚdecode_tokens_processedz!Number of decode tokens processed)é   rr   é   é   é(   rt   é<   éF   éP   éZ   é_   éb   rv   Úbatch_fill_percentagez5Percentage of max_batch_tokens utilized in each batchÚpercentÚkv_cache_free_memory_bytesz/Free memory of the PagedAttentionCache in bytesÚbytesÚkv_cache_memory_bytesz0Memory usage of the PagedAttentionCache in bytes)r=   ÚloggerÚinfor   Ú	get_meterÚmeterÚcreate_histogramÚttft_histogramÚcreate_gaugeÚactive_requests_gaugeÚwaiting_requests_gaugeÚrequest_latency_histogramÚdecode_prefill_ratio_gaugeÚcreate_counterÚprefill_tokens_counterÚdecode_tokens_counterÚbatch_fill_percentage_histogramÚkv_cache_free_memory_gaugeÚkv_cache_memory_gauge)r1   Úttft_bucketsÚlatency_bucketsÚbatch_fill_bucketss       r   rp   z.ContinuousBatchProcessorMetrics._setup_metrics¸   sØ  € õ "Ü�K‰KðRôð ä×&Ñ&Ð'[Ó\ˆŒ
ò _ˆà"Ÿj™j×9Ñ9Ø$Ø=ØØ0<ð	 :ó 
ˆÔð &*§Z¡Z×%<Ñ%<Ø(ØMØð &=ó &
ˆÔ"ð '+§j¡j×&=Ñ&=Ø)ØDØð '>ó '
ˆÔ#ò \ˆà)-¯©×)DÑ)DØ/ØSØØ0?ð	 *Eó *
ˆÔ&ð +/¯*©*×*AÑ*AØ'ØMØð +Bó +
ˆÔ'ð '+§j¡j×&?Ñ&?Ø+Ø<Øð '@ó '
ˆÔ#ð &*§Z¡Z×%>Ñ%>Ø*Ø;Øð &?ó &
ˆÔ"ò RÐà/3¯z©z×/JÑ/JØ(ØOØØ0Bð	 0Kó 0
ˆÔ,ð +/¯*©*×*AÑ*AØ-ØIØð +Bó +
ˆÔ'ð &*§Z¡Z×%<Ñ%<Ø(ØJØð &=ó &
ˆÕ"r   Úcreated_timeÚ
request_idÚreturnNc                 ó  — t         syt        j                  «       |z
  dz  }	 | j                  j                  |«       t        j                  d|› d|d›d�«       y# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z£Record Time to First Token (TTFT).

        Args:
            created_time: The time the request was created
            request_id: The ID of the request
        Nç     @�@zRecorded TTFT for request ú: ú.2fr   zFailed to record TTFT metric: )r=   Útimer¡   Úrecordrœ   ÚdebugrT   Úwarning)r1   r°   r±   Úttft_msrh   s        r   Úrecord_ttft_metricz2ContinuousBatchProcessorMetrics.record_ttft_metric  s�   € õ "Øä—9‘9“; Ñ-°Ñ7ˆð	AØ×Ñ×&Ñ& wÔ/Ü�L‰LÐ5°j°\ÀÀGÈCÀ=ÐPRÐSÕTøÜò 	AÜ�N‰NÐ;¸A¸3Ð?×@Ñ@ûð	Aúó   £8A Á	BÁ%BÂBÚrequests_in_batchc                 ó   — t         r|syd}d}|D ]v  }|j                  }|j                  t        j                  k(  r|dz  }Œ2|j                  t        j
                  t        j                  fv sŒ_|t        |j                  «      z  }Œx ||z   }	 |dkD  r| j                  j                  |«       |dkD  r| j                  j                  |«       |dkD  r ||z  }| j                  j                  |«       || j                  z  dz  }| j                  j!                  |«       t"        j%                  d|› d|› d|d›d	|› d
| j                  › d�«       y# t&        $ r"}	t"        j)                  d|	› �«       Y d}	~	yd}	~	ww xY w)zÇRecord metrics about the batch composition including decode/prefill ratio and batch fill percentage.

        Args:
            requests_in_batch: List of request states in the current batch
        Nr   r   g      Y@zBatch metrics: z decode tokens, z prefill tokens, batch fill: r¶   z% (Ú/Ú)z Failed to record batch metrics: )r=   ÚstateÚstatusr	   r   r   r   ÚlenÚ
prompt_idsr¨   Úaddr©   r¦   Úsetrn   rª   r¸   rœ   r¹   rT   rº   )
r1   r¾   Údecode_tokensÚprefill_tokensÚrequestrÂ   Útotal_batch_tokensr‰   Úfill_percentagerh   s
             r   Úrecord_batch_metricsz4ContinuousBatchProcessorMetrics.record_batch_metrics  s„  € õ "Ñ):ØàˆØˆã(ˆGØ—M‘MˆEØ�|‰|œ}×5Ñ5Ò5Ø Ñ"‘Ø—‘¤-×":Ñ":¼M×<ZÑ<ZÐ![Ò[Ø¤# e×&6Ñ&6Ó"7Ñ7‘ð )ð +¨^Ñ;Ðð	CØ Ò!Ø×+Ñ+×/Ñ/°Ô?à˜qÒ Ø×*Ñ*×.Ñ.¨}Ô=à Ò!Ø%¨Ñ6�Ø×/Ñ/×3Ñ3°EÔ:à1°D×4IÑ4IÑIÈUÑRˆOØ×0Ñ0×7Ñ7¸ÔHÜ�L‰LØ! - Ð0@ÀÐ@Pð QØ.¨sÐ3°3Ð7IÐ6JÈ!ÈD×LaÑLaÐKbÐbcðeõøô ò 	CÜ�N‰NÐ=¸a¸SÐA×BÑBûð	Cús   ÂCE Å	E=ÅE8Å8E=c                 ód  — t         sy	 |j                  |j                  z  }||j                  j                  z  }dt        |j                  «      z  |j                  z  |z  }|j                  «       }|j                  |z
  }||z  }||z  }| j                  j                  |«       | j                  j                  |«       t        j                  d|dz  d›d|› d|j                  › d||j                  z  d	z  d
›d�	«       y# t        $ r"}	t        j!                  d|	› �«       Y d}	~	yd}	~	ww xY w)a&  Record memory usage of the PagedAttentionCache without GPU synchronization.

        This calculates the theoretical memory usage based on cache configuration
        and the number of blocks currently in use.

        Args:
            cache: The PagedAttentionCache object to measure
        Né   zKV Cache memory: i   r¶   zMB, Used blocks: rÀ   z (rv   z.1fz%)z*Failed to record KV cache memory metrics: )r=   Úhead_dimÚnum_key_value_headsÚdtypeÚitemsizerÄ   Ú	key_cacheÚ
block_sizeÚget_num_free_blocksÚ
num_blocksr¬   rÇ   r«   rœ   r¹   rT   rº   )
r1   ÚcacheÚ	page_sizeÚpage_mem_in_bytesÚblock_mem_in_bytesÚfree_blocksÚused_blocksÚused_memory_bytesÚfree_memory_bytesrh   s
             r   Úrecord_kv_cache_memory_metricsz>ContinuousBatchProcessorMetrics.record_kv_cache_memory_metricsI  sK  € õ "Øð	MàŸ™¨×)BÑ)BÑBˆIØ )¨E¯K©K×,@Ñ,@Ñ @Ðð "#¤S¨¯©Ó%9Ñ!9¸E×<LÑ<LÑ!LÐO`Ñ!`Ðð  ×3Ñ3Ó5ˆKØ×*Ñ*¨[Ñ8ˆKð !,Ð.@Ñ @ÐØ +Ð.@Ñ @Ðð ×&Ñ&×*Ñ*Ð+<Ô=Ø×+Ñ+×/Ñ/Ð0AÔBÜ�L‰LØ#Ð$5¸Ñ$EÀcÐ#Jð K Ø +˜}¨A¨e×.>Ñ.>Ð-?ð @Ø %×"2Ñ"2Ñ2°SÑ8¸Ð=¸RðAõøô
 ò 	MÜ�N‰NÐGÈÀsÐK×LÑLûð	Mús   ‰C:D Ä	D/ÄD*Ä*D/Úactive_requestsÚwaiting_requestsc                 ó  — t         sy	 | j                  j                  |«       | j                  j                  |«       t        j                  d|› d|› d�«       y# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)z¹Record metrics about active and waiting requests.

        Args:
            active_requests: Number of active requests
            waiting_requests: Number of waiting requests
        NzQueue metrics: z active requests, z waiting requestsz Failed to record queue metrics: )r=   r£   rÇ   r¤   rœ   r¹   rT   rº   )r1   rá   râ   rh   s       r   Úrecord_queue_metricsz4ContinuousBatchProcessorMetrics.record_queue_metricsq  s‚   € õ "Øð	CØ×&Ñ&×*Ñ*¨?Ô;Ø×'Ñ'×+Ñ+Ð,<Ô=Ü�L‰L˜?¨?Ð*;Ð;MÐN^ÐM_Ð_pÐqÕrøÜò 	CÜ�N‰NÐ=¸a¸SÐA×BÑBûð	Cús   ‰AA Á	BÁ%BÂBc                 ó  — t         syt        j                  «       |z
  dz  }	 | j                  j                  |«       t        j                  d|› d|d›d�«       y# t        $ r"}t        j                  d|› �«       Y d}~yd}~ww xY w)zªRecord metrics about a completed request.

        Args:
            created_time: The time the request was created
            request_id: The ID of the request
        Nr´   z Recorded request completion for rµ   r¶   r   z,Failed to record request completion metric: )r=   r·   r¥   r¸   rœ   r¹   rT   rº   )r1   r°   r±   Ú
latency_msrh   s        r   Úrecord_request_completionz9ContinuousBatchProcessorMetrics.record_request_completionƒ  sƒ   € õ "Øä—i‘i“k LÑ0°FÑ:ˆ
ð	OØ×*Ñ*×1Ñ1°*Ô=ä�L‰LÐ;¸J¸<ÀrÈ*ÐUXÐIYÐY[Ð\Õ]øÜò 	OÜ�N‰NÐIÈ!ÈÐM×NÑNûð	Oúr½   )r²   N)r   r   r   r   rM   r9   rp   rk   rN   rL   r¼   ÚlistrÍ   rà   rä   rç   r   r   r   rm   rm   ª   sâ   „ á:ð¨ó òR
ðh ðA¨uð AÀ#ð AÈ$ò Aó ðAð$ ð'C°dð 'C¸tò 'Có ð'CðR ò%Mó ð%MðN ðC°Cð CÈ3ð CÐSWò Có ðCð" ðO°eð OÈð OÐQUò Oó ñOr   rm   r%   )r:   Úloggingr·   Úcollections.abcr   Úenumr   Útypingr   Úimport_utilsr   r	   Úopentelemetryr   Úopentelemetry.tracer    r!   r"   r=   r>   rè   ÚtuplerL   rk   Ú	getLoggerr   rœ   rm   r   r   r   Ú<module>rò      sÌ   ðÛ Û Û Ý $Ý Ý å 4ô	�Dô 	ñ ÔÝ%ßBÑBàÑàÐó,ð` 
ðUð ØØVZòUð
    c¨3°°hÀ¸uÀc¸zÑ6JÑ0JÐ&JÑ KÑLÈtÑSóUðp 
ˆ×	Ñ	˜8Ó	$€ñ ƒ÷jOð jOó ñjOr   