
    oi                    ~    S SK Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
Jr  S SKJr  SS	KJr   " S
 S\
5      rg)    )annotations)Optional)Module)tqdm)
PeftConfig)	BaseTuner_get_submodules)6TRANSFORMERS_MODELS_TO_LNTUNING_TARGET_MODULES_MAPPING   )LNTuningLayerc                      \ rS rSr% SrSrS\S'   \r\	r
              SS jr        SS jrSS jr    S     SS
 jjrSSS jjrSrg	)LNTuningModel   a  
Creates LayerNorm tuning from a pretrained transformer model.

The method is described in detail in https://huggingface.co/papers/2312.11420.

Args:
    model ([`torch.nn.Module`]): The model to be adapted.
    config ([`LNTuningConfig`]): The configuration of the Lora model.
    adapter_name (`str`): The name of the adapter, defaults to `"default"`.
    low_cpu_mem_usage (`bool`, `optional`, defaults to `False`):
        This option has no effect on LN tuning but exists for consistency with other PEFT methods.

Returns:
    'torch.nn.Module': The adapted model with LayerNorm tuned on.

Example:

    ```py
    >>> from transformers import AutoModelForCausalLM
    >>> from peft import get_peft_model, TaskType, LNTuningConfig

    >>> peft_config = LNTuningConfig(
    ...     task_type=TaskType.CAUSAL_LM,
    ... )

    >>> model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
    >>> model = get_peft_model(model, peft_config)
    >>> model.print_trainable_parameters()
    ```

**Attributes**:
    - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`LNTuningConfig`]): The configuration of the Lora model.

ln_tuning_strprefixc                    U R                  XU5      nX R                  :w  a  UR                  S5        U R                  XTXs5        g )NF)_create_new_moduleactive_adapterrequires_grad__replace_module)selfpeft_configadapter_nametargettarget_nameparentcurrent_key
new_modules           U/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/ln_tuning/model.py_create_and_replace!LNTuningModel._create_and_replaceD   s@     ,,[,O
...%%e,V*E    c                    [        U[        5      (       d  [        X#5      nU$ UnUR                  UR                  U5        U$ N)
isinstancer   update_layer
base_layer)r   r   r   r   r   s        r    r    LNTuningModel._create_new_moduleS   sF     &-00&v<J   J##F$5$5|Dr#   c                   ^  U=(       d    T R                   n[        U 4S jU 5       5      nU(       a  [        U5      S:  a  [        S5      eg g )Nc              3  V   >#    U  H  nTR                   U   R                  v   M      g 7fr%   )r   modules_to_save).0adapterr   s     r    	<genexpr>2LNTuningModel._unloading_checks.<locals>.<genexpr>b   s&      +
EY'DW%55EYs   &)r   z?Cannot unload multiple adapters that specify `modules_to_save`.)active_adaptersanylen
ValueError)r   adapter_namesadapters_to_consideris_modules_to_save_availables   `   r    _unloading_checksLNTuningModel._unloading_checks`   sS    ,D0D0D'* +
EY+
 (
$ (C0D,E,I^__ -J'r#   Nc                   U R                  U5        U R                  R                  5        VVs/ s H  u  pVU R                  U;  d  M  UPM     nnnSU(       a  SOS-   S-   n[	        Xr(       + US9 Hi  n [        U R                  U5      u  pn[        U
S5      (       d  M0  U(       a  U
R                  U5        U R                  XU
R                  5       U
5        Mk     U R                  $ s  snnf ! [         a     M  f = f)NzUnloading adapters zand merging  model)disabledescr(   )r8   r<   named_modulesr   r   r	   AttributeErrorhasattrmerger   get_base_layer)r   rB   progressbar
safe_merger5   key_key_listr>   r   r   r   s               r    _unload_and_optionally_merge*LNTuningModel._unload_and_optionally_mergeh   s     	}-&*jj&>&>&@[&@FCDKKWZDZC&@[$%RH7R/EC.=djj#.N+ v|,,LL/$$V&:O:O:QSYZ F zz \ " s   C+	C+6C11
C?>C?c                    g r%    )r   r   autocast_adapter_dtypes      r    _cast_adapter_dtype!LNTuningModel._cast_adapter_dtype   s     	r#   rL   )r   r   r   r   r   r   r   r   r   r   r   r   returnNone)r   r   r   r   r   r   rP   r   )r5   Optional[list[str]])TFFN)rD   boolrE   rS   r5   rR   )T)r   r   rM   rS   rP   rQ   )__name__
__module____qualname____firstlineno____doc__r   __annotations__r   tuner_layer_clsr
   target_module_mappingr!   r   r8   rI   rN   __static_attributes__rL   r#   r    r   r      s    !F FC#ORFF F 	F
 F F F 
F  	
 
` ! -1  	
 +0 r#   r   N)
__future__r   typingr   torch.nn.modulesr   r   peft.configr   peft.tuners.tuners_utilsr   r	   
peft.utilsr
   layerr   r   rL   r#   r    <module>rd      s-    #  #  " ? M  hI hr#   