
    oi'5                        S SK Jr  S SKrS SKrS SKJr  S SKrS SKJr  S SK	J
r
Jr  S SKJrJr  S SKJrJrJrJrJr  SS	KJrJrJrJr   " S
 S\5      rg)    )annotationsN)replace)Conv1D)is_bnb_4bit_availableis_bnb_available)	BaseTunerBaseTunerLayer)6TRANSFORMERS_MODELS_TO_IA3_FEEDFORWARD_MODULES_MAPPING1TRANSFORMERS_MODELS_TO_IA3_TARGET_MODULES_MAPPINGModulesToSaveWrapper_freeze_adapter_get_submodules   )Conv2dConv3dIA3LayerLinearc                     ^  \ rS rSr% SrSrS\S'   \r\	S 5       r
S r\	SS j5       r\	S	 5       rU 4S
 jrSS jr        SS jrSrU =r$ )IA3Model$   a  
Creates a Infused Adapter by Inhibiting and Amplifying Inner Activations ((IA)^3) model from a pretrained
transformers model. The method is described in detail in https://huggingface.co/papers/2205.05638

Args:
    model ([`~transformers.PreTrainedModel`]): The model to be adapted.
    config ([`IA3Config`]): The configuration of the (IA)^3 model.
    adapter_name (`str`): The name of the adapter, defaults to `"default"`.
    low_cpu_mem_usage (`bool`, `optional`, defaults to `False`):
        Create empty adapter weights on meta device. Useful to speed up the loading process.

Returns:
    `torch.nn.Module`: The (IA)^3 model.

Example:

    ```py
    >>> from transformers import AutoModelForSeq2SeqLM, ia3Config
    >>> from peft import IA3Model, IA3Config

    >>> config = IA3Config(
    ...     peft_type="IA3",
    ...     task_type="SEQ_2_SEQ_LM",
    ...     target_modules=["k", "v", "w0"],
    ...     feedforward_modules=["w0"],
    ... )

    >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
    >>> ia3_model = IA3Model(config, model)
    ```

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`ia3Config`]): The configuration of the (IA)^3 model.
ia3_strprefixc                   [        5       (       a
  SS KnSSKJn  [	        5       (       a  SSKJn  UR                  SS5      nUR                  SS5      nUR                  SS5      n	[        U[        5      (       a  UR                  5       n
OUn
U(       a  [        U
WR                  R                  5      (       ad  UR                  5       nUR                  U
R                  R                  U
R                  R                  U
R                   S	.5        W" X!4SU	0UD6nU$ U(       a  [        U
WR                  R
                  5      (       ad  UR                  5       nUR                  U
R"                  U
R$                  R&                  U
R$                  R(                  S
.5        W" X!4SU	0UD6nU$ [        U[*        R                  R,                  5      (       a  [-        X!4SU	0UD6nU$ [        U[*        R                  R.                  5      (       a  [/        X!4SU	0UD6nU$ [        U
[*        R                  R0                  5      (       a<  US   (       a"  [2        R4                  " S5        S=US'   U l        [1        X!4SU	0UD6nU$ [        U
[8        5      (       a=  US   (       d"  [2        R4                  " S5        S=US'   U l        [1        X!4U	SS.UD6nU$ [;        SU S35      e)Nr   r   )Linear8bitLt)
Linear4bitloaded_in_8bitFloaded_in_4bitis_feedforward)has_fp16_weights	thresholdindex)compute_dtypecompress_statistics
quant_typefan_in_fan_outzjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.zafan_in_fan_out is set to False but the target module is `Conv1D`. Setting fan_in_fan_out to True.T)r   is_target_conv_1d_layerzTarget module zd is not supported. Currently, only `torch.nn.Linear`, `torch.nn.Conv2d`, and `Conv1D` are supported.)r   bitsandbytesbnbr   r   r   pop
isinstancer	   get_base_layernncopyupdatestater    r!   r"   r#   weightr$   r%   torchr   r   r   warningswarnr&   r   
ValueError)
ia3_configadapter_nametargetkwargsr)   r   r   r   r   r   target_base_layereightbit_kwargs
new_modulefourbit_kwargss                 O/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/ia3/model.py_create_new_moduleIA3Model._create_new_moduleL   s    &) ""'$4e<$4e<$4e<fn-- & 5 5 7 &j):CFF<O<OPP$kkmO""(9(?(?(P(P!2!8!8!B!B.44 &fm>m]lmJJ I 
+<cff>O>O P P#[[]N!!%6%D%D+<+C+C+W+W"3":":"E"E $Fjj[ijJ6 5 00^^^W]^J2 1 00^^^W]^J. - )588??;;&'7 HML'(:+D^^^W]^J  )622*+w HLK'(:+D5C]aekJ 	   )d e     c           	        U R                  X5      nUR                  UR                  U[        U R                  SS5      [        U R                  SS5      S.n[        U[        5      (       a  UR                  UUR                  5        g U R                  " XU40 UD6n	X R                  ;  a  U	R                  S5        U R                  XTX5        g )Nis_loaded_in_8bitFis_loaded_in_4bit)r&   init_ia3_weightsr   r   r   ) _check_target_module_feedforwardr&   rE   getattrmodelr+   r   update_layerr?   active_adaptersrequires_grad__replace_module)
selfr6   r7   r8   target_nameparentcurrent_keyr   r9   r<   s
             r>   _create_and_replaceIA3Model._create_and_replace   s     >>zW )77 * ; ;,%djj2EuM%djj2EuM
 fh''++
 006\U[\J#7#77))%0  jIrA   c                   ^ [        U R                  [        5      (       a,  [        [        R
                  " U R                  T5      5      nU$ [        U4S jU R                   5       5      nU$ )z|
A helper private method that checks if the target module `key` matches with a feedforward module specified in
`ia3_config`
c              3  F   >#    U  H  nTR                  U5      v   M     g 7fN)endswith).0
target_keykeys     r>   	<genexpr><IA3Model._check_target_module_feedforward.<locals>.<genexpr>   s      kLjjj!9!9Ljs   !)r+   feedforward_modulesr   boolre	fullmatchany)r6   rY   r   s    ` r>   rF   )IA3Model._check_target_module_feedforward   sY     j44c::!",,z/M/Ms"STN  ! kJLjLj kkNrA   c                   U R                   c2  US   [        ;  a  [        S5      e[        [        US      5      U l         U R                  c2  US   [
        ;  a  [        S5      e[        [
        US      5      U l        U $ )N
model_typez0Please specify `target_modules` in `peft_config`z5Please specify `feedforward_modules` in `peft_config`)target_modulesr   r5   setr\   r
   )peft_configmodel_configs     r>   _prepare_adapter_config IA3Model._prepare_adapter_config   s    %%-L)1bb !STT),A,|B\]*K& **2L)1gg !XYY.1F|T`Gab/K+ rA   c                   > [        U R                  SS5      (       a  [        S5      e[        U R                  SS5      (       a  [        S5      e[        TU ]  " U0 UD6$ )as  
This method merges the (IA)^3 layers into the base model. This is needed if someone wants to use the base model
as a standalone model.

Args:
    safe_merge (`bool`, `optional`, defaults to `False`):
        If True, the merge operation will be performed in a copy of the original weights and check for NaNs
        before merging the weights. This is useful if you want to check if the merge operation will produce
        NaNs. Defaults to `False`.
    adapter_names (`List[str]`, *optional*):
        The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults
        to `None`.
rC   Fz>Cannot merge ia3 layers when the model is loaded in 8-bit moderD   z>Cannot merge ia3 layers when the model is loaded in 4-bit mode)rG   rH   r5   super_unload_and_optionally_merge)rM   argsr9   	__class__s      r>   rl   %IA3Model._unload_and_optionally_merge   sZ     4::2E::]^^4::2E::]^^w3TDVDDrA   c                \  ^ ^ T H"  nUT R                   ;  d  M  [        SU S35      e   T R                  5        Vs/ s H  n[        U[        5      (       d  M  UPM     nn[        U4S jU 5       5      (       a  [        S5      eT Vs1 s H%  n[        T R                   U   R                  5      iM'     nnT Vs1 s H%  n[        T R                   U   R                  5      iM'     nn[        U5      S:  d  [        U5      S:  a  [        S5      e[        U;   a  SR                  U 4S jT 5       5      nO[        R                  " U 4S	 jT 5       6 n[        U;   a  SR                  U 4S
 jT 5       5      nXx4$ [        R                  " U 4S jT 5       6 nXx4$ s  snf s  snf s  snf )zw
Helper function to check if the arguments to add_weighted_adapter are valid and compatible with the underlying
model.
zAdapter z does not existc              3  V   >^#    U  H  m[        U4S  jT 5       5      S:  v   M     g7f)c              3  @   >#    U  H  oTR                   ;   v   M     g 7frU   )modules_to_save)rW   adapterwrappers     r>   rZ   AIA3Model._check_add_weighted_adapter.<locals>.<genexpr>.<genexpr>   s     K(w7222(s   r   N)sum)rW   ru   adapterss    @r>   rZ   7IA3Model._check_add_weighted_adapter.<locals>.<genexpr>   s&      
_wT[CK(KKaO_ws   %)zLCannot add weighted adapters targeting the same module with modules_to_save.r   zQAll adapter configs should have the same type for target and feedforward modules.|c              3  ^   >#    U  H"  nS TR                   U   R                   S3v   M$     g7f()Nrf   rd   rW   rt   rM   s     r>   rZ   ry      s0     )riq^eAd.>.>w.G.V.V-WWX*Yiq   *-c              3  V   >#    U  H  nTR                   U   R                  v   M      g 7frU   r   r   s     r>   rZ   ry      s%     ,nemZaT-=-=g-F-U-Uem   &)c              3  ^   >#    U  H"  nS TR                   U   R                   S3v   M$     g7fr|   rf   r\   r   s     r>   rZ   ry      s0      /T\!D$$W-AAB!DT\r   c              3  V   >#    U  H  nTR                   U   R                  v   M      g 7frU   r   r   s     r>   rZ   ry     s"     XxG$""7+??xr   )rf   r5   modulesr+   r   r`   typerd   r\   lenr   joinre   union)	rM   rx   rt   modulemodules_to_save_wrapperstarget_module_typesfeedforward_module_typesnew_target_modulesnew_feedforward_moduless	   ``       r>   _check_add_weighted_adapter$IA3Model._check_add_weighted_adapter   s     Gd... 8G9O!DEE  
 :>#tv:V\^rKsF #t 
_w
 
 
 kll ^ff]eRYtD$4$4W$=$L$LM]efgo#pgo\cD)9)9')B)V)V$Wgo #p"#a'3/G+H1+Lpqq %%!$)riq)r!r!$,nem,n!o**&)hh /T\/ '# "::	 '*iiXxX'# "::7 $u g#ps   FF,F$=,F)c                V   U[        U R                  R                  5       5      ;   a  gU R                  US9u  pE[	        U R                  US      UUS9U R                  U'   U R                  U R                  U5        [        U R                  U5        U R                  R                  5        VVs/ s H  u  pgU R                  U;  d  M  UPM     nnnU H  n[        U R                  U5      u  pyn[        U	[        5      (       d  M3  X9R                  ;   a  U	R                  U   n
OMT  U
R                  R                  5       U
l        [!        X5       HH  u  pXR                  ;   a  U	R                  U   nOM&  U
=R                  UR                  U-  -  sl        MJ     M     gs  snnf )a  
This method adds a new adapter by merging the given adapters with the given weights.

Args:
    adapters (`list`):
        List of adapter names to be merged.
    weights (`list`):
        List of weights for each adapter.
    adapter_name (`str`):
        Name of the new adapter.
N)rx   r   )rd   r\   )listrf   keysr   r   inject_adapterrH   r   named_modulesr   r   r+   r   ia3_ldatazero_zip)rM   rx   weightsr7   r   r   rY   _key_listr8   target_ia3_lrt   r1   current_adapter_ia3_ls                 r>   add_weighted_adapterIA3Model.add_weighted_adapter
  ss   " 4 0 0 5 5 7886:6V6V 7W 7
3 *1Xa[)- 7*
&
 	DJJ5 	

L1&*jj&>&>&@[&@FCDKKWZDZC&@[C*4::s;LAq&(++<</#)<<#=L$0$5$5$;$;$=!'*8'=OG,,.06W0E-  %%)>)C)Cf)LL% (>  \s   1F%F% )returnr]   )rx   	list[str]r   ztuple[str, str])rx   r   r   zlist[float]r7   r   r   None)__name__
__module____qualname____firstlineno____doc__r   __annotations__r   tuner_layer_clsstaticmethodr?   rQ   rF   rh   rl   r   r   __static_attributes____classcell__)rn   s   @r>   r   r   $   s    "H FCOA AFJ@ 	 	  E,&;P1M1M 1M 	1M
 
1M 1MrA   r   )
__future__r   r^   r3   dataclassesr   r2   transformers.pytorch_utilsr   peft.import_utilsr   r   peft.tuners.tuners_utilsr   r	   
peft.utilsr
   r   r   r   r   layerr   r   r   r   r   r   rA   r>   <module>r      sA    # 	    - E >  4 3WMy WMrA   