o
    NiGi                     @  s   d dl mZ d dlZd dlmZmZ d dlZd dlZd dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ dd	lmZ dd
lmZmZ dgZe rZG dd dejjeZdddZe
 roG dd dejjeZdddZdS dS )    )annotationsN)AnyOptional)is_bnb_4bit_availableis_bnb_available)BaseTunerLayercheck_adapters_to_merge)dequantize_bnb_weight)	transpose   )ArrowConfig)	LoraLayerLoraVariantalora_offsetsc                      s|   e Zd Z									d4d5 fddZd6ddZd7d8d"d#Zd9d$d%Zd&d' Zd:d.d/Zd;d0d1Z	d< fd2d3Z
  ZS )=Linear8bitLtr   r           TFN
base_layertorch.nn.Moduleadapter_namestrrint
lora_alphalora_dropoutfloatinit_lora_weightsbool
use_rslora	use_alorause_doraarrow_configr   	lora_biasreturnNonec                   sD   t    t| | d| _|| _| j|||||||	|||
d
 d S )NF)r   r   r   r   r   r   r!   r    super__init__r   fan_in_fan_out_active_adapterupdate_layer)selfr   r   r   r   r   r   r   r   r   r    r!   kwargs	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/lora/bnb.pyr&   %   s    

zLinear8bitLt.__init__Optional[LoraVariant]c                K  F   |d urddl m} | S |s|sd S ddl m}m} |r | S | S Nr   )ArrowLinearVariant)ALoraLinearVariantDoraLinearVariantvariantsr3   r4   r5   r*   r    r   r   r+   r3   r4   r5   r.   r.   r/   resolve_lora_variantF      z!Linear8bitLt.resolve_lora_variant
safe_mergeadapter_namesOptional[list[str]]c           
      C  sX  t | |}|s	dS |D ]}|| j vrqtd |  j}|  j}|jdu r-|j|_t	||d}|| j
vrJ| |}||j|j| }n
| j
| | ||}|ret| setd| dtjj|dd|jd|j|  _| j| r|  jj| j| j }	|rt|	std| d|	|  j_|  | j| qdS )	  
            Merge the active adapter weights into the base weights

            Args:
                safe_merge (`bool`, *optional*):
                    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`.
            NzWMerge lora module to 8-bit linear may get different generations due to rounding errors.state1NaNs detected in the merged weights. The adapter  seems to be brokencpuFrequires_gradhas_fp16_weights)r   lora_Akeyswarningswarnget_base_layerweightr@   SCBr	   lora_variantget_delta_weighttodtypedevice
merge_safetorchisfiniteall
ValueErrorbnbnn
Int8ParamsrF   r!   biasdatalora_Breset_gradsmerged_adaptersappend)
r*   r;   r<   active_adapterrL   r@   output	lora_dataw_data	bias_datar.   r.   r/   mergeX   sJ   








zLinear8bitLt.mergec                 C  s&  | j s
td dS t| jdkr| j }|| j vrq
td |  j	}|  j
}|jdu r6|j|_t||d}|| jvrS| |}||j|j| }n
| j| | ||}tjj|dd|jd|j|  _	| j| r|  j j| j| j8  _|  t| jdksdS dS )	_
            This method unmerges all merged adapter layers from the base weights.
             Already unmerged. Nothing to do.Nr   zYUnmerge lora module to 8-bit linear may get different generations due to rounding errors.r?   rC   FrD   )mergedrI   rJ   lenr_   poprG   rH   rK   rL   r@   rM   r	   rN   rO   rP   rQ   rR   unmergerX   rY   rZ   rF   r!   r[   r\   r]   r^   )r*   ra   rL   r@   rb   rc   rd   r.   r.   r/   rl      s8   







zLinear8bitLt.unmergec                 C  (   t | j| j| j| j d| j|  S NFr
   r]   rL   rG   scalingr*   adapterr.   r.   r/   rO         zLinear8bitLt.get_delta_weightxtorch.Tensorargsr   	list[str]r+   c                    fddt D }| j|g|R i }t|}g }|D ] | fddt|D  qt|D ]\}	}
|
dkr;q2|
| j vrCq2| j|
 }| j|
 }| j|
 }| j	|
 }t
  }|ri|j}| ||jj}|||	  }|
| jvr||||| }|r||}|||	   |7  < q2|dd d urfdd||	 D |d< | j|
 j| f|
||||	  d|}|r||}||||	 < q2|S )	Nc                      i | ]	}|  |d qS Nrk   .0kr+   r.   r/   
<dictcomp>       z5Linear8bitLt._mixed_batch_forward.<locals>.<dictcomp>c                      g | ]
\}}| kr|qS r.   r.   r}   indexitemrr   r.   r/   
<listcomp>       z5Linear8bitLt._mixed_batch_forward.<locals>.<listcomp>__base__r   c                      g | ]} | qS r.   r.   r}   jr   r.   r/   r          ra   rt   resultVARIANT_KWARG_KEYSr   setr`   	enumeraterG   rH   r]   r   rp   rT   is_autocast_enabledrQ   _cast_input_dtyperL   rN   rP   getforwardr*   rt   r<   rv   r+   variant_kwargsr   unique_adapterssub_batch_indices_listira   rG   r]   dropoutrp   requires_conversionexpected_dtype	sub_batchrb   r.   rr   r   r+   r/   _mixed_batch_forward   V   









z!Linear8bitLt._mixed_batch_forwardc                   s  | j |g|R i    dd } fddtD }| jr3| jr%|   | j|g|R i  }|S |d urI| j|g|R d|i| }|S | jrZ| j|g|R i  }|S | j|g|R i  }| jD ]d}|| j	
 vrsqi| j	| }| j| }	| j| }
| j| }t  }|r|j}| ||jj}|| jvr|	||
|| }|r||}|| }qi| j| j| f|||d| }|r||}qi|S )Nr<   c                   ry   rz   r{   r|   r   r.   r/   r      r   z(Linear8bitLt.forward.<locals>.<dictcomp>r   )_check_forward_argsrk   r   disable_adaptersri   rl   r   r   active_adaptersrG   rH   r]   r   rp   rT   r   rQ   r   rL   rN   rP   r   r*   rt   rv   r+   r<   r   r   ra   rG   r]   r   rp   r   r   rb   r.   r   r/   r      s\   % #!










zLinear8bitLt.forwardc                      t   }d| S Nzlora.r%   __repr__r*   repr,   r.   r/   r   '     
zLinear8bitLt.__repr__)	r   r   r   TFFFNF)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r#   r    r   r   r   r   r   r"   r0   FNr;   r   r<   r=   r"   r#   r"   r#   
rt   ru   rv   r   r<   rw   r+   r   r"   ru   rt   ru   r"   ru   r"   r   __name__
__module____qualname__r&   r9   rf   rl   rO   r   r   r   __classcell__r.   r.   r,   r/   r   #   s$    
!
<$
	
7/r   targetr   r   r   c                 K  st   d }t | tr|  }n| }|dd}|r8t |tjjr8| }|| j	j
| j	j| jd t| |fi |}|S )Nloaded_in_8bitF)rF   	thresholdr   )
isinstancer   rK   r   rX   rY   r   copyupdater@   rF   r   r   )r   r   r+   
new_moduletarget_base_layerr   eightbit_kwargsr.   r.   r/   dispatch_bnb_8bit+  s   

r   c                      sz   e Zd Z								d4d5 fddZd6ddZd7d8d"d#Zd9d$d%Zd&d' Zd:d.d/Zd;d0d1Z	d< fd2d3Z
  ZS )=
Linear4bitr   r   r   TFNr   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r"   r#   c                   sB   t    t| | d| _|| _| j||||||||
|	d	 d S )NF)r   r   r   r   r   r!   r    r$   )r*   r   r   r   r   r   r   r   r   r    r!   r+   r,   r.   r/   r&   F  s   

zLinear4bit.__init__r   r0   c                K  r1   r2   r6   r8   r.   r.   r/   r9   e  r:   zLinear4bit.resolve_lora_variantr;   r<   r=   c           
      C  sb  t | |}|s	dS |D ]}|| j vrqtd |  j}|j}t||j	d}|| j
vr8| |}|| }n
| j
| | ||}|rSt| sStd| dd|v r[d|d< d|d< |d	d d
d | D }tjj|dfi ||j|  _| j| r|  jj| j| j }	|rt|	std| d|	|  j_| j| qdS )r>   NzWMerge lora module to 4-bit linear may get different generations due to rounding errors.r?   rA   rB   bnb_quantizedFrE   r\   c                 S  s    i | ]\}}| d s||qS )_)
startswith)r}   r~   vr.   r.   r/   r     s     z$Linear4bit.merge.<locals>.<dictcomp>rC   )r   rG   rH   rI   rJ   rK   rL   __dict__r	   quant_staterN   rO   rS   rT   rU   rV   rW   rk   itemsrX   rY   
Params4bitrP   rR   r!   r[   r\   r]   r_   r`   )
r*   r;   r<   ra   rL   r+   rb   rc   rd   re   r.   r.   r/   rf   w  sF   





(

zLinear4bit.mergec                 C  s  | j s
td dS t| jdkr| j }|| j vrq
td |  j	}|j
}t||jd}|| jvrA| |}|| }n
| j| | ||}d|v rSd|d< d|d< |d	d tjj|d
fi ||j|  _	| j| r|  j j| j| j8  _t| jdksdS dS )rg   rh   Nr   zYUnmerge lora module to 4-bit linear may get different generations due to rounding errors.r?   r   FrE   r\   rC   )ri   rI   rJ   rj   r_   rk   rG   rH   rK   rL   r   r	   r   rN   rO   rl   rX   rY   r   rP   rR   r!   r[   r\   r]   )r*   ra   rL   r+   rb   rc   rd   r.   r.   r/   rl     s2   





(
zLinear4bit.unmergec                 C  rm   rn   ro   rq   r.   r.   r/   rO     rs   zLinear4bit.get_delta_weightrt   ru   rv   r   rw   r+   c                  rx   )	Nc                   ry   rz   r{   r|   r   r.   r/   r     r   z3Linear4bit._mixed_batch_forward.<locals>.<dictcomp>c                   r   r.   r.   r   r   r.   r/   r     r   z3Linear4bit._mixed_batch_forward.<locals>.<listcomp>r   r   c                   r   r.   r.   r   r   r.   r/   r     r   r   r   r   r.   r   r/   r     r   zLinear4bit._mixed_batch_forwardc                   s  | j |g|R i    dd } fddtD }| jr3| jr%|   | j|g|R i  }|S |d urI| j|g|R d|i| }|S | jrZ| j|g|R i  }|S | j|g|R i  }| }| j	D ]d}|| j
 vrwqm| j
| }| j| }	| j| }
| j| }t  }|r|j}| ||jj}|| jvr|	||
|| }|r||}|| }qm| j| j| f|||d| }|r||}qm|S )Nr<   c                   ry   rz   r{   r|   r   r.   r/   r     r   z&Linear4bit.forward.<locals>.<dictcomp>r   )r   rk   r   r   ri   rl   r   r   cloner   rG   rH   r]   r   rp   rT   r   rQ   r   rL   rN   rP   r   r   r.   r   r/   r     s^   , *(










zLinear4bit.forwardc                   r   r   r   r   r,   r.   r/   r   K  r   zLinear4bit.__repr__)r   r   r   TFFNF)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r#   r   r   r   r   r   r   r   r   r.   r.   r,   r/   r   D  s"    

;#
	
76r   c                 K  sz   d }t | tr|  }n| }|dd}|r;t r;t |tjjr;| }|	|j
|jj|jjd t| |fi |}|S )Nloaded_in_4bitF)compute_dtypecompress_statistics
quant_type)r   r   rK   r   r   rX   rY   r   r   r   r   rL   r   r   )r   r   r+   r   r   r   fourbit_kwargsr.   r.   r/   dispatch_bnb_4bitO  s   

r   )r   r   r   r   )
__future__r   rI   typingr   r   bitsandbytesrX   rT   peft.import_utilsr   r   peft.tuners.tuners_utilsr   r   peft.utils.integrationsr	   peft.utils.otherr
   configr   layerr   r   r   rY   Moduler   r   r   r   r.   r.   r.   r/   <module>   s2     

    