
    _tjW
                     n    S r SSKrSSKrSSKrSSKr\R
                  " S5      rS rS rSS.S\	4S	 jjr
g)
u   
Утилиты для работы с PyTorch: CUDA OOM fallback, device management.

Использование:
    from utils.torch_utils import with_cpu_fallback, safe_device_call
    NAI_Strategyc                 F   ^  [         R                  " T 5      U 4S j5       nU$ )u  Декоратор: при CUDA OOM переключает на CPU и повторяет вызов.

Использует глобальный DEVICE из config для переключения.
После успешного вызова на CPU, оставляет устройство CPU для последующих вызовов.

Пример:
    @with_cpu_fallback
    def load_model(ticker):
        ...
c                  (  >  T" U 0 UD6$ ! [         [        R                  4 al  nS[        U5      R	                  5       ;   d  S[        U5      ;   a:  [
        R                  STR                   S35        [        5         T" U 0 UD6s S nA$ e S nAff = f)Nout of memoryCUDA   ⚠ CUDA OOM в !   , переключаем на CPU)	RuntimeErrortorchOutOfMemoryErrorstrlowerloggerwarning__name___switch_to_cpu)argskwargsefuncs      utils/torch_utils.pywrapper"with_cpu_fallback.<locals>.wrapper   s    		(((e445 	#a&,,.0Fc!f4D!1$--@abc T,V,,	s!    BA BBBB)	functoolswraps)r   r   s   ` r   with_cpu_fallbackr      s'     __T
 
 N    c                  &   [         R                  " S5        SSKn U R                  5          [        R
                  R                  5       (       a  [        R
                  R                  5         [        R                  S5        g! [         a     N"f = f)um   Переключает глобальное устройство на CPU и очищает GPU память.	inferencer   NuU   Устройство переключено на CPU, GPU память очищена)config
set_devicegccollectr   cudais_availableempty_cache	Exceptionr   info)r"   s    r   r   r   *   sg    
k"JJL::""$$JJ""$ KKgh  s   AB 
BBT)fallback_cpur)   c          	      6    U " U0 UD6$ ! [         [        R                  4 at  nU(       ag  S[        U5      R	                  5       ;   d  S[        U5      ;   a;  [
        R                  S[        U SS5       S35        [        5         U " U0 UD6s SnA$ e SnAff = f)uu  Безопасный вызов функции с fallback на CPU при OOM.

Args:
    func: вызываемая функция
    fallback_cpu: если True — при OOM повторяет на CPU
    *args, **kwargs: аргументы для func

Returns:
    Результат func(*args, **kwargs)

Raises:
    RuntimeError: если OOM даже на CPU
r   r   r   r   unknownr	   N)	r
   r   r   r   r   r   r   getattrr   )r   r)   r   r   r   s        r   safe_device_callr-   7   s    T$V$$%001 _A>&CPQFBRNN-gdJ	.R-SStuv(((s!   
 BA(BBBB)__doc__r   loggingr   r    	getLoggerr   r   r   boolr-    r   r   <module>r3      sD       			=	)4
i 8<  r   