o
    Ni                     @  sd   d dl m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 G dd deZdS )	    )annotationsN)	BaseTuner)1TRANSFORMERS_MODELS_TO_OSF_TARGET_MODULES_MAPPING   )OSFLayerdispatch_defaultc                      s   e Zd ZU dZdZded< eZeZ			d(d) fddZ
d* fddZdd Zddd+ddZd,d d!Zd-d.d$d%Zd&d' Z  ZS )/OSFModelz=A minimal tuner implementing Orthogonal Subspace Fine-tuning.osf_strprefixFNlow_cpu_mem_usagebool
state_dictdict[str, torch.Tensor] | Nonec                   s   t  j|||||d d S )N)r   r   )super__init__)selfmodelconfigadapter_namer   r   	__class__ I/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/osf/model.pyr      s   	
zOSFModel.__init__namec                   s8   zt  |W S  ty   |dkr t| j| Y S w )zForward missing attributes to the wrapped base model.

        This mirrors the behavior of other tuners (e.g., LoRA), ensuring attributes like `device` resolve to the
        underlying transformers model.
        r   )r   __getattr__AttributeErrorgetattrr   )r   r   r   r   r   r   &   s   zOSFModel.__getattr__c                 C  sN   t |dd d u r%|d}|| jv rt| j| |_|S ddlm} ||_|S )Ntarget_modules
model_typer   )INCLUDE_LINEAR_LAYERS_SHORTHAND)r   gettarget_module_mappingsetr   peft.utils.constantsr    )r   peft_configmodel_configr   r    r   r   r   _prepare_adapter_config3   s   

z OSFModel._prepare_adapter_config)parameter_namer   target	nn.Moduletarget_nameparentcurrent_keyr(   
str | NonereturnNonec                C  s   t |drt|jjdkrd S ddd}t|jj}	|t|dd |	}
t |d	rB|jrB|j D ]\}}t	||rA|||	}
 nq0d|
i}t
|trV|j|fi | d S t|||fi |}|d u rfd S || jvrp|d
 | |||| d S )Nweight   min_dimintr/   c                 S  s^   | d u rt |d dS t| tr#d|   k rdkr#n nt||  }nt| }t t||dS )Nr2   r   r   )max
isinstancefloatr4   min)valuer3   rr   r   r   _resolve_rankO   s   "z3OSFModel._create_and_replace.<locals>._resolve_rankeffective_rankrank_patternF)r3   r4   r/   r4   )hasattrlenr1   shaper8   r   r=   itemsresearchr6   r   update_layerr   active_adaptersrequires_grad__replace_module)r   
osf_configr   r)   r+   r,   r-   r(   r;   r3   r<   patternrankkwargs
new_moduler   r   r   _create_and_replace?   s*   





zOSFModel._create_and_replacer   c                 C  s$   |  D ]\}}d|vrd|_qd S )Nosf_svd_paramsF)named_parametersrequires_grad)r   r   npr   r   r    _mark_only_adapters_as_trainables   s
   z)OSFModel._mark_only_adapters_as_trainableTautocast_adapter_dtypec                 C  s   |sdS | j  D ]_}t|dsq	t|dd}|du s t|ds!q	|jj}||jv rD|j| }| D ]\}}|j|krC|j	||_q3t
jD ] }	t||	rgt||	}
||
v rg|
| }|j|krg|	||
|< qGq	dS )z
        Ensure all OSF adapter components have consistent dtype with the base model.

        Instead of forcing float32, we match the base model's actual dtype for consistency.
        NrN   
base_layerr1   )r   modulesr>   r   r1   dtyperN   rA   datator   other_param_names)r   r   rT   modulerU   target_dtype
svd_params
param_nameparambuffer_dict_namebuffer_dictbufferr   r   r   _cast_adapter_dtypey   s2   







zOSFModel._cast_adapter_dtypec                 O  s   t d)Nz#OSF models do not support unmerging)NotImplementedError)r   argsrK   r   r   r   unmerge_adapter   s   zOSFModel.unmerge_adapter)FN)r   r   r   r   )r   r
   )r   r
   r)   r*   r+   r
   r,   r*   r-   r
   r(   r.   r/   r0   )r   r*   r/   r0   )T)r   r
   rT   r   r/   r0   )__name__
__module____qualname____doc__r   __annotations__r   tuner_layer_clsr   r"   r   r   r'   rM   rS   rc   rf   __classcell__r   r   r   r   r      s   
 
4&r   )
__future__r   rB   torchtorch.nnnnpeft.tuners.tuners_utilsr   r$   r   layerr   r   r   r   r   r   r   <module>   s    