o
    -i                     @   sb   d dl mZ 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 )
    )Sequence)OptionalN)
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   S/home/ubuntu/veenaModal/venv/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_dim1   r   zLoRALayerWeights.output_dimc                 C      dS )NFr   r   r   r   r   	is_packed5      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_config9   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_weightsI   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ed  d	d fddZe	dde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>z   s    z3PackedLoRALayerWeights.__init__.<locals>.<listcomp>)superr   r;   r   )r   r   r   r;   r
   r   r   	__class__r   r   r   g   s   	
zPackedLoRALayerWeights.__init__lorasr   c                 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	   rD   r   r   r   r=          z/PackedLoRALayerWeights.pack.<locals>.<listcomp>c                 S   rH   r   )r
   rD   r   r   r   r=      rI   c                 S   rH   r   )r   rD   r   r   r   r=      rI   c                 S   s   g | ]
}|d ur
dnd qS r   r   rD   r   r   r   r=      s    r   )nextr   r   r   )r$   rA   
first_lorarE   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 )rB   c                 s   rC   r   r   rD   r   r   r   rF      rG   z2PackedLoRALayerWeights.pack_moe.<locals>.<genexpr>N   r   r      )dimg      ?rJ   )
rK   r   r	   lenrangeappendr
   r   r+   stack)r$   rA   r   rO   rL   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_brM   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)rT   rS   r   r   )r   ir   r   r   r      s   zPackedLoRALayerWeights.optimizec                 C      t  r   NotImplementedErrorr   r   r   r   r         z PackedLoRALayerWeights.input_dimc                 C   rj   r   rk   r   r   r   r   r      rm   z!PackedLoRALayerWeights.output_dimc                 C   r   )NTr   r   r   r   r   r      r    z PackedLoRALayerWeights.is_packedr   )F)r   r:   )r.   r/   r0   r1   r*   r2   listr+   r3   r4   r   r7   GenericSequencer   rN   r6   rh   r   r5   r   r   r   __classcell__r   r   r?   r   r:   d   sT    	




K	r:   )collections.abcr   ro   typingr   r+   torch.typesvllm.lora.peft_helperr   vllm.utils.platform_utilsr   r   r:   r   r   r   r   <module>   s   V