
    g                         d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
mZmZmZmZ ddlmZ ddZd Zd	ed
efdZddedefdZdefdZdS )z
A collection of utilities for ensuring that training can always occur. Heavily influenced by the
[toma](https://github.com/BlackHC/toma) library.
    N   )is_cuda_availableis_ipex_availableis_mlu_availableis_mps_availableis_musa_availableis_npu_availableis_xpu_available)compare_versionsFc                 \   | rt          j                     t                      r t          j                                         dS t                      r t          j                                         dS t                      r t          j	                                         dS t                      r t          j                                         dS t          d          r t          j                                         dS t                      r t          j                                         dS dS )z
    Clears the device cache by calling `torch.{backend}.empty_cache`. Can also run `gc.collect()`, but do note that
    this is a *considerable* slowdown and should be used sparingly.
    z2.0)min_versionN)gccollectr
   torchxpuempty_cacher   mlur   musar	   npur   mpsr   cudagarbage_collections    S/var/www/html/ai-engine/env/lib/python3.11/site-packages/accelerate/utils/memory.pyclear_device_cacher   (   s   
  

 !				 	!				 !
     			 !		e	,	,	, !				 !
     ! !    c                      t          | t                    st          |           } t          t          |                     D ]}d| |<   t	          d           | S )aN  
    Releases memory from `objects` by setting them to `None` and calls `gc.collect()` and `torch.cuda.empty_cache()`.
    Returned objects should be reassigned to the same variables.

    Args:
        objects (`Iterable`):
            An iterable of objects
    Returns:
        A list of `None` objects to replace `objects`

    Example:

        ```python
        >>> import torch
        >>> from accelerate.utils import release_memory

        >>> a = torch.ones(1000, 1000).cuda()
        >>> b = torch.ones(1000, 1000).cuda()
        >>> a, b = release_memory(a, b)
        ```
    NTr   )
isinstancelistrangelenr   )objectsis     r   release_memoryr$   >   s_    , gt$$  w--3w<<    

$////Nr   	exceptionreturnc                      g d}t           t                    r3t           j                  dk    rt	           fd|D                       S dS )z
    Checks if `exception` relates to CUDA out-of-memory, CUDNN not supported, or CPU out-of-memory

    Args:
        exception (`Exception`):
            An exception
    )zCUDA out of memory.z(cuDNN error: CUDNN_STATUS_NOT_SUPPORTED.z*DefaultCPUAllocator: can't allocate memoryr   c              3   6   K   | ]}|j         d          v V  dS )r   N)args).0errr%   s     r   	<genexpr>z+should_reduce_batch_size.<locals>.<genexpr>j   s/      CC3).++CCCCCCr   F)r   RuntimeErrorr!   r)   any)r%   _statementss   ` r   should_reduce_batch_sizer0   \   se      K
 )\** Ds9>/B/Ba/G/GCCCC{CCCCCC5r      functionstarting_batch_sizec                 T      t          j        t          |          S | fd}|S )a  
    A basic decorator that will try to execute `function`. If it fails from exceptions related to out-of-memory or
    CUDNN, the batch size is cut in half and passed to `function`

    `function` must take in a `batch_size` parameter as its first argument.

    Args:
        function (`callable`, *optional*):
            A function to wrap
        starting_batch_size (`int`, *optional*):
            The batch size to try and fit into memory

    Example:

    ```python
    >>> from accelerate.utils import find_executable_batch_size


    >>> @find_executable_batch_size(starting_batch_size=128)
    ... def train(batch_size, model, optimizer):
    ...     ...


    >>> train(model, optimizer)
    ```
    N)r3   c            	      \   t          d           t          t          j                  j                                                  }t          |          t          |           dz   k     r`d                    d t          |dd          | dd                    D                       }t          dj
         dj
         d| d	          	 d
k    rt          d          	  g| R i |S # t          $ r0}t          |          rt          d           dz  n Y d }~nd }~ww xY w`)NTr   r   z, c                 "    g | ]\  }}| d | S )= )r*   argvalues      r   
<listcomp>zAfind_executable_batch_size.<locals>.decorator.<locals>.<listcomp>   s*     ^ ^ ^jc5C!1!1%!1!1 ^ ^ ^r   zBatch size was passed into `zS` as the first argument when called.Remove this as the decorator already does so: `(z)`r   z-No executable batch size found, reached zero.   )r   r   inspect	signature
parameterskeysr!   joinzip	TypeError__name__r-   	Exceptionr0   )r)   kwargsparamsarg_stre
batch_sizer2   s        r   	decoratorz-find_executable_batch_size.<locals>.decorator   s   d3333g'11<AACCDDv;;#d))a-((ii ^ ^Cqrr
TXYZY[Y[T\D]D] ^ ^ ^__Gbx/@ b bBJBSb bV]b b b  
	Q"#RSSSx
<T<<<V<<<   +A.. &$????1$JJ JJJJ
	s   $C0 0
D*:&D%%D*)	functoolspartialfind_executable_batch_size)r2   r3   rL   rK   s   `  @r   rO   rO   n   sO    6  !;Qdeeee$J     . r   device_indexc                    t                      rGt          j                            d          }t	          |dd          rddlm}  ||           d         S t          j        d           t          j
                            |           S )Nintel_extension_for_pytorchz>=z2.5r   )mem_get_infozThe XPU `mem_get_info` API is available in IPEX version >=2.5. The current returned available memory is incorrect. Please consider upgrading your IPEX version.)r   	importlibmetadataversionr   intel_extension_for_pytorch.xpurS   warningswarnr   r   max_memory_allocated)rP   ipex_versionrS   s      r   get_xpu_available_memoryr\      s     1 )112OPPL$66 	1DDDDDD<--a00M 	j   9)),777r   )F)Nr1   )__doc__rM   r   rT   r>   rX   r   importsr   r   r   r   r   r	   r
   versionsr   r   r$   rF   boolr0   callableintrO   r\   r8   r   r   <module>rc      sM   
     				                         ' & & & & &! ! ! !,  <	 d    $7 7 7s 7 7 7 7t
83 
8 
8 
8 
8 
8 
8r   