§
    ‚ŠtjV)  ã                   ó‚  — U d Z ddlZddlZddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZmZ ddlmZmZmZmZ dd	lmZ dd
lmZ erddlmZ ddlmZ  ej        e¦  «        Zi Zeeee eee e	j!                 f         f         f         e"d<    G d„ d¦  «        Z# G d„ d¦  «        Z$ G d„ de#¦  «        Z%dddddede#deee e	j!                 f         f
d„Z&dddddede#ddf
d„Z'd e%¦   «         iZ(eee#f         e"d<   deee)eeef         z  f         de*e         fd „Z+	 d"dddeee)eeef         z  f         dz  ddfd!„Z,dS )#zrFusion registration helpers.

See `docs/source/en/fusion_mapping.md` for the design overview and extension guide.
é    N)ÚMapping)ÚTYPE_CHECKINGÚAny)Únné   )Ú!get_checkpoint_conversion_mappingÚ&register_checkpoint_conversion_mapping)ÚConv3dToLinearÚWeightConverterÚWeightRenamingÚWeightTransform)Úregister_patch_mapping)Úlogging)ÚPretrainedConfig)ÚPreTrainedModelÚ_FUSION_DISCOVERY_CACHEc                   ó´   — e Zd ZU dZdZeedf         ed<   dedefd„Zde	j
        defd	„Zd
ee	j
                 dee	j
                 fd„Zdddee         fd„ZdS )ÚModuleFusionSpeczÿBase recipe for a fusion family.

    A fusion spec decides which modules are eligible for a fusion, how to build
    the runtime replacement class, and which weight transforms are needed to map
    checkpoints between the original and fused layouts.
    © .Útarget_modules_patternsÚ
model_nameÚreturnc                 ó6   — dt          | ¦  «        j        › d|› �S )zDReturn the log message emitted when no compatible modules are found.zNo compatible z classes found to fuse for )ÚtypeÚ__name__)Úselfr   s     úY/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/fusion_mapping.pyÚget_empty_logzModuleFusionSpec.get_empty_log6   s"   € à\¥ T¡
¤
Ô 3Ð\Ð\ÐPZÐ\Ð\Ð\ó    Úmodulec                 ó   — t           ‚)z>Return whether `module` is compatible with this fusion family.©ÚNotImplementedError)r   r    s     r   Ú
is_fusablezModuleFusionSpec.is_fusable:   ó   € å!Ð!r   Úoriginal_clsc                 ó   — t           ‚)zBBuild the runtime replacement class for a compatible module class.r"   )r   r&   s     r   Úmake_fused_classz!ModuleFusionSpec.make_fused_class>   r%   r   Úconfigr   c                 ó   — t           ‚)zMBuild the weight transforms needed to load and save the fused runtime layout.r"   )r   r)   s     r   Úmake_transformsz ModuleFusionSpec.make_transformsB   r%   r   N)r   Ú
__module__Ú__qualname__Ú__doc__r   ÚtupleÚstrÚ__annotations__r   r   ÚModuleÚboolr$   r   r(   Úlistr   r+   r   r   r   r   r   ,   sÝ   € € € € € € ðð ð 02Ð˜U 3¨ 8œ_Ð1Ð1Ñ1ð]¨ð ]°ð ]ð ]ð ]ð ]ð" ¤ð "¨tð "ð "ð "ð "ð"¨T°"´)¬_ð "ÀÀbÄiÄð "ð "ð "ð "ð"Ð&8ð "¸TÀ/Ô=Rð "ð "ð "ð "ð "ð "r   r   c                   óB   ‡ — e Zd Zˆ fd„Zdej        dej        fd„Zˆ xZS )Ú_FusedPatchEmbeddingMixinc                 óL  •—  t          ¦   «         j        |i |¤Ž | j        j        t	          j        | j        j        ¦  «        z  | _        t          j	        | j        | j        j
        | j        j        d u| j        j        j        | j        j        j        ¬¦  «        | _        | `d S )N)ÚbiasÚdeviceÚdtype)ÚsuperÚ__init__ÚprojÚin_channelsÚmathÚprodÚkernel_sizeÚpatch_volumer   ÚLinearÚout_channelsr8   Úweightr9   r:   Úlinear_proj)r   ÚargsÚkwargsÚ	__class__s      €r   r<   z"_FusedPatchEmbeddingMixin.__init__H   s”   ø€ à�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ø œIÔ1µD´I¸d¼iÔ>SÑ4TÔ4TÑTˆÔåœ9ØÔØŒIÔ"Ø”” tÐ+Ø”9Ô#Ô*Ø”)Ô"Ô(ð
ñ 
ô 
ˆÔð ˆIˆIˆIr   Úhidden_statesr   c                 óâ   — | j         j        j        }|                     d| j        ¦  «        }|                       |                     |¬¦  «        ¦  «        }|                     d| j        ¦  «        S )Néÿÿÿÿ)r:   )rF   rE   r:   ÚviewrB   ÚtoÚ	embed_dim)r   rJ   Útarget_dtypes      r   Úforwardz!_FusedPatchEmbeddingMixin.forwardW   sd   € ØÔ'Ô.Ô4ˆØ%×*Ò*¨2¨tÔ/@ÑAÔAˆØ×(Ò(¨×)9Ò)9ÀÐ)9Ñ)MÔ)MÑNÔNˆØ×!Ò! " d¤nÑ5Ô5Ð5r   )r   r,   r-   r<   ÚtorchÚTensorrQ   Ú__classcell__)rI   s   @r   r6   r6   G   s^   ø€ € € € € ðð ð ð ð ð6 U¤\ð 6°e´lð 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6r   r6   c                   óˆ   — e Zd ZdZdZdej        defd„Zde	ej                 de	ej                 fd„Z
dd	dee         fd
„ZdS )ÚPatchEmbeddingsFusionSpeczJFuse compatible Conv3d patch embeddings into flattened Linear projections.)z(^|\.)patch_embed$r    r   c                 ó¾   — t          t          |dd ¦  «        x}t          j        ¦  «        sdS |j        |j        k    o |j        dk    o|j        dk    o
|j        dk    S )Nr=   F)r   r   r   )r   r   r   r   )	Ú
isinstanceÚgetattrr   ÚConv3dÚstriderA   ÚpaddingÚdilationÚgroups)r   r    r=   s      r   r$   z$PatchEmbeddingsFusionSpec.is_fusablec   so   € Ý¥'¨&°&¸$Ñ"?Ô"?Ð?˜$ÅÄÑKÔKð 	Ø�5ð ŒK˜4Ô+Ò+ð !Ø” 	Ò)ð!à” Ò*ð!ð ”˜qÒ ð		
r   r&   c                 ód   — t          d|j        › �t          |fi ¦  «        }d|j        › �|_        |S )NÚFused)r   r   r6   r-   )r   r&   Ú	fused_clss      r   r(   z*PatchEmbeddingsFusionSpec.make_fused_classo   s@   € ÝÐ8 Ô!6Ð8Ð8Õ;TÐVbÐ:cÐegÑhÔhˆ	Ø!D¨Ô)BÐ!DÐ!Dˆ	ÔØÐr   r)   r   c                 ó  — t          |d|¦  «        }|j        }t          |t          ¦  «        r||f}|j        gt          |¦  «        ¢R }|j        }t          ddt          ||¬¦  «        g¬¦  «        t          dd¬¦  «        gS )	NÚvision_configzpatch_embed\.proj\.weight$z!patch_embed\.linear_proj\.weight$)r>   rA   )Úsource_patternsÚtarget_patternsÚ
operationszpatch_embed\.proj\.bias$zpatch_embed\.linear_proj\.bias$)rd   re   )
rY   Ú
patch_sizerX   ÚintÚtemporal_patch_sizer/   r>   r   r
   r   )r   r)   rc   rg   rA   r>   s         r   r+   z)PatchEmbeddingsFusionSpec.make_transformst   sµ   € Ý ¨¸Ñ@Ô@ˆØ"Ô-ˆ
Ý�j¥#Ñ&Ô&ð 	2Ø$ jÐ1ˆJØ$Ô8ÐM½5ÀÑ;LÔ;LÐMÐMˆØ#Ô/ˆõ Ø =Ø Då"Ø$/Ø$/ðñ ô ðð	ñ 	ô 	õ Ø ;Ø Bðñ ô ð
ð 	
r   N)r   r,   r-   r.   r   r   r2   r3   r$   r   r(   r4   r   r+   r   r   r   rV   rV   ^   sš   € € € € € ØTÐTà6Ðð

 ¤ð 

¨tð 

ð 

ð 

ð 

ð¨T°"´)¬_ð ÀÀbÄiÄð ð ð ð ð

Ð&8ð 
¸TÀ/Ô=Rð 
ð 
ð 
ð 
ð 
ð 
r   rV   Úclsztype[PreTrainedModel]r)   r   Úfusion_nameÚspecr   c                 ór  — t                                |i ¦  «        }| |v r||          S t          j        d¦  «        5   | |¦  «        }ddd¦  «         n# 1 swxY w Y   t	          ¦   «         }i }|j        r,t          j        d                     |j        ¦  «        ¦  «        nd}| 	                    ¦   «         D ]y\  }	}
t          |
¦  «        }||v rŒ|�|                     |	¦  «        €Œ1|                     |
¦  «        sŒG|                     |¦  «         |                     |¦  «        ||j        <   Œz||| <   |S )ar  Discover compatible module classes for one fusion family on a meta-initialized model.

    This function:
    - instantiates `cls(config)` on the meta device
    - scans `named_modules()` for candidate modules
    - optionally pre-filters them with `target_modules_patterns`
    - uses `is_fusable(...)` as the final structural check
    - builds the class-level patch mapping used by monkey patching

    Results are cached per `(fusion_name, cls)` to avoid repeated meta-initialization.
    This matches the current class-level fusion behavior, where one compatible
    module class maps to one fused replacement class.
    ÚmetaNú|)r   Ú
setdefaultrR   r9   Úsetr   ÚreÚcompileÚjoinÚnamed_modulesr   Úsearchr$   Úaddr(   r   )rj   r)   rk   rl   ÚcacheÚmodelÚseen_classesÚpatch_mappingÚtarget_module_patternÚmodule_namer    Ú
module_clss               r   Ú_discover_fusable_modulesr   Ž   s�  € õ( $×.Ò.¨{¸BÑ?Ô?€EØ
ˆe€|€|Ø�SŒzÐå	Œ�fÑ	Ô	ð ð Ø��F‘”ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ‘5”5€LØ€Mà>BÔ>ZÐd�Œ
�3—8’8˜DÔ8Ñ9Ô9Ñ:Ô:Ð:Ð`dð ð  %×2Ò2Ñ4Ô4ð 
Oð 
OÑˆ�VÝ˜&‘\”\ˆ
Ø˜Ð%Ð%ØØ Ð,Ð1F×1MÒ1MÈkÑ1ZÔ1ZÐ1bØØ�Š˜vÑ&Ô&ð 	Øà×Ò˜Ñ$Ô$Ð$Ø-1×-BÒ-BÀ:Ñ-NÔ-Nˆ�jÔ)Ñ*Ð*à€Eˆ#�JØÐs   ¼AÁAÁAc           
      óp  — t          | |||¬¦  «        }|s4t                               |                     | j        ¦  «        ¦  «         dS t          |d¬¦  «         t          | d¦  «        rt          | j        d¦  «        st          d| j        › d�¦  «        ‚| j        j	        }| 
                    |¦  «        }t          |¦  «        }|�Zd	„ |D ¦   «         }|D ]F}	t          |	j        ¦  «        }
|                     |
¦  «        }|�t          d
|› d|› d|
› d�¦  «        ‚ŒG||z   }t          ||d¬¦  «         dS )a‰  Register one fusion family for `cls`.

    This function updates the two global registries used by fused loading:
    - the monkey-patching registry, so compatible module classes are replaced before initialization
    - the checkpoint conversion mapping, so fused runtime modules still load from the original checkpoint layout

    Notes:
    - conflicting checkpoint transforms fail fast
    )rk   rl   NT)Ú	overwriteÚconfig_classÚ
model_typezModel z" has no config class or model typec                 ó8   — i | ]}t          |j        ¦  «        |“ŒS r   )r/   rd   )Ú.0Úexistings     r   ú
<dictcomp>z+_register_module_fusion.<locals>.<dictcomp>Û   s&   € Ð%tÐ%tÐ%tÐT\¥e¨HÔ,DÑ&EÔ&EÀxÐ%tÐ%tÐ%tr   zFusion z for model type zC conflicts with an existing conversion mapping for source patterns ú.)r   ÚloggerÚinfor   r   r   Úhasattrr‚   Ú
ValueErrorrƒ   r+   r   r/   rd   Úgetr	   )rj   r)   rk   rl   Úfusable_classesrƒ   Ú
convertersÚexisting_convertersÚexisting_converter_sourcesÚ	converterrd   Úexisting_converters               r   Ú_register_module_fusionr”   ¾   s‘  € õ 0°°VÈÐ[_Ð`Ñ`Ô`€OØð Ý�Š�D×&Ò& s¤|Ñ4Ô4Ñ5Ô5Ð5Øˆå˜?°dÐ;Ñ;Ô;Ð;å�3˜Ñ'Ô'ð T­w°sÔ7GÈÑ/VÔ/Vð TÝÐR #¤,ÐRÐRÐRÑSÔSÐSØÔ!Ô,€JØ×%Ò% fÑ-Ô-€Jå;¸JÑGÔGÐØÐ&ð &uÐ%tÐ`sÐ%tÑ%tÔ%tÐ"Ø#ð 	ð 	ˆIÝ# IÔ$=Ñ>Ô>ˆOØ!;×!?Ò!?ÀÑ!PÔ!PÐØ!Ð-Ý ð>˜kð >ð >¸:ð >ð >Ø+:ð>ð >ð >ñô ð ð .ð )¨:Ñ5ˆ
å*¨:°zÈTÐRÑRÔRÐRÐRÐRr   Úpatch_embeddingsÚ_FUSION_REGISTRYÚfusion_configc                 ó   — g }|                       ¦   «         D ]f\  }}|t          vrt          d|› �¦  «        ‚|du rŒ%|dur(t          |t          ¦  «        st          d|› d�¦  «        ‚|                     |¦  «         Œg|S )zQValidate `fusion_config` and return enabled fusion names in user-specified order.zUnknown fusion type: FTzInvalid fusion config for z4: expected `True`, `False`, or a mapping of options.)Úitemsr–   rŒ   rX   r   Úappend)r—   Úenabled_fusionsrk   Úfusion_optionss       r   Ú_iter_enabled_fusionsr�   î   s³   € ð €OØ'4×':Ò':Ñ'<Ô'<ð 	,ð 	,Ñ#ˆ�^ØÕ.Ð.Ð.ÝÐB°[ÐBÐBÑCÔCÐCØ˜UÐ"Ð"ØØ Ð%Ð%­j¸ÍÑ.QÔ.QÐ%ÝØn¨[ÐnÐnÐnñô ð ð 	×Ò˜{Ñ+Ô+Ð+Ð+ØÐr   c                 ól   — |sdS t          |¦  «        D ]}t          | ||t          |         ¦  «         Œ dS )a  Register requested runtime fusions for `cls`.

    This function:
    - validates `fusion_config` against `_FUSION_REGISTRY`
    - resolves the enabled fusion families in user order
    - registers monkey patches and checkpoint transforms before model instantiation
    N)r�   r”   r–   )rj   r)   r—   rk   s       r   Úregister_fusion_patchesrŸ   ÿ   sS   € ð ð Øˆå,¨]Ñ;Ô;ð Yð YˆÝ  V¨[Õ:JÈ;Ô:WÑXÔXÐXÐXðYð Yr   )N)-r.   r?   rr   Úcollections.abcr   Útypingr   r   rR   r   Úconversion_mappingr   r	   Úcore_model_loadingr
   r   r   r   Úmonkey_patchingr   Úutilsr   Úconfiguration_utilsr   Úmodeling_utilsr   Ú
get_loggerr   r‰   r   Údictr0   r   r2   r1   r   r6   rV   r   r”   r–   r3   r4   r�   rŸ   r   r   r   ú<module>rª      s5  ððð ð ð
 €€€Ø 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€Ø Ð Ð Ð Ð Ð à iÐ iÐ iÐ iÐ iÐ iÐ iÐ iØ `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ð `Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð ð ð 0Ø5Ð5Ð5Ð5Ð5Ð5Ø/Ð/Ð/Ð/Ð/Ð/ð 
ˆÔ	˜HÑ	%Ô	%€àMOÐ ˜˜c 4¨¨d°3¸¸R¼Y¼Ð3GÔ.HÐ(HÔ#IÐIÔJÐ OÐ OÑ Oð"ð "ð "ð "ð "ñ "ô "ð "ð66ð 6ð 6ð 6ð 6ñ 6ô 6ð 6ð.-
ð -
ð -
ð -
ð -
Ð 0ñ -
ô -
ð -
ð`-Ø	 ð-àð-ð ð-ð ð	-ð
 
ˆ#ˆt�B”IŒÐ
Ôð-ð -ð -ð -ð`*SØ	 ð*SØ*<ð*SØKNð*SØVfð*Sà	ð*Sð *Sð *Sð *SðZ 2DÐE^ÐE^ÑE`ÔE`Ð0aÐ �$�sÐ,Ð,Ô-Ð aÐ aÑ að¨°°d¸WÀSÈ#ÀXÔ=NÑ6NÐ1NÔ)Oð ÐTXÐY\ÔT]ð ð ð ð ð$ jnðYð YØ	 ðYØ9@ÀÀdÈWÐUXÐZ]ÐU]ÔM^ÑF^ÐA^Ô9_ÐbfÑ9fðYà	ðYð Yð Yð Yð Yð Yr   