o
    i                     @   sV   d dl mZ d dlZd dlZd dlmZ d dlmZ G dd dZ	G dd de	Z
dS )	    )SequenceN)
PEFTHelper)is_pin_memory_availablec                   @   s   e Zd ZdZ	ddedededejdejdedB d	dfd
dZ	dddZ
ed	efddZed	efddZed	efddZededed	d fddZedededededejdejjd	d fddZdS )LoRALayerWeightsz;LoRA weights for a layer composed of two low rank matrixes.Nmodule_namerank
lora_alphalora_alora_bscalingreturnc                 C   sB   || _ || _|| _|| _|| _|d u r| j| j | _d S || _d S Nr   r   r   r	   r
   r   )selfr   r   r   r	   r
   r    r   L/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/lora/lora_weights.py__init__   s   	
zLoRALayerWeights.__init__c                 C   s(   | j dkr| S |  j| j 9  _d| _ | S )5Optimize the LoRA by merging the scaling into lora_b.   )r   r
   r   r   r   r   optimize$   s
   
zLoRALayerWeights.optimizec                 C      | j jd S Nr   )r	   shaper   r   r   r   	input_dim,      zLoRALayerWeights.input_dimc                 C   r   )Nr   )r
   r   r   r   r   r   
output_dim0   r   zLoRALayerWeights.output_dimc                 C      dS )NFr   r   r   r   r   	is_packed4      zLoRALayerWeights.is_packedpeft_helperc                 C   s   | ||j |jd d |jS r   )rr   vllm_lora_scaling_factor)clsr   r    r   r   r   from_config8   s   zLoRALayerWeights.from_configr   r   dtypedevicec           
      C   sP   t |dkot }tj||g|||d}tj||g|||d}	| ||d||	dS )Ncpu)r%   r&   
pin_memoryr   )r   r   r	   r
   )strr   torchzeros)
r#   r   r   r   r   r%   r&   r(   r	   r
   r   r   r   create_dummy_lora_weightsH   s   
z*LoRALayerWeights.create_dummy_lora_weightsr   )r   r   )__name__
__module____qualname____doc__r)   intr*   Tensorfloatr   r   propertyr   r   boolr   classmethodr   r$   r%   typesDevicer,   r   r   r   r   r      sb    	

r   c                       s   e Zd ZdZ	ddededeedB  deejdB  deejdB  dee	 dB d	df fd
dZ
eded d	d fddZe	dded deded	d fddZdddZed	efddZed	efddZed	efddZ  ZS )PackedLoRALayerWeightsz+LoRA used for packed layers (eg. qkv_proj).Nr   r   lora_alphasr	   r
   r   r   c                    sD   t  j||d|||d | _|d u r  fdd jD  _d S d S )Nr   r   c                    s   g | ]}| j  qS r   )r   ).0r   r   r   r   
<listcomp>y   s    z3PackedLoRALayerWeights.__init__.<locals>.<listcomp>)superr   r:   r   )r   r   r   r:   r	   r
   r   	__class__r   r   r   f   s   	
zPackedLoRALayerWeights.__init__loraszLoRALayerWeights | Nonec                 C   sz   t dd |D }|D ]}|du rq|  q|j}|j}| ||dd |D dd |D dd |D dd |D d	}|S )
Pack a list of LoRAs into a single LoRA.

        If LoRA is None, it signifies that the submodule does not have a LoRA.
        c                 s       | ]	}|d ur|V  qd S r   r   r;   lorar   r   r   	<genexpr>       z.PackedLoRALayerWeights.pack.<locals>.<genexpr>Nc                 S      g | ]}|d ur|j nd qS r   )r   rC   r   r   r   r<          z/PackedLoRALayerWeights.pack.<locals>.<listcomp>c                 S   rG   r   )r	   rC   r   r   r   r<      rH   c                 S   rG   r   )r
   rC   r   r   r   r<      rH   c                 S   s   g | ]
}|d ur
dnd qS r   r   rC   r   r   r   r<      s    r   )nextr   r   r   )r#   r@   
first_lorarD   r   r   objr   r   r   pack~   s$   
zPackedLoRALayerWeights.packFis_non_gated_moec              	   C   s  t dd |D }|dusJ |j}|j}t|d dksJ g }g }g }	g }
g }g }tt|d D ]V}||d  }||d d  }||d d  }|du rS|rS|}|dusYJ |dus_J |duseJ ||j ||j |	|j |
|j ||j ||j q3tj	|dd}tj	|dd}tj	|
dd}tj	|dd}|| }|}|r|}|}d	}ntj	|	dd}tj	|dd}| |||||g|||g|||g|||gd
}|S )rA   c                 s   rB   r   r   rC   r   r   r   rE      rF   z2PackedLoRALayerWeights.pack_moe.<locals>.<genexpr>N   r   r      )dimg      ?rI   )
rJ   r   r   lenrangeappendr	   r
   r*   stack)r#   r@   r   rN   rK   r   r   w1_lora_a_lstw2_lora_a_lstw3_lora_a_lstw1_lora_b_lstw2_lora_b_lstw3_lora_b_lsteidw1_loraw2_loraw3_lora	w1_lora_a	w2_lora_a	w1_lora_b	w2_lora_br   last_scaling	w3_lora_a	w3_lora_brL   r   r   r   pack_moe   s^   zPackedLoRALayerWeights.pack_moec                 C   sX   t t| jD ]"}| j| dks| j| du rq| j|  | j| 9  < d| j|< q| S )r   r   N)rS   rR   r
   r   )r   ir   r   r   r      s   zPackedLoRALayerWeights.optimizec                 C      t  r   NotImplementedErrorr   r   r   r   r         z PackedLoRALayerWeights.input_dimc                 C   ri   r   rj   r   r   r   r   r      rl   z!PackedLoRALayerWeights.output_dimc                 C   r   )NTr   r   r   r   r   r      r   z PackedLoRALayerWeights.is_packedr   )F)r   r9   )r-   r.   r/   r0   r)   r1   listr*   r2   r3   r   r6   GenericSequencerM   r5   rg   r   r4   r   r   r   __classcell__r   r   r>   r   r9   c   sT    	


K	r9   )collections.abcr   rn   r*   torch.typesvllm.lora.peft_helperr   vllm.utils.platform_utilsr   r   r9   r   r   r   r   <module>   s   V