o
    -i!                     @   s   d dl Z d dlZ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 d dlmZ d dlmZ d dlmZ eeZG d	d
 d
ZdS )    N)init_logger)LoRALayerWeights)
PEFTHelper)get_lora_idis_base_embeddding_weightsparse_fine_tuned_lora_name)TensorizerConfig)WeightsMapper)is_pin_memory_availablec                   @   s  e Zd ZdZdededeeef ddfddZdedd fd	d
Z	dededB fddZ
dedefddZe				d dedeeejf dededejdB dedB dedB dd fddZeddddddddedee dededB dedejdB dedB dedB dedB dd fddZdS )!	LoRAModelzA LoRA fine-tuned model.lora_model_idranklorasreturnNc                 C   s.   || _ |dksJ d| j  || _|| _dS )z
        Args:
            lora_model_id: The integer id for the lora model.
            rank: lora rank.
            loras: module name -> weights for lora-replaced layers.

        r   z.a valid lora id should be greater than 0, got N)idr   r   )selfr   r   r    r   Q/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/lora/lora_model.py__init__   s   


zLoRAModel.__init__c                 C   s   | j || j| j dS )z[Return a copy of the object with different ids.

        Will share the underlying tensors.)r   r   )	__class__r   r   copy)r   r   r   r   r   clone0   s
   zLoRAModel.clonemodule_namec                 C   s   | j |dS )z#Get LoRA for a given module by nameN)r   get)r   r   r   r   r   get_lora:   s   zLoRAModel.get_lora	lora_namec                 C   s
   || j v S )N)r   )r   r   r   r   r   check_lora_name>   s   
zLoRAModel.check_lora_namecudatensorspeft_helperdevicedtypemodel_vocab_sizeweights_mapperc                 C   s   t |dkot }i }	| D ]h\}
}t|
rqt|
|\}}||	vr+t|||	|< |rad|
v rJ|durJ||jd krJtd|jd  d| d|j	||d|	| _
|r`|	| j
 |	| _
q|j	||d|	| _|rw|	| j |	| _q| ||j|	S )	z0Create a LoRAModel from a dictionary of tensors.cpulora_embedding_AN   zThe embedding LoRA size(z;) must be consistent with the base model's vocabulary size(z).)r    r!   )strr
   itemsr   r   r   from_configshapeRuntimeErrortolora_a
pin_memorylora_br)clsr   r   r   r    r!   r"   r#   r.   r   tensor_nametensorr   	is_lora_ar   r   r   from_lora_tensorsA   s<   zLoRAModel.from_lora_tensors)r   r    r!   r"   r#   tensorizer_config_dictlora_direxpected_lora_modulesr6   c             	      s  t jd}
t jd}t jd}i }g dtf fdd}|	rQddlm} tdi |	}t j|jd	}
| }||
fd
|j	i|j
}|| n\t j|
rg tj|
dd}|| | D ]	}||||< qiW d   n1 s}w   Y  n*t j|st j|rt j|r|n|}tj||dd}|| nt d| j|du rt n||||||dS )a8  Create a LoRAModel from a local checkpoint.

        Args:
            lora_dir: The local path that has lora data.
            expected_lora_modules: Name of modules that are expected to be
                replaced by lora.
            peft_helper: Loaded lora configuration information.
            lora_model_id: LoRA model id. If not given, automatically set by
                a global counter.
            device: Device where the lora model is loaded.
            dtype: dtype of the lora model weights.

        Returns:
            Loaded LoRA Model.
        zadapter_model.safetensorszadapter_model.binzadapter_model.ptmodulesc                    s   |   D ]=}t|rqd|v rqt|\}}d|v r2|d}||d d  }| vr1| q|ddd  vrA| qrRtd d  d d	d S )
N
base_layerz.expertsr&   .zWhile loading z, expected target modules in z but received z6. Please verify that the loaded LoRA module is correct)keysr   r   findappendrsplit
ValueError)r9   lora_moduler   _
expert_idxexpert_suffixr8   r7   unexpected_modulesr#   r   r   check_unexpected_modules   s0   


zALoRAModel.from_local_checkpoint.<locals>.check_unexpected_modulesr   )TensorDeserializerzadapter_model.tensorsr!   pt)	frameworkNT)map_locationweights_onlyz doesn't contain tensors)r   r   r   r    r!   r"   r#   r   )ospathjoindict
tensorizerrI   r   tensorizer_dir_construct_tensorizer_argsr!   deserialization_kwargsisfilesafetensors	safe_openr=   
get_tensortorchloadrA   r5   r   )r1   r7   r8   r   r   r    r!   r"   r#   r6   lora_tensor_pathlora_bin_file_pathlora_pt_file_pathr   rH   rI   tensorizer_configtensorizer_argsfmodulelora_file_pathr   rF   r   from_local_checkpointo   s^   


zLoRAModel.from_local_checkpoint)r   NNN)__name__
__module____qualname____doc__intrQ   r'   r   r   r   r   boolr   classmethodrZ   Tensorr   r!   r	   r5   setrd   r   r   r   r   r      s    


	-	
r   )rN   rW   rZ   vllm.loggerr   vllm.lora.lora_weightsr   vllm.lora.peft_helperr   vllm.lora.utilsr   r   r   +vllm.model_executor.model_loader.tensorizerr    vllm.model_executor.models.utilsr	   vllm.utils.platform_utilsr
   re   loggerr   r   r   r   r   <module>   s   