o
    پix'                     @   s   d dl Z d dlmZm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 d dlmZ d dlmZ d d	lmZ d d
lmZ e eZG dd dejZG dd dejZdS )    N)DictList)nn)
LoadConfig)get_layer_id)BaseLoRABackend)LORA_SUPPORTED_BACKENDS)
LoRAConfig)DefaultModelLoader)
AutoConfigc                       s&   e Zd Zdedef fddZ  ZS )	LoRALayerconfigbase_hf_configc                    s    t    || _|| _i | _d S N)super__init__r   r   weights)selfr   r   	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/lora/lora.pyr   '   s   

zLoRALayer.__init__)__name__
__module____qualname__r	   r   r   __classcell__r   r   r   r   r   &   s    r   c                
       s   e Zd Zdededededef
 fddZdd	 Z	d
e
eejf fddZdedejfddZdd Zdee de
eejf fddZdee de
eejf fddZdd Z  ZS )LoRAAdapteruidr   r   load_configlora_backendc                    s   t    || _| _| jjd  dksJ  | _|| _|| _| jj	| jj
 | _t fddt jD | _i | _i | _d S )N	peft_typelorac                    s   g | ]}t  qS r   )r   ).0_r   r   r   r   
<listcomp>D   s    z(LoRAAdapter.__init__.<locals>.<listcomp>)r   r   r   r   	hf_configlowerr   r   r   
lora_alpharscalingr   
ModuleListrangenum_hidden_layerslayersembedding_layersadded_tokens_embeddings)r   r   r   r   r   r   r   r$   r   r   2   s   

zLoRAAdapter.__init__c                 C   sZ   | j j}t| j}t| j jdd }|tj||ddD ]
\}}| || q| 	  d S )NrevisionT)r1   fall_back_to_pt)
r   pathr
   r   getattrr&   _get_weights_iteratorSource_process_weight_normalize_weights)r   
model_pathloaderr1   nameloaded_weightr   r   r   initialize_weightsM   s   
zLoRAAdapter.initialize_weightstensorsc                 C   s*   |  D ]
\}}| || q|   d S r   )itemsr7   r8   )r   r>   r;   tensorr   r   r   initialize_weights_from_tensors\   s   z+LoRAAdapter.initialize_weights_from_tensorsr;   r<   c                 C   s  ddl m} || jj}d|v r|dd}t|}|d ur*| | j| j|< d S d|v s2d|v r]d|v r8dnd}d|v sB||v rK| | j	|< d S t
d| d| d	| jj  d S d
|v sed|v r| | j|< |jd | jjksJ d| j d| jj d|jd  dd S d S )Nr   )get_normalized_target_modulesunembed_tokenslm_headembed_tokensallz	Skipping z as 'z&' is not in adapter's target_modules: input_embeddingsoutput_embeddingszLoRA adapter z has extra_vocab_size z4 specified in the config, but the loaded weight has z extra vocab size)sglang.srt.lora.utilsrB   r   target_modulesreplacer   cpur.   r   r/   loggerdebugr0   shapelora_added_tokens_sizer   extra_vocab_size)r   r;   r<   rB   normalized_target_moduleslayer_idmodule_namer   r   r   r7   b   s2   zLoRAAdapter._process_weightc                 C   s:   | j D ]}t|j }| ||j | ||j qd S r   )r.   listr   keysnormalize_qkv_projnormalize_gate_up_proj)r   layerweight_namesr   r   r   r8      s
   
zLoRAAdapter._normalize_weightsrZ   r   c           
      C   sV  t  }|D ]&}d|v r|d d|v r|d d|v r"|d d|v r+|d qt|dkr4d S |D ]r}d|v r|}|dd}|dd}|dd}d|v rX|| nt|| }	t|| |	|| fd||< || d|v r||| || q6d|v r|}|dd}|dd}|dd}d|v r|| dd||< q6d S )	Nk_projq_projv_projqkv_projr   lora_A      )	setaddlenrK   torch
zeros_likecatpoprepeat)
r   rZ   r   target_moduleweight_nameq_namek_namev_nameqkv_namek_proj_weightr   r   r   rW      sV   





zLoRAAdapter.normalize_qkv_projc                 C   s   |D ]k}d|v rY| dd}| dd}||vr<t|| ||< | jjtv s<J dddd tD  d| jj d	t|| || fd
||< || ||v rX|| qd|v rm|}d|v rm|| 	dd||< qd S )N	gate_projup_projgate_up_projzGLoRA weight initialization currently only supported for LoRA backends: z, c                 s   s    | ]}|V  qd S r   r   )r"   br   r   r   	<genexpr>   s    z5LoRAAdapter.normalize_gate_up_proj.<locals>.<genexpr>zReceived backend: zs. Please verify your backend configuration or consider implementing custom initialization logic for other backends.r   r_      ra   )
rK   re   rf   r   r;   r   joinrg   rh   ri   )r   rZ   r   rk   up_namegate_up_namer   r   r   rX      s0   

z"LoRAAdapter.normalize_gate_up_projc                 C   sv   | j D ]}|j D ]\}}| |j|< q
q| j D ]\}}| | j|< q| j D ]\}}| | j|< q-d S r   )r.   r   r?   
pin_memoryr/   r0   )r   rY   r;   weightr   r   r   pin_weights_in_cpu   s   
zLoRAAdapter.pin_weights_in_cpu)r   r   r   strr	   r   r   r   r   r=   r   re   TensorrA   r7   r8   r   rW   rX   r|   r   r   r   r   r   r   0   s6    &
5
r   )loggingtypingr   r   re   r   sglang.srt.configs.load_configr   sglang.srt.layers.utilsr   $sglang.srt.lora.backend.base_backendr   %sglang.srt.lora.backend.lora_registryr   sglang.srt.lora.lora_configr	   sglang.srt.model_loader.loaderr
   &sglang.srt.utils.hf_transformers_utilsr   	getLoggerr   rM   Moduler   r   r   r   r   r   <module>   s   

