o
    Ni                     @  s   d dl 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
mZ d dlmZ d dlmZ d d	lmZ d
dlmZmZ dd ZG dd deZdS )    )annotationsN)contextmanager)partial)nn)is_bnb_4bit_availableis_bnb_available)
RoadConfig)	BaseTuner)2TRANSFORMERS_MODELS_TO_ROAD_TARGET_MODULES_MAPPING   )	RoadLayerdispatch_defaultc                 C  s   ||d< ||fS )Nadapter_names )targetargskwargsr   r   r   J/home/ubuntu/.local/lib/python3.10/site-packages/peft/tuners/road/model.py_adapter_names_pre_forward_hook    s   r   c                   @  sJ   e Zd ZU dZdZded< eZeZ	dddZ
edddZedd ZdS )	RoadModel road_strprefixroad_configr   adapter_namer   	nn.Moduletarget_nameparentreturnNonec                 C  s   |d u rt d|j}|j}|||jt| jddt| jddd}	ztd| j|	d< W n	 ty6   Y nw t	|t
rH|j||||jd d S t| jd	rR| jjnd }
| j|||fd
|
i|	}|| jvrk|d | |||| d S )NzCurrent Key shouldn't be `None`is_loaded_in_8bitFis_loaded_in_4bit)variant
group_sizeinit_weightsloaded_in_8bitloaded_in_4bitz:hf_quantizer.quantization_config.get_apply_tensor_subclassget_apply_tensor_subclass)r%   hf_device_map
device_map)
ValueErrorr#   r$   r%   getattrmodeloperator
attrgetterAttributeError
isinstancer   update_layerhasattrr)   _create_new_moduleactive_adaptersrequires_grad__replace_module)selfr   r   r   r   r   current_keyr#   r$   r   r*   
new_moduler   r   r   _create_and_replace-   s>   	



zRoadModel._create_and_replacec           	      K  s   g }t  rddlm} || t rddlm} || |tg d }|D ]}|||fd| i|}|d ur; nq(|d u rHtd| d|S )Nr   )dispatch_bnb_8bit)dispatch_bnb_4bitr   zTarget module zZ is not supported. Currently, only the following modules are supported: `torch.nn.Linear`.)	r   bnbr<   appendr   r=   extendr   r+   )	r   r   r   r   dispatchersr<   r=   r:   
dispatcherr   r   r   r4   [   s,   


zRoadModel._create_new_modulec                 o  s    | dd }|d u rd V  d S | jrtdt }|  D ]}t|tr,||j O }qdd |D }|| }|rFtdd	t
| g }|  D ]}	t|	trett|d}
|	j|
dd	}|| qLd V  |D ]}|  qkd S )
Nr   z?Cannot pass `adapter_names` when the model is in training mode.c                 S  s   h | ]}|d kr|qS )__base__r   ).0namer   r   r   	<setcomp>   s    z7RoadModel._enable_peft_forward_hooks.<locals>.<setcomp>z.Trying to infer with non-existing adapter(s): z, )r   T)with_kwargs)poptrainingr+   setmodulesr1   r   
road_thetakeysjoinsortedr   r   register_forward_pre_hookr?   remove)r8   r   r   r   expected_adapterslayerunique_adaptersunexpected_adaptershook_handlesmodulepre_forwardhandler   r   r   _enable_peft_forward_hooks   s6   



z$RoadModel._enable_peft_forward_hooksN)r   r   r   r   r   r   r   r   r   r   r   r    )r   r   )__name__
__module____qualname____doc__r   __annotations__r   tuner_layer_clsr
   target_module_mappingr;   staticmethodr4   r   rZ   r   r   r   r   r   &   s   
 
.#r   )
__future__r   r.   
contextlibr   	functoolsr   torchr   peft.import_utilsr   r   peft.tuners.road.configr   peft.tuners.tuners_utilsr	   
peft.utilsr
   rS   r   r   r   r   r   r   r   r   <module>   s   