
    bi0                        d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	Z	d dl
mZ d dlmZ d dlmZmZmZ d dlmZmZmZ d	d
lmZ d	dlmZmZ  G d de      Zy)    )annotationsN)asdict)Enum)Optional)tqdm)	BaseTunerBaseTunerLayercheck_target_module_exists)3TRANSFORMERS_MODELS_TO_SHIRA_TARGET_MODULES_MAPPINGModulesToSaveWrapper_get_submodules   )ShiraConfig)Linear
ShiraLayerc                       e Zd ZU dZdZded<   ddZed        Zd Z	ed        Z
dd	Zed
        Zd fdZdddZddZd Zd Zd Zed        Z	 	 	 	 d	 	 	 	 	 ddZddZ	 d	 	 	 	 	 ddZd Z xZS ) 
ShiraModela  
    Creates a Sparse High Rank Adapter (SHiRA) Model from a pretrained model.

    Args:
        model ([`~transformers.PreTrainedModel`]): The model to be adapted.
        config ([`ShiraConfig`]): The configuration of the SHiRA model.
        adapter_name (`str`): The name of the adapter, defaults to `"default"`.

    Returns:
        `torch.nn.Module`: The SHiRA model.

    Example:

        ```py
        >>> from transformers import AutoModelForCausalLM
        >>> from peft import ShiraConfig, get_peft_model

        >>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
        >>> config = ShiraConfig(r=32)
        >>> model = get_peft_model(base_model, config)
        ```

    **Attributes**:
        - **model** ([`~transformers.PreTrainedModel`]) -- The model to be adapted.
        - **peft_config** ([`ShiraConfig`]): The configuration of the SHiRA model.
    shira_strprefixc                L    | j                   j                         D ]  }||u s	 y)z
        A helper method to check the config when a new adapter is being added.

        Raise a ValueError if there is something wrong with the config or if it conflicts with existing adapters.

        N)peft_configvalues)selfconfigexisting_configs      R/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/shira/model.py_check_new_adapter_configz$ShiraModel._check_new_adapter_configC   s-      $//668 	O&(	    c                    t        | |      S N)r
   )shira_configkeys     r   _check_target_module_existsz&ShiraModel._check_target_module_existsO   s    ),<<r   c                J   |t        d      t        |d      xr |j                  d u}i }	||	d<   |j                  dk(  r|j                  |	d<   |j                         D ]
  \  }
}||	|
<    t        |t              r`|j                  ( |j                  |j                  |j                  fi |	nd }|j                  |||j                  |j                         y  | j                  |||fi |	}|| j                  vr|j                  d       | j!                  ||||       y )NzCurrent Key shouldn't be `None`biasrandomrandom_seed)init_weightsF)
ValueErrorhasattrr&   	mask_typer(   items
isinstancer   mask_fn
base_layerrupdate_layerr)   _create_new_moduleactive_adapterrequires_grad__replace_module)r   r"   adapter_nametargettarget_nameparentcurrent_keyoptional_kwargsr&   kwargskvmask
new_modules                 r   _create_and_replacezShiraModel._create_and_replaceS   s?    >??vv&B6;;d+Bv!!X-$0$<$<F=!#))+ 	DAqF1I	 ff%  ''3 %$$V%6%6Q&Q 
 )66	    100|V^W]^J4#6#66))%0  j&Ir   c                   t        | ||       t        |d      r|j                  }t        |d      s.|j                  |_        t        |d      r|j                  |_        t        |dd       ^t        |d      r|j                  |j                  _        n|j                  |_        |j                  |j                  j                         t        j                  d      |j                         D ]R  \  }}d|v st        fd|j                         D              r.|j                  |j                  j                         T y )Nr0   r&   statemetar   c              3  <   K   | ]  }|j                   k(    y wr!   )device).0prE   s     r   	<genexpr>z-ShiraModel._replace_module.<locals>.<genexpr>   s     I188t+Is   )setattrr+   r0   weightr&   getattrrD   torG   torchnamed_modulesany
parameters)r:   
child_namerA   childnamemodulerE   s         @r   r6   zShiraModel._replace_module|   s    
J/
 5,'$$Ez<0 %Juf%"'**
5'4(4z<0.3kk
%%+#(;;
 MM%,,--.||F#&446 	3LD&4IV5F5F5HIIIIell112	3r   c                `    |j                         D ]  \  }}| j                  |vsd|_         y )NF)named_parametersr   requires_grad)r   modelnrI   s       r    _mark_only_adapters_as_trainablez+ShiraModel._mark_only_adapters_as_trainable   s1    **, 	(DAq{{!#"'	(r   c                   | j                   }|j                  dd      }t        |t              r|j	                         }n|}t        |t
        j                  j                        r!|r.t        j                  d       dx}| _         nt        d| d      | j                   | j                  || j                  fi |nd }t        |||| j                  |fd| j                  i|}|S )Nr&   Fzjfan_in_fan_out is set to True but the target module is `torch.nn.Linear`. Setting fan_in_fan_out to False.zTarget module zZ is not supported. Currently, only the following modules are supported: `torch.nn.Linear`.r)   )fan_in_fan_outpopr.   r	   get_base_layerrO   nnr   warningswarnr*   r/   r1   r)   )	r"   r7   r8   r=   r^   _target_base_layerr@   rA   s	            r   r3   zShiraModel._create_new_module   s   %44JJvu%fn- & 5 5 7 &'97 @ED!<  )% %  ##/ !L  !2LNNMfM 	 NN
 &22
 

 r   c                z    	 t         |   |      S # t        $ r |dk(  r t        | j                  |      cY S w xY w)z1Forward missing attributes to the wrapped module.rZ   )super__getattr__AttributeErrorrM   rZ   )r   rU   	__class__s     r   rh   zShiraModel.__getattr__   sB    	-7&t,, 	-w4::t,,	-s    %::c           
        i }| j                   j                         D ]U  \  }}t        |      j                         D ci c]$  \  }}|t        |t              r|j
                  n|& }}}|sQd|d<   W |<   |S c c}}w )NTinference_mode)r   r-   r   r.   r   value)r   	inferenceconfig_dictr#   rm   r>   r?   r   s           r   get_peft_config_as_dictz"ShiraModel.get_peft_config_as_dict   s    **002 	0JCKQRW=K^K^K`a41aaJq$$7Q>aFa+/'(	0 "C	 bs   )A<c                    | j                   j                         D ]*  }t        |t        t        f      s|j                  |       , y r!   )rZ   modulesr.   r	   r   enable_adapters)r   enabledrV   s      r   _set_adapter_layerszShiraModel._set_adapter_layers   s<    jj((* 	0F&>3G"HI&&w/	0r   c                (    | j                  d       y )NTrt   ru   r   s    r   enable_adapter_layersz ShiraModel.enable_adapter_layers   s       .r   c                (    | j                  d       y )NFrw   rx   ry   s    r   disable_adapter_layersz!ShiraModel.disable_adapter_layers   s       /r   c                    | j                   j                         D ]U  }t        |t              s|j                  r%t        j                  d       |j                          |j                  |       W || _	        y )NzJAdapter cannot be set when the model is merged. Unmerging the model first.)
rZ   rr   r.   r   mergedrb   rc   unmergeset_adapterr4   )r   r7   rV   s      r   r   zShiraModel.set_adapter   s^    jj((* 	1F&*-==MM"noNN$""<0	1 +r   c                ~    | j                   0|d   t        vrt        d      t        t        |d            | _         | S )N
model_typez0Please specify `target_modules` in `peft_config`)target_modulesr   r*   set)r   model_configs     r   _prepare_adapter_configz"ShiraModel._prepare_adapter_config   sK    %%-L)1dd !STT),CLQ]D^_*K& r   c                   | j                   j                         D cg c]  \  }}d|vs| }}}d|rdndz   dz   }t        || |      D ]  }	 t        | j                   |      \  }	}
}t        |
d      r8|r|
j                  ||       | j                  |	||
j                         |
       bt        |
t              sst        |	||
j                  |
j                             | j                   S c c}}w # t        $ r Y w xY w)	Nshiraz
Unloading zand merging  rZ   )disabledescr0   )
safe_mergeadapter_names)rZ   rP   r   r   ri   r+   merger6   r`   r.   r   rK   modules_to_saver4   )r   r   progressbarr   r   r#   rd   key_listr   r:   r8   r9   s               r   _unload_and_optionally_mergez'ShiraModel._unload_and_optionally_merge   s    '+jj&>&>&@WFCGSVDVCWW~B?'Ik/E 	\C.=djj#.N+ v|,LLJmLT$$V[&:O:O:QSYZF$89V-C-CFDYDY-Z[	\ zz# X
 " s   C2C2C88	DDc                   |t        | j                  j                               vrt        d| d      | j                  |= | j                  j                         D cg c]  \  }}d|vs| }}}d}|D ]P  }t        | j                  |      \  }}}t        |t              s.|j                  |       |B|j                  dd }R |xs g | _
        yc c}}w )z
        Deletes an existing adapter.

        Args:
            adapter_name (str): Name of the adapter to be deleted.
        zAdapter z does not existr   N)listr   keysr*   rZ   rP   r   r.   r   delete_adapterr4   )r   r7   r#   rd   r   new_adapterr8   s          r   r   zShiraModel.delete_adapter  s     tD$4$4$9$9$;<<x~_EFF\* '+jj&>&>&@WFCGSVDVCWW 	;C*4::s;LAvq&*-%%l3&"("7"7":K	; */R Xs   C,Cc                *    | j                  |||      S )aC  
        This method merges the Shira layers into the base model. This is needed if someone wants to use the base model
        as a standalone model.

        Args:
            progressbar (`bool`):
                whether to show a progressbar indicating the unload and merge process
            safe_merge (`bool`):
                whether to activate the safe merging check to check if there is any potential Nan in the adapter
                weights
            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`.

        Example:

        ```py
        >>> from transformers import AutoModelForCausalLM
        >>> from peft import ShiraConfig, get_peft_model

        >>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
        >>> config = ShiraConfig(r=32)
        >>> model = get_peft_model(base_model, config)
        >>> ## [Train the adapter] ##
        >>> merged_model = model.merge_and_unload()
        ```
        )r   r   r   r   )r   r   r   r   s       r   merge_and_unloadzShiraModel.merge_and_unload*  s#    < 00#
- 1 
 	
r   c                &    | j                  d      S )z
        Gets back the base model by removing all the Shira modules without merging. This gives back the original base
        model.
        F)r   r   ry   s    r   unloadzShiraModel.unloadL  s    
 00u0==r   )r   r   returnNone)rZ   z	nn.Moduler   r   )rU   r   )F)rn   bool)T)TFFN)r   r   r   r   r   zOptional[list[str]])r7   r   )FFN)__name__
__module____qualname____doc__r   __annotations__r   staticmethodr$   rB   r6   r\   r3   rh   rp   ru   rz   r|   r   r   r   r   r   r   __classcell__)rj   s   @r   r   r   %   s    6 FC
 = ='JR 3 38(
 ' 'R-0
/0+   ! -1  	
 +600 im 
 
59 
Re 
D>r   r   )
__future__r   rb   dataclassesr   enumr   typingr   rO   torch.nnra   r   peft.tuners.tuners_utilsr   r	   r
   
peft.utilsr   r   r   r   r   layerr   r   r    r   r   <module>r      sE    #        Z Z    %l> l>r   