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ej d	eej d
e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edefddZe	d&deded	eej dd fddZe		d'dededededejdejjd ee d!ee 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biasembeddings_tensorscalingreturnc	           	      C   sN   || _ || _|| _|| _|| _|| _|| _|d u r"| j| j | _d S || _d S N)r   r   r	   r
   r   r   r   r   )	selfr   r   r	   r
   r   r   r   r    r   Z/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/lora/lora.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_dim1      zLoRALayerWeights.input_dimc                 C   r   Nr   )r   r   r   r   r   r   
output_dim5   r   zLoRALayerWeights.output_dimc                 C      dS NFr   r   r   r   r   	is_packed9      zLoRALayerWeights.is_packedc                 C   s   | j d ur| j jd S dS r   )r   r   r   r   r   r   extra_vocab_size=   s   
z!LoRALayerWeights.extra_vocab_sizepeft_helperc              	   C   s   | ||j |jd d d ||jS r   )rr	   Zvllm_lora_scaling_factor)clsr   r%   r   r   r   r   from_configB   s   zLoRALayerWeights.from_configFr   r   dtypedeviceembeddings_tensor_dimbias_enabledc	              	   C   s   t |dkot }	tj||g|||	d}
tj||g|||	d}|r,tj|g|||	d}nd }|r:tjd||||	dnd }| ||d|
|||dS )Ncpu)r)   r*   
pin_memory
   r   )r   r	   r
   r   r   r   )strr   torchZzerosZrand)r'   r   r   r   r   r)   r*   r+   r,   r.   r
   r   r   r   r   r   r   create_dummy_lora_weightsM   sJ   

z*LoRALayerWeights.create_dummy_lora_weights)NNN)r   r   r   r!   )__name__
__module____qualname____doc__r0   intr1   Tensorr   floatr   r   propertyr   r   boolr"   r$   classmethodr   r(   r)   typesZDevicer2   r   r   r   r   r      s    		



			r   c                       s   e Zd ZdZ		ddededeee  deeej	  deeej	  deeeej	   d	eee
  d
df fddZedeed  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   r   c              
      sH   t  j||d||||d d | _|d u r" fdd jD  _d S d S )Nr   )r   r   r	   r
   r   r   r   r   c                    s   g | ]}| j  qS r   )r   ).0r	   r   r   r   
<listcomp>   s    z3PackedLoRALayerWeights.__init__.<locals>.<listcomp>)superr   r?   r   )r   r   r   r?   r
   r   r   r   	__class__r   r   r   }   s    


zPackedLoRALayerWeights.__init__lorasr   c              	   C   s   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	d |D d
}|S )zPack a list of LoRAs into a single LoRA.

        If LoRA is None, it signifies that the submodule does not have a LoRA.
        c                 s   s    | ]	}|d ur|V  qd S r   r   r@   lorar   r   r   	<genexpr>   s    z.PackedLoRALayerWeights.pack.<locals>.<genexpr>Nc                 S      g | ]}|d ur|j nd qS r   )r	   rF   r   r   r   rA          z/PackedLoRALayerWeights.pack.<locals>.<listcomp>c                 S   rI   r   )r
   rF   r   r   r   rA      rJ   c                 S   rI   r   )r   rF   r   r   r   rA      rJ   c                 S   rI   r   )r   rF   r   r   r   rA      rJ   c                 S   s   g | ]
}|d ur
dnd qS r   r   rF   r   r   r   rA      s    )r   )nextr   r   r   )r'   rE   Z
first_lorarG   r   r   objr   r   r   pack   s&   
zPackedLoRALayerWeights.packc                 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)rangelenr   r   )r   ir   r   r   r      s   zPackedLoRALayerWeights.optimizec                 C      t  r   NotImplementedErrorr   r   r   r   r         z PackedLoRALayerWeights.input_dimc                 C   rQ   r   rR   r   r   r   r   r      rT   z!PackedLoRALayerWeights.output_dimc                 C   r    )NTr   r   r   r   r   r"      r#   z PackedLoRALayerWeights.is_packed)NN)r   r>   )r3   r4   r5   r6   r0   r7   listr   r1   r8   r9   r   r<   GenericSequencerM   r   r:   r   r   r;   r"   __classcell__r   r   rC   r   r>   z   sD    	

	

	r>   )collections.abcr   rV   typingr   r1   Ztorch.typesZvllm.lora.peft_helperr   Z
vllm.utilsr   r   r>   r   r   r   r   <module>   s   l