
    oi<                         S SK r S SKrS SKJr  S SKJrJrJr  S SKJ	r	J
r
  S SKJr  S SKJrJrJrJrJrJr  S SKJr  SS	KJr  SS
KJrJrJr   " S S\
5      rg)    N)Conv1D)is_bnb_4bit_availableis_bnb_availableis_gptqmodel_available)
LoraConfig	LoraModel)BaseTunerLayer)5TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPING_freeze_adapter_get_submodulesget_auto_gptq_quant_linearget_gptqmodel_quant_linearget_quantization_config)gather_params_ctx   )SVDQuantLinear)AdaLoraLayerRankAllocator	SVDLinearc                      ^  \ rS rSrSr\rU 4S jrS\SS4U 4S jjr	S r
\SS	 j5       rS
 rS rS rS rS rSrU =r$ )AdaLoraModel%   a  
Creates AdaLoRA (Adaptive LoRA) model from a pretrained transformers model. Paper:
https://openreview.net/forum?id=lq62uWRJjiY

Args:
    model ([`transformers.PreTrainedModel`]): The model to be adapted.
    config ([`AdaLoraConfig`]): The configuration of the AdaLora 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 AdaLora model.

Example::

    >>> from transformers import AutoModelForSeq2SeqLM >>> from peft import LoraConfig, AdaLoraModel, AdaLoraConfig
    >>> config = AdaLoraConfig(
            peft_type="ADALORA", task_type="SEQ_2_SEQ_LM", init_r=12, lora_alpha=32, target_modules=["q", "v"],
            lora_dropout=0.01,
        )
    >>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") >>> model = AdaLoraModel(model, config, "default")

**Attributes**:
    - **model** ([`transformers.PreTrainedModel`]) -- The model to be adapted.
    - **peft_config** ([`AdaLoraConfig`]): The configuration of the AdaLora model.
c                   > [         TU ]  " XU40 UD6  SnU R                  R                  5        H  nUR                  (       a  M  US-  nM     US:  a  [        S5      eU R                  U   R                  (       a  [        U R                  U5        g X0l        [        U R                  U R                  U   U R                  5      U l
        g )Nr   r   zAdaLoraModel supports only 1 trainable adapter. When using multiple adapters, set inference_mode to True for all adapters except the one you want to train.)super__init__peft_configvaluesinference_mode
ValueErrorr   modeltrainable_adapter_namer   rankallocator)selfr    configadapter_namekwargstraininable_mode_counter	__class__s         S/home/james-whalen/.local/lib/python3.13/site-packages/peft/tuners/adalora/model.pyr   AdaLoraModel.__init__E   s    ??#$ &&--/F((((A-( 0 $a'~ 
 L)88DJJ5*6'!.tzz4;K;KL;Y[_[v[v!wD    r$   returnNc                    > [         TU ]  U5        SnU R                  R                  5        H  nUR                  (       a  M  US-  nM     US:  a"  [        U R                  R                   S35      eg)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.

r   r   z supports only 1 trainable adapter. When using multiple adapters, set inference_mode to True for all adapters except the one you want to train.N)r   _check_new_adapter_configr   r   r   r   r(   __name__)r#   r$   r'   config_r(   s       r)   r.   &AdaLoraModel._check_new_adapter_configY   s~     	)&1#$ ''..0G)))(A-( 1 $a'>>**+ ,% %  (r+   c                    UR                   UR                  UR                  UR                  UR                  [        U R                  SS5      [        U R                  SS5      S.nUS   (       d
  US   (       a  [        5       (       d  [        S5      e[        U R                  SS	9nUb  XS
'   [        U[        5      (       d|  [        U R                  S5      (       a  U R                  R                  OS n	U R                  " XU4SU	0UD6n
X R                  ;  a  U
R!                  S5        U R#                  XTX5        g UR%                  UUR                   UR                  UR                  UR                  5        g )Nis_loaded_in_8bitFis_loaded_in_4bit)r
lora_alphalora_dropoutfan_in_fan_outinit_lora_weightsloaded_in_8bitloaded_in_4bitr:   r;   zTo use AdaLora with 8-bit quantization, please install the `bitsandbytes` package. You can install it with `pip install bitsandbytes`.gptq)methodgptq_quantization_confighf_device_map
device_map)init_rr6   r7   r8   r9   getattrr    r   ImportErrorr   
isinstancer   hasattrr?   _create_new_moduleactive_adaptersrequires_grad__replace_moduleupdate_layer)r#   lora_configr%   targettarget_nameparentcurrent_keyr&   quantization_configr@   
new_modules              r)   _create_and_replace AdaLoraModel._create_and_replacen   sY    ##%00'44)88!,!>!>%djj2EuM%djj2EuM
 #$/?(@JZJ\J\F 
 6djjP*1D-. &,//5<TZZ5Y5Y11_cJ00Ft_itmstJ#7#77))%0  jI""&&((--r+   c                 D   [        5       (       a
  SS KnSSKJn  [	        5       (       a  SSKJn  UR                  SS 5      n[        5       (       a
  [        XS9n	O[        U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
(       aw  [        UWR                  R                  5      (       aR  UR!                  UR"                  R$                  UR"                  R&                  UR(                  S
.5        W" X!40 UD6nU$ U(       a  [	        5       (       a  [        UWR                  R*                  5      (       ab  UR-                  5       nUR!                  UR.                  UR0                  R2                  UR0                  R4                  S.5        W" X!40 UD6nU$ U	b  [        X)5      (       a  [7        X!40 UD6nU$ [        U[8        R                  R:                  5      (       a-  US   (       a"  [<        R>                  " S5        S=US'   U l         OQ[        U[B        5      (       a-  US   (       d"  [<        R>                  " S5        S=US'   U l         O[E        SU S35      e[G        X!40 UD6nU$ )Nr   r   )SVDLinear8bitLt)SVDLinear4bitr>   )r@   r:   Fr;   )has_fp16_weights	thresholdindex)compute_dtypecompress_statistics
quant_typer8   zjfan_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.TzTarget module zP is not supported. Currently, only `torch.nn.Linear` and `Conv1D` are supported.)$r   bitsandbytesbnbrU   r   rV   getr   r   r   poprD   r	   get_base_layernnLinear8bitLtupdatestaterW   rX   rY   
Linear4bitcopyrZ   weightr[   r\   r   torchLinearwarningswarnr8   r   r   r   )rK   r%   rL   r@   r&   r^   rU   rV   r>   QuantLinearr:   r;   target_base_layerrQ   fourbit_kwargss                  r)   rF   AdaLoraModel._create_new_module   sq    &, ""*#)::.H$#O !##45MeK45MNK$4e<$4e<fn-- & 5 5 7 &j):CFF<O<OPPMM(9(?(?(P(P!2!8!8!B!B.44 )HHJF E  5 7 7JGXZ]Z`Z`ZkZk<l<l#[[]N!!%6%D%D+<+C+C+W+W"3":":"E"E 'vN~NJ2 1 $F)H)H'GGJ. + +UXX__==*+MM; MRQF+,{/I-v66./MM: MQPF+,{/I $VH -T U  #6B6BJr+   c                    U R                   R                  " U0 UD6n[        USS 5      Gb  [        UR                  [
        R                  5      (       Ga}  U R                  U R                     R                  nUS::  a  [        S5      eSnSnU R                   R                  5        GH  u  pxSU;   d  SU;   d  M  U R                  U;   d  M&  UR                  [
        R                  " S/5      :X  a6  [        XS9   SU;   a  XR                  -  OUR                  U-  n	S S S 5        O#SU;   a  XR                  -  OUR                  U-  n	[
        R                   " W	R#                  5       S[
        R$                  " U	5      06n
SU
l        US	-  nU[
        R(                  " X-
  S
S9-  nGM     US:  a  XV-  nOSnU=R                  XE-  -  sl        U$ ! , (       d  f       N= f)Nlossr   z*orth_reg_weight should be greater than 0. lora_Alora_B)
fwd_moduleoutFr   fro)p)r    forwardrB   rD   rr   ri   Tensorr   r!   orth_reg_weightr   named_parametersshapeSizer   Teyesize
empty_likerequires_gradnorm)r#   argsr&   outputsr{   	regu_loss	num_paramnrx   para_covIs              r)   ry   AdaLoraModel.forward   s   **$$d5f5GVT*6Jw||UZUaUa<b<b"..t/J/JK[[O!# !MNNII

335MX]8S8SWX8Xww%**aS/1.qB2:a-q33wQSS1WH CB /7!m1ss7q		8==?S8H8H8RSA&+AONIHLE!BBI 6 1}%1		LLO77L CBs   <$G
G#	c                 l   U R                   U   nUR                  5        GH  u  pE[        U[        5      (       a  [	        U5      nOZ[        U[
        R                  5      (       a0  UR                  S5      nUR	                  5       R                  5       nO[        S5      eX$;   a#  SR                  UR                  S5      SS 5      O"SR                  UR                  S5      SS 5      n[        U R                  U5      u  pnU	R                  U   U   n
U	R                  U   U   nU	R                   U   S S 2U4   nU	R"                  U   nU	R%                  UUUR&                  UR(                  UR*                  5        [
        R,                  " 5          US:  ax  U	R                  U   R/                  U
5        U	R                  U   R/                  U5        U	R                   U   R/                  U5        U	R"                  U   R/                  U5        S S S 5        GM      g ! , (       d  f       GM  = f)NzUnexpected type of rank_idx.r   )r   itemsrD   listsumri   rz   viewitemr   joinsplitr   r    lora_Ers   rt   ranknumrJ   r6   r7   r9   no_gradcopy_)r#   rank_patternr%   rK   namerank_idxrankkey_rL   lora_E_weightslora_A_weightslora_B_weightsr   s                 r)   resize_modules_by_rank_pattern+AdaLoraModel.resize_modules_by_rank_pattern   s   &&|4*002ND(D))8}Hell33#==,||~**, !>??5A5I#((4::c?1R01sxxX\XbXbcfXghijlXmOnC*4::s;LAq#]]<8BN#]]<8BN#]]<8HENnn\2G&&((-- !8MM,/55nEMM,/55nEMM,/55nENN<066w? !+ 3* !s   A?H##
H3	c                    UR                  5        H  u  pE[        U5      nX4;   a#  SR                  UR                  S5      SS 5      O"SR                  UR                  S5      SS 5      nS H^  nSU SU SU 3n	US:w  a$  XbU	   R                  S   :w  a  X)   U   OX)   X)'   M8  XbU	   R                  S   :w  a  X)   S S 2U4   OX)   X)'   M`     M     U$ )	Nr   r   r   r   )r   rs   rt   zbase_model.model.rt   r   )r   r   r   r   r}   )
r#   r   
state_dictr%   r   r   r   prefixlayerr   s
             r)   !resize_state_dict_by_rank_pattern.AdaLoraModel.resize_state_dict_by_rank_pattern  s    *002NDx=D8D8LSXXdjjoa34RURZRZ[_[e[efi[jklmo[pRqF7)&5'<.IH$59_=R=RST=U5U
1[e[j O
 9=3@U@UVW@X8X
84^h^m O 8 3 r+   c                 >   U R                   U R                     nXR                  UR                  -
  :  a7  U R                  R                  U R                  U5      u  p4U(       a  XBl        ggXR                  UR                  -
  :X  aH  U R                  R                  U R                  USS9u  p4XBl        U R                  R                  5         gXR                  UR                  -
  :  a1  U R                  R                  U R                  UR                  5        gg)a  
This method updates Adalora budget and mask.

This should be called in every training step after `loss.backward()` and before `zero_grad()`.

`tinit`, `tfinal` and `deltaT` are handled with in the method.

Args:
    global_step (`int`): The current training step, it is used to calculate adalora budget.

Example:

```python
>>> loss = model(**input).loss
>>> loss.backward()
>>> optimizer.step()
>>> model.base_model.update_and_allocate(i_step)
>>> optimizer.zero_grad()
```
T)
force_maskN)
r   r!   
total_steptfinalr"   update_and_allocater    r   	reset_iptmask_using_rank_pattern)r#   global_steprK   r   r   s        r)   r    AdaLoraModel.update_and_allocate.  s    * &&t'B'BC//+2D2DDD"00DDTZZQ\]OA+7(  22[5G5GGG"00DDTZZQ\imDnOA (4$((* 11K4F4FFF66tzz;C[C[\ r+   c                 F    [        U R                  R                   S35      e)z;This method is not supported for AdaLoRA, use LoRA instead.z. does not support add_weighted_adapter method.)	TypeErrorr(   r/   )r#   r   r&   s      r)   add_weighted_adapter!AdaLoraModel.add_weighted_adapterX  s     4>>2233abccr+   )r"   r!   )N)r/   
__module____qualname____firstlineno____doc__r
   target_module_mappingr   r   r.   rR   staticmethodrF   ry   r   r   r   r   __static_attributes____classcell__)r(   s   @r)   r   r   %   si    : Rx(
 t *+Z C CJ<@> (Td dr+   r   )rk   ri   transformers.pytorch_utilsr   peft.import_utilsr   r   r   peft.tuners.lorar   r   peft.tuners.tuners_utilsr	   
peft.utilsr
   r   r   r   r   r   peft.utils.integrationsr   r<   r   r   r   r   r   r    r+   r)   <module>r      sD      - ] ] 2 3  6   9 9ud9 udr+   