o
    ߥiV                     @   s   d dl Z d dlZd dlmZ 			ddejjdefddZ		ddejjdefdd	Zdejfd
dZ	ddejjdefddZ
dS )    Ncpumodel
local_pathc                 C   s   t | |||dS )N)	sub_level)load_pretrained_dict)r   
state_dictr   map_locationloggerr    r
   b/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/image_probing_model/utils.pyload_pretrained	   s   r   r   c           
         s,  dg}d|v r|d }d|v r|d }|D ]\  fdd|  D }qrCdr/nd tfdd|  D }t| ||d}| j|d	d
}|j}|j}g }|rg|dd| d |ru|dd| d d|}t|dkr|r|	| dS ddl
}	|	| dS dS )a   
    Load parameters to model with
    1. Sub name by revise_keys For DataParallelModel or DistributeParallelModel.
    2. Load 'state_dict' again if possible by key 'state_dict' or 'model_state'.
    3. Take sub level keys from source, e.g. load 'backbone' part from a classifier into a backbone model.
    4. Auto remove invalid parameters from source.
    5. Log or warning if unexpected key exists or key misses.

    Args:
        model (torch.nn.Module):
        state_dict (dict): dict of parameters
        logger (logging.Logger, None):
        sub_level (str, optional): If not None, parameters with key startswith sub_level will remove the prefix
            to fit actual model keys. This action happens if user want to load sub module parameters
            into a sub module model.
    )z	^module\. r   model_statec                    s    i | ]\}}t  ||qS r
   )resub).0kv)prr
   r   
<dictcomp>.   s     z(load_pretrained_dict.<locals>.<dictcomp>.c                    s(   i | ]\}}|  r|d  |qS N)
startswith)r   keyvalue)r   sub_level_lenr
   r   r   3   s
    )r	   F)strictz%unexpected key in source state_dict: z, 
z"missing key in source state_dict: r   N)itemsendswithlen_auto_drop_invalidload_state_dictunexpected_keysmissing_keysappendjoinwarningwarningswarn)
r   r   r	   r   revise_keysload_statusr$   r%   err_msgsr)   r
   )r   r   r   r   r   r      sB   


r   c                 C   s   dd }|  | dS )z6
    Convert applicable model parameters to fp16.
    c                 S   s   t | tjtjtjfr | jj | j_| jd ur | jj | j_t | tj	rGg dd dD dddD ]}t
| |}|d urF|j |_q5dD ]}t| |r_t
| |}|d ur_|j |_qIdD ]}t| |rxt
| |}|d urx|j |_qbd S )	Nc                 S   s   g | ]}| d qS )_proj_weightr
   )r   sr
   r
   r   
<listcomp>[   s    zEconvert_weights.<locals>._convert_weights_to_fp16.<locals>.<listcomp>)inqr   r   in_proj_biasbias_kbias_v)text_projectionproj)prompt_embeddings)
isinstancennConv1dConv2dLinearweightdatahalfbiasMultiheadAttentiongetattrhasattr)layerattrtensornamer
   r
   r   _convert_weights_to_fp16S   s>   





z1convert_weights.<locals>._convert_weights_to_fp16N)apply)r   rI   r
   r
   r   convert_weightsN   s   rK   c           
      C   s   |  }g }|   D ]A\}}||v rM|| }|j|jkr3|| d|j d|j  || q|j|jkrM|| d|j d|j  || qt|dkrmdd| }|rd|	| |S ddl
}	|	| |S )z
    Strip unmatched parameters in state_dict, e.g. shape not matched, type not matched.

    Args:
        model (torch.nn.Module):
        state_dict (dict):
        logger (logging.Logger, None):

    Returns:
        A new state dict.
    z: invalid shape, dst z	 vs. src z: invalid dtype, dst r   zignore keys from source: 
r   N)copyr   r   shaper&   popdtyper!   r'   r(   r)   r*   )
r   r   r	   ret_dictinvalid_msgsr   r   	new_valuewarning_msgr)   r
   r
   r   r"   q   s0   


r"   )r   NN)NNr   )r   torchtorch.nnr:   Modulestrr   dictr   rK   r"   r
   r
   r
   r   <module>   s    

<#