
    biq                        d dl mZ d dl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 ddlmZ  G d	 d
e      Z	 	 	 	 	 	 	 	 	 	 ddZy)    )annotationsN)AnyOptional)is_torchao_available)BaseTunerLayercheck_adapters_to_merge   )
LoraConfig)Linearc                  F     e Zd ZdZ fdZd ZdddZd	dZd
 fdZ xZ	S )TorchaoLoraLinearz>LoRA layer implementation for Linear layers using torchao datac                   |j                  dd      r"t        | j                  j                   d      t	        |   |i | || _        | j                          y )N	lora_biasFz0 does not support lora_bias yet, set it to False)get
ValueError	__class____name__super__init__get_apply_tensor_subclass_check_dtype_supported)selfr   argskwargsr   s       S/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/tuners/lora/torchao.pyr   zTorchaoLoraLinear.__init__    sW     ::k5) 7 788hijj$)&))B&##%    c                t   | j                         }|j                  }t        |d      r1|j                  j                  j
                  t        j                  k7  s=t        |d      rS|j                  j                  j
                  t        j                  k7  r!t        t        |       j                   d      y y )Ntensor_impllayout_tensorz$ only supports int8 weights for now.)get_base_layerweighthasattrr   datadtypetorchint8r   r   typer   )r   
base_layerr!   s      r   r   z(TorchaoLoraLinear._check_dtype_supported*   s    ((*
"" V]+1C1C1H1H1N1NRWR\R\1\ V_-63G3G3L3L3R3RV[V`V`3`T
 3 344XYZZ 4a-r   c                *   ddl m} t        | |      }|sy | j                          | j	                         }|j
                  }|D ]  }	 j                         }|r2t        j                  |      j                         st        d| d      || j                  |      z  }|`||_         ||| j                                ~| j                   j#                  |        y # t        $ r*}dt              j                   d}t        |      |d }~ww xY w)Nr   	quantize_Weights of type zI do not support dequantization (yet), which is needed to support merging.z1NaNs detected in the merged weights. The adapter z seems to be broken)torchaor+   r   r   r    r!   
dequantizeNotImplementedErrorr'   r   r%   isfiniteallr   get_delta_weightr   merged_adaptersappend)	r   
safe_mergeadapter_namesr+   r(   r!   active_adapterexcmsgs	            r   mergezTorchaoLoraLinear.merge8   s#   %/mD##%((*
""+ 	8N8**, %.."8"<"<"> GGWWjk  d++N;;F! &Jj$"@"@"BC  ''7-	8 ' 8&tF|'<'<&= >' '  *#.C78s   C	D(%DDc                V   ddl m} | j                  st        j                  d       y t        | j                        dkD  r| j                  j                         }|| j                  j                         vrO| j                         }|j                  }	 |j                         }|| j!                  |      z  }|`||_         ||| j#                                ~t        | j                        dkD  ry y # t        $ r*}dt        |      j                   d}t        |      |d }~ww xY w)Nr   r*   z Already unmerged. Nothing to do.r,   zK do not support dequantization (yet), which is needed to support unmerging.)r-   r+   mergedwarningswarnlenr3   poplora_Akeysr    r!   r.   r/   r'   r   r2   r   )r   r+   r7   r(   r!   r8   r9   s          r   unmergezTorchaoLoraLinear.unmerge]   s   %{{MM<=$&&'!+!11557NT[[%5%5%77,,.J&&F8**, d++N;;F
 ! &Jj$"@"@"BC1 $&&'!+ ' 8&tF|'<'<&= >) )  *#.C78s   C5 5	D(>%D##D(c                r    t         |          }|j                  dd| j                  j                         S )Nzlora.Linearzlora.)r   __repr__replacer   r   )r   repr   s     r   rE   zTorchaoLoraLinear.__repr__~   s3    g {{=E$..2I2I1J*KLLr   )FN)r5   boolr6   zOptional[list[str]]returnNone)rI   rJ   )rI   str)
r   
__module____qualname____doc__r   r   r:   rC   rE   __classcell__)r   s   @r   r   r      s)    H&[#8JBM Mr   r   c                    d }t        | t              r| j                         }n| }t        |d      s|S t	               s|S ddlm} ddlm} t        |j                  ||f      rt        | |fi |}|S )Nr!   r   )AffineQuantizedTensor)LinearActivationQuantizedTensor)
isinstancer   r    r"   r   torchao.dtypesrQ   torchao.quantizationrR   r!   r   )targetadapter_namelora_configr   
new_moduletarget_base_layerrQ   rR   s           r   dispatch_torchaor[      sz     J&.)"113"$h/!4D#**-BDc,de&v|FvF
r   )
rV   ztorch.nn.ModulerW   rK   rX   r
   r   r   rI   zOptional[torch.nn.Module])
__future__r   r=   typingr   r   r%   peft.import_utilsr   peft.tuners.tuners_utilsr   r   configr
   layerr   r   r[    r   r   <module>rc      se    #     3 L  cM cML  	
 r   