a
    AdL                     @   sR   d dl Z d dlmZmZ dae dZdd Zdd Zdd	 Z	d
d Z
dd ZdS )    N)devicessharedcpuc                   C   s   t d urt t d a d S N)module_in_gputor    r   r   7/var/www/html/stable-diffusion-webui/modules/lowvram.pysend_everything_to_cpu   s    
r
   c                 C   s"   t jjp t jjp t jjo t| dS )Nconditioner)r   cmd_optslowvrammedvrammedvram_sdxlhasattrsd_modelr   r   r	   	is_needed   s    r   c                 C   s0   t | }| t_|r&t| tjj  nd| _d S )NF)r   r   parallel_processing_allowedsetup_for_low_vramr   r   )r   enabler   r   r	   apply   s
    r   c                    s  t | ddrd S d| _i fdd| j | jj| jj fdd} fdd	}| d
f| df| df| df| dfg}t| d}| ot| jd}|r|| df n&|r|| jdf n|| jdf g }|D ]*\}}	t ||	d }
||
 t||	d  q| 	t
j t||D ]\\}}	}
t||	|
 q|rN| j n`|r| jj | jjj | j| jj< | j| jjj< n| jj | j| jj< | j || j_|| j_| jr| j | jr| j |r| j n| jj}|j|j|j|jf}d\|_|_|_|_| j	t
j |\|_|_|_|_|j |jD ]}| qj|j |jD ]}| qd S )Nr   FTc                    s>     | | } t| krdS tdur*tt | tj | adS )zsend this module to GPU; send whatever tracked module was previous in GPU to CPU;
        we add this as forward_pre_hook to a lot of modules and this way all but one of them will
        be in CPU
        N)getr   r   r   r   device)module_)parentsr   r	   send_me_to_gpu'   s    
z*setup_for_low_vram.<locals>.send_me_to_gpuc                    s    d  | S r   r   )x)first_stage_modelfirst_stage_model_encoder   r   r	   first_stage_model_encode_wrapA   s    
z9setup_for_low_vram.<locals>.first_stage_model_encode_wrapc                    s    d  | S r   r   )z)r   first_stage_model_decoder   r   r	   first_stage_model_decode_wrapE   s    
z9setup_for_low_vram.<locals>.first_stage_model_decode_wrapr   depth_modelembeddermodelr   transformer)NNNN)getattrr   r   encodedecoder   cond_stage_modelappendsetattrr   r   r   zipr   register_forward_pre_hookr'   token_embeddingr(   r%   r&   diffusion_modelinput_blocksmiddle_blockoutput_blocks
time_embed)r   Zuse_medvramr!   r$   Zto_remain_in_cpuis_sdxlis_sd2storedobjfieldr   Z
diff_modelblockr   )r   r#   r    r   r   r	   r      sx    



r   c                 C   s   | j S r   )r   r   r   r   r	   
is_enabled   s    r=   )torchmodulesr   r   r   r   r   r
   r   r   r   r=   r   r   r   r	   <module>   s   
	
s