
    vj                     t    d dl Z d dlmZ d dlmZmZ d dlmZ  e            Zd Z	ed
d            Z
d Zd	 ZdS )    N)contextmanager)Devices
Frameworks)
get_loggerc                    d}| | dk    s
J |            |                                  } |                     d          }t          |          dk    s
J |            | J |d         dv s
J |            |d         }d}t          |          dk    rt          |d                   }|d	k    rt          j        }|t          j        k    r|d}||fS )
a^   Verify device is valid, device should be either cpu, cuda, gpu, cuda:X or gpu:X.

    Args:
        device (str):  device str, should be either cpu, cuda, gpu, gpu:X or cuda:X
            where X is the ordinal for gpu device.

    Return:
        device info (tuple):  device_type and device_id, if device_id is not set, will use 0 as default.
    z^device should be either cpu, cuda, gpu, gpu:X or cuda:X where X is the ordinal for gpu device.N :   r   )cpucudagpu   r   )lowersplitlenintr   r   )device_nameerr_msgelesdevice_type	device_ids        g/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/modelscope/utils/device.pyverify_devicer      s     oG"{b'8'8'8''8'88##%%KS!!Dt99>>>7>>>"""7,,,,g,,,q'KI
4yy1}}QLL	fkgk!!i&7		!!    gpu:0c              #     K   t          |          \  }}| t          j        k    rddl}|t          j        k    r3|j                                        st          	                    d           t          j
        }|t          j
        k    r4|                    d          5  dV  ddd           dS # 1 swxY w Y   dS |t          j        k    r7|                    d|           5  dV  ddd           dS # 1 swxY w Y   dS dS | t          j        k    rkddl}|t          j        k    rQ|j                                        r|j                            d|            nt          	                    d           dV  dS dV  dS )a   Device placement function, allow user to specify which device to place model or tensor
    Args:
        framework (str):  tensorflow or pytorch.
        device (str):  gpu or cpu to use, if you want to specify certain gpu,
            use gpu:$gpu_id or cuda:$gpu_id.

    Returns:
        Context manager

    Examples:

        >>> # Requests for using model on cuda:0 for gpu
        >>> with device_placement('pytorch', device='gpu:0'):
        >>>     model = Model.from_pretrained(...)
    r   Nz5tensorflow: cuda is not available, using cpu instead.z/CPU:0z/device:gpu:cuda:z2pytorch: cuda is not available, using cpu instead.)r   r   tf
tensorflowr   r   testis_gpu_availableloggerdebugr   devicetorchr   is_available
set_device)	frameworkr   r   r   r   r%   s         r   device_placementr)   '   s6     " +;77KJM!!'+%%bg.F.F.H.H%LLGI I Ik'+%%8$$                    gk))YY9i99::  EEE                  *) 
j&	&	&'+%%z&&(( J
%%&9i&9&9::::HJ J Js$   B//B36B3$C66C:=C:c                 $   ddl }t          |           \  }}d}|t          j        k    r7d}|j                                        st                              d           d}|r|                    d|           }n|                    d          }|S )z] create torch device

    Args:
        device_name (str):  cpu, gpu, gpu:0, cuda:0 etc.
    r   NFTz)cuda is not available, using cpu instead.r   r   )	r%   r   r   r   r   r&   r"   infor$   )r   r%   r   r   use_cudar$   s         r   create_devicer-   U   s     LLL*;77KHgk!!z&&(( 	KKCDDDH %1i1122e$$Mr   c                     dd l } ddl m} | j                                        rO|                                r8|                                r$dt
          j        v rdt
          j        d          }nd}nd}|                     |          S )Nr   )distributed
LOCAL_RANKr   zcuda:0r   )r%   r/   r   r&   is_initializedosenvironr$   )r%   distr   s      r   
get_devicer5   l   s    LLL))))))z    	!4#6#6 $
 $
 	!bj((:
< 8::II II	<<	"""r   )r   )r2   
contextlibr   modelscope.utils.constantr   r   modelscope.utils.loggerr   r"   r   r)   r-   r5    r   r   <module>r:      s    				 % % % % % % 9 9 9 9 9 9 9 9 . . . . . .	" " "8 * * * *Z  .# # # # #r   