o
    
۾i                     @   s|   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ ddlmZ dd	lmZ G d
d deZdS )    N)PretrainedConfig)
LoRAConfig)divide)ColumnParallelLinear
LinearBaseReplicatedLinearRowParallelLinear)current_platform   )BaseLayerWithLoRA)_get_lora_devicec                	       s   e Zd Zdef fddZ	ddedededB ddfd	d
ZdefddZ	dede
jee
j B de
jee
j B fddZdde
jde
jdB de
jfddZede
jfddZede
jdB fddZ  ZS )BaseLinearLayerWithLoRA
base_layerc                    sJ   t    || _| jj| _| jj| _| jj| _t| j| _|  |  |  d S N)super__init__r   
input_sizetp_sizetp_rankr   device)selfr   	__class__ P/home/ubuntu/.local/lib/python3.10/site-packages/vllm/lora/layers/base_linear.pyr      s   



z BaseLinearLayerWithLoRA.__init__N	max_loraslora_configmodel_configreturnc                    s   _ tjtrj jn0tjtr'jsjntjj	 jntjt
r>j js6jntjj	ntt fddtjD _tfddtjD _jd jd f_d S )Nc              	   3   s,    | ]}t jd  jjjdV  qdS r
   )dtyper   N)torchzerosr   
lora_dtyper   .0_)lora_a_out_sizer   r   r   r   r   	<genexpr>A       	
z>BaseLinearLayerWithLoRA.create_lora_weights.<locals>.<genexpr>c              	   3   s,    | ]}t jd  jjjdV  qdS r   )r!   r"   max_lora_rankr#   r   r$   )lora_b_out_sizer   r   r   r   r   r(   L   r)   r      )r   
isinstancer   r   r*   output_sizer   fully_sharded_lorasr   r   r   NotImplementedErrortuplerangen_sliceslora_a_stackedlora_b_stackedshapeoutput_slices)r   r   r   r   r   )r'   r+   r   r   r   r   create_lora_weights#   s0   	
	
z+BaseLinearLayerWithLoRA.create_lora_weightsindexc                 C   s0   t | jD ]}d| j| |< d| j| |< qd S )Nr   )r2   r3   r4   r5   )r   r9   s_indexr   r   r   
reset_loraY   s   z"BaseLinearLayerWithLoRA.reset_loralora_alora_bc                 C   s   t |tjsJ t |tjsJ t| jt| j  kr'| j  kr'dks*J  J | | | jdkr>| 	|}| 
|}| jd |dd |jd d |jd f j|dd | jd |dd |jd d |jd f j|dd d S )Nr
   r   T)non_blocking)r-   r!   Tensorlenr4   r5   r3   r;   r   slice_lora_aslice_lora_br6   copy_)r   r9   r<   r=   r   r   r   set_lora^   s   
4



**
z BaseLinearLayerWithLoRA.set_loraxbiasc                 C   s   | j j| j ||}|jdkr|jnd }|jdkr*|jdkr*|dd}|dd}| j||| j| j	d| j
}t s>|}|d urG||}|S )N   r   r
   g      ?)r   quant_methodapplyndimr6   flattenpunica_wrapperadd_lora_linearr4   r5   r7   r	   can_update_inplacereshape)r   rE   rF   outputoriginal_shapelora_outputr   r   r   rI   z   s   
zBaseLinearLayerWithLoRA.applyc                 C   s`   t | jdr
| jjS t | jdr| jjS t | jdr| jjS t | jdr(| jjS td| j )Nweightweight_packedqweightBzUnsupported base layer: )hasattrr   rS   rT   rU   rV   
ValueErrorr   r   r   r   rS      s   zBaseLinearLayerWithLoRA.weightc                 C   s   t | jdr
| jjS d S )NrF   )rW   r   rF   rY   r   r   r   rF      s   zBaseLinearLayerWithLoRA.biasr   )__name__
__module____qualname__r   r   intr   r   r8   r;   r!   r?   listrD   rI   propertyrS   rF   __classcell__r   r   r   r   r      s2    
6
"r   )r!   transformersr   vllm.config.lorar   vllm.distributed.utilsr   !vllm.model_executor.layers.linearr   r   r   r   vllm.platformsr	   baser   utilsr   r   r   r   r   r   <module>   s   