o
    ;ήc                     @   s   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m	Z	m
Z
mZ d dlZd dlZd dlmZmZmZmZmZmZmZmZ G dd dZdd Zdd
efddZedkree Zeeej dS dS )    N)environ)DictListTupleUnion)	NVMLErrornvmlDeviceGetCountnvmlDeviceGetHandleByIndexnvmlDeviceGetMemoryInfonvmlDeviceGetNamenvmlInitnvmlShutdownnvmlSystemGetDriverVersionc                   @   s   e Zd ZdZdddZdd Zdefd	d
Zdedede	fddZ
defddZdefddZdee	 fddZdefddZdefddZdefddZdS )MachineInfoz'Class encapsulating Machine Info logic.FNc                 C   sp   || _ |d u rtjdtjd tt| _n|| _d | _z|  | _W d S  t	y7   | j
d d | _Y d S w )Nz3%(asctime)s - %(name)s - %(levelname)s: %(message)s)formatlevelz"Exception in getting machine info.)silentloggingbasicConfigINFO	getLogger__name__loggermachine_infoget_machine_info	Exception	exception)selfr   r    r   L/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/machine_info.py__init__!   s   zMachineInfo.__init__c              
   C   sR   |   }t }||  |  t | |dg|  |  |  | 	 d	}|S )z!Get machine info in metric formatpython_version)	gpucpumemoryospythonpackagesonnxruntimepytorch
tensorflow)
get_gpu_info_by_nvmlcpuinfoget_cpu_infoget_memory_infoplatform_try_getget_related_packagesget_onnxruntime_infoget_pytorch_infoget_tensorflow_info)r   gpu_infocpu_infor   r   r   r   r   4   s   zMachineInfo.get_machine_inforeturnc                 C   s   t  }|j|jdS )zGet memory info)total	available)psutilvirtual_memoryr8   r9   )r   memr   r   r   r.   F   s   zMachineInfo.get_memory_infor6   namesc                 C   sL   |D ]!}||v r#|| }t |ttfrddd |D   S |  S qdS )N,c                 S   s   g | ]}t |qS r   )str.0ir   r   r   
<listcomp>P   s    z(MachineInfo._try_get.<locals>.<listcomp> )
isinstancelisttuplejoin)r   r6   r=   namevaluer   r   r   r0   K   s   zMachineInfo._try_getc              	   C   s\   t  }| |ddgtjddtjdd| |dg| |dg| |dgt jd	S )
zGet CPU infobrand	brand_rawF)logicalT	hz_actuall2_cache_sizeflags)rK   coreslogical_coreshzl2_cacherP   	processor)r,   r-   r0   r:   	cpu_countr/   unamerU   )r   r6   r   r   r   r-   T   s   

zMachineInfo.get_cpu_infoc           
   
   C   s   g }d}z4t   t }t }t|D ]!}t|}t|}i }|j|d< |j|d< t||d< |	| qt
  W n tyU } z| jsJ| jd| W Y d}~dS d}~ww ||d}	dtv retd |	d< |	S )	zGet GPU info using nvmlNmemory_totalmemory_availablerI   z-Error fetching GPU information using nvml: %s)driver_versiondevicesCUDA_VISIBLE_DEVICEScuda_visible)r   r   r   ranger	   r
   r8   freer   appendr   r   r   r   errorr   )
r   gpu_info_listrZ   deviceCountrB   handleinfor5   ra   resultr   r   r   r+   b   s2   



z MachineInfo.get_gpu_info_by_nvmlc                    s,   dd l }|j}g d  fdd|D }|S )Nr   )zonnxruntime-gpur(   zort-nightly-gpuzort-nightlyonnxtransformersprotobufsympytorchr*   flatbuffersnumpyzonnxconverter-commonc                    s    i | ]}|j  v r|j |jqS r   )keyversionr@   related_packagesr   r   
<dictcomp>   s     z4MachineInfo.get_related_packages.<locals>.<dictcomp>)pkg_resourcesworking_set)r   rs   installed_packagesrelated_packages_listr   rp   r   r1   ~   s
   z MachineInfo.get_related_packagesc              
   C   s   zdd l }|jd| v dW S  ty+ } z| js | j| W Y d }~d S d }~w tyG } z| js<| j|d W Y d }~d S d }~ww )Nr   CUDAExecutionProvider)ro   support_gpuF)r(   __version__get_available_providersImportErrorr   r   r   r   )r   r(   ra   r   r   r   r   r2      s    
z MachineInfo.get_onnxruntime_infoc              
   C   s   zdd l }|j|j |jjdW S  ty- } z| js"| j| W Y d }~d S d }~w t	yI } z| js>| j|d W Y d }~d S d }~ww )Nr   )ro   rx   cudaF)
rk   ry   r|   is_availablero   r{   r   r   r   r   )r   rk   ra   r   r   r   r   r3      s"   zMachineInfo.get_pytorch_infoc              
   C   s   zdd l }|jj|jj|j dW S  ty. } z| js#| j	| W Y d }~d S d }~w t
yI } z| js>| j	| W Y d }~d S d }~ww )Nr   )ro   git_versionrx   )r*   ro   VERSIONGIT_VERSIONtestis_built_with_cudar{   r   r   r   ModuleNotFoundError)r   tfra   r   r   r   r4      s"   zMachineInfo.get_tensorflow_info)FN)r   
__module____qualname____doc__r    r   r   r.   r   r?   r0   r-   r+   r1   r2   r3   r4   r   r   r   r   r      s    
	r   c                  C   s2   t  } | jddddd | jdd |  }|S )Nz--silentF
store_truezDo not print error message)requiredactionhelp)r   )argparseArgumentParseradd_argumentset_defaults
parse_args)parserargsr   r   r   parse_arguments   s   r   Tr7   c                 C   s   t | }tj|jddS )N   )indent)r   jsondumpsr   )r   machiner   r   r   r      s   r   __main__)T)r   r   r   r/   sysr%   r   typingr   r   r   r   r,   r:   py3nvml.py3nvmlr   r   r	   r
   r   r   r   r   r   r   r?   r   r   r   printr   r   r   r   r   <module>   s$   ( -