
    :i	                     |    d Z ddlmZ ddlZdefdZdefdZddee   defdZd	ee   defd
Z	d	ee   fdZ
g dZy)u   
设备检测工具（支持 CUDA 与 Ascend NPU）

提供统一的设备选择/映射接口，以便在代码中优雅地支持 `cuda` / `npu` / `cpu`。
    )OptionalNreturnc                      	 t        t        dd      } t        | dd      }t        t        |      r |             S d      S # t        $ r Y yw xY w)uD   检测当前运行时是否存在华为 Ascend NPU（torch.npu）。npuNis_availableF)getattrtorchboolcallable	Exception)npu_modis_avails     /app/gzzm/utils/device_utils.pyhas_npur   
   sQ    %-7ND9(8"4HJ@@%@@ s   8A A 	AAc                  p    	 t        t        j                  j                               S # t        $ r Y yw xY w)u*   检测是否存在 CUDA（NVIDIA GPU）。F)r
   r	   cudar   r        r   has_cudar      s1    EJJ++-.. s   &) 	55device_hintc                 H   | xs dj                         j                         }|rh|j                  d      ry|j                  d      rt               rdS t	               rdS dS |j                  d      rt	               rdS t               rdS dS t	               ryt               ryy)u  
    基于 hint 与运行时检测选择设备，返回 'npu' | 'cuda' | 'cpu'.

    选择逻辑：优先尊重显式 hint（支持 'npu', 'cuda', 'cpu'，自动处理带索引的 'cuda:0'/'npu:0'），
    否则按顺序优先选择 NPU -> CUDA -> CPU。
     cpur   r   )striplower
startswithr   r   )r   hints     r   choose_devicer      s     2$$&,,.D??5!??6"%Z6LwyeLeL??5!#I5LhjFLeL yzr   devicec                 H    | sy| j                         j                         } | S )uH   根据选择的设备返回适合传给模型的 device_map 字符串。r   )r   r   r   s    r   device_map_for_modelr"   4   s!    \\^!!#FMr   c                 P    | r| dk(  rt         j                  S t         j                  S )u0   返回建议用于加载模型的 torch dtype。r   )r	   float32float16r!   s    r   torch_dtype_for_devicer&   =   s    Vu_}}==r   )r   r   r   r"   r&   )N)__doc__typingr   r	   r
   r   r   strr   r"   r&   __all__r   r   r   <module>r+      sp   
   $ x}  0# 3 8C=  er   