U
    dA                     @   s  d dl mZ 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	 zd dl
Z
dZW n  eeeefk
rx   dZY nX e	dddd	d
dddddddddddddddddddgZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLd Z(dMdN Z)dO* Z+dPdQ Z,dRdS Z-dTdU Z.e/dVkre.  dS )W    )print_functionN)
namedtupleTF	SystemEnvtorch_versionis_debug_buildcuda_compiled_versiongcc_versionclang_versioncmake_versionoslibc_versionpython_versionpython_platformis_cuda_availablecuda_runtime_versionnvidia_driver_versionnvidia_gpu_modelscudnn_versionpip_versionpip_packagesconda_packageship_compiled_versionhip_runtime_versionmiopen_runtime_versioncaching_allocator_configis_xnnpack_availablec                 C   sf   t j| t jt jdd}| \}}|j}t dkr8d}nt }||}||}||	 |	 fS )z%Returns (return-code, stdout, stderr)T)stdoutstderrshellwin32Zoem)

subprocessPopenPIPEcommunicate
returncodeget_platformlocalegetpreferredencodingdecodestrip)commandpZ
raw_outputZraw_errrcencoutputerr r0   ;/tmp/pip-unpacked-wheel-ua33x9lu/torch/utils/collect_env.pyrun1   s    
 


r2   c                 C   s   | |\}}}|dkrdS |S )zIRuns command using run_lambda; reads and returns entire output if rc is 0r   Nr0   
run_lambdar*   r,   out_r0   r0   r1   run_and_read_all@   s    r7   c                 C   s<   | |\}}}|dkrdS t ||}|dkr2dS |dS )zIRuns command using run_lambda, returns the first regex match if it existsr   N   )researchgroup)r4   r*   regexr,   r5   r6   matchr0   r0   r1   run_and_parse_first_matchH   s    r>   c                 C   s(   | |\}}}|dkrdS | dd S )zKRuns command using run_lambda and returns first line if output is not emptyr   N
)splitr3   r0   r0   r1   run_and_return_first_lineR   s    rA   c                 C   sB   t jdd}t| | d}|d kr*|S ddd | D S )NZ	CONDA_EXEcondaz listr?   c                 3   s2   | ]*   d st fdddD r V  qdS )#c                 3   s   | ]}| kV  qd S Nr0   .0nameliner0   r1   	<genexpr>d   s   z/get_conda_packages.<locals>.<genexpr>.<genexpr>>   mklmagmasoumithnumpycudatoolkittorchN)
startswithanyrF   r0   rH   r1   rJ   `   s   
z%get_conda_packages.<locals>.<genexpr>)r   environgetr7   join
splitlines)r4   rB   r5   r0   r0   r1   get_conda_packagesZ   s    
rX   c                 C   s   t | ddS )Nzgcc --versionzgcc (.*)r>   r4   r0   r0   r1   get_gcc_versionr   s    r[   c                 C   s   t | ddS )Nzclang --versionzclang version (.*)rY   rZ   r0   r0   r1   get_clang_versionu   s    r\   c                 C   s   t | ddS )Nzcmake --versionz
cmake (.*)rY   rZ   r0   r0   r1   get_cmake_versiony   s    r]   c                 C   s,   t  dkrd}t| |dS t }t| |dS )Ndarwinzkextstat | grep -i cudazcom[.]nvidia[.]CUDA [(](.*?)[)]zDriver Version: (.*?) )r%   r>   get_nvidia_smi)r4   cmdsmir0   r0   r1   get_nvidia_driver_version}   s    
rb   c                 C   s   t  dks&trDttjdrDtjjd k	rDtr@tj r@tjd S d S t	 }t
d}| |d \}}}|dkrrd S t
|d|S )Nr^   hipz \(UUID: .+?\)z -Lr    )r%   TORCH_AVAILABLEhasattrrP   versionrc   cudais_availableZget_device_namer_   r9   compilesub)r4   ra   Z
uuid_regexr,   r5   r6   r0   r0   r1   get_gpu_info   s    &
rl   c                 C   s   t | ddS )Nznvcc --versionzrelease .+ V(.*)rY   rZ   r0   r0   r1   get_running_cuda_version   s    rm   c                 C   s(  t  dkrDtjdd}tjdd}tj|dd}d||}nt  d	krTd
}nd}| |\}}}t|dks|dkr|dkrtjd}|dk	rtj|rtj	|S dS t
 }	|dD ]&}
tj	|
}
tj|
r|	|
 q|	sdS tt|	}t|dkr|d S d|}d|S )zQThis will return a list of libcudnn.so; it's hard to tell which one is being usedr   
SYSTEMROOT
C:\WindowsZ	CUDA_PATHz%CUDA_PATH%System32wherez{} /R "{}\bin" cudnn*.dllr^   z ls /usr/local/cuda/lib/libcudnn*z7ldconfig -p | grep libcudnn | rev | cut -d" " -f1 | revr   r8   ZCUDNN_LIBRARYNr?   z!Probably one of the following:
{})r%   r   rT   rU   pathrV   formatlenisfilerealpathsetr@   addlistsorted)r4   system_rootZ	cuda_pathZ	where_cmdZ	cudnn_cmdr,   r5   r6   lZ	files_setfnfilesresultr0   r0   r1   get_cudnn_version   s4    


r   c                  C   s|   d} t  dkrxtjdd}tjdd}tj|dd| }tj|d	| }||g}|D ]}tj|rXd
|}  qxqX| S )Nz
nvidia-smir   rn   ro   ZPROGRAMFILESzC:\Program FileszNVIDIA CorporationZNVSMIrp   z"{}")r%   r   rT   rU   rr   rV   existsrs   )ra   r{   Zprogram_files_rootlegacy_pathnew_pathZsmisZcandidate_smir0   r0   r1   r_      s    

r_   c                   C   sJ   t jdrdS t jdr dS t jdr0dS t jdr@dS t jS d S )Nlinuxr   cygwinr^   )sysplatformrQ   r0   r0   r0   r1   r%      s    r%   c                 C   s   t | ddS )Nzsw_vers -productVersionz(.*)rY   rZ   r0   r0   r1   get_mac_version   s    r   c                 C   sB   t jdd}t j|ddd}t j|dd}t| d||S )Nrn   ro   rp   ZWbemZwmicZfindstrz!{} os get Caption | {} /v Caption)r   rT   rU   rr   rV   r7   rs   )r4   r{   Zwmic_cmdZfindstr_cmdr0   r0   r1   get_windows_version   s    r   c                 C   s   t | ddS )Nzlsb_release -azDescription:\t(.*)rY   rZ   r0   r0   r1   get_lsb_version   s    r   c                 C   s   t | ddS )Nzcat /etc/*-releasezPRETTY_NAME="(.*)"rY   rZ   r0   r0   r1   check_release_file   s    r   c                 C   s   ddl m} t }|dks"|dkr*t| S |dkrTt| }|d krFd S d|| S |dkrt| }|d k	rzd|| S t| }|d k	rd|| S d|| S |S )	Nr   )machiner   r   r^   zmacOS {} ({})r   z{} ({}))r   r   r%   r   r   rs   r   r   )r4   r   r   rg   descr0   r0   r1   get_os   s$    r   c                  C   s   dd l } |   S Nr   r   r   r0   r0   r1   get_python_platform  s    r   c                  C   s$   dd l } t dkrdS d|  S )Nr   r   N/A-)r   r%   rV   libc_verr   r0   r0   r1   get_libc_version  s    
r   c                    s8    fdd}t jd dkrdnd}|t jd }||fS )z_Returns `pip list` output. Note: will also find conda-installed pytorch
    and numpy packages.c                    s(   t  |  d}ddd | D S )Nz list --format=freezer?   c                 3   s(   | ]  t  fd ddD r V  qdS )c                 3   s   | ]}| kV  qd S rD   r0   rE   rH   r0   r1   rJ   "  s   zCget_pip_packages.<locals>.run_with_pip.<locals>.<genexpr>.<genexpr>>   mypyrP   rN   N)rR   rS   r0   rH   r1   rJ     s
   z9get_pip_packages.<locals>.run_with_pip.<locals>.<genexpr>)r7   rV   rW   )pipr5   rZ   r0   r1   run_with_pip  s    
z&get_pip_packages.<locals>.run_with_pipr   3Zpip3r   z -mpip)r   rg   
executable)r4   r   r   r5   r0   rZ   r1   get_pip_packages  s    r   c                  C   s   t jdd} | S )NZPYTORCH_CUDA_ALLOC_CONFrd   )r   rT   rU   )Z	ca_configr0   r0   r1   get_cachingallocator_config2  s    r   c                  C   s"   t rdd l} t| jjjS dS d S )Nr   r   )re   Ztorch.backends.xnnpackstrbackendsZxnnpackZenabled)rP   r0   r0   r1   r   6  s    c                  C   sB  t } t| \}}trtj}ttjj}ttj	 }tjj}t
tjdrTtjjd krbd } }}	qtj d}
dd |
D d }dd |
D d }	d}tjj}nd } } }}d } }}	tjdd}t||d	|tj d
 t ||t| t| t| t| |||	||t| t| t t| t| t| t  t! dS )Nrc   r   r?   c                 S   s$   g | ]}d |kr| ddd qS )zHIP RuntimeNr8   rsplitrF   sr0   r0   r1   
<listcomp>J  s      z get_env_info.<locals>.<listcomp>r   c                 S   s$   g | ]}d |kr| ddd qS )ZMIOpenNr8   r   r   r   r0   r0   r1   r   K  s       z{} ({}-bit runtime)r8   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   )"r2   r   re   rP   __version__r   rg   debugrh   ri   rf   rc   Z_CZ_show_configr@   r   replacer   rs   maxsize
bit_lengthr   rm   rl   rb   r   rX   r   r   r[   r\   r]   r   r   )r4   r   Zpip_list_outputversion_strZdebug_mode_strZcuda_available_strZcuda_version_strr   r   r   cfgsys_versionr0   r0   r1   get_env_info=  sT    
r   a  
PyTorch version: {torch_version}
Is debug build: {is_debug_build}
CUDA used to build PyTorch: {cuda_compiled_version}
ROCM used to build PyTorch: {hip_compiled_version}

OS: {os}
GCC version: {gcc_version}
Clang version: {clang_version}
CMake version: {cmake_version}
Libc version: {libc_version}

Python version: {python_version}
Python platform: {python_platform}
Is CUDA available: {is_cuda_available}
CUDA runtime version: {cuda_runtime_version}
GPU models and configuration: {nvidia_gpu_models}
Nvidia driver version: {nvidia_driver_version}
cuDNN version: {cudnn_version}
HIP runtime version: {hip_runtime_version}
MIOpen runtime version: {miopen_runtime_version}
Is XNNPACK available: {is_xnnpack_available}

Versions of relevant libraries:
{pip_packages}
{conda_packages}
c           
         s"  ddd}ddd}dd	d
}d dd}dd }|    || j d< dddg}|dg }t fdd|D }trtj s|r|D ]}	d |	< q| jd krd d< |  |  | d  d< | d  d<  d  r| d d| j	 d<  d r| d d d< t
jf  S )!NCould not collectc                 S   s(   |   D ]}| | d k	rq|| |< q| S rD   keys)dctreplacementkeyr0   r0   r1   replace_nones  s
    
z!pretty_str.<locals>.replace_nonesYesNoc                 S   s<   |   D ].}| | dkr"|| |< q| | dkr|| |< q| S )NTFr   )r   truefalser   r0   r0   r1   replace_bools  s    

z!pretty_str.<locals>.replace_bools	[prepend]c                    s&   |  d} fdd|D }d|S )Nr?   c                    s   g | ]} | qS r0   r0   )rF   rI   tagr0   r1   r     s     z/pretty_str.<locals>.prepend.<locals>.<listcomp>)r@   rV   )textr   linesZupdated_linesr0   r   r1   prepend  s    
zpretty_str.<locals>.prependNo relevant packagesc                 S   s   | d k	rt | dkr|S | S r   )rt   )r   r   r0   r0   r1   replace_if_empty  s    z$pretty_str.<locals>.replace_if_emptyc                 S   s(   | d k	r$t | ddkr$d| S | S )Nr?   r8   z
{}
)rt   r@   rs   )stringr0   r0   r1   maybe_start_on_next_line  s    
z,pretty_str.<locals>.maybe_start_on_next_liner   r   r   r   c                 3   s   | ]} | d kV  qd S rD   r0   )rF   fieldZmutable_dictr0   r1   rJ     s    zpretty_str.<locals>.<genexpr>zNo CUDANoner   r   r   z[{}] z[conda] )r   )r   r   )r   )r   )_asdictr   allre   rP   rh   ri   r   rs   r   env_info_fmt)
Zenvinfor   r   r   r   r   Zdynamic_cuda_fieldsZall_cuda_fieldsZall_dynamic_cuda_fields_missingr   r0   r   r1   
pretty_str  sD    









r   c                   C   s
   t t S rD   )r   r   r0   r0   r0   r1   get_pretty_env_info  s    r   c                     s   t d t } t |  trttdrttjdrtjjj tj	dkrt
j r fddt
 D }t|t
jjd}t
j|}tj|d}d	||d
 }t |tjd d S )Nz%Collecting environment information...utils_crash_handlerr   c                    s   g | ]}t j |qS r0   )r   rr   rV   )rF   dumpZminidump_dirr0   r1   r     s     zmain.<locals>.<listcomp>)r   z%Y-%m-%d %H:%M:%Sz.
*** Detected a minidump at {} created on {}, zKif this is related to your bug please include it when you file a report ***)file)printr   re   rf   rP   r   r   ZDEFAULT_MINIDUMP_DIRr   r   r   rr   r   listdirmaxgetctimedatetimefromtimestampstrftimers   r   )r.   dumpsZlatestctimeZcreation_timemsgr0   r   r1   main  s    

r   __main__)0
__future__r   r   r&   r9   r    r   r   collectionsr   rP   re   ImportError	NameErrorAttributeErrorOSErrorr   r2   r7   r>   rA   rX   r[   r\   r]   rb   rl   rm   r   r_   r%   r   r   r   r   r   r   r   r   r   r   r   r)   r   r   r   r   __name__r0   r0   r0   r1   <module>   s   

	%1J
