a
    dy                     @   s   d Z ddlZddlmZ ddlZddlmZ zdddlZddlm	Z	m
Z
 zddlmZ ddlmZ W n* ey   ddlmZ ddlmZ Y n0 W n ey   dZY n0 ddlmZ G d	d
 d
ejZdS )z timm model adapter

Wraps timm (https://github.com/rwightman/pytorch-image-models) models for use as a vision tower in CLIP model.
    N)OrderedDict)Mlp	to_2tuple)RotAttentionPool2d)AttentionPool2d   )freeze_batch_norm_2dc                       sF   e Zd ZdZd fdd		ZdddZejjdddZ	dd Z
  ZS )	TimmModelz timm model adapter
       avglinearF        Nc                    s  t    td u rtdt|| _i }|d ur8||d< |	d urH|	|d< |dv }|sz|sztj|f|||
d|| _|}ntj|fd|
i|| _| jj	dd }|sdnd	}|r|d	ksJ | jj
d
dd n$|rt|dni }| jj
di | | jj}t }|dkr$t|||d|d< |}n|dkrBt||d|d< |}|dkrpt||d< tj|||d|d< nD|dkrt|d	| ||d
fd|fd|d< n|rJ d| dt|| _d S )Nz-Please `pip install timm` to use timm models.Zdrop_path_rateZpatch_drop_rate)abs_attnrot_attn)Znum_classesglobal_pool
pretrainedr   Z	pool_sizer      r    )r   r   )	feat_sizeout_featurespoolr   )r   r   drop)biasprojZmlpT)r   r   zUnknown projection type .)r   )super__init__timmRuntimeErrorr   
image_sizeZcreate_modeltrunkZdefault_cfggetZreset_classifierdictZnum_featuresr   AbsAttentionPool2dr   nnZDropoutZLinearr   Z
Sequentialhead)selfZ
model_nameZ	embed_dimr   r   r   Z	proj_biasr   Z	drop_pathZ
patch_dropr   Ztimm_kwargsZcustom_poolZprev_chsr   Zfeature_ndimZreset_kwargsZhead_layers	__class__ ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/open_clip/timm_model.pyr       sd    





$zTimmModel.__init__r   c                    s   |s*| j  D ]
}d|_q|rt| j  nzddlm}m} W n tyX   tdY n0 | j 	 }|| j |}t
|   |  t d D ]$}|| }	|	D ]}d| j |_qq|r|| j |dd}
 fdd	|
 D }
t| j |
 d
S )zw lock modules
        Args:
            unlocked_groups (int): leave last n layer groups unlocked (default: 0)
        Fr   )group_parametersgroup_modulesz^Please install latest timm `pip install git+https://github.com/rwightman/pytorch-image-models`r   T)reversec                    s   h | ]\}}| kr|qS r)   r)   ).0kvZmax_layer_idr)   r*   	<setcomp>       z!TimmModel.lock.<locals>.<setcomp>N)r    
parametersZrequires_gradr   Ztimm.models.helpersr+   r,   ImportErrorr   Zgroup_matchermaxkeysrangeZget_parameteritems)r&   Zunlocked_groupsZfreeze_bn_statsparamr+   r,   ZmatcherZgparamsZ	group_idxgroupZgmodulesr)   r1   r*   lockk   s.    

zTimmModel.lockTc              
   C   sD   z| j | W n. ty> } ztd W Y d }~n
d }~0 0 d S )NzQgrad checkpointing not supported for this timm image tower, continuing without...)r    set_grad_checkpointing	Exceptionloggingwarning)r&   enableer)   r)   r*   r=      s    z TimmModel.set_grad_checkpointingc                 C   s   |  |}| |}|S )N)r    r%   )r&   xr)   r)   r*   forward   s    

zTimmModel.forward)r
   r   r   Fr   NNF)r   F)T)__name__
__module____qualname____doc__r   r<   torchZjitignorer=   rD   __classcell__r)   r)   r'   r*   r	      s           K
 r	   )rH   r?   collectionsr   rI   Ztorch.nnr$   r   Ztimm.models.layersr   r   Z#timm.models.layers.attention_pool2dr   r   r#   r5   Ztimm.layersutilsr   Moduler	   r)   r)   r)   r*   <module>   s"   
