
    :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dS )u   
设备检测工具（支持 CUDA 与 Ascend NPU）

提供统一的设备选择/映射接口，以便在代码中优雅地支持 `cuda` / `npu` / `cpu`。
    )OptionalNreturnc                      	 t          t          dd          } t          | dd          }t          t          |          r
 |            nd          S # t          $ r Y dS w xY w)uD   检测当前运行时是否存在华为 Ascend NPU（torch.npu）。npuNis_availableF)getattrtorchboolcallable	Exception)npu_modis_avails     src\gzzm\utils\device_utils.pyhas_npur   
   sp    %--7ND99(8"4"4?HHJJJ%@@@   uus   AA 
AAc                  |    	 t          t          j                                                  S # t          $ r Y dS w xY w)u*   检测是否存在 CUDA（NVIDIA GPU）。F)r
   r	   cudar   r        r   has_cudar      sE    EJ++--...   uus   *- 
;;device_hintc                    | pd                                                                 }|r|                    d          rdS |                    d          r"t                      rdnt	                      rdndS |                    d          r"t	                      rdnt                      rdndS t	                      rdS t                      rdS dS )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 M??5!! 	5??6"" 	M%ZZL66wyy.KeeeL??5!! 	M#IIL55hjj,KFFeL yy uzz v5r   devicec                 Z    | sdS |                                                                  } | S )uH   根据选择的设备返回适合传给模型的 device_map 字符串。r   )r   r   r   s    r   device_map_for_modelr"   4   s-     u\\^^!!##FMr   c                 B    | 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+      s    
           $     x}     0# 3    8C=     e
d
dr   