ó
    Eñi~  ã                   ó®   • S r SSKrSSKrSSKrSSKJr  SSKrSSKJrJ	r	J
r
JrJrJrJrJrJr  SS jrS rS\S	\4S
 jr   SS\\   S\S\\   4S jjrg)z“
A collection of utilities for ensuring that training can always occur. Heavily influenced by the
[toma](https://github.com/BlackHC/toma) library.
é    N)ÚOptionalé   )	Úis_cuda_availableÚis_hpu_availableÚis_mlu_availableÚis_mps_availableÚis_musa_availableÚis_neuron_availableÚis_npu_availableÚis_sdaa_availableÚis_xpu_availablec                 ó:  • U (       a  [         R                  " 5         [        5       (       a  [        R                  R                  5         g[        5       (       a  [        R                  R                  5         g[        5       (       a  [        R                  R                  5         g[        5       (       a  [        R                  R                  5         g[        5       (       a  [        R                  R                  5         g[        SS9(       a  [        R                  R                  5         g[!        5       (       a  [        R"                  R                  5         g[%        5       (       a  g['        5       (       a  [        R(                  R                  5         gg)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   Úsdaar	   Úmusar   Únpur   Úmpsr   Úcudar   r
   Úneuron©Úgarbage_collections    ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/accelerate/utils/memory.pyÚclear_device_cacher   (   sè   € ö
 Ü
�
Š
Œä×ÑÜ�	‰	×ÑÕÜ	×	Ñ	Ü�	‰	×ÑÕÜ	×	Ñ	Ü�
‰
×ÑÕ Ü	×	Ñ	Ü�
‰
×ÑÕ Ü	×	Ñ	Ü�	‰	×ÑÕÜ	 e×	,Ü�	‰	×ÑÕÜ	×	Ñ	Ü�
‰
×ÑÕ Ü	×	Ñ	àÜ	×	Ñ	ä�‰× Ñ Õ"ð 
ó    c                  ó–   • [        U [        5      (       d  [        U 5      n [        [        U 5      5       H  nSX'   M	     [	        SS9  U $ )a  
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(   F   sA   € ô, �gœt×$Ñ$Ü�w“-ˆÜ”3�w“<Ö ˆØˆ‹
ñ !ä¨$Ò/Ø€Nr    Ú	exceptionÚreturnc                 ó”   ^ • / SQn[        T [        5      (       a.  [        T R                  5      S:X  a  [	        U 4S jU 5       5      $ g)z¬
Checks if `exception` relates to CUDA out-of-memory, XPU out-of-memory, CUDNN not supported, or CPU out-of-memory

Args:
    exception (`Exception`):
        An exception
)z out of memory.z(cuDNN error: CUDNN_STATUS_NOT_SUPPORTED.z*DefaultCPUAllocator: can't allocate memoryz1FATAL ERROR :: MODULE:PT_DEVMEM Allocation failedr   c              3   óF   >#   • U  H  oTR                   S    ;   v •  M     g7f)r   N)Úargs)Ú.0Úerrr)   s     €r   Ú	<genexpr>Ú+should_reduce_batch_size.<locals>.<genexpr>s   s   øé € ÐC²{°˜)Ÿ.™.¨Ñ+Ö+²{ùs   ƒ!F)r"   ÚRuntimeErrorr%   r-   Úany)r)   Ú_statementss   ` r   Úshould_reduce_batch_sizer5   d   s=   ø€ ò€Kô �)œ\×*Ñ*¬s°9·>±>Ó/BÀaÓ/GÜÔC±{ÓCÓCÐCØr    ÚfunctionÚstarting_batch_sizeÚreduce_batch_size_fnc                 ój   ^ ^^• T c  [         R                  " [        US9$ UmTc  U4S jmUU U4S jnU$ )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 multiplied by 0.9 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)
```
)r7   c                  ó$   >• [        T S-  5      m T $ )NgÍÌÌÌÌÌì?)Úint)Ú
batch_sizes   €r   r8   Ú8find_executable_batch_size.<locals>.reduce_batch_size_fnœ   s   ø€ ä˜Z¨#Ñ-Ó.ˆJØÐr    c            	      ó@  >• [        SS9  [        [        R                  " T5      R                  R                  5       5      n[        U5      [        U 5      S-   :  ad  SR                  [        USS  U SS  5       VVs/ s H  u  p4U SU 3PM     snn5      n[        STR                   STR                   SU S	35      e TS
:X  a  [        S5      e T" T/U Q70 UD6$ s  snnf ! [         a+  n[        U5      (       a  [        SS9  T	" 5       m S nAO	e S nAff = fM^  )NTr   r   z, Ú=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__r2   Ú	Exceptionr5   )
r-   ÚkwargsÚparamsÚargÚvalueÚarg_strÚer<   r6   r8   s
          €€€r   Ú	decoratorÚ-find_executable_batch_size.<locals>.decorator¡   s3  ø€ ä¨dÒ3Ü”g×'Ò'¨Ó1×<Ñ<×AÑAÓCÓDˆäˆv‹;œ#˜d›) a™-Ó(Ø—i‘iÄCÈÈqÈrÈ
ÐTXÐYZÐY[ÐT\ÔD]Ô ^ÒD]±j°c C 5¨¨%¨Ó!1ÑD]Ò ^Ó_ˆGÜØ.¨x×/@Ñ/@Ð.Að BBØBJ×BSÑBSÐATÐTUÐV]ÐU^Ð^`ðbóð ð Ø˜Q‹Ü"Ð#RÓSÐSðÙ 
Ð<¨TÒ<°VÑ<Ð<ùó !_øô ó Ü+¨A×.Ñ.Ü&¸$Ò?Ù!5Ó!7•Jàûðúñ s$   Á=C 
ÃC& Ã&
DÃ0 DÄDÄD)Ú	functoolsÚpartialÚfind_executable_batch_size)r6   r7   r8   rP   r<   s   ` ` @r   rT   rT   w   s=   ú€ ð> ÑÜ× Ò Ô!;ÐQdÑeÐeà$€JØÑ#õ	÷
ð. Ðr    )F)Né€   N)Ú__doc__rR   r   rA   Útypingr   r   Úimportsr   r   r   r   r	   r
   r   r   r   r   r(   rI   Úboolr5   Úcallabler;   rT   © r    r   Ú<module>r\      s   ðñó
 Û 	Û Ý ã ÷
÷ 
õ 
ô#ò<ð<¨	ð °dô ð( $(Ø"Ø/3ñAØ�xÑ ðAàðAð # 8Ñ,öAr    