o
    bi                     @   s   d dl Z d dlmZ d dlmZmZ d dlZd dlZd dlm	  m
Z
 d dlmZ d dlmZ dedefdd	Zed
ZerBd dlZG dd deZdS )    N)	find_spec)ListUnion)TorchDeviceManager)!ASCEND_RT_VISIBLE_DEVICES_ENV_VARpackage_namereturnc                 C   s$   zt | d uW S  ty   Y dS w NF)r   ModuleNotFoundError)r    r   X/home/ubuntu/.local/lib/python3.10/site-packages/ray/air/_internal/device_manager/npu.pyis_package_present   s
   r   	torch_npuc                   @   s|   e Zd ZdZedd ZdefddZdee	j
 fddZd	ee	j
ef fd
dZdefddZdd Zdd Zdd ZdS )NPUTorchDeviceManagerzAscend NPU device managerc                  C   s   t rdd l} d S d S )Nr   )NPU_TORCH_PACKAGE_AVAILABLEr   )r   r   r   r   "register_custom_torch_dist_backend   s   z8NPUTorchDeviceManager.register_custom_torch_dist_backendr   c                 C   s   t sdS tj S r	   )r   torchnpuis_availableselfr   r   r   r   #   s   
z"NPUTorchDeviceManager.is_availablec              
   C   s   t rbtj rbdd t  tj D }g }t	|dkrTt
jtd}|r0|dkr0|d}ng }|D ]}z
||| W q4 tyR   td| d| d	w n|d d
d |D }|S td)zGets the correct torch device list configured for this process.

        Returns a list of torch NPU devices allocated for the current worker.
        If no NPUs are assigned, then it returns a list with a single CPU device.
        c                 S   s   g | ]}t |qS r   )str).0idr   r   r   
<listcomp>0   s    z5NPUTorchDeviceManager.get_devices.<locals>.<listcomp>r    
NoDevFiles,z/ASCEND_RT_VISIBLE_DEVICES set incorrectly. Got z, expected to include zH. Did you override the `ASCEND_RT_VISIBLE_DEVICES` environment variable?c                 S   s   g | ]
}t d | qS )znpu:)r   device)r   	device_idr   r   r   r   O   s    z;Using NPUTorchDeviceManager but torch npu is not available.)r   r   r   r   rayget_runtime_contextget_accelerator_idsray_constantsNPUlenosenvirongetr   splitappendindex
IndexErrorRuntimeError)r   npu_ids
device_idsnpu_visible_strnpu_visible_listnpu_iddevicesr   r   r   get_devices)   s>   

z!NPUTorchDeviceManager.get_devicesr   c                 C   s   t j| d S )N)r   r   
set_devicer   r   r   r   r   r5   W   s   z NPUTorchDeviceManager.set_devicec                 C   s   dS )z6Validate if the device type support to create a streamTr   r   r   r   r   supports_streamZ   s   z%NPUTorchDeviceManager.supports_streamc                 C      t j|S )zCreate a stream on NPU device)r   r   Streamr6   r   r   r   create_stream^      z#NPUTorchDeviceManager.create_streamc                 C   r8   )z(Get a torch.stream context on NPU device)r   r   stream)r   r<   r   r   r   get_stream_contextb   r;   z(NPUTorchDeviceManager.get_stream_contextc                 C   s
   t j S )z!Get current stream for NPU device)r   r   current_streamr   r   r   r   get_current_streamf   s   
z(NPUTorchDeviceManager.get_current_streamN)__name__
__module____qualname____doc__staticmethodr   boolr   r   r   r   r4   r   intr5   r7   r:   r=   r?   r   r   r   r   r      s    
.r   )r&   importlib.utilr   typingr   r   r   r    ray._private.ray_constants_privater#   5ray.air._internal.device_manager.torch_device_managerr   ray._private.accelerators.npur   r   rE   r   r   r   r   r   r   r   r   <module>   s    