
    9j/J              	          U d Z ddlZddlZddlmZ ddlmZ ddlZddlmZ ddl	m
Z
mZ ddlmZ ddlmZ d	d
lmZ ej$                  Zej&                  ZdZeej,                  j.                  df   ed<   dag aeeeg df   ee   f      ed<    ej:                         Z ej>                         Z  e       a! e"ej,                  d      rej,                  jF                  Z$nde%de%fdZ$ e"ej,                  d      rej,                  jL                  Z'nde%de%fdZ'd Z(d Z)d Z*de+fdZ,dFdZ- G d de.      Z/de+fdZ0de+fdZ1dGdeddfdZ2de%fd Z3de%fd!Z4dGdedefd"Z5dGdedefd#Z6	 dHd$edz  d%ed&e%ddfd'Z7de8eef   fd(Z9d)ee%e%e%e%gdf   ddfd*Z:dId+e+fd,Z;dGdedee%e%f   fd-Z<dFd.Z=d/efd0Z>deddfd1Z?dGdede8eef   fd2Z@ G d3 d      ZA G d4 d5      ZBd6 ZCd/edz  deBfd7ZDdJdedefd8ZEdee   fd9ZFdJd:ededdfd;ZGd<ee   ddfd=ZHd>e%ddfd?ZId>e%ddfd@ZJde%fdAZKde%fdBZLde%fdCZMd	dDlN d	dDlO g dEZPy)KzH
This package enables an interface for accessing MTIA backend in python
    N)Callable)Any)Tensor)	is_fbcodeis_prod)_LazySeedTracker)Device   )_get_device_index .default_generatorsF_queued_calls_mtia_exchangeDevicedevicereturnc                 $    | dk  ryt        d      Nr   z)PyTorch was compiled without MTIA supportRuntimeErrorr   s    S/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/mtia/__init__.py_exchange_devicer   )       A:FGG    _mtia_maybeExchangeDevicec                 $    | dk  ryt        d      r   r   r   s    r   _maybe_exchange_devicer   3   r   r   c                      t                y N)
_lazy_initr   r   r   initr"   9   s    Lr   c                  (    t         xr t                S )z9Return whether PyTorch's MTIA state has been initialized.)_initialized_is_in_bad_forkr   r   r   is_initializedr&   =   s    1 111r   c                    t         5  t               r |        cd d d        S |j                  dd      r)t        j	                  | t        j                                nd|j                  dd      r)t        j                  | t        j                                n)t        j                  | t        j                         f       d d d        y # 1 sw Y   y xY w)Nseed_allFseed)
_initialization_lockr&   get_lazy_seed_trackerqueue_seed_all	tracebackformat_stack
queue_seedr   append)callablekwargss     r   
_lazy_callr4   B   s    	 
K:
K 
K
 zz*e,"11(I<R<R<TUFE*"--h	8N8N8PQ$$h	0F0F0H%IJ
K 
K 
Ks   C
BC

Cc                  >    t         j                  j                         S r    )torch_C_mtia_isInBadForkr   r   r   r%   r%   P   s    88%%''r   c            	         t               st        t        d      ry t        5  t               r
	 d d d        y t	               rt        d      t               st        d      t               r!t               r	 ddl
m}  | j                          t        j                  j!                          dt        _        t$        j'                  d t(        j+                         D               	 t$        D ]  \  }}	  |         	 t5        t        d       dad d d        y # t        $ r Y w xY w# t,        $ r1}dt/        |       d	d
j1                  |       }t3        |      |d }~ww xY w# t5        t        d       w xY w# 1 sw Y   y xY w)Nis_initializingzwCannot re-initialize MTIA in forked subprocess. To use MTIA with multiprocessing, you must use the 'spawn' start methodzTorch not compiled with MTIA enabled. Ensure you have `import mtia.host_runtime.torch_mtia.dynamic_library` in your python src file and include `//mtia/host_runtime/torch_mtia:torch_mtia` as your target dependency!r   )cxx_resource_managerTc              3   &   K   | ]	  }|s|  y wr    r   ).0callss     r   	<genexpr>z_lazy_init.<locals>.<genexpr>   s     XuRWUXs   z6MTIA call failed lazily at initialization with error: z(

MTIA call was originally invoked at:

 )r&   hasattr_tlsr*   r%   r   _is_compiledAssertionErrorr   r   libfb.py.cxx_resourcesr;   installModuleNotFoundErrorr6   r7   
_mtia_initr:   r   extendr,   	get_calls	ExceptionstrjoinDeferredMtiaCallErrordelattrr$   )r;   queued_callorig_tracebackemsgs        r   r!   r!   T   s}   74):;	 7 7 7 I  ~ *  ;79G$,,.
 	  $X0B0L0L0NXX	-/< <+^<M< D+,o7 7> '   ! <PQTUVQWPX YCCE77>CZB[]  04!;< D+,m7 7sq   E7>E76DAE7$E"1D%8E";E7	D"E7!D""E7%	E.,EEE""E44E77F c                       e Zd Zy)rN   N)__name__
__module____qualname__r   r   r   rN   rN      s    r   rN   c                  >    t         j                  j                         S )z*Return true if compiled with MTIA support.)r6   r7   _mtia_isBuiltr   r   r   rC   rC      s    88!!##r   c                  2    t               syt               dkD  S )z'Return true if MTIA device is availableFr   )rC   device_countr   r   r   is_availabler\      s    >>Ar   c                     t         j                  j                  |       5  t         j                  j	                         cddd       S # 1 sw Y   yxY w)z?Waits for all jobs in all streams on a MTIA device to complete.N)r6   mtiar   r7   _mtia_deviceSynchronizer   s    r   synchronizer`      s9    			6	" 2xx//12 2 2s   AAc                  >    t         j                  j                         S )z,Return the number of MTIA devices available.)r6   r7   _mtia_getDeviceCountr   r   r   r[   r[      s    88((**r   c                  >    t         j                  j                         S )z0Return the index of a currently selected device.)r6   r7   _mtia_getDevicer   r   r   current_devicere      s     88##%%r   c                 Z    t        | d      }t        j                  j                  |      S )aS  Return the currently selected :class:`Stream` for a given device.

    Args:
        device (torch.device or int, optional): selected device. Returns
            the currently selected :class:`Stream` for the current device, given
            by :func:`~torch.mtia.current_device`, if :attr:`device` is ``None``
            (default).
    Toptional)r   r6   r7   _mtia_getCurrentStream)r   
device_idxs     r   current_streamrk      s%     #6D9J88**:66r   c                 V    t         j                  j                  t        | d            S )a=  Return the default :class:`Stream` for a given device.

    Args:
        device (torch.device or int, optional): selected device. Returns
            the default :class:`Stream` for the current device, given by
            :func:`~torch.mtia.current_device`, if :attr:`device` is ``None``
            (default).
    Trg   )r6   r7   _mtia_getDefaultStreamr   r   s    r   default_streamrn      s!     88**+<Vd+STTr   enabledstacksmax_entriesc                 \    t               syt        j                  j                  | ||       y)a  Enable/Disable the memory profiler on MTIA allocator

    Args:
        enabled (all or state, optional) selected device. Returns
            statistics for the current device, given by current_device(),
            if device is None (default).

        stacks ("python" or "cpp", optional). Select the stack trace to record.

        max_entries (int, optional). Maximum number of entries to record.
    N)r&   r6   r7   _mtia_recordMemoryHistory)ro   rp   rq   s      r   record_memory_historyrt      s#     	HH&&wDr   c                  >    t         j                  j                         S )z4Return a dictionary of MTIA memory allocator history)r6   r7   _mtia_memorySnapshotr   r   r   snapshotrw      s     88((**r   observerc                 B    t         j                  j                  |        y)z9Attach an out-of-memory observer to MTIA memory allocatorN)r6   r7   _mtia_attachOutOfMemoryObserver)rx   s    r   attach_out_of_memory_observerr{      s     
HH,,X6r   including_emulationc                      y)zLReturn a bool indicating if the current MTIA device supports dtype bfloat16.Tr   )r|   s    r   is_bf16_supportedr~      s    r   c                 V    t         j                  j                  t        | d            S )a  Return capability of a given device as a tuple of (major version, minor version).

    Args:
        device (torch.device or int, optional) selected device. Returns
            statistics for the current device, given by current_device(),
            if device is None (default).
    Trg   )r6   r7   _mtia_getDeviceCapabilityr   r   s    r   get_device_capabilityr      "     88--.?QU.VWWr   c                  >    t         j                  j                         S )zEmpty the MTIA device cache.)r6   r7   _mtia_emptyCacher   r   r   empty_cacher      s    88$$&&r   streamc                 H    | yt         j                  j                  |        y)a  Set the current stream. This is a wrapper API to set the stream.
        Usage of this function is discouraged in favor of the ``stream``
        context manager.

    Args:
        stream (Stream): selected stream. This function is a no-op
            if this argument is ``None``.
    N)r6   r7   _mtia_setCurrentStreamr   s    r   
set_streamr     s     ~	HH##F+r   c                 d    t        |       } | dk\  r t        j                  j                  |        yy)zSet the current device.

    Args:
        device (torch.device or int): selected device. This function is a no-op
            if this argument is negative.
    r   N)r   r6   r7   _mtia_setDevicer   s    r   
set_devicer     s,     v&F{  ( r   c                 V    t         j                  j                  t        | d            S )zReturn a dictionary of MTIA device properties

    Args:
        device (torch.device or int, optional) selected device. Returns
            statistics for the current device, given by current_device(),
            if device is None (default).
    Trg   )r6   r7   _mtia_getDevicePropertiesr   r   s    r   get_device_propertiesr     r   r   c                   6    e Zd ZdZd efdZd ZdededefdZy)	r   zContext-manager that changes the selected device.

    Args:
        device (torch.device or int): device index to select. It's a no-op if
            this argument is a negative integer or ``None``.
    c                 6    t        |d      | _        d| _        y )NTrg   r   )r   idxprev_idx)selfr   s     r   __init__zdevice.__init__0  s    $Vd;r   c                 `    t         j                  j                  | j                        | _        y r    )r6   r7   r   r   r   )r   s    r   	__enter__zdevice.__enter__4  s    ::488Dr   typevaluer.   c                 `    t         j                  j                  | j                        | _        y)NF)r6   r7   r   r   r   )r   r   r   r.   s       r   __exit__zdevice.__exit__8  s    8855dmmDr   N)rU   rV   rW   __doc__r   r   r   r   r   r   r   r   r   (  s3    s ES   r   c                   N    e Zd ZU dZedz  ed<   dedz  fdZd Zdeded	efd
Z	y)StreamContexta  Context-manager that selects a given stream.

    All MTIA kernels queued within its context will be enqueued on a selected
    stream.

    Args:
        Stream (Stream): selected stream. This manager is a no-op if it's
            ``None``.
    .. note:: Streams are per-device.
    N
cur_streamr   c                    d | _         || _        t        d d      | _        t        j
                  j                         s| j                  d| _        t        j
                  j                         sd nt        j                  j                  d       | _	        t        j
                  j                         sd | _
        y t        j                  j                  d       | _
        y )NTr   )r   r   r   r   r6   jitis_scriptingr^   rn   src_prev_streamdst_prev_stream)r   r   s     r   r   zStreamContext.__init__L  s    $T40yy%%'xx 		..0Dejj6O6OPT6U 	 		..0D 	6;jj6O6OPT6U 	r   c                    | j                   }|| j                  dk(  ry t        j                  j	                  d       | _        | j
                  j                  |j                  k7  rLt        |j                        5  t        j                  j	                  |j                        | _        d d d        t        j                  j                  |       y # 1 sw Y   )xY wNr   )	r   r   r6   r^   rk   r   r   r   r   )r   r   s     r   r   zStreamContext.__enter__[  s    [[
R$zz88> &&**;*;;
))* T',zz'@'@ARAR'S$T

j)T Ts   ;/CCr   r   r.   c                 *   | j                   }|| j                  dk(  ry | j                  j                  |j                  k7  r)t        j
                  j                  | j                         t        j
                  j                  | j                         y r   )r   r   r   r   r6   r^   r   r   )r   r   r   r.   r   s        r   r   zStreamContext.__exit__j  sj    [[
R &&**;*;;JJ!!$"6"67

d223r   )
rU   rV   rW   r   Stream__annotations__r   r   r   r   r   r   r   r   r   >  sB    	 
v} 
*4S 4 4 4r   r   c                 F    t         j                  j                  | ||       y)zset stream specified by the stream id, device index and
        device type

    Args: stream_id (int): stream id in stream pool
          device_index (int): device index in topo
          device_type (int): enum device type
    N)r6   r7   _mtia_setStream)	stream_iddevice_indexdevice_types      r   _set_stream_by_idr   x  s     
HHYkBr   c                     t        |       S )a,  Wrap around the Context-manager StreamContext that selects a given stream.

    Arguments:
        stream (Stream): selected stream. This manager is a no-op if it's
            ``None``.
    .. note:: In eager mode stream is of type Stream class while in JIT it doesn't support torch.mtia.stream
    )r   r   s    r   r   r     s       r   c                 z    t                t        | d      }|
t               }t        |   }|j	                         S )a[  Returns the random number generator state of the specified MTIA device as a ByteTensor.

    Args:
        device (torch.device or int, optional): The device to return the RNG state of.
            Default: ``'mtia'`` (i.e., ``torch.device('mtia')``, the current mtia device).

    .. warning::
        This function eagerly initializes MTIA.
    Trg   )r!   r   re   r   	get_state)r   r   default_generators      r   get_rng_stater     s<     L
FT
2C
{*3/&&((r   c                  b    t        t                     D  cg c]  } t        |        }} |S c c} w )zRReturns a list of ByteTensor representing the random number states of all devices.)ranger[   r   )iresultss     r   get_rng_state_allr     s,    ).|~)>?A}Q?G?N @s   ,	new_statec                     t               sGt        j                  j                         5   j	                  t        j
                         ddd       t        |d      
t                fd}t        |       y# 1 sw Y   4xY w)a8  Sets the random number generator state of the specified MTIA device.

    Args:
        new_state (torch.ByteTensor): The desired state
        device (torch.device or int, optional): The device to set the RNG state.
            Default: ``'mtia'`` (i.e., ``torch.device('mtia')``, the current mtia device).
    )memory_formatNTrg   c                  :    t            } | j                         y r    )r   	set_state)r   r   r   s    r   cbzset_rng_state.<locals>.cb  s    .s3##I.r   )	r&   r6   r7   _DisableFuncTorchclonecontiguous_formatr   re   r4   )r   r   r   r   s   `  @r   set_rng_stater     su     XX'') 	O "e6M6MNI	O
 FT
2C
{/ rN	O 	Os   !A??B
new_statesc                 B    t        |       D ]  \  }}t        ||        y)zSets the random number generator state of all devices.

    Args:
        new_states (Iterable of torch.ByteTensor): The desired state for each device.
    N)	enumerater   )r   r   states      r   set_rng_state_allr     s&     j)  5eQ r   r)   c                 @     t                 fd}t        |d       y)a  Sets the seed for generating random numbers for the current MTIA device.
    It's safe to call this function if MTIA is not available; in that case, it is silently ignored.

    Args:
        seed (int): The desired seed.

    .. warning::
        If you are working with a multi-GPU model, this function is insufficient
        to get determinism.  To seed all GPUs, use :func:`manual_seed_all`.
    c                  N    t               } t        |    }|j                         y r    )re   r   manual_seed)r   r   r)   s     r   r   zmanual_seed.<locals>.cb  s$    .s3%%d+r   Tr)   Nintr4   r)   r   s   ` r   r   r     s     t9D,
 rr   c                 @     t                 fd}t        |d       y)zSets the seed for generating random numbers on all MTIA devices.
    It's safe to call this function if MTIA is not available; in that case, it is silently ignored.

    Args:
        seed (int): The desired seed.
    c                  j    t        t                     D ]  } t        |    }|j                          y r    )r   r[   r   r   )r   r   r)   s     r   r   zmanual_seed_all.<locals>.cb  s2    |~& 	0A 21 5))$/	0r   Tr(   Nr   r   s   ` r   manual_seed_allr     s     t9D0
 rD!r   c                  "    d } t        | d      S )ax  Sets the seed for generating random numbers to a random number for the current MTIA device.
    It's safe to call this function if MTIA is not available; in that case, it is silently ignored.

    .. warning::
        If you are working with a multi-GPU model, this function will only initialize
        the seed on one GPU.  To initialize all GPUs, use :func:`seed_all`.
    c                  H    t               } t        |    }|j                         S r    )re   r   r)   )r   r   s     r   r   zseed.<locals>.cb  s$    .s3 %%''r   Tr   r4   r   s    r   r)   r)     s    (
 bt$$r   c                  "    d } t        | d      S )zSets the seed for generating random numbers to a random number on all MTIA devices.

    It's safe to call this function if MTIA is not available; in that case, it is silently ignored.
    c                      d} d}t        t                     D ]1  }t        |   }|s|j                         } d}!|j	                  |        3 | S )Nr   FT)r   r[   r   r)   r   )random_seedseededr   r   s       r   r   zseed_all.<locals>.cb  sY    |~& 	;A 21 5/446!--k:	; r   Tr   r   r   s    r   r(   r(      s    
 b4((r   c                  X    t                t               } t        |    j                         S )zReturns the current random seed of the current MTIA device.

    .. warning::
        This function eagerly initializes MTIA.
    )r!   re   r   initial_seed)r   s    r   r   r     s%     L

Cc"//11r   )*)#r"   r\   r&   r`   r[   re   rk   rn   memory_statsmax_memory_allocatedmemory_allocatedreset_peak_memory_statsr   r   rt   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r)   r(   r   r~   	MTIAGraphgraphgraph_pool_handle)r   Nr    )allpythonr   )T)r^   )Qr   	threadingr.   collections.abcr   typingr   r6   r   torch._environmentr   r   torch._utilsr   torch.typesr	   _utilsr   Eventr   r   tupler7   	Generatorr   r$   r   listrL   localrB   Lockr*   r,   rA   r   r   r   r   r   r"   r&   r4   boolr%   r!   rK   rN   rC   r\   r`   r[   re   rk   rn   rt   dictrw   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r(   r   memory
mtia_graph__all__r   r   r   <module>r      s     $    1 )  % 		 68 E%((,,c12 7   t	(2t8
d3i
'(  y%y~~' %'  588+,xx44H H H 58801"XX??Hs Hs H2
K( (;|	I 	$d $
d 2 2$ 2+c +
& &
76 
7V 
7	U6 	UV 	U MNE4ZE),EFIE	E&+$sCx. +7S#s+T127	74 
X& XE#s(O X'
,v ,
)v 
)$ 
)X& XDcN X ,74 74tC!6D= !] !)& )f )$4< V V  2 $v,  4  c d *"# "$ ""%c %")# )*2c 2  $r   