o
    W۷i]                     @  s  d 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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Zdadadadada	 dadddZejddd	kZdUddZdd Zdd Zdd Zdd Zdd Z ej
!dZ"ej
!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+d,d- Z,dVd/d0Z-dWd2d3Z.dXd6d7Z/d8d9 Z0dYd<d=Z1dZdAdBZ2d[dDdEZ3d[dFdGZ4dHdI Z5ej6d\dMdNZ7dOdP Z8d]dQdRZ9d]dSdTZ:dS )^z6
This file must not depend on any other CuPy modules.
    )annotationsN)Any )ncclcutensorCUPY_DEBUG_LIBRARY_LOAD01msgstrreturnNonec                 C  s*   t rtjd|  d tj  d S d S )Nz[CUPY_DEBUG_LIBRARY_LOAD] 
)_debugsysstderrwriteflush)r
    r   G/home/ubuntu/vllm_env/lib/python3.10/site-packages/cupy/_environment.py_logD   s   r   c                   C     t dkrt a t S Nr   )
_cuda_path_get_cuda_pathr   r   r   r   get_cuda_pathJ      r   c                   C  r   r   )
_nvcc_path_get_nvcc_pathr   r   r   r   get_nvcc_pathR   r   r   c                   C  r   r   )
_rocm_path_get_rocm_pathr   r   r   r   get_rocm_pathZ   r   r"   c                   C  r   r   )_hipcc_path_get_hipcc_pathr   r   r   r   get_hipcc_pathb   r   r%   c                   C  r   r   )	_cub_path_get_cub_pathr   r   r   r   get_cub_pathj   r   r(   linuxwin32c                  C  s   t jd} tr-t }|dkrt jdr| d}nd}n| d}t j| d|}nt	r7t j| d}nJ t j|rA|S d	S )
zThis works since CUDA 12.0+.CONDA_PREFIXaarch64z/etc/nv_tegra_releasez-linuxz
sbsa-linuxtargetsLibraryFN)
osenvironget_PLATFORM_LINUXplatformmachinepathexistsjoin_PLATFORM_WIN32)conda_prefixplatarch	cuda_pathr   r   r   _get_conda_cuda_pathv   s   
r=   c                  C  s   t jdd} t j| r| S t }|d ur%|d dkr%t }|d ur%|S ddlm}m	} z|d}W n	 |y<   Y n6w t j
t j
|j} |jdkrYt }|| sWJ |S |jdkrptd	| rntrlt j
| } | S d S | S t jd
rzd
S d S )N	CUDA_PATHr   	packagingcondar   load_nvidia_dynamic_libDynamicLibNotFoundErrornvrtczsite-packageszsite-packages.*nvidia.*cu\d{2}z/usr/local/cuda)r/   r0   r1   r5   r6   get_preload_configr=   cuda.pathfinderrB   rC   dirnameabs_path	found_via
startswithresearchr8   )r<   configconda_cuda_pathrB   rC   rD   r   r   r   r      s:   

r   c                  C  sD   t jdd } | d ur| S t }|d u rd S tjdt j|ddS )NNVCCnvccbinr5   )r/   r0   r1   r   shutilwhichr5   r7   )	nvcc_pathr<   r   r   r   r      s   r   c                  C  sX   t jdd} t j| r| S td}|d ur"t jt j|S t jdr*dS d S )N	ROCM_HOMEr   hipccz	/opt/rocm)r/   r0   r1   r5   r6   rS   rT   rG   )	rocm_path
hipcc_pathr   r   r   r!      s   
r!   c                  C  s*   t  } | d u r	d S tjdtj| ddS )NrW   rQ   rR   )r"   rS   rT   r/   r5   r7   )rX   r   r   r   r$      s   r$   c                  C  s   ddl m}  tjtjt}| js&tjtj	|dr"d}|S d }|S t
 }|d ur<tjtj	|dr<d}|S d }|S )Nr   )runtimez_core/include/cupy/_cccl/cubz<bundle>zinclude/hipcubz<ROCm>)cupy_backends.cuda.apirZ   r/   r5   rG   abspath__file__is_hipisdirr7   r"   )rZ   current_dirr&   rX   r   r   r   r'      s$   
r'   c                  C  sx  t jdrt } | d uo| d dk}t }|d ur'|r|}ntj|d}n	d }|s0t	d t
d| tjt ddd	}tj|rOt
d
| n	t
d| d }dt jkr|d urt
d| t| tj|d}tj|rt
d|  t| |d urt
d| t| d S d S |d urt
d| tjdd}|tj | tjd< d S d S d S )Nr*   r?   r@   rQ   zZCUDA path could not be detected. Set CUDA_PATH environment variable if CuPy fails to load.zCUDA_PATH: {}cupy.datalibzWheel shared libraries: {}z%Not wheel distribution ({} not found))      zAdding DLL search path: {}x64z&Adding DLL search path (for CUDA 13): zAdding to PATH: {}PATHr   )r   r3   rJ   rE   r   r/   r5   r7   warningswarnr   formatget_cupy_install_pathr_   version_infoadd_dll_directoryr6   r0   r1   pathsep)rM   is_condar<   cuda_bin_pathwheel_libdircuda_bin_x64_pathr5   r   r   r   _setup_win32_dll_directory  sV   



-rs   c                   C  s   t jt jt jtdS )Nz..)r/   r5   r\   r7   rG   r]   r   r   r   r   rk   7  s   rk   c                  C  s.   t jdd} | du rt jdS t j| S )az  Returns the directory where CUDA external libraries are installed.

    This environment variable only affects wheel installations.

    Shared libraries are looked up from
    `$CUPY_CUDA_LIB_PATH/$CUDA_VER/$LIB_NAME/$LIB_VER/{lib,lib64,bin}`,
    e.g., `~/.cupy/cuda_lib/11.2/nccl/2.8.0/lib64/libnccl.so.2.8.0`.

    The default $CUPY_CUDA_LIB_PATH is `~/.cupy/cuda_lib`.
    CUPY_CUDA_LIB_PATHNz~/.cupy/cuda_lib)r/   r0   r1   r5   
expanduserr\   )cupy_cuda_lib_pathr   r   r   get_cupy_cuda_lib_path=  s   rw   dict[str, Any] | Nonec                   C  s   t d u rtda t S )Nz_wheel.json)_preload_config_get_json_datar   r   r   r   rE   N  s   rE   namec                 C  sZ   t jt dd| }t j|sd S t|}t|W  d    S 1 s&w   Y  d S )Nra   rb   )r/   r5   r7   rk   r6   openjsonload)r{   config_pathfr   r   r   rz   U  s   

$rz   rc   boolc                 C  s   t  }|du s|d dkrtd|  d dS | tvr"td|  | |vr0td|  d	 dS t|  dur?td
|   dS dS )z(Returns if the preload can be attempted.Nr?   r@   zNot preloading z( as this is not a pip wheel installationFzUnknown preload library: zPreload z not configured in wheelzPreload already attempted: T)rE   r   _preload_libsAssertionError)rc   rM   r   r   r   _can_attempt_preload^  s   r   c                   s  t d  tsdS i t< ddlm}m} z|}W n |y: } zt  d|  W Y d}~nd}~ww |t d< t  d|  dS t   d }t d	| t t d
   d   d }|D ]׉t d d d d  fdddD }dkr  d }t	| d | }ndkr  d }t
| d | }|D ]T}	tj|	st d|	 qzt d|	  t|	t |	< t d W  ni ty } z t|j}
d|	 d|
 d| d}t | t| W Y d}~qd}~ww t d t d d ztt < t d W qr tyH } zt d d|  W Y d}~qrd}~ww qrdS ) zPreload dependent shared libraries.

    The preload configuration file (cupy/.data/_wheel.json) will be added
    during the wheel build process.
    z"Preloading triggered for library: Nr   rA   z) could not be loaded by cuda-pathfinder: 
pathfinderz is loaded by cuda-pathfinder: cudaz$CuPy wheel package built for CUDA {}zCuPy CUDA library directory: {}version	filenameszLooking for z	 version  ()c              
     s&   g | ]}t j d  |qS )r   )r/   r5   r7   ).0xrM   rv   filenamerc   r   r   r   
<listcomp>  s    z$_preload_library.<locals>.<listcomp>)rc   lib64rQ   r   min_pypi_versionr   z"Rejected candidate (not found): {}zTrying to load Loadedz CuPy failed to preload library (z): zFile {} could not be foundz from default search pathzLibrary z could not be preloaded: )r   r   r   rF   rB   rC   rE   rj   rw   _get_cutensor_from_wheel_get_nccl_from_wheelr/   r5   r6   ctypesCDLL	Exceptiontype__name__rh   ri   )rc   rB   rC   	loaded_dlecuda_versionr   libpath_candsr   libpathe_typer
   r   r   r   _preload_libraryz  s   
 r   r   tuple[int, int, int]c                 C  s^   t jd| dd}t|d }t|dkrt|d nd}t|dkr(t|d nd}|||fS )Nz[^\d]rd   )maxsplitr         )rK   splitintlen)r   partsmajorminorpatchr   r   r   _parse_version  s
   
r   package_prefixr   &importlib.metadata.Distribution | Nonec           
      C  s   | d\}}|  d| }ztj|}W n tjjy,   t|  d| d Y dS w t|j}t|}|d |d koU|d |d kpU|d |d koU|d |d k}	|	sjt|  d| d	| d
|j  dS t|  d| d|j  |S )z
    Returns the distribution of the given package name and version
    installed via pip (e.g., cutensor-cuXX).
    If the package is not found or incompatible, returns None.
    .z-cuz wheel package (z) not installedNr   r   r   z) incompatible: expected z, found z	) found: )r   	importlibmetadatadistributionPackageNotFoundErrorr   r   r   )
r   r   r   cuda_major_ver_pkgdistactualexpectedis_compatibler   r   r   _find_compatible_wheel  s.   
r   	list[str]c                 C  sz   t d| |}|du rg S tjdkr,|d| dd  |d| dd  g}n
|d|d	g}d
d |D S )zx
    Returns the list of shared library path candidates for cuTENSOR
    installed via Pip (cutensor-cuXX package).
    r   Nr)   zcutensor/lib/libcutensor.so.r   r   zcutensor/lib/libcutensorMg.so.zcutensor\bin\cutensor.dllzcutensor\bin\cutensorMg.dllc                 S     g | ]}t |qS r   r   r   rc   r   r   r   r         z,_get_cutensor_from_wheel.<locals>.<listcomp>)r   r   r3   locate_filer   r   r   r   shared_libsr   r   r   r      s   

r   c                 C  sP   t jdkrg S td| |}|du rg S |d| dd  g}dd |D S )	zw
    Returns the list of shared library path candidates for NCCL
    installed via Pip (nvidia-nccl-cuXX package).
    r)   znvidia-ncclNznvidia/nccl/lib/libnccl.so.r   r   c                 S  r   r   r   r   r   r   r   r   (  r   z(_get_nccl_from_wheel.<locals>.<listcomp>)r   r3   r   r   r   r   r   r   r   r     s   
r   c                 C  s  t  }|d u s| |vrd S |d dkrc|d }|dd }| dkr=|d d }t|d }d| d	| d
|d  d}n4| dkr\|d d }t|d }d| d	| d
|d  d}ntd|  |d dkrod|  }nttd|  dt|j dt| d| d	 d S )Nr?   pipr   r   r   r   r   zpip install "cutensor-cuz>=z,<r   "r   zpip install "nvidia-nccl-cuzUnknown library: r@   zconda install -c conda-forge r   z' library could not be loaded.

Reason: r   z')

You can install the library by:
  $ )	rE   r   r   r   rh   ri   r   r   r   )rc   excrM   r   
cuda_majorr   r   cmdr   r   r   _preload_warning+  s6   r   r   r   r   c                 C  s   | dk s| dkr|dk rg S t  }|d ur3|d dkr3t }|d ur3tj|dg}td|  |S ddlm} z|d	}W n tyN   td
 g  Y S w |d ur]td|  |gS td
 g S )N   r   r?   r@   includezfound CUDA headers from conda: r   )find_nvidia_header_directorycudartz*CUDA headers not found via cuda-pathfinderz(found CUDA headers via cuda-pathfinder: )	rE   r=   r/   r5   r7   r   rF   r   RuntimeError)r   r   rM   r<   resultr   include_dirr   r   r   $_get_include_dir_from_conda_or_wheelK  s*   r   c               	   C  sv   d} g }| D ]}zt j| || W q t jjy    Y qw dt|k r9dt|}t	d| d d S d S )N)ra   zcupy-cuda12xzcupy-cuda13xzcupy-rocm-7-0zcupy-rocm-7-1zcupy-cuda11xzcupy-cuda102zcupy-cuda110zcupy-cuda111zcupy-rocm-4-3zcupy-rocm-5-0zcupy-cuda112zcupy-cuda113zcupy-cuda114zcupy-cuda115zcupy-cuda116zcupy-cuda117zcupy-rocm-4-0zcupy-rocm-4-2zamd-cupyr   z, z
--------------------------------------------------------------------------------

  CuPy may not function correctly because multiple CuPy packages are installed
  in your environment:

    a/  

  Follow these steps to resolve this issue:

    1. For all packages listed above, run the following command to remove all
       existing CuPy installations:

         $ pip uninstall <package_name>

      If you previously installed CuPy via conda, also run the following:

         $ conda uninstall cupy

    2. Install the appropriate CuPy package.
       Refer to the Installation Guide for detailed instructions.

         https://docs.cupy.dev/en/stable/install.html

--------------------------------------------------------------------------------
)
r   r   r   appendr   r   r7   sortedrh   ri   )knowncupy_installedkcupy_packages_listr   r   r   _detect_duplicate_installationk  s   r   c               
   C  sd   d} t jdkr0z| t 7 } W | S  ty/ } z| dt|j d| 7 } W Y d }~| S d }~ww | S )Na  Failed to import CuPy.

If you installed CuPy via wheels (cupy-cudaXXX or cupy-rocm-X-X), make sure that the package matches with the version of CUDA or ROCm installed.

On Linux, you may need to set LD_LIBRARY_PATH environment variable depending on how you installed CUDA/ROCm.
On Windows, try setting CUDA_PATH environment variable.

Check the Installation Guide for details:
  https://docs.cupy.dev/en/latest/install.htmlr*   z%

The cause could not be identified: : )r   r3   _diagnose_win32_dll_loadr   r   r   )r
   r   r   r   r   _diagnose_import_error  s"   
r   c                  C  s"  t d} | d u r
dS ddlm} td}|j|j|jg|j_|j|j_	dddt
  dg}td}| d	 D ]T}zt|}||j|t| |d
| d|j  W q7 tyh   |d
| d Y q7 ty } z|d
| dt|j d| d W Y d }~q7d }~ww d|S )Nz_depends.jsonr   r   )wintypeskernel32zCUDA Path: zDLL dependencies:i   dependsz  z -> z -> not foundz -> error (r   r   r   )rz   r   r   r   HANDLELPWSTRDWORDGetModuleFileNameWargtypesrestyper   create_unicode_buffer_handler   r   valueFileNotFoundErrorr   r   r   r7   )r   r   r   linesfilepathr{   dllr   r   r   r   r     s4   




0
r   )r
   r   r   r   )r   rx   )r{   r   r   rx   )rc   r   r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   );__doc__
__future__r   r   	functoolsimportlib.metadatar   r}   r/   os.pathr3   rK   rS   r   typingr   rh   r   r   r    r#   r&   ry   r   r0   r1   r   r   r   r   r"   r%   r(   rJ   r2   r8   r=   r   r   r!   r$   r'   rs   rk   rw   rE   rz   r   r   r   r   r   r   r   cacher   r   r   r   r   r   r   r   <module>   sp    
46


	
]

!
 
H