o
    )i<#                     @   s  d dl Z d dlZd dlZ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mZmZ d dlmZ d dlZ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mZ d d
lm Z! ee"Z#ej$Z%ej&'e%dZ(ej&'e%dZ)da*ej+Z,e-e.ee.e/e0f f  Z1g dZ2de.dee.e/e0f ddfddZ3dd Z4de/fddZ5de.fddZ6G dd de.eZ7G dd dZ8e8 Z9dS )    N)Enum)Path)Thread)AnyOptionalUnion)uuid4)global_http_connection)init_logger)cuda_device_count_statelesscuda_get_device_properties)__version__zusage_stats.jsondo_not_track)ZVLLM_USE_MODELSCOPEZVLLM_USE_TRITON_FLASH_ATTNZVLLM_ATTENTION_BACKENDZVLLM_USE_FLASHINFER_SAMPLERZVLLM_PP_LAYER_PARTITIONZVLLM_USE_TRITON_AWQZVLLM_USE_V1ZVLLM_ENABLE_V1_MULTIPROCESSINGkeyvaluereturnc                 C   s   |t | < dS )zCSet global usage data that will be sent with every usage heartbeat.N)_GLOBAL_RUNTIME_DATA)r   r    r   `/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/usage/usage_lib.pyset_runtime_usage_data1   s   r   c                  C   s2   t du rtj} tj}tjt}| p|p| a t S )a|  Determine whether or not we can send usage stats to the server.
    The logic is as follows:
    - By default, it should be enabled.
    - Three environment variables can disable it:
        - VLLM_DO_NOT_TRACK=1
        - DO_NOT_TRACK=1
        - VLLM_NO_USAGE_STATS=1
    - A file in the home directory can disable it if it exists:
        - $HOME/.config/vllm/do_not_track
    N)_USAGE_STATS_ENABLEDenvsZVLLM_DO_NOT_TRACKZVLLM_NO_USAGE_STATSospathexists_USAGE_STATS_DO_NOT_TRACK_PATH)r   Zno_usage_statsZdo_not_track_filer   r   r   is_usage_stats_enabled6   s   r   c                   C   s   t tjtjj d S )Ng    eA)intdatetimenowtimezoneutc	timestampr   r   r   r   _get_current_timestamp_nsL   s   r#   c            	      C   s   g d} ddddd}| D ]#}t |}| r0|  }| D ]\}}||v r/|    S q!qddi}| D ]\}}tj|rG|  S q9d	S )
N)z!/sys/class/dmi/id/product_versionz/sys/class/dmi/id/bios_vendorz/sys/class/dmi/id/product_namez#/sys/class/dmi/id/chassis_asset_tagz/sys/class/dmi/id/sys_vendorZAWSZAZUREZGCPZOCI)Zamazonzmicrosoft corporationZgoogleZoraclecloudZRUNPOD_DC_IDZRUNPODUNKNOWN)r   is_file	read_textloweritemsr   environget)	Zvendor_filesZcloud_identifiersZvendor_filer   Zfile_content
identifierproviderZenv_to_cloud_providerenv_varr   r   r   _detect_cloud_providerP   s,   r.   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )UsageContextUNKNOWN_CONTEXT	LLM_CLASS
API_SERVEROPENAI_API_SERVEROPENAI_BATCH_RUNNERENGINE_CONTEXTN)	__name__
__module____qualname__r0   r1   r2   r3   r4   r5   r   r   r   r   r/   r   s    r/   c                
   @   s   e Zd ZdZdddZ	ddededeeee	f  ddfd	d
Z
dededeee	f ddfddZdededeee	f ddfddZdd Zdeee	f ddfddZdeee	f ddfddZdS )UsageMessagezCCollect platform information and send it to the usage stats server.r   Nc                 C   sv   t t | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d | _d | _d | _d S N)strr   uuidr,   num_cpucpu_typecpu_family_model_steppingtotal_memoryarchitectureplatformcuda_runtime	gpu_countgpu_typegpu_memory_per_deviceenv_var_jsonmodel_architecturevllm_versioncontextlog_timesource)selfr   r   r   __init__~   s$   
zUsageMessage.__init__rH   usage_context	extra_kvsc                 C   s&   t | j|||pi fdd}|  d S )NT)targetargsdaemon)r   _report_usage_workerstart)rM   rH   rO   rP   tr   r   r   report_usage   s
   zUsageMessage.report_usagec                 C   s   |  ||| |   d S r:   )_report_usage_once_report_continuous_usage)rM   rH   rO   rP   r   r   r   rT      s   z!UsageMessage._report_usage_workerc              	   C   s  ddl m} | rt | _tdd\| _| _| r t	j
j| _| rNzdd l}|j | _|j | _|jj d | _W n tyM   td Y nw t | _t | _t | _t j | _!t"# }|$dd | _%|$dd| _&d	't(|$d
dt(|$ddt(|$ddg| _)|j*| _+t,| _-|| _.t/0dd t1D | _2t3 | _4t5j6| _7t8| }|r|9| | :| | ;| d S )Nr   )current_platform)namer@   Zbytes_limitz!Failed to collect TPU informationcountZ	brand_raw ,familymodelZsteppingc                 S   s   i | ]}|t t|qS r   )getattrr   ).0r-   r   r   r   
<dictcomp>   s    
z3UsageMessage._report_usage_once.<locals>.<dictcomp>)<Zvllm.platformsrZ   Zis_cuda_aliker   rD   r   rE   rF   Zis_cudatorchversioncudarC   Zis_tpu	torch_xlaZruntimeZ
world_sizeZtpuZget_tpu_typecoreZ	xla_modelZget_memory_info	Exceptionlogger	exceptionr.   r,   rB   machinerA   psutilZvirtual_memorytotalr@   cpuinfoZget_cpu_infor*   r=   r>   joinr;   r?   r   rJ   VLLM_VERSIONrI   rH   jsondumps_USAGE_ENV_VARS_TO_COLLECTrG   r#   rK   r   ZVLLM_USAGE_SOURCErL   varsupdate_write_to_file_send_to_server)rM   rH   rO   rP   rZ   rg   infodatar   r   r   rX      sT   







zUsageMessage._report_usage_oncec                 C   s:   	 t d | jt d}|t | | | | q)zReport usage every 10 minutes.

        This helps us to collect more data points for uptime of vLLM usages.
        This function can also help send over performance metrics over time.
        TiX  )r<   rK   )timesleepr<   r#   rv   r   rw   rx   )rM   rz   r   r   r   rY      s   



z%UsageMessage._report_continuous_usagerz   c                 C   s@   zt  }|jt|d W d S  tjjy   td Y d S w )N)rr   z#Failed to send usage data to server)	r	   Zget_sync_clientpost_USAGE_STATS_SERVERrequests
exceptionsRequestExceptionloggingdebug)rM   rz   Zglobal_http_clientr   r   r   rx      s   zUsageMessage._send_to_serverc                 C   sl   t jt jtdd ttjdd ttd}t	|| |
d W d    d S 1 s/w   Y  d S )NT)exist_oka
)r   makedirsr   dirname_USAGE_STATS_JSON_PATHr   touchopenrr   dumpwrite)rM   rz   fr   r   r   rw      s   "zUsageMessage._write_to_file)r   Nr:   )r6   r7   r8   __doc__rN   r;   r/   r   dictr   rW   rT   rX   rY   rx   rw   r   r   r   r   r9   {   s<    
 
	



8r9   ):r   rr   r   r   rB   r{   enumr   pathlibr   	threadingr   typingr   r   r   r<   r   ro   rm   r   rd   Z	vllm.envsr   Zvllm.connectionsr	   Zvllm.loggerr
   Z
vllm.utilsr   r   Zvllm.versionr   rq   r6   rj   ZVLLM_CONFIG_ROOTZ_config_homer   rp   r   r   r   ZVLLM_USAGE_STATS_SERVERr~   r   r;   r   boolr   rt   r   r   r#   r.   r/   r9   Zusage_messager   r   r   r   <module>   sH    "	 
	