o
    ٷi!                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
 d dlmZ eeZe jjeg fde jjde jdeej d	efd
dZd	ejfddZe jjdeej d	dfddZdS )    N)contextmanager)	GeneratorOptionalList)_is_group_offload_enabled)init_loggerblockreference_tensorpending_tasksreturnc              	   #   s`   t  s
 V  d S d t dr t  }|r dd |D |j}d }d}zid urjtt}t|dks>|d |krjtt	j
rOtd| d|  td	d
 D }|ra j|d n j|dd d} V  W |rr fdd}	t }
|
|	 }|r|| d S d S d S d S |rr fdd}	t }
|
|	 }|r|| w w w w )N
parametersc                 S   s   g | ]}|j jqS  )datadevice).0paramr   r   `/home/ubuntu/.local/lib/python3.10/site-packages/cache_dit/caching/cache_blocks/offload_utils.py
<listcomp>   s    z maybe_onload.<locals>.<listcomp>F   r   zOnloading from z to c                 s       | ]}|j d kV  qdS )metaN)type)r   devr   r   r   	<genexpr>)       zmaybe_onload.<locals>.<genexpr>)r   non_blockingTc                     s:   t   D ]\} }tdd | j|I d H | _qd S )Nc                 S   s   | j |ddS )NTr   )to)pdr   r   r   <lambda>6   s    z6maybe_onload.<locals>.restore_device.<locals>.<lambda>)zipr   asyncio	to_threadr   )r   original_devicer   original_devicesr   r   restore_device3   s   z$maybe_onload.<locals>.restore_device)r   hasattrlistr   r   setlenloggerisEnabledForloggingDEBUGdebuganyto_emptyr   get_event_loopcreate_taskappend)r   r	   r
   paramstarget_device	move_taskneed_restoreunique_deviceshas_meta_paramsr'   loopr   r%   r   maybe_onload   sP   
r=   c                     s   zt   W n" ty(   zt   W n ty%   t   t   Y nw Y nw   sMd
 fdd} dd l}tdd |	 D sM|j
| ddd	   S )Nr   c                      s   t      d S N)r"   set_event_looprun_foreverr   r<   r   r   run_loopM   s   
z get_event_loop.<locals>.run_loopr   c                 s   r   )_my_loopN)name)r   tr   r   r   r   S   r   z!get_event_loop.<locals>.<genexpr>rC   T)targetrD   daemon)r   N)r"   get_running_loopRuntimeErrorr3   new_event_loopr?   
is_running	threadingr1   	enumerateThreadstart)rB   rL   r   rA   r   r3   A   s"   r3   c              
      sz    sd S t  } fdd}t| |}z|jdd W n ty6 } ztd|  W Y d }~nd }~ww    d S )Nc                      s   t j  I d H S r>   )r"   gatherr   r
   r   r   gather_tasksb   s   z#maybe_offload.<locals>.gather_tasksg      >@)timeoutzMay Offload Error: )r3   r"   run_coroutine_threadsaferesult	Exceptionr,   errorclear)r
   r<   rR   futureer   rQ   r   maybe_offloadY   s   r[   )torchr"   r.   
contextlibr   typingr   r   r    diffusers.hooks.group_offloadingr   cache_dit.loggerr   __name__r,   compilerdisablennModuleTensorTaskr=   AbstractEventLoopr3   r[   r   r   r   r   <module>   s6    3