o
    rqi~                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZmZ g d	Zd
d ZdddZdd Zdd Zdd Z dd Z!dd Z"e j#dd Z$dS )    N)Future)partial)Path)
MethodType)BinaryIODictIterableListOptionalUnion) DEFAULT_MODELSCOPE_DATA_ENDPOINT)
CommitInfoCommitOperationCommitOperationAdd)
z\w+\.binz\w+\.safetensorsz\w+\.pthz\w+\.ptz\w+\.h5z	\w+\.ckptz\w+\.zipz	\w+\.onnxz\w+\.tarz\w+\.gzc            
         s
  g } g d}ddgg d t jddur^ddl}tjd j}|D ]9}d| v r-q$|| }|D ])tfd	d
|D r\zt 	d| |j
}t||  W q3   Y q3q3q$t jddurzddlW n   Y nt}dd
 |D }| fdd
|D  t jddurzddl}	W n   Y | S tjd tdrj}|D ]9}d| v rq|| }|D ])tfdd
 D rzt 	d| |	j
}t||  W q   Y qqq| S t}dd
 |D }|  fdd
|D  | S )z/Find all modules in transformers/peft/diffusers)zAuto.*zT5.*ZBitsAndBytesConfigGenerationConfigzAwq.*zGPTQ.*ZBatchFeaturezQwen.*zLlama.*zIntern.*z
Deepseek.*ZPretrainedConfigZPreTrainedTokenizerPreTrainedModelZPreTrainedTokenizerFastz.*PeftModel.*z.*Config)z^(?!TF|Flax).*Pipeline$z^(?!TF|Flax).*Autoencoder.*z^(?!TF|Flax).*Model$z^(?!TF|Flax).*Adapter$ZImageProjectionz^(?!TF|Flax).*UNet$z^(?!TF|Flax).*Scheduler$transformersNr   dummyc                       g | ]}t | qS  re	fullmatch.0namevaluer   g/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/utils/hf_util/patcher.py
<listcomp>D       
z,get_all_imported_modules.<locals>.<listcomp>.peftc                 S      g | ]	}| d s|qS __
startswithr   attrr   r   r   r   W   
    
c                    s,   g | ] t  fd dD rt qS )c                    r   r   r   r   Z_importr   r   r   [   s    7get_all_imported_modules.<locals>.<listcomp>.<listcomp>anygetattrr   )r"   peft_include_namesr+   r   r   Z   s    	diffusers_import_structurec                    r   r   r   r   r   r   r   r   n   r    c                 S   r#   r$   r&   r(   r   r   r   r   {   r*   c                    s,   g | ] t  fd dD rt qS )c                    r   r   r   r   r+   r   r   r      r    r,   r-   r0   )diffusers_include_nameslazy_moduler+   r   r   ~   s    )	importlibutil	find_specr   sysmodulesr3   lowerr.   import_module__name__r/   appendr"   dirextendr2   hasattr)
all_imported_modulesZtransformers_include_namesr   r3   keyvaluesmodule
attributesZimportsr2   r   )r4   r5   r"   r1   r   r   get_all_imported_modules    s   

!


rG   Fc                    s:  		ddd  fdd} fdd} fdd	} fd
d}		ddddt tttt f  dt tttt f  f fdd}g }| D ]։du sOtdsPqDj}d| v p^d| v }	|	sdi }
ndti}
ztd}td}td}td}W n   Y qD|sd| v r|rz|s|s|s|s| n||fi |
 W qD   | Y qD|rtdst	
jj}d|v od|v }j_|stt|fi |
_ntt|fi |
_|rtdsj_tt|fi |
_|rtdsj_tt|fi |
_| qD|S ) zPatch all class to download from modelscope

    Args:
        wrap: Wrap the class or monkey patch the original class

    Returns:
        The classes after patched
    Nc           	      [   s   ddl m} |dd }d }|r| d}tj| sD|dd }|d u s)|dkr+d}|d ur1|}|| |||d}|rBtj||}|S | }|S )	Nr   )snapshot_download	subfolderz/*revisionmainmaster)rJ   ignore_file_patternallow_file_pattern)
modelscoperH   popospathexistsjoin)	pretrained_model_name_or_pathrM   rN   kwargsrH   rI   Zfile_filterrJ   	model_dirr   r   r   get_model_dir   s,   
z._patch_pretrained_class.<locals>.get_model_dirc                    @    || dd| ddfi |}| jj| |g|R i |S )zPatch all from_pretrainedrM   NrN   rP   _from_pretrained_origin__func__clsrU   
model_argsrV   rW   rX   r   r   #patch_pretrained_model_name_or_path      

zD_patch_pretrained_class.<locals>.patch_pretrained_model_name_or_pathc                    rY   )zPatch all get_config_dictrM   NrN   )rP   _get_config_dict_originr\   r]   r`   r   r   patch_get_config_dict   rb   z6_patch_pretrained_class.<locals>.patch_get_config_dictc                    sB    || dd| ddfi |}| jj| ||g|R i |S )zPatch all peft.from_pretrainedrM   NrN   rZ   )r^   modelmodel_idr_   rV   rW   r`   r   r   patch_peft_model_id   s   

z4_patch_pretrained_class.<locals>.patch_peft_model_idc                    s:    || dd| ddfi |}| jj| |fi |S )zPatch all _get_peft_typerM   NrN   )rP   _get_peft_type_originr\   )r^   rf   rV   rW   r`   r   r   patch_get_peft_type   s   

z4_patch_pretrained_class.<locals>.patch_get_peft_typemodule_classr   rM   rN   c                    s   t j fddfdd}G  fddd}tds(|`ntjj}d|v r:d	|v r:||_td
sA|`tdsH|`tdsO|`	j
|_
j|_|S )a?  Get a custom wrapper class for  auto classes to download the models from the ModelScope hub
        Args:
            module_class (`PreTrainedModel`): The actual module class
            ignore_file_pattern (`str` or `List`, *optional*, default to `None`):
                Any file pattern to be ignored, like exact file names or file extensions.
            allow_file_pattern (`str` or `List`, *optional*, default to `None`):
                Any file pattern to be included, like exact file names or file extensions.
        Returns:
            The wrapped class
        c                 3   s    d| vr	 | d< d| vr| d< |  dd u rg|d urgd }d|jkr.ddlm} |dg}n5d|jv r>ddlm} |dg}n%d	|jv rZt|d urRt|d
rR|j	 ng g d }n	d|jv rcg d}|| d< d V  | 
dd  | 
dd  d S )NrN   rM   r   r   )GENERATION_CONFIG_NAME*.pyZConfig)CONFIG_NAME	Tokenizervocab_files_names)zchat_template.jinjaz*.jsonrl   z*.txtz*.modelz
*.tiktokenZ	Processor)getr=   transformers.utilsrk   r   rm   listrA   ro   rD   rP   )rV   rj   r^   Zextra_allow_file_patternrk   rm   )rN   rM   r   r   file_pattern_context   sD   




zP_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.file_pattern_contextc                    s\    | |fd|}W d    n1 sw   Y  j | |g|R i |}|S )N)rj   r^   )from_pretrained)re   rf   r_   rV   rW   
module_objrs   rX   rj   r   r   rt     s    

zK_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.from_pretrainedc                       sx   e Zd ZefddZefddZefddZ	ddeee	j
f d	ef fd
dZ  ZS )zH_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.ClassWrapperc                    sj    ||  |fi |}W d    n1 sw   Y  j |g|R i |}jdr3||_|S )NZ	AutoModel)rt   r=   r'   rW   r^   rU   r_   rV   rW   ru   rv   r   r   rt     s   zX_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.ClassWrapper.from_pretrainedc                    sX   ||  |f d|}W d    n1 sw   Y  j |fi |}|S N)rM   rN   )_get_peft_type)r^   rf   rV   rW   ru   rN   rs   rX   rM   rj   r   r   ry   $  s   zW_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.ClassWrapper._get_peft_typec                    s^   ||  |f d|}W d    n1 sw   Y  j |g|R i |}|S rx   )get_config_dictrw   rz   r   r   r{   0  s$   zX_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.ClassWrapper.get_config_dictTsave_directorysafe_serializationc                    s   | dd}|rDddlm} ddlm} ddlm} |d}| dd }| d	|t	j
jd
 }	| }
|
| |
|	 |||	 t jd||dd| |r]||	|||d d S d S )Npush_to_hubFr   )r~   HubApi)
Repositorytokencommit_messagerepo_id)r|   r}   r~   )	repo_name
output_dirr   r   r   )rP   modelscope.hub.push_to_hubr~   modelscope.hub.apir   Zmodelscope.hub.repositoryr   rp   splitrQ   rR   seplogincreate_reposupersave_pretrained)selfr|   r}   rV   r~   r   r   r   r   r   api	__class__r   r   r   >  s<   




zX_patch_pretrained_class.<locals>.get_wrapped_class.<locals>.ClassWrapper.save_pretrained)T)r=   
__module____qualname__classmethodrt   ry   r{   r   strrQ   PathLikeboolr   __classcell__r   rz   r   r   ClassWrapper  s    r   rt   re   rf   ry   r{   r   )
contextlibcontextmanagerrA   rt   inspect	signature
parametersry   r{   r   r=   r   )rj   rM   rN   rV   rt   r   r   rX   var)rN   rs   rM   rj   r   get_wrapped_class   s$   #
P


z2_patch_pretrained_class.<locals>.get_wrapped_classr=   Z	tokenizerconfigrt   ry   r{   r   Zpipeliner[   re   rf   rh   rc   )NN)r
   r   r   r	   rA   r=   r;   rM   r>   r   r   rt   r   r[   r   r   ry   rh   r{   rc   )rB   wrapra   rd   rg   ri   r   Zall_available_modulesr   Z
skip_modelZignore_file_pattern_kwargshas_from_pretrainedhas_get_peft_typehas_get_config_dictZhas_save_pretrainedr   Zis_peftr   r   r   _patch_pretrained_class   s   


	
 )



r   c                 C   s   | D ]d}|d u r	qzt |d}t |d}t |d}W n   Y q|r7t |dr7|j|_zt|d W n   Y |rNt |drN|j|_zt|d W n   Y |rft |drf|j|_zt|d W q   Y qqd S )Nrt   ry   r{   r[   rh   rc   )rA   r[   rt   delattrrh   ry   rc   r{   )rB   r   r   r   r   r   r   r   _unpatch_pretrained_class  s:   

r   c                     sp  dd l } ddl m} ddlm} ddlm} ddlm} |  d d d ddtdtd	tt d
tt dt	tt
d f f
 fdd}d d d d d d dddtdtdtt d	tt d
tt dt	ttd f dt	ttd f dt	t
td f dt
f fdd}d@dt	t
td f dtfdd}d dddtdt	tt
d f dt
ddfdd}|d d d d dd ddtd t	ttf d!tt d"tt d#tt dt	tt
d f d
tt d$tt	tt tf  fd%d&}	dd'lm}
 |d |
d d d(d)t	ttttf d!tdtdt	tt
d f d
tt d"tt d#tt fd*d+}|d d d |
d,dtd-tt d"td#tt dt	tt
d f d	tt d
tt dt	ttt f fd.d/}	 	 	dAd0t	ttf d	tt dtt d1t
fd2d3}dd4l m} t|jd5st|jj|j_d6d7 |j_|jj|j_t||j|j_t|d8s| jj|_ || _|| j_t|d9s|j!|_"t|||_!|j!| _!|j!| j_!t|d:s|j#|_$t|||_#|j#| _#|j#| j_#t|d;sdd<l%m&} |j'|_(t|||_'|j'| _'|j'| j_'|j'|_'t|d=s|j)|_*t|	||_)|j)| _)|j)| j_)t|d>s|j+|_,t|||_+|j+| _+|j+| j_+|j+|_+t|d?s6|j-|_.t|||_-|j-| _-|j-| j_-dd<l%m&} |j-|_-d S d S )BNr   hf_api)r   )future_compatible)
get_logger)	repo_typerJ   r   r   filenamer   rJ   r   c                   sR   |dur	  d ddlm} | }|| |du s|dkr!d}|j|||dS )z!Patch huggingface_hub.file_existsNz[The passed in repo_type will not be used in modelscope. Now only model repo can be queried.r   r   rK   rL   )rJ   )warningr   r   r   file_exists)r   r   r   r   rJ   r   r   r   loggerr   r   _file_exists  s   

z _patch_hub.<locals>._file_existsF)rI   r   rJ   	cache_dir	local_dirr   local_files_onlyrI   r   r   r   c                   s   t |	dkr d |dv sJ d| d|dv r"ddlm}
 nddlm}
 dd	lm} | }|| |d
u s>|dkr@d}|
| |rKtj	
||n|||||dS )z%Patch huggingface_hub.hf_hub_downloadr   zThe passed in library_name,library_version,user_agent,force_download,proxiesetag_timeout,headers,endpoint will not be used in modelscope.)Nre   datasetz
repo_type=z is not supported in ModelScope)Nre   model_file_downloaddataset_file_downloadr   NrK   rL   )	file_pathr   r   r   rJ   )lenr   Zmodelscope.hub.file_downloadr   r   rO   r   r   rQ   rR   rT   )r   r   rI   r   rJ   r   r   r   r   rV   file_downloadr   r   r   r   r   _file_download  s2   


z"_patch_hub.<locals>._file_downloadreturnc                 S   s<   ddl m} ddl m} | }|| d| d pdiS )Nr   )ModelScopeConfigr   r   unknown)r   r   r   r   Zget_user_info)r   r   r   r   r   r   r   r   _whoami  s
   
z_patch_hub.<locals>._whoami)r   privater   RepoUrlc          
      [   sP   ddl m} | }|rdnd}|j|f||d|}ddlm}	 |	|d|dS )	af  
        Create a new repository on the hub.

        Args:
            repo_id: The ID of the repository to create.
            token: The authentication token to use.
            private: Whether the repository should be private.
            **kwargs: Additional arguments.

        Returns:
            RepoUrl: The URL of the created repository.
        r   r   r   public)r   
visibility)r   re   )urlr   r   )r   r   r   modelscope.utils.repo_utilsr   )
r   r   r   r   rV   r   r   r   repo_urlr   r   r   r   r   #  s   z_patch_hub.<locals>.create_reporL   )path_in_repor   commit_descriptionr   rJ   ignore_patternsfolder_pathr   r   r   r   c             	   [   s^   ddl m}
 |d u s|dkrd}|
|||||||d ddlm} |t d| d||d d	S )
Nr   _push_files_to_hubrK   rL   )path_or_fileobjr   r   r   r   rJ   r   )r   z/models/z/files)Z
commit_urlr   r   oid)r   r   r   r   r   )r   r   r   r   r   r   r   rJ   r   rV   r   r   r   r   r   upload_folder=  s&   z!_patch_hub.<locals>.upload_folder)DEFAULT_REPOSITORY_REVISION)r   rJ   r   r   r   c          
      [   s8   |d u s|dkr
d}ddl m}	 |	||||||| d S )NrK   rL   r   r   )r   r   )
r   r   r   r   r   rJ   r   r   rV   r   r   r   r   upload_filea  s   
z_patch_hub.<locals>.upload_file)r   r   r   rJ   
operationsc             	   [   sn   ddl m}	 |	 }
tdd |D rtd|d u s|dkr d}dd |D }|
j|||||||p2d	d
 d S )Nr   r   c                 S   s   g | ]}d |j jvqS )Add)r   r=   r   opr   r   r   r     s    z5_patch_hub.<locals>.create_commit.<locals>.<listcomp>z<ModelScope create_commit only support Add operation for now.rK   rL   c                 S   s   g | ]}|j qS r   )r   r   r   r   r   r     s    re   )r   r   r   r   r   rJ   r   )r   r   r.   
ValueErrorr   )r   r   r   r   r   r   r   rJ   rV   r   r   	all_filesr   r   r   create_committ  s$   
z!_patch_hub.<locals>.create_commitrepo_id_or_pathignore_metadata_errorsc                 S   s   ddl m} | }|| tj|r|}n+|dks|d u r+ddlm} ||d}n|dkr;ddlm}	 |	|d}nt	d| t
|d	}
| |
 |d
}t|jdsZg |j_|W  d    S 1 sfw   Y  d S )Nr   r   re   r   z	README.mdr   r   z5repo_type should be `model` or `dataset`, but now is r)r   tags)r   r   r   rQ   rR   rS   rO   r   r   r   openreadrA   datar   )r^   r   r   r   r   r   r   r   r   r   fZ	repo_cardr   r   r   load  s,   
$z_patch_hub.<locals>.loadrepocard_validate_originc                  _   s   d S Nr   )argsrV   r   r   r   <lambda>  s    z_patch_hub.<locals>.<lambda>_hf_hub_download_origin_file_exists_origin_whoami_origin_create_repo_originhub_upload_folder_origin_upload_file_origin_create_commit_originr   )NNF)/huggingface_hubr   Zhuggingface_hub.hf_apir   r   rO   r   r   r
   r   r   r   r   r	   Zmodelscope.utils.constantr   bytesr   r   r   r   r   r   rA   RepoCardvalidater   r   _load_originr   r   hf_hub_downloadr   r   r   whoamir   rq   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
_patch_hub  sj  
	&


	
!		 








r   c                  C   s  dd l } ddl m} ddl m} t|jdr"|jj|j_t|jd t|jdr4|jj|j_	t|jd t|drL|j
| j_|j
| _|j
| j_t|d t|drc|j|_|j| _|j| j_t|d t|drz|j|_|j| _|j| j_t|d t|d	rdd
lm} |j|_|j| _|j| j_|j|_t|d	 t|dr|j|_|j| _|j| j_t|d t|dr|j|_|j| _|j| j_|j|_t|d t|dr|j|_|j| _|j| j_dd
lm} |j|_t|d d S d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   rA   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   _unpatch_hub  sd   




















r   c                   C   s   t   tt  d S r   )r   r   rG   r   r   r   r   	patch_hub*  s   r  c                   C   s   t t  t  d S r   )r   rG   r   r   r   r   r   unpatch_hub/  s   

r  c                   c   s    t   d V  t  d S r   )r  r  r   r   r   r   patch_context4  s   
r  )F)%r   r6   r   rQ   r   r9   asyncior   	functoolsr   pathlibr   typesr   typingr   r   r   r	   r
   r   Zmodelscope.hub.constantsr   r   r   r   r   rM   rG   r   r   r   r   r  r  r   r  r   r   r   r   <module>   s6    
h  4  <