o
    H!i                     @   s   d dl Z d dlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ g 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G dd deZdS )    N)ContextDecorator   )logging)DCU_WHITELISTGCU_WHITELISTMLU_WHITELISTNPU_BLACKLISTXPU_WHITELIST)DISABLE_DEV_MODEL_WL)cpugpuxpunpumlugcudcuZiluvatar_gpuc                 C   s@   | dkr|d urt d|rdtt|}|  d| S |  S )Nr   z"`device_ids` must be None for CPUs,:)
ValueErrorjoinmapstr)device_type
device_ids r   `/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddlex/utils/device.pyconstr_device   s   r   c                  C   s2   dd l } | j r| jj dkrtddgS dS )Nr   r   r   )paddledeviceZis_compiled_with_cudacudaZdevice_countr   )r   r   r   r   get_default_device)   s   r    c                 C   s   |  d}t|dkrtd|  t|dkr |d d}}n |\}}| d}|D ]}| s8td| q+ttt|}| }| tv sLJ |d	krX|durXtd
||fS )parse_devicer      zInvalid device: r   r   Nr   z1Device ID must be an integer. Invalid device ID: r   z)No Device ID should be specified for CPUs)	splitlenr   isdigitlistr   intlowerSUPPORTED_DEVICE_TYPE)r   partsr   r   Z	device_idr   r   r   r!   2   s&   

r!   c                 C   s<   t | \}}|rt||ksJ t||d | S t||S N)r!   r$   r   )r   numr   r   r   r   r   update_device_numK   s
   
r-   c                 C   s   t | \}}t|S r+   )r!   set_env_for_device_type)r   r   _r   r   r   set_env_for_deviceT   s   r0   c                 C   s   dd l }dd }|  dkr| rddi}|| |  dkr-ddd	d
ddd}|| |  dkr>ddddd}|| |  dkrMddd}|| |  dkr]ddi}|| d S d S )Nr   c                 S   s6   |   D ]\}}|tj|< t| d| d qd S )Nz has been set to .)itemsosenvironr   debug)envskeyvalr   r   r   _set\   s   
z%set_env_for_device_type.<locals>._setr   ZFLAGS_conv_workspace_size_limit2000r   0Zauto_growthz0pad3d,pad3d_grad,set_value,set_value_with_tensorTrue)ZFLAGS_npu_jit_compileFLAGS_use_stride_kernelZFLAGS_allocator_strategyZCUSTOM_DEVICE_BLACK_LISTZFLAGS_npu_scale_aclnnZFLAGS_npu_split_aclnnr   1Z1800Zpad3d)ZBKCL_FORCE_SYNCZBKCL_TIMEOUTr=   ZXPU_BLACK_LISTr   )r=   Z$FLAGS_use_stream_safe_cuda_allocatorr   r=   )r   r(   Zis_compiled_with_rocm)r   r   r9   r6   r   r   r   r.   Y   s<   r.   c                 C   s   t r	td d S d}| dkr|tv sJ d| d| d S | dkr3|tv s1J d| d| d S | dkrG|tvsEJ d	| d| d S | d
kr[|tv sYJ d| d| d S | dkrm|tv soJ d| d| d S d S )NznSkip checking if model is supported on device because the flag `PADDLE_PDX_DISABLE_DEV_MODEL_WL` has been set.zWYou could set env `PADDLE_PDX_DISABLE_DEV_MODEL_WL` to `true` to disable this checking.r   z%The DCU device does not yet support `z` model!r   z%The MLU device does not yet support `r   z%The NPU device does not yet support `r   z%The XPU device does not yet support `r   z%The GCU device does not yet support `)r
   r   warningr   r   r   r	   r   )r   
model_nameZtipsr   r   r   check_supported_device_type   s8   




rA   c                 C   s   t | \}}t||S r+   )r!   rA   )r   r@   r   r/   r   r   r   check_supported_device   s   
rB   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TemporaryDeviceChangerz?
    A context manager to temporarily change global device
    c                 C   s   dd l }|| _|j | _d S Nr   )r   
new_devicer   Z
get_deviceoriginal_device)selfrE   r   r   r   r   __init__   s   zTemporaryDeviceChanger.__init__c                 C   s(   dd l }| jd u r| S |j| j | S rD   )r   rE   r   
set_device)rG   r   r   r   r   	__enter__   
   
z TemporaryDeviceChanger.__enter__c                 C   s(   dd l }| jd u rdS |j| j dS )Nr   F)r   rE   r   rI   rF   )rG   exc_typeexc_valexc_tbr   r   r   r   __exit__   rK   zTemporaryDeviceChanger.__exit__N)__name__
__module____qualname____doc__rH   rJ   rO   r   r   r   r   rC      s
    rC   )r3   
contextlibr    r   Zcustom_device_listr   r   r   r   r	   flagsr
   r)   r   r    r!   r-   r0   r.   rA   rB   rC   r   r   r   r   <module>   s   
		)