ó
    >:jÃ2 ã                  óª  • S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
Jr  S SKJr  S SKJrJrJr  S SKrS SKrS SKrS SKJr  S SKJrJr  S S	KJrJr  S S
KJr  S SKJrJ r   S SK!J"r"  S SK#J$r$J%r%  S SKJ&r&  SSK'J(r(J)r)J*r*  SSK+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrKJLrLJMrMJNrNJOrO  SrP\"R¢                  " \R¤                  5      \"R¢                  " S5      :¼  a  S SKJSrS  \S" 5       rP/ SQrTS7S jrUS8S jrVS9S jrWS:S jrX " S S\R²                  R´                  5      r[ " S S\[5      r\ " S S\[5      r]S;S  jr^S! r_S" r`S# ra   S<       S=S$ jjrbS>S?S% jjrcS& rdS@S' jreS( rfS) rgSAS* jrhSBS+ jriSCS, jrjS;S- jrkSDS. jrlS/ rmSES0 jrnSFS1 jroSGS2 jrpSHS3 jrqSISJS4 jjrrS5 rsSKS6 jrtg)Lé    )ÚannotationsN)ÚSequence)Únullcontext)Ú
attrgetter)ÚAnyÚOptionalÚUnion)ÚFullyShardedDataParallelPlugin)Úadd_hook_to_moduleÚremove_hook_from_module)Úis_npu_availableÚis_xpu_available)Úfile_exists)ÚEntryNotFoundErrorÚHFValidationError)Úversion)Ústorage_ptrÚstorage_size)ÚPreTrainedModelé   )Úis_gptqmodel_availableÚis_torch_tpu_availableÚis_transformers_ge_v5_1_0é   )$ÚCONFIG_NAMEÚEMBEDDING_LAYER_NAMESÚINCLUDE_LINEAR_LAYERS_SHORTHANDÚSAFETENSORS_WEIGHTS_NAMEÚ5TRANSFORMERS_MODELS_TO_ADALORA_TARGET_MODULES_MAPPINGÚ4TRANSFORMERS_MODELS_TO_ADAMSS_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_BOFT_TARGET_MODULES_MAPPINGÚ1TRANSFORMERS_MODELS_TO_C3A_TARGET_MODULES_MAPPINGÚ4TRANSFORMERS_MODELS_TO_DELORA_TARGET_MODULES_MAPPINGÚ7TRANSFORMERS_MODELS_TO_FOURIERFT_TARGET_MODULES_MAPPINGÚ5TRANSFORMERS_MODELS_TO_GRALORA_TARGET_MODULES_MAPPINGÚ1TRANSFORMERS_MODELS_TO_HRA_TARGET_MODULES_MAPPINGÚ6TRANSFORMERS_MODELS_TO_IA3_FEEDFORWARD_MODULES_MAPPINGÚ1TRANSFORMERS_MODELS_TO_IA3_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_LILY_TARGET_MODULES_MAPPINGÚ6TRANSFORMERS_MODELS_TO_LNTUNING_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_LOHA_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_LOKR_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_MISS_TARGET_MODULES_MAPPINGÚ1TRANSFORMERS_MODELS_TO_OFT_TARGET_MODULES_MAPPINGÚ4TRANSFORMERS_MODELS_TO_PEANUT_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_POLY_TARGET_MODULES_MAPPINGÚ8TRANSFORMERS_MODELS_TO_PREFIX_TUNING_POSTPROCESS_MAPPINGÚ3TRANSFORMERS_MODELS_TO_PSOFT_TARGET_MODULES_MAPPINGÚ3TRANSFORMERS_MODELS_TO_PVERA_TARGET_MODULES_MAPPINGÚ6TRANSFORMERS_MODELS_TO_RANDLORA_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_ROAD_TARGET_MODULES_MAPPINGÚ3TRANSFORMERS_MODELS_TO_SHIRA_TARGET_MODULES_MAPPINGÚ6TRANSFORMERS_MODELS_TO_TINYLORA_TARGET_MODULES_MAPPINGÚ4TRANSFORMERS_MODELS_TO_VBLORA_TARGET_MODULES_MAPPINGÚ2TRANSFORMERS_MODELS_TO_VERA_TARGET_MODULES_MAPPINGÚ4TRANSFORMERS_MODELS_TO_WAVEFT_TARGET_MODULES_MAPPINGÚWEIGHTS_NAMEÚ&bloom_model_postprocess_past_key_valueÚ*starcoder_model_postprocess_past_key_valueFz0.29.0)Úis_mlu_availablec                 ó>  • [         R                  R                  5       (       a  g[        [         R                  S5      (       a.  [         R                  R
                  R                  5       (       a  g[        (       a  g[        5       (       a  g[        5       (       a  gg)NÚcudaÚmpsÚmluÚxpuÚnpuÚcpu)	ÚtorchrA   Úis_availableÚhasattrÚbackendsrB   Úmlu_availabler   r   © ó    ÚM/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/utils/other.pyÚinfer_devicerO      sg   € Ü‡z�z×Ñ× Ñ ØÜ	”—‘ ×	'Ñ	'¬E¯N©N×,>Ñ,>×,KÑ,K×,MÑ,MØß	ŠØÜ	×	Ñ	ØÜ	×	Ñ	ØØrM   c                óô  • [        U SS5      =(       d    [        U SS5      n[        U SS5      S:H  n[        U SS5      S:H  n[        U SS5      S:H  n[        U SS5      S	:H  n[        U SS5      S
:H  =(       d    [        U SS5      nUc  0 nU R                  5        H  u  pšSU
l        M     U(       d»  U(       d´  U(       d­  U(       d¦  U(       dŸ  U R                  5        H‹  n
U
R                  [
        R                  :X  d   U
R                  [
        R                  :X  d  MA  U
R                  R                  S:w  d  M]  U
R                  R                  [
        R                  5      U
l
        M�     U(       d#  U(       d  U(       d  U(       d  U(       d  U(       aá  U(       aÚ  SU;  d
  US   (       aD  [        U S5      (       a  U R                  5         O"S nU R                  5       R!                  U5        S[#        [$        R&                  " U R(                  5      R                  5      ;   nU(       d*  [+        U5      S:”  a  [,        R.                  " S[0        5        U(       d  0 OSU0nU R(                  " S0 UD6  U $ )a   
Note this method only works for `transformers` models.

This method wraps the entire protocol for preparing a model before running a training. This includes:
    1- Cast the layernorm in fp32 2- making output embedding layer require grads 3- Add the upcasting of the lm
    head to fp32 4- Freezing the base model layers to ensure they are not updated during training


Args:
    model (`transformers.PreTrainedModel`):
        The loaded model from `transformers`
    use_gradient_checkpointing (`bool`, *optional*, defaults to `True`):
        If True, use gradient checkpointing to save memory at the expense of slower backward pass.
    gradient_checkpointing_kwargs (`dict`, *optional*, defaults to `None`):
        Keyword arguments to pass to the gradient checkpointing function, please refer to the documentation of
        `torch.utils.checkpoint.checkpoint` for more details about the arguments that you can pass to that method.
        Note this is only available in the latest transformers versions (> 4.34.1).
Úis_loaded_in_8bitFÚis_loaded_in_4bitÚquantization_methodNÚgptqÚaqlmÚeetqÚtorchaoÚhqqÚhqq_quantizedÚ
Params4bitÚuse_reentrantÚenable_input_require_gradsc                ó&   • UR                  S5        g )NT)Úrequires_grad_)ÚmoduleÚinputÚoutputs      rN   Úmake_inputs_require_gradÚAprepare_model_for_kbit_training.<locals>.make_inputs_require_gradË   s   € Ø×)Ñ)¨$Õ/rM   Úgradient_checkpointing_kwargsr   zÉgradient_checkpointing_kwargs is not supported in this version of transformers. The passed kwargs will be ignored. if you want to use that feature, please upgrade to the latest version of transformers.rL   )ÚgetattrÚnamed_parametersÚrequires_gradÚ
parametersÚdtyperG   Úfloat16Úbfloat16Ú	__class__Ú__name__ÚdataÚtoÚfloat32rI   r\   Úget_input_embeddingsÚregister_forward_hookÚlistÚinspectÚ	signatureÚgradient_checkpointing_enableÚlenÚwarningsÚwarnÚFutureWarning)ÚmodelÚuse_gradient_checkpointingrd   Úloaded_in_kbitÚis_gptq_quantizedÚis_aqlm_quantizedÚis_eetq_quantizedÚis_torchao_quantizedÚis_hqq_quantizedÚnameÚparamrb   Ú_supports_gc_kwargsÚgc_enable_kwargss                 rN   Úprepare_model_for_kbit_trainingr‡   �   s  € ô& ˜UÐ$7¸Ó?×mÄ7È5ÐReÐglÓCm€NÜ Ð'<¸dÓCÀvÑMÐÜ Ð'<¸dÓCÀvÑMÐÜ Ð'<¸dÓCÀvÑMÐÜ" 5Ð*?ÀÓFÈ)ÑSÐÜ˜uÐ&;¸TÓBÀeÑK×uÌwÐW\Ð^mÐotÓOuÐà$Ñ,Ø(*Ð%à×-Ñ-Ö/‰ˆà#ˆÖñ 0ö
 Þ!Þ!Þ Þ$ð ×%Ñ%Ö'ˆEà—‘¤§¡Ó-°5·;±;Ä%Ç.Á.Õ3PØ—/‘/×*Ñ*¨lÕ:Ø"ŸZ™ZŸ]™]¬5¯=©=Ó9�–
ñ	 (ö 	ÞÞÞÞÞÞ
$àÐ"?Ó?ÐC`Ðap×Cqä�uÐ:×;Ñ;Ø×0Ñ0Õ2ò0ð ×*Ñ*Ó,×BÑBÐC[Ô\ð >ÄÜ×Ò˜e×AÑAÓB×MÑMóB
ñ 
Ðö #¤sÐ+HÓ'IÈAÓ'MÜ�MŠMðjäôö *‰BÐ0OÐQnÐ/oð 	ð
 	×+Ò+Ñ?Ð.>Ò?Ø€LrM   c                óÖ   • U R                  U R                  5      nU SS2SS24   R                  5       USS2SS24'   X#SS2S4'   Uc  [        S5      eUR	                  US:H  U5        U$ )a  
Shift input ids one token to the right.

Args:
    input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): input ids
    pad_token_id (`int`): The id of the `padding` token.
    decoder_start_token_id (`int`): The id of the `start` token.
Néÿÿÿÿr   r   z1self.model.config.pad_token_id has to be defined.iœÿÿÿ)Ú	new_zerosÚshapeÚcloneÚ
ValueErrorÚmasked_fill_)Ú	input_idsÚpad_token_idÚdecoder_start_token_idÚshifted_input_idss       rN   Úshift_tokens_rightr“   æ   sz   € ð "×+Ñ+¨I¯O©OÓ<ÐØ(ª¨C¨R¨C¨Ñ0×6Ñ6Ó8Ð’a˜™�eÑØ4’a˜�dÑàÑÜÐLÓMÐMà×"Ñ"Ð#4¸Ñ#<¸lÔKàÐrM   c                ó4  • [        U [        R                  R                  [        R                  45      (       a$  U R
                  (       a  U R                  U5        ggU R                  5        H'  nUR
                  (       d  M  UR                  U5        M)     g)aR  Set requires_grad on all leaf parameters of a layer.

This handles the FSDP case where params may be non-leaf tensors (wrapped in DTensors). Only leaf tensors can have
their requires_grad flag toggled, so non-leaf tensors are silently skipped

Args:
    layer: A module, parameter or tensor
    requires_grad: enable or disable gradients
N)Ú
isinstancerG   ÚnnÚ	ParameterÚTensorÚis_leafr^   rh   )Úlayerrg   r„   s      rN   Ú_set_layer_requires_gradr›   û   sj   € ô �%œ%Ÿ(™(×,Ñ,¬e¯l©lÐ;×<Ñ<Ø�=�=Ø× Ñ  Õ/ð ð ×%Ñ%Ö'ˆEØ�}�}‰}Ø×$Ñ$ ]Ö3ò (rM   c                  ó˜  ^ • \ rS rSr% SrSrS\S'   SrS\S'   / rS\S'   U 4S	 jr	S
 r
S%S jrS rS r\S&S j5       r\S'S j5       r\S(S j5       rS rS rS)U 4S jjrS rS rS rS*S jr          S+S jrS*S jr          S,S jrS-S jrS.S jrS/S jrS0S1S jjrS2S jr S3S4S  jjr!S! r"S" r#        S5S# jr$S$r%U =r&$ )6ÚAuxiliaryTrainingWrapperi  z¼Wrap a specific module so that it can be trained and saved in a way that is tangential to how
PEFT normally works, e.g. fully training a classification layer instead of using an adapter.

rL   útuple[str, ...]Úadapter_layer_namesÚother_param_namesú	list[str]Úmerged_adaptersc                óÖ   >• [         TU ]  5         Xl        U/U l        SU l        [        5       U l        U R                  " U40 UD6  U R                  " U40 UD6  U R                  5         g)zEExtra kwargs will be passed to `self.init_modules` and `self.update`.FN)
ÚsuperÚ__init__Úoriginal_moduleÚ_active_adapterÚ_disable_adaptersÚsetÚ	_adaptersÚinit_modulesÚupdateÚcheck_module)ÚselfÚmodule_to_saveÚadapter_nameÚkwargsrl   s       €rN   r¥   Ú!AuxiliaryTrainingWrapper.__init__  s_   ø€ ä‰ÑÔØ-ÔØ ,˜~ˆÔØ!&ˆÔÜ›ˆŒà×Ò˜,Ñ1¨&Ò1à�Š�LÑ+ FÒ+Ø×ÑÕrM   c                ó   • [         e)zWA place to initialize PyTorch modules in `__init__` before the call to `self.update()`.©ÚNotImplementedError©r®   r°   r±   s      rN   r«   Ú%AuxiliaryTrainingWrapper.init_modules(  ó   € ä!Ð!rM   c                ó   • [         e©z:Return all adapter names that can be found on this module.r´   ©r®   s    rN   Ú_get_available_adaptersÚ0AuxiliaryTrainingWrapper._get_available_adapters,  r¸   rM   c                ó   • g)a  Returns a user friendly identifier for error messages, e.g. for type compatibility error messages from
`check_module()` so that the user can backtrack where the error comes from. A generic "training wrapper" is
less helpful than "modules_to_save", for example.
ztraining wrapperrL   r»   s    rN   Ú_error_message_nameÚ,AuxiliaryTrainingWrapper._error_message_name0  s   € ð
 "rM   c                ó  • [         R                  R                  [         R                  R                  [         R                  R                  [         R                  R
                  4n[        U R                  U5      (       a4  U R                  R                  n[        U R                  5        SU 35      eSSKJn  [        U R                  U5      (       a4  U R                  R                  n[        U R                  5        SU 35      eg)z@Perform some sanity checks on the module to ensure that it worksz& cannot be applied to modules of type r   ©ÚBaseTunerLayerN)rG   r–   Ú
ModuleDictÚ
ModuleListÚParameterDictÚParameterListr•   r¦   rl   Ú	TypeErrorr¿   Úpeft.tuners.tuners_utilsrÃ   )r®   Úforbidden_classesÚcls_namerÃ   s       rN   r­   Ú%AuxiliaryTrainingWrapper.check_module7  s×   € ô
 #ŸX™X×0Ñ0´%·(±(×2EÑ2EÄuÇxÁx×G]ÑG]Ô_d×_gÑ_g×_uÑ_uÐvÐÜ�d×*Ñ*Ð,=×>Ñ>Ø×+Ñ+×5Ñ5ˆHÜ˜t×7Ñ7Ó9Ð:Ð:`ÐaiÐ`jÐkÓlÐlõ 	<ä�d×*Ñ*¨N×;Ñ;à×+Ñ+×5Ñ5ˆHÜ˜t×7Ñ7Ó9Ð:Ð:`ÐaiÐ`jÐkÓlÐlð <rM   c                ó   • U R                   $ ©N©r¨   r»   s    rN   Údisable_adaptersÚ)AuxiliaryTrainingWrapper.disable_adaptersI  s   € ð ×%Ñ%Ð%rM   c                ó   • U R                   $ rÎ   )r§   r»   s    rN   Úactive_adapterÚ'AuxiliaryTrainingWrapper.active_adapterN  s   € ð ×#Ñ#Ð#rM   c                ór   • [        U R                  [        5      (       a  U R                  /$ U R                  $ rÎ   )r•   r§   Ústrr»   s    rN   Úactive_adaptersÚ(AuxiliaryTrainingWrapper.active_adaptersS  s0   € ä�d×*Ñ*¬C×0Ñ0Ø×(Ñ(Ð)Ð)Ø×#Ñ#Ð#rM   c                ó   • g)a  Infrastructure to enable the implementing class to delegate attributes to other modules.
Returns True if the implementing class knows how to handle attribute `name`.

Gets passed `modules` which is PyTorch's internal list of assigned modules from `nn.Module`.
FrL   ©r®   rƒ   Úmoduless      rN   Ú_hasattr_wrappedÚ)AuxiliaryTrainingWrapper._hasattr_wrappedY  s   € ð rM   c                ó   • g)z€If `_hasattr_wrapped` returns True for `name`, then this function should return the corresponding
value associated with `name`.
NrL   rÚ   s      rN   Ú_getattr_wrappedÚ)AuxiliaryTrainingWrapper._getattr_wrappeda  s   € ð 	rM   c                óÔ  >•  [         TU ]  U5      $ ! [         a     Of = fSU R                  ;  a%  [        S[	        U 5      R
                   SU S35      eU R                  S   nU R                  (       d  U R                  (       d  [        U R                  U5      $ U R                  X5      (       a  U R                  X5      $ [        S[	        U 5      R
                   SU S35      e)NÚ_modulesÚ'z' object has no attribute ')r¤   Ú__getattr__ÚAttributeErrorÚ__dict__Útyperm   rÐ   r×   re   r¦   rÜ   rß   )r®   rƒ   rÛ   rl   s      €rN   rä   Ú$AuxiliaryTrainingWrapper.__getattr__g  sâ   ø€ ð	Ü‘7Ñ& tÓ,Ð,øÜó 	Ùð	úð ˜TŸ]™]Ó*Ü  1¤T¨$£Z×%8Ñ%8Ð$9Ð9TÐUYÐTZÐZ[Ð!\Ó]Ð]ð —-‘- 
Ñ+ˆØ× × ¨×)=×)=ä˜4×/Ñ/°Ó6Ð6Ø×"Ñ" 4×1Ñ1Ø×(Ñ(¨Ó7Ð7ô ˜q¤ d£×!4Ñ!4Ð 5Ð5PÐQUÐPVÐVWÐXÓYÐYs   ƒ ’
žc                óZ   • XR                   ;  a  U R                   R                  U5        gg)a  Called when this instance should be part of an adapter's training.
Adds the given adapter to the list of adapters that this instance is training along with.

Additional kwargs are expected to be the same kwargs that are also passed for initializing this class.
N)rª   Úaddr¶   s      rN   r¬   ÚAuxiliaryTrainingWrapper.update  s%   € ð Ÿ~™~Ó-Ø�N‰N×Ñ˜|Õ,ð .rM   c                ó*  • [        [        R                  UR                  R                  5      nUR
                  n0 n[        R                  " UR                  5      nUR                  5        H  nXeR                  ;   d  M  X6   XF'   M     U" S0 UD6nU$ )zX
Creates a new hook based on the old hook. Use it only if you know what you are doing !
rL   )re   Ú
accelerateÚhooksrl   rm   ræ   rt   ru   r¥   Úkeysrh   )r®   Úold_hookÚold_hook_clsÚold_hook_attrÚfiltered_old_hook_attrÚold_hook_init_signatureÚkÚnew_hooks           rN   Ú_create_new_hookÚ)AuxiliaryTrainingWrapper._create_new_hookˆ  sŠ   € ô œz×/Ñ/°×1CÑ1C×1LÑ1LÓMˆØ ×)Ñ)ˆØ!#ÐÜ")×"3Ò"3°L×4IÑ4IÓ"JÐØ×#Ñ#Ö%ˆAØ×6Ñ6Õ6Ø,9Ñ,<Ð&Ó)ñ &ñ  Ñ9Ð"8Ñ9ˆØˆrM   c                ó¬   • UR                  SS5      nUc  g[        U5      [        U5      :w  a&  S[        U5       S[        U5       S3n[        U5      eg)zMCheck if the arguments are compatible with the configs and state of the modelÚadapter_namesNzNLength of `adapter_names` should be the same as the number of inputs, but got z and z respectively.)Úgetrw   r�   )r®   ÚxÚargsr±   rú   Úmsgs         rN   Ú_check_forward_argsÚ,AuxiliaryTrainingWrapper._check_forward_args–  sb   € àŸ
™
 ?°DÓ9ˆØÑ Øäˆq‹6”S˜Ó'Ó'à`Ü�}Ó%Ð& e¬C°«F¨8°>ðCð ô ˜S“/Ð!ð (rM   c                ó   • [         erÎ   r´   ©r®   rü   rý   r±   s       rN   Ú_forward_wrappedÚ)AuxiliaryTrainingWrapper._forward_wrapped£  s   € Ü!Ð!rM   c                ó   • [         erÎ   r´   ©r®   rü   rÓ   rý   r±   s        rN   Ú_forward_wrapped_mixed_batchÚ5AuxiliaryTrainingWrapper._forward_wrapped_mixed_batch¦  s
   € ô "Ð!rM   c                ó   • [         e)z\The forward call when no adapter is involved in the forward computation, only the base modelr´   r  s       rN   Ú_forward_wrapped_passthroughÚ5AuxiliaryTrainingWrapper._forward_wrapped_passthrough«  r¸   rM   c          	     ó´  • [         R                  R                  [         R                  R                  [         R                  R                  [         R                  R
                  [         R                  R                  4nSR                  U Vs/ s H  ofR                  PM     sn5      n[        U R                  U5      (       d  [        SU S35      e[        U5      n/ n	U H9  n
U	R                  [        U5       VVs/ s H  u  p¼XÊ:X  d  M  UPM     snn5        M;     [        [!        U5      5       Vs/ s H  nSPM     nn[        U5       H`  u  nnXU      nUS:X  a  U R                  " U/UQ70 UD6nOU R"                  " UU/UQ70 UD6n[        XŸ   5       H  u  nnUU   UU'   M     Mb     [         R$                  " U5      $ s  snf s  snnf s  snf )Nú, z<Mixed batching is only supported for the following modules: Ú.r   Ú__base__)rG   r–   ÚLinearÚ	EmbeddingÚConv1dÚConv2dÚConv3dÚjoinrm   r•   r¦   rÈ   r©   ÚappendÚ	enumerateÚrangerw   r  Ústack)r®   r`   rú   rý   r±   ÚSUPPORTED_MODULESr_   Úmodule_namesÚunique_adaptersÚsub_batch_indices_listÚadapterÚindexÚitemÚ_ÚresultsÚirÓ   Ú	sub_batchra   Újs                       rN   Ú_mixed_batch_forwardÚ-AuxiliaryTrainingWrapper._mixed_batch_forward¯  s¤  € ô #ŸX™XŸ_™_¬e¯h©h×.@Ñ.@Ä%Ç(Á(Ç/Á/ÔSX×S[ÑS[×SbÑSbÔdi×dlÑdl×dsÑdsÐtÐà—y‘yÑ@QÓ!RÒ@Q°f§/¤/Ñ@QÑ!RÓSˆä˜$×.Ñ.Ð0A×BÑBÜÐZÐ[gÐZhÐhiÐjÓkÐkä˜mÓ,ˆØ!#Ðã&ˆGØ"×)Ñ)ÄIÈmÔD\Ô*pÒD\±[°UÐ`dÑ`o¯5ÑD\Ò*pÖqñ 'ô $¤C¨£JÔ/Ó0Ò/˜“1Ñ/ˆÐ0ä!*¨?Ö!;ÑˆAˆ~Ø°QÑ7Ñ8ˆIà Ó+Ø×-Ò-¨iÐI¸$ÒIÀ&ÑI‘à×:Ò:¸9ÀnÐfÐW[ÒfÐ_eÑf�ä%Ð&<Ñ&?Ö@‘��qØ# E™]�˜“
ó Añ "<ô �{Š{˜7Ó#Ð#ùò1 "Sùó +qùâ0s   ÂG
Ä GÄGÄ7Gc                óL  ^ • T R                   " U/UQ70 UD6  UR                  SS 5      nT R                  (       d$  [        U 4S jT R                   5       5      (       a  T R
                  " U/UQ70 UD6$ Uc  T R                  " U/UQ70 UD6$ T R                  " U/UQ7SU0UD6$ )Nrú   c              3  ó@   >#   • U  H  oTR                   ;  v •  M     g 7frÎ   )rª   )Ú.0r  r®   s     €rN   Ú	<genexpr>Ú3AuxiliaryTrainingWrapper.forward.<locals>.<genexpr>Õ  s   øé € Ð'jÒUiÈ'°t·~±~Ö(EÒUiùs   ƒ)rÿ   ÚpoprÐ   Úanyr×   r
  r  r&  )r®   rü   rý   r±   rú   s   `    rN   ÚforwardÚ AuxiliaryTrainingWrapper.forwardÑ  s¨   ø€ Ø× Ò  Ð4 TÒ4¨VÒ4ØŸ
™
 ?°DÓ9ˆà× × ¤CÔ'jÐUY×UiÒUiÓ'j×$jÑ$jØ×4Ò4°QÐH¸ÒHÀÑHÐHàÑ Ø×(Ò(¨Ð<¨TÒ<°VÑ<Ð<Ø×(Ò(¨ÐY¨TÒYÀÐYÐRXÑYÐYrM   c                ó0   • U(       a  SU l         gSU l         g)z|Toggle the enabling and disabling of adapters

Args:
    enabled (bool): True to enable adapters, False to disable adapters
FTNrÏ   )r®   Úenableds     rN   Úenable_adaptersÚ(AuxiliaryTrainingWrapper.enable_adaptersÜ  s   € ö Ø%*ˆDÕ"à%)ˆDÕ"rM   c                ó   • [         e)úŒHelper function to check if the given adapter(s) can be set.

Return the name of the adapter to be set or None if no adapter should be set.
r´   ©r®   r°   s     rN   Úcheck_set_adapterÚ*AuxiliaryTrainingWrapper.check_set_adapterç  s
   € ô
 "Ð!rM   c                óæ   • [        U[        5      (       a  Xl        g/ U l        U HH  nX0R                  ;  a  [	        SU SU R                   35      eU R                  R                  U5        MJ     g)a‡  Set the active adapter

Note: This only deals with active_adapters, not with requires_grad. If the latter needs changing, handle it via
the subclass.

Args:
    adapter_names (str or list[str]):
        The name(s) of the adapter(s) to set as active
    inference_mode (bool, optional):
         Whether the activated adapter should be frozen (i.e. `requires_grad=False`). Default is False.
úAdapter ú not found in N)r•   rÖ   r§   rª   r�   r  )r®   rú   Úinference_moder°   s       rN   Úset_adapterÚ$AuxiliaryTrainingWrapper.set_adapterî  sd   € ô �m¤S×)Ñ)Ø#0Õ à#%ˆDÔ Û -�Ø§~¡~Ó5Ü$ x°¨~¸^ÈDÏNÉNÐK[Ð%\Ó]Ð]à×$Ñ$×+Ñ+¨LÖ9ò	 !.rM   c                ó   • [         e)zGDelete an adapter from the layer, set a new active adapter if necessaryr´   )r®   r°   Únew_active_adapterss      rN   Údelete_adapterÚ'AuxiliaryTrainingWrapper.delete_adapter  r¸   rM   c                óê   • [        U[        5      (       a  U1nO[        U5      nU R                   H?  n[	        U5      " U 5      nUR                  5        H  u  pgXc;   d  M  [        Xr5        M     MA     g)a"  
Enable or disable gradients on the given adapter(s).

Args:
    adapter_name (`str` or `Sequence[str]`):
        The name of the adapter(s) whose gradients should be enabled/disabled.
    requires_grad (`bool`, *optional*)
        Whether to enable (`True`, default) or disable (`False`).
N)r•   rÖ   r©   rŸ   r   Úitemsr›   )r®   rú   rg   Úadapter_names_setÚ
layer_nameÚmodule_dictÚkeyrš   s           rN   Úset_requires_gradÚ*AuxiliaryTrainingWrapper.set_requires_grad  sf   € ô �m¤S×)Ñ)Ø!. Ñä # MÓ 2Ðà×2Ô2ˆJä$ ZÔ0°Ó6ˆKØ)×/Ñ/Ö1‘
�ØÕ+Ü,¨UÖBó 2ò 3rM   c                ó   • [         e)z9Return the state dict of this module for a given adapter.r´   r7  s     rN   Úadapter_state_dictÚ+AuxiliaryTrainingWrapper.adapter_state_dict  r¸   rM   c                ó   • [         e)a8  Return a mapping from the key present in disk-loaded state dict
and how it should be represented in the loaded model's state dict.

The default should be a 1:1 mapping but it is important to define a mapping as it also serves as the
ground-truth for which keys are supposed to be loaded from a saved state dict.
r´   r7  s     rN   Úadapter_state_dict_load_mapÚ4AuxiliaryTrainingWrapper.adapter_state_dict_load_map"  s
   € ô "Ð!rM   c                ó   • [         e)z…Handles unloading when called from PEFT models. Returns the wrapped module
and handles merging onto the wrapped module if requested.
r´   ©r®   ÚmergeÚ
safe_mergerú   s       rN   Ú"unload_and_optionally_merge_moduleÚ;AuxiliaryTrainingWrapper.unload_and_optionally_merge_module+  s
   € ô "Ð!rM   )r§   rª   r¨   r¦   ©Úreturnzset[str])rY  Úbool)rY  zUnion[list[str], str]©rY  r¡   )rƒ   rÖ   )rü   útorch.Tensorrý   r   r±   r   rY  r\  )
rü   r\  rÓ   rÖ   rý   r   r±   r   rY  r\  )
r`   r\  rý   r   rú   r¡   r±   r   rY  r\  )rü   r\  ©r2  rZ  ©r°   ústr | list[str]rY  z
str | None©F©rú   zUnion[str, list[str]]r=  rZ  rY  ÚNone©r°   rÖ   rA  úOptional[list[str]]rY  rb  ©T)rú   zstr | Sequence[str]rg   rZ  rY  rb  ©rT  rZ  rU  rZ  rú   rd  rY  útorch.nn.Module)'rm   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rŸ   Ú__annotations__r    r¢   r¥   r«   r¼   r¿   r­   ÚpropertyrÐ   rÓ   r×   rÜ   rß   rä   r¬   r÷   rÿ   r  r  r
  r&  r/  r3  r8  r>  rB  rJ  rM  rP  rV  Ú__static_attributes__Ú__classcell__©rl   s   @rN   r�   r�     sX  ø‡ ñð ,.Ð˜Ó-à)+Ð�Ó+à!#€O�YÓ#õò"ô"ò"òmð$ ó&ó ð&ð ó$ó ð$ð ó$ó ð$ò
ò÷Zò0-òò"ô"ð"Øð"Ø/2ð"Ø;>ð"ØJMð"à	ô"ô
"ð $Ø!ð $Ø*-ð $Ø>Gð $ØSVð $à	ô $ôD	Zô	*ô"ö:ô,"öCò,"ò"ð"Øð"Ø'+ð"Ø<Oð"à	÷"ò "rM   r�   c                  óÜ   ^ • \ rS rSr% SrSrS\S'   SU 4S jjrS rS r	S	 r
S
 rS rS rS rSU 4S jjrSU 4S jjrSS jrSSS jjrSS jrS rS r        SS jrSS jrSrU =r$ ) ÚModulesToSaveWrapperi4  zeWraps a module that is supposed to be trained (i.e. `requires_grad_(True)`) and saved after training.©Úmodules_to_saverž   rŸ   c                ó"   >• [         TU ]  XUS9  g )N)Útied_module)r¤   r¥   )r®   r¯   r°   rv  rl   s       €rN   r¥   ÚModulesToSaveWrapper.__init__:  s   ø€ Ü‰Ñ˜À;ÐÒOrM   c                óL   • [         R                  R                  0 5      U l        g rÎ   )rG   r–   rÄ   rt  r¶   s      rN   r«   Ú!ModulesToSaveWrapper.init_modules=  s   € ä$Ÿx™x×2Ñ2°2Ó6ˆÕrM   c                ó   • g)Nrt  rL   r»   s    rN   r¿   Ú(ModulesToSaveWrapper._error_message_nameA  s   € Ø rM   c                óœ   • U R                   (       d  U R                  " U/UQ70 UD6$ U R                  U R                   S      " U/UQ70 UD6$ )Nr   )r×   r
  rt  r  s       rN   r  Ú%ModulesToSaveWrapper._forward_wrappedD  sQ   € Ø×#×#Ø×4Ò4°QÐH¸ÒHÀÑHÐHØ×#Ñ# D×$8Ñ$8¸Ñ$;Ò<¸QÐPÀÒPÈÑPÐPrM   c                ó4   • U R                   U   " U/UQ70 UD6$ rÎ   rs  r  s        rN   r  Ú1ModulesToSaveWrapper._forward_wrapped_mixed_batchI  s"   € Ø×#Ñ# NÒ3°AÐG¸ÒGÀÑGÐGrM   c                ó.   • U R                   " U/UQ70 UD6$ rÎ   )r¦   r  s       rN   r
  Ú1ModulesToSaveWrapper._forward_wrapped_passthroughL  s   € Ø×#Ò# AÐ7¨Ò7°Ñ7Ð7rM   c                ó,   • U R                   S   US   ;   $ )Nr   rt  )r×   rÚ   s      rN   rÜ   Ú%ModulesToSaveWrapper._hasattr_wrappedO  s   € à×#Ñ# AÑ&¨'Ð2CÑ*DÑDÐDrM   c                ó@   • [        US   U R                  S      U5      $ )Nrt  r   )re   r×   rÚ   s      rN   rß   Ú%ModulesToSaveWrapper._getattr_wrappedS  s%   € Ü�wÐ0Ñ1°$×2FÑ2FÀqÑ2IÑJÈDÓQÐQrM   c                ó   >• [         TU ]  U5        [        5       nU R                  R	                  5        Hf  u  pVUR                  5       nUS:X  d  M  [        US5      (       d  M0  SS KnUR                  R                  U R                  R                  5       SS9n  O   XR                  ;  a“  U   U(       aT  [        R                  R                  " UR                  R                   SS06n	UR                  U	l        X�R                  U'   O-["        R$                  " U R                  5      U R                  U'   S S S 5        [        U R                  U   S5      (       a[  U R                  U   R&                  n
U R)                  U
5      n[+        U R                  U   5        [-        U R                  U   U5        U R                  R/                  S5        XR0                  :X  a  [3        U R                  U   S5        g g ! , (       d  f       NÌ= f)Nr   Úds_numel)Úmodifier_rankÚbiasFÚ_hf_hookT)r¤   r¬   r   r¦   rf   ÚnumelrI   Ú	deepspeedÚzeroÚGatheredParametersrh   rt  rG   r–   r  Úweightr‹   ÚcopyÚdeepcopyrŠ  r÷   r   r   r^   rÓ   r›   )r®   r°   rv  r±   Úcontext_managerr!  r„   Ú
num_paramsrŒ  Ú
new_linearrð   rö   rl   s               €rN   r¬   ÚModulesToSaveWrapper.updateV  s£  ø€ Ü‰‰�|Ô$ä%›-ˆØ×,Ñ,×=Ñ=Ö?‰HˆAØŸ™›ˆJà˜Q�¤7¨5°*×#=Ó#=Û à"+§.¡.×"CÑ"CÀD×DXÑDX×DcÑDcÓDeÐuvÐ"CÐ"w�Ùñ @ð ×3Ñ3Ó3Ú ÞÜ!&§¡§¢°+×2DÑ2D×2JÑ2JÐ!WÐQVÑ!W�JØ(3×(:Ñ(:�JÔ%à9C×(Ñ(¨Ò6ä9=¿ºÀt×G[ÑG[Ó9\�D×(Ñ(¨Ñ6÷ !ô �4×'Ñ'¨Ñ5°z×BÑBØ×+Ñ+¨LÑ9×BÑBˆHØ×,Ñ,¨XÓ6ˆHÜ# D×$8Ñ$8¸Ñ$FÔGÜ˜t×3Ñ3°LÑAÀ8ÔLà×Ñ×+Ñ+¨EÔ2ð
 ×.Ñ.Ó.Ü$ T×%9Ñ%9¸,Ñ%GÈÕNð /÷) !•ús   Â0B	G?Ç?
Hc                óæ   >• [         TU ]  U5        U(       a-  U R                   H  n[        U R                  U   S5        M     gU R                  R                  5        H  n[        US5        M     g)z–Takes care of setting the required_grad flag on the modules_to_save.
If adapters are enabled, gradients for the modules_to_save are required as well.
TFN)r¤   r3  r×   r›   rt  Úvalues)r®   r2  r°   r_   rl   s       €rN   r3  Ú$ModulesToSaveWrapper.enable_adapters{  s_   ø€ ô 	‰Ñ Ô(æØ $× 4Ô 4�Ü(¨×)=Ñ)=¸lÑ)KÈTÖRò !5ð ×.Ñ.×5Ñ5Ö7�Ü(¨°Ö7ò 8rM   c                ó*  • [        U[        5      (       a  U$ [        U5      S:X  a  [        S5      eU Vs/ s H  o"U R                  ;   d  M  UPM     nn[        U5      S:”  a  [        SU  S[        U5       35      eU(       d  SnU$ US   nU$ s  snf ©r6  r   z*Please specify at least one adapter to setr   z*Only one adapter can be set at a time for z, got N)r•   rÖ   rw   r�   rt  ©r®   r°   ÚnÚadapter_names_in_moduleÚadapter_name_to_sets        rN   r8  Ú&ModulesToSaveWrapper.check_set_adapterˆ  s­   € ô
 �l¤C×(Ñ(ØÐô ˆ|Ó Ó!ÜÐIÓJÐJá.:Ó"Xªl¨À4×CWÑCWÑ>W§1©lÐÐ"XäÐ&Ó'¨!Ó+ÜÐIÈ$ÈÈvÔVYÐZqÓVrÐUsÐtÓuÐuö 'Ø"&Ðð #Ð"ð #:¸!Ñ"<Ðà"Ð"ùò #Ys   ¶BÁBc                óœ  • [        U[        5      (       a  U/n[        U5      S:”  a  [        SU S35      eU R                   H  n[        U R                  U   S5        M     [        U5      S:X  a  / U l        gUS   nX@R                  ;  a  [        SU SU R                   35      e[        U R                  U   U(       + 5        X@l        g)	a‹  Set the active adapter

Additionally, this function will set the specified adapter to trainable (i.e., requires_grad=True) unless
inference_mode is True.

Args:
    adapter_names (list[str], str):
         The name(s) of the adapter(s) to set as active.
    inference_mode (bool, optional):
         Whether the activated adapter should be frozen (i.e. `requires_grad=False`). Default is False.
r   úAttempted to set multiple (z') adapters at once for modules_to_save.Fr   Nr;  r<  )	r•   rÖ   rw   r�   r×   r›   rt  r§   rª   )r®   rú   r=  Úcurrently_active_adapter_namer°   s        rN   r>  Ú ModulesToSaveWrapper.set_adapter¡  sÍ   € ô �m¤S×)Ñ)Ø*˜OˆMäˆ}Ó Ó!ÜÐ:¸=¸/ÐIpÐqÓrÐrà-1×-AÔ-AÐ)Ü$ T×%9Ñ%9Ð:WÑ%XÐZ_Ö`ñ .Bô ˆ}Ó Ó"à#%ˆDÔ Øà$ QÑ'ˆàŸ~™~Ó-Ü˜x¨ ~°^ÀDÇNÁNÐCSÐTÓUÐUä  ×!5Ñ!5°lÑ!CÈÔEWÔXØ+ÕrM   c                ó  • XR                   ;  a  g[        U[        [        45      (       a7  [	        U5      S:”  a(  U R
                  R                  n[        SU SU S35      eXR                  ;   a  U R                  R                  U5        U(       d  U R                   U	 / U l
        gUS   nX@R                   ;  a  U R                   U	 / U l
        gX@R                  S   :w  a  U R                  U5        U R                   U	 g)á  
Delete the adapter if present.

This method will also set a new active adapter if the deleted adapter was the active adapter. It is important
that the new adapter is chosen by the caller in a deterministic way, so that the same adapter is chosen on all
layers.
Nr   r¡  ú) adapters at once for ú, which is not allowed.r   )rt  r•   rs   Útuplerw   rl   rm   r�   rª   Úremover§   r×   r>  ©r®   r°   rA  rƒ   Únew_active_adapters        rN   rB  Ú#ModulesToSaveWrapper.delete_adapterÃ  s  € ð ×3Ñ3Ó3Øô Ð)¬D´%¨=×9Ñ9¼cÐBUÓ>VÐYZÓ>ZØ—>‘>×*Ñ*ˆDÜØ-Ð.AÐ-BÐBYÐZ^ÐY_Ð_vÐwóð ð Ÿ>™>Ó)Ø�N‰N×!Ñ! ,Ô/æ"à×$Ñ$ \Ð2Ø#%ˆDÔ Øà0°Ñ3ÐØ×%9Ñ%9Ó9à×$Ñ$ \Ð2Ø#%ˆDÔ Øà×!5Ñ!5°aÑ!8Ó8Ø×ÑÐ/Ô0Ø× Ñ  Ñ.rM   c                ó–   • XR                   ;  a  0 $ U R                  U   R                  5        Vs0 s H  o"SU SU 3_M     sn$ s  snf ©Nzmodules_to_save.r  ©rª   rt  Ú
state_dict)r®   r°   rõ   s      rN   rP  Ú0ModulesToSaveWrapper.adapter_state_dict_load_mapê  sU   € ð Ÿ~™~Ó-ð ˆIØBF×BVÑBVÐWcÑBd×BoÑBoÔBqÓrÒBq¸QÐ% l ^°1°Q°CÐ8Ò8ÑBqÑrÐrùÒrs   ±Ac           	     óœ   • XR                   ;  a  0 $ U R                  U   R                  5        Vs0 s H  nX2SU SU 3   _M     sn$ s  snf r®  r¯  ©r®   r°   r°  rõ   s       rN   rM  Ú'ModulesToSaveWrapper.adapter_state_dictó  sd   € ØŸ~™~Ó-ð ˆIð ×)Ñ)¨,Ñ7×BÑBÔDó
âD�ð Ð,¨\¨N¸!¸A¸3Ð?Ñ@Ò@ÙDñ
ð 	
ùò 
s   ±A	c                ó¦   • U R                   U R                     n[        US5      (       a&  U(       a  UR                  X#S9  UR	                  5       nU$ )z¢Unloading in case of `ModulesToSave` means to simply return the wrapped module.

However, if the wrapped module is itself a tuner, we'll call merge on it before.
Ú
base_layer©rU  rú   )rt  rÓ   rI   rT  Úget_base_layer)r®   rT  rU  rú   Ú
new_modules        rN   rV  Ú7ModulesToSaveWrapper.unload_and_optionally_merge_moduleþ  sQ   € ð ×)Ñ)¨$×*=Ñ*=Ñ>ˆ
ô �:˜|×,Ñ,æØ× Ñ ¨JÐ ÑTØ#×2Ñ2Ó4ˆJàÐrM   c                óH   • [        U R                  R                  5       5      $ rº   )r©   rt  rï   r»   s    rN   r¼   Ú,ModulesToSaveWrapper._get_available_adapters  s   € ä�4×'Ñ'×,Ñ,Ó.Ó/Ð/rM   )r§   rt  rÎ   r]  r^  r`  ra  rc  rf  rX  )rm   rh  ri  rj  rk  rŸ   rl  r¥   r«   r¿   r  r  r
  rÜ   rß   r¬   r3  r8  r>  rB  rP  rM  rV  r¼   rn  ro  rp  s   @rN   rr  rr  4  s˜   ø‡ Ùoð ,@Ð˜Ó?÷Pò7ò!òQò
Hò8òEòR÷#O÷J8ô#ö2 ,ôD%/òNsò	
ðØðØ'+ðØ<Oðà	ô÷&0ò 0rM   rr  c                  ó  ^ • \ rS rSr% SrSrS\S'   SrS\S'    S       SU 4S jjjr\	S	 5       r
S
 rS rS rS rS rS rS rU 4S jrS rS rSU 4S jjrSS jrSS U 4S jjjrS!S jr        S"S jrS#S jrSrU =r$ )$ÚTrainableTokensWrapperi  a(  Wraps a module (typically an embedding layer) that is supposed to be re-trained selectively (i.e.
solely updating a few columns) using the `TrainableTokensLayer` PEFT method.

Supports weight-tying to another adapter when passed a `tied_adapter` which is expected to be a
`TrainableTokensLayer`.
)ú$token_adapter.trainable_tokens_deltarž   rŸ   )ztoken_adapter.token_indicesz'token_adapter.trainable_tokens_originalr    c                ó0   >• [         TU ]  XX4S9  S U l        g )N)Útoken_indicesÚtied_adapter)r¤   r¥   r¦   )r®   r¯   r°   rÁ  rÂ  rl   s        €rN   r¥   ÚTrainableTokensWrapper.__init__"  s!   ø€ ô 	‰Ñ˜À]ÐÑnð  $ˆÕrM   c                ó.   • U R                   R                  $ rÎ   )Útoken_adapterr¶  r»   s    rN   r¦   Ú&TrainableTokensWrapper.original_module.  s   € ð ×!Ñ!×,Ñ,Ð,rM   c                óB   • SSK Jn  U" U R                  XU5      U l        g )Nr   )ÚTrainableTokensLayer)Úpeft.tuners.trainable_tokensrÈ  r¦   rÅ  )r®   r°   rÁ  rÂ  rÈ  s        rN   r«   Ú#TrainableTokensWrapper.init_modules4  s   € åEñ 2°$×2FÑ2FÈÐeqÓrˆÕrM   c                ó   • g)NÚtrainable_token_indicesrL   r»   s    rN   r¿   Ú*TrainableTokensWrapper._error_message_name<  s   € Ø(rM   c                ó   • US:H  $ )Nr�  rL   rÚ   s      rN   rÜ   Ú'TrainableTokensWrapper._hasattr_wrapped?  s   € Ø�xÑÐrM   c                ó|   • US:X  a(  US   R                  U R                  R                  5      $ [        SU S35      e)Nr�  rÅ  zWThis code should've never been reached, probably a bad check in `_hasattr_wrapped` for zH. Please file an issue under https://github.com/huggingface/peft/issues.)Úget_merged_weightsrÅ  r×   ÚRuntimeErrorrÚ   s      rN   rß   Ú'TrainableTokensWrapper._getattr_wrappedB  sQ   € ð �8ÓØ˜?Ñ+×>Ñ>¸t×?QÑ?Q×?aÑ?aÓbÐbäØeÐfjÐekð lUð Uó
ð 	
rM   c                ór   • U R                   (       d  U R                  " U/UQ70 UD6$ U R                  U5      $ rÎ   )r×   r
  rÅ  r  s       rN   r  Ú'TrainableTokensWrapper._forward_wrappedN  s7   € Ø×#×#Ø×4Ò4°QÐH¸ÒHÀÑHÐHØ×!Ñ! !Ó$Ð$rM   c                ó:   • U R                   R                  X/5      $ rÎ   )rÅ  Úforward_adaptersr  s        rN   r  Ú3TrainableTokensWrapper._forward_wrapped_mixed_batchS  s   € Ø×!Ñ!×2Ñ2°1Ð6FÓGÐGrM   c                ó.   • U R                   " U/UQ70 UD6$ rÎ   )rÅ  r  s       rN   r
  Ú3TrainableTokensWrapper._forward_wrapped_passthroughV  s   € ð ×!Ò! !Ð5 dÒ5¨fÑ5Ð5rM   c                ó|   >• XR                   ;  a  U R                  R                  " U40 UD6  [        TU ]  U5        g rÎ   )rª   rÅ  Úupdate_layerr¤   r¬   )r®   rÓ   r±   rl   s      €rN   r¬   ÚTrainableTokensWrapper.update[  s4   ø€ ð §¡Ó/Ø×Ñ×+Ò+¨NÑE¸fÒEä‰‰�~Õ&rM   c                óJ   • U R                   R                  (       a  0 $ SSU 30$ )Nr¿  z%token_adapter.trainable_tokens_delta.©rÅ  rÂ  r7  s     rN   rP  Ú2TrainableTokensWrapper.adapter_state_dict_load_mapc  s+   € Ø×Ñ×*×*ØˆIØ6Ð:_Ð`lÐ_mÐ8nÐoÐorM   c           	     ó†   • U R                   R                  (       a  0 $ S Vs0 s H  nSU 3USU SU 3   _M     sn$ s  snf )N)Útrainable_tokens_deltaztoken_adapter.r  rß  r³  s       rN   rM  Ú)TrainableTokensWrapper.adapter_state_dicth  s]   € Ø×Ñ×*×*ð ˆIñ \vó
Ú[uÐVWˆn˜Q˜CÐ  *¨~¸a¸SÀÀ,ÀÐ-PÑ"QÒQÑ[uñ
ð 	
ùò 
s   ¢>c                óZ   >• [         TU ]  U5        U R                  R                  U5        g)zkEnables/disables the underlying `TrainableTokens` adapter.
Also handles the internal adapter disable flag.
N)r¤   r3  rÅ  )r®   r2  rl   s     €rN   r3  Ú&TrainableTokensWrapper.enable_adapterss  s&   ø€ ô 	‰Ñ Ô(à×Ñ×*Ñ*¨7Õ3rM   c                ó>  • [        U[        5      (       a  U$ [        U5      S:X  a  [        S5      eU Vs/ s H   o"U R                  R
                  ;   d  M  UPM"     nn[        U5      S:”  a  [        SU  S[        U5       35      eU(       d  SnU$ US   nU$ s  snf rš  )r•   rÖ   rw   r�   rÅ  râ  r›  s        rN   r8  Ú(TrainableTokensWrapper.check_set_adapter{  sµ   € ô
 �l¤C×(Ñ(ØÐô ˆ|Ó Ó!ÜÐIÓJÐJñ /;Ó"mªl¨À4×CUÑCU×ClÑClÑ>l§1©lÐÐ"mäÐ&Ó'¨!Ó+ÜÐIÈ$ÈÈvÔVYÐZqÓVrÐUsÐtÓuÐuö 'Ø"&Ðð #Ð"ð #:¸!Ñ"<Ðà"Ð"ùò #ns   ¶BÁBc                óR   >• [         TU ]  XS9  U R                  R                  XS9  g )N©r=  )r¤   r>  rÅ  )r®   rú   r=  rl   s      €rN   r>  Ú"TrainableTokensWrapper.set_adapter•  s*   ø€ Ü‰Ñ˜MÐÑIØ×Ñ×&Ñ& }Ð&ÒTrM   c                óÆ  • U R                   R                  U5        [        U[        [        45      (       a7  [        U5      S:”  a(  U R                  R                  n[        SU SU S35      eXR                  ;   a  U R                  R                  U5        U(       d  / U l        gUS   U R                   R                  ;  a  / U l        gUS   nU R                  U5        g)r¥  r   r¡  r¦  r§  Nr   )rÅ  rB  r•   rs   r¨  rw   rl   rm   r�   rª   r©  r§   râ  r>  rª  s        rN   rB  Ú%TrainableTokensWrapper.delete_adapter™  sØ   € ð 	×Ñ×)Ñ)¨,Ô7ô Ð)¬D´%¨=×9Ñ9¼cÐBUÓ>VÐYZÓ>ZØ—>‘>×*Ñ*ˆDÜØ-Ð.AÐ-BÐBYÐZ^ÐY_Ð_vÐwóð ð Ÿ>™>Ó)Ø�N‰N×!Ñ! ,Ô/æ"Ø#%ˆDÔ Øà˜qÑ!¨×);Ñ);×)RÑ)RÓRà#%ˆDÔ Øà0°Ñ3ÐØ×ÑÐ+Õ,rM   c                óv   • U(       a  U R                   R                  X#S9  U R                   R                  5       $ )z¶Unloading for `TrainableTokensWrapper` means to return the wrapped module, e.g. the embedding layer and,
if requested, merging the `TrainableTokens` adapter onto the wrapped module.
r·  )rÅ  rT  r¸  rS  s       rN   rV  Ú9TrainableTokensWrapper.unload_and_optionally_merge_moduleº  s3   € ö Ø×Ñ×$Ñ$°
Ð$ÑXØ×!Ñ!×0Ñ0Ó2Ð2rM   c                ó\   • [        U R                  R                  R                  5       5      $ rº   )r©   rÅ  râ  rï   r»   s    rN   r¼   Ú.TrainableTokensWrapper._get_available_adaptersÄ  s"   € ä�4×%Ñ%×<Ñ<×AÑAÓCÓDÐDrM   )r§   r¦   rÅ  rÎ   )r¯   rg  r°   rÖ   rÁ  z	list[int]rY  rb  r]  r^  r`  ra  rc  rf  rX  )rm   rh  ri  rj  rk  rŸ   rl  r    r¥   rm  r¦   r«   r¿   rÜ   rß   r  r  r
  r¬   rP  rM  r3  r8  r>  rB  rV  r¼   rn  ro  rp  s   @rN   r¾  r¾    sì   ø‡ ñð ,UÐ˜ÓTØ)sÐ�Ósð ð
$à'ð
$ð ð
$ð !ð	
$ð 
÷
$ð 
$ð ñ-ó ð-ò
sò)ò ò

ò%ò
Hò6õ
'òpò
	
÷4ô#÷4Uñ Uô-ðB3Øð3Ø'+ð3Ø<Oð3à	ô3÷Eò ErM   r¾  c                óŽ   • [        U S5      (       d  U$ U R                  5       nU R                  5        H  u  p4XBL d  M  Us  $    U$ )Nrq   )rI   rq   Únamed_modules)r{   ÚdefaultÚinput_embeddingsrƒ   r_   s        rN   Ú_get_input_embeddings_namerõ  É  sK   € Ü�5Ð0×1Ñ1Øˆà×1Ñ1Ó3ÐØ×+Ñ+Ö-‰ˆØÔ%ØŠKñ .ð €NrM   c                ó¸   • U R                  SR                  UR                  S5      S S 5      5      nUR                  S5      S   nU R                  U5      nX$U4$ )Nr  r‰   )Úget_submoduler  Úsplit)r{   rI  ÚparentÚtarget_nameÚtargets        rN   Ú_get_submodulesrü  Õ  sW   € Ø× Ñ  §¡¨#¯)©)°C«.¸¸"Ð*=Ó!>Ó?€FØ—)‘)˜C“. Ñ$€KØ× Ñ  Ó%€FØ˜;Ð&Ð&rM   c                óB  • U R                  SR                  UR                  S5      S S 5      5      n U R                  SR                  UR                  S5      S S 5      5      nUR                  S5      S   nU R                  U5      nX#XT4$ ! [         a    S n N7f = f)Nr  r‰   éþÿÿÿ)r÷  r  rø  rå   )r{   rI  rù  Úgrandparentrú  rû  s         rN   Ú _get_submodules_with_grandparentr   Ü  sœ   € Ø× Ñ  §¡¨#¯)©)°C«.¸¸"Ð*=Ó!>Ó?€FðØ×)Ñ)¨#¯(©(°3·9±9¸S³>À#À2Ð3FÓ*GÓHˆð —)‘)˜C“. Ñ$€KØ× Ñ  Ó%€FØ Ð3Ð3øô ó àŠðús   ´2B ÂBÂBc                óR   • U R                  5        H  u  p#X;   d  M  SUl        M     g )NF)rf   rg   )r{   r°   rœ  Úps       rN   Ú_freeze_adapterr  è  s$   € Ø×&Ñ&Ö(‰ˆØÕØ#ˆAŽOò )rM   c           
     óœ  ^• SSK Jn  Uc  [        nU(       d  g/ n	[        5       n
U R	                  SS9 VVs/ s H  u  p¼UPM	     nnnU GH@  m[        U4S jU 5       5      nU(       d  M"  [        U T5      u  nnnn[        UU5      (       a  [        SU S[        U5       S	U S
35      e[        UU5      (       a.  UR                  " U40 UD6  UR                  UR                  US9  OŽ[        UU5      (       a.  UR                  " U40 UD6  UR                  UR                  US9  OOU" UU40 UD6nU(       a  UR                  XS9  OUR                  / US9  [        UUU5        U	R                  U5        U
R                  U5        GMC     [        U5      R!                  U
5      nU(       a  U
(       d  [        SU S35      eU	$ s  snnf )aM  Wraps modules that are supposed to be re-trained either normally, i.e. marking them to require gradients and
saving them alongside other modules, or with certain methods that go alongside PEFT methods, such as retraining
specific token indices using selective read/write.

Note that you need to validate beforehand if there are layers targeted by multiple wrappers, e.g. if the
'embedding' layer is configured for both `ModulesToSaveWrapper` and `TrainableTokensWrapper` there would be
conflicts down the line.

The default is to wrap the module in a `ModulesToSaveWrapper` wrapper.

If `strict_module_check` is set, this method raises an ValueError, similar to BaseTuner.inject_adapter when none of
the requested modules in `module_names` is not found in the model.

The `active_adapter` flag indicates if this new adapter should be activated.
r   rÂ   NF©Úremove_duplicatec              3  óF   >#   • U  H  nTR                  U5      v •  M     g 7frÎ   )Úendswith)r*  Ú
target_keyrI  s     €rN   r+  Ú!_set_trainable.<locals>.<genexpr>  s   øé € Ð!ZÊ\¸z #§,¡,¨z×":Ð":Ê\ùs   ƒ!z'You are trying to target a module with z that is a child of z\. This is almost certainly not the intended behavior. Please ensure that the adapter name, 'z6', does not conflict with any of the targeted modules.ré  zTarget modules zL not found in the base model. Please check the target modules and try again.)rÉ   rÃ   rr  r©   rò  r.  r   r•   r�   rç   r¬   r>  rÓ   Úsetattrr  rê   Ú
difference)r{   r°   r  r=  Ústrict_module_checkÚwrapper_clsÚactivate_adapterÚwrapper_kwargsrÃ   Útrainable_modulesÚfound_modulesrI  r!  Úkey_listÚtarget_module_foundrù  rÿ  rû  rú  r¹  Ú	not_founds              `         rN   Ú_set_trainabler  î  sæ  ø€ õ2 8àÑÜ*ˆæð 	àÐÜ“E€Mà"'×"5Ñ"5ÀuÐ"5Ñ"MÔNÒ"M™˜“Ñ"M€HÑNäˆÜ!Ô!ZÉ\Ó!ZÓZÐßÐÜ7WÐX]Ð_bÓ7cÑ4ˆF�K ¨Ü˜+ ~×6Ñ6ô !Ø=¸k¸]ÐJ^Ô_cÐdoÓ_pÐ^qð rà$�~Ð%[ð]óð ô ˜+ {×3Ñ3Ø×"Ò" <ÑB°>ÒBØ×'Ñ'¨×(BÑ(BÐSaÐ'ÒbÜ˜F K×0Ñ0Ø—’˜lÑ=¨nÒ=Ø×"Ñ" 6×#8Ñ#8ÈÐ"ÒXá(¨°ÑPÀÑP�
Þ#Ø×*Ñ*¨<Ð*ÒWà×*Ñ*¨2¸nÐ*ÑMÜ˜ ¨ZÔ8Ø!×(Ñ(¨Ô4Ø×Ñ˜k×*ñM ôP �LÓ!×,Ñ,¨]Ó;€IÞ¦=ÜØ˜i˜[Ð(tÐuó
ð 	
ð Ðùóa Os   ·Gc                óâ   • U R                  5        H[  n[        U[        5      (       d  M  UR                  U5      nXCR                  ;   a  UR                  XBS9  MK  UR                  / US9  M]     g)z8Call set_adapter on the AuxiliaryTrainingWrapper modulesré  N)rÛ   r•   r�   r8  rª   r>  )r{   r°   r=  r_   rž  s        rN   Ú_set_adapterr  G  sd   € à—-‘-–/ˆÜ�fÔ6×7Ó7à"(×":Ñ":¸<Ó"HÐð #×&6Ñ&6Ó6Ø×"Ñ"Ð#6Ð"ÓVà×"Ñ" 2°nÐ"ÓEò "rM   c                ó>  • Un[        US5      (       a  UR                  5       nOUnSU;   a  US   nU R                  cS  [        US5      (       a  UR                  nO/SU;   a  US   nO#SU;   a  US   nOSU;   a  US   nO[	        S5      eX0l        U R
                  c5  SU;   a  US   nO#SU;   a  US   nOS	U;   a  US	   nO[	        S
5      eX@l        U R                  cA  SU;   a  US   nO/SU;   a  US   nO#SU;   a  US   nOSU;   a  US   nO[	        S5      eXPl        U R                  S;   aL  SU;   aF  US   nUR                  SS 5      b  US   nOU R
                  U R                  -  nXv-  U l        X`l        [        U SS 5      c  U R
                  U l
        U $ )NÚto_dictÚtext_configÚnum_hidden_layersÚ
num_layersÚn_layerz,Please specify `num_layers` in `peft_config`Úhidden_sizeÚn_embdÚd_modelz+Please specify `token_dim` in `peft_config`Únum_attention_headsÚn_headÚ	num_headsÚencoder_attention_headsz5Please specify `num_attention_heads` in `peft_config`>   Ú	CARTRIDGEÚPREFIX_TUNINGÚnum_key_value_headsÚhead_dimÚencoder_hidden_size)rI   r  r  r  r�   Ú	token_dimr"  Ú	peft_typerû   re   r*  )Úpeft_configÚmodel_configÚorig_model_configr  r+  r"  r(  r)  s           rN   Ú_prepare_prompt_learning_configr0  V  sù  € Ø$ÐÜˆ|˜Y×'Ñ'Ø#×+Ñ+Ó-‰à#ˆð ˜Ó$Ø# MÑ2ˆà×ÑÑ%ÜÐ$Ð&9×:Ñ:à*×<Ñ<‰JØ  LÓ0Ø%Ð&9Ñ:‰JØ˜\Ó)Ø% lÑ3‰JØ˜,Ó&Ø% iÑ0‰JäÐKÓLÐLØ!+Ôà×ÑÑ$Ø˜LÓ(Ø$ ]Ñ3‰IØ˜Ó%Ø$ XÑ.‰IØ˜,Ó&Ø$ YÑ/‰IäÐJÓKÐKØ )Ôà×&Ñ&Ñ.Ø  LÓ0Ø".Ð/DÑ"EÑØ˜Ó%Ø".¨xÑ"8ÑØ˜LÓ(Ø".¨{Ñ";ÑØ&¨,Ó6Ø".Ð/HÑ"IÑäÐTÓUÐUØ*=Ô'ð 	×ÑÐ!?Ó?ÐF[Ð_kÓFkØ*Ð+@ÑAÐØ×Ñ˜J¨Ó-Ñ9Ø# JÑ/‰Hà"×,Ñ,°×0OÑ0OÑOˆHØ (Ñ >ˆÔØ*=Ô'äˆ{Ð1°4Ó8Ñ@Ø*5×*?Ñ*?ˆÔ'àÐrM   c                ó¶  • [        5       n[        U S5      (       d  U$ [        (       a  U R                  $ U /n[	        U5      S:”  a’  UR                  S5      nUR                  R                  U;  aV  [        U[        5      (       a%  UR                  b  U[        UR                  5      -  nU[        UR                  5       5      -  n[	        U5      S:”  a  M’  U$ )zÜ
Get the modules of the model that should not be split when using device_map. We iterate through the modules to get
the underlying `_no_split_modules`.

Returns:
    `List[str]`: List of modules that should not be split
Ú_no_split_modulesr   r‰   )r©   rI   r   r2  rw   r-  rl   rm   r•   r   rs   Úchildren)r{   r2  Úmodules_to_checkr_   s       rN   Ú_get_no_split_modulesr5  —  sÍ   € ô #&£%ÐÜ�5Ð-×.Ñ.Ø Ð ç Ò à×&Ñ&Ð&ð �wÐÜ
ÐÓ
 !Ó
#Ø!×%Ñ% bÓ)ˆà×Ñ×$Ñ$Ð,=Ó=Ü˜&¤/×2Ñ2Ø×+Ñ+Ñ7Ø(9¼CÀ×@XÑ@XÓ<YÑ(YÐ%Ø¤ V§_¡_Ó%6Ó 7Ñ7Ðô ÐÓ
 !Õ
#ð ÐrM   c                ó*  • [        [        S5      (       a  [        R                  nOSSKJn  SSKJnJnJn  SSKJ	nJ
nJnJn  SR                  [        U 5      5      n	[        R                   R#                  SU	5      R%                  S5      n
XVX‡1nU
 H;  n['        U5      S:X  a  M  U" X5      nUc  [)        S	5      eUR+                  U5        M=     S
 n[,        R.                  " X>S9n[,        R.                  " UUS9n[,        R.                  " X/U/S9nU$ )NÚget_module_class_from_namer   )r7  )Ú
_or_policyÚlambda_auto_wrap_policyÚtransformer_auto_wrap_policyr   )ÚCartridgeEncoderÚPrefixEncoderÚPromptEmbeddingÚPromptEncoderÚ,ÚFSDP_TRANSFORMER_CLS_TO_WRAPz@Could not find the transformer layer class to wrap in the model.c                ó¤   • [        [        U R                  5       5      5      S:X  a*  [        U SS 5      b  U R                  R
                  (       a  gg)Nr   r�  TF)rw   rs   Únamed_childrenre   r�  rg   )r_   s    rN   Úlambda_policy_fnÚ/fsdp_auto_wrap_policy.<locals>.lambda_policy_fnÍ  s?   € ä”�V×*Ñ*Ó,Ó-Ó.°!Ó3Ü˜ ¨$Ó/Ñ;Ø—‘×+×+àØrM   )Ú	lambda_fn)Útransformer_layer_cls)Úpolicies)rI   r
   r7  Úaccelerate.utils.dataclassesÚtorch.distributed.fsdp.wrapr8  r9  r:  Útunersr;  r<  r=  r>  r  r5  ÚosÚenvironrû   rø  rw   Ú	Exceptionrê   Ú	functoolsÚpartial)r{   r7  r8  r9  r:  r;  r<  r=  r>  Ú%default_transformer_cls_names_to_wrapÚtransformer_cls_names_to_wrapÚtransformer_cls_to_wrapÚlayer_classÚtransformer_clsrC  Úlambda_policyÚtransformer_wrap_policyÚauto_wrap_policys                     rN   Úfsdp_auto_wrap_policyrX  ¶  s  € ÜÔ-Ð/K×LÑLÜ%C×%^Ñ%^Ñ"åKßmÑmçXÓXà,/¯H©HÔ5JÈ5Ó5QÓ,RÐ)Ü$&§J¡J§N¡NØ&Ð(Mó%ç�eˆCƒjð "ð  0ÀÐ_ÐÛ4ˆÜˆ{Ó˜qÓ ÙÙ4°UÓHˆØÑ"ÜÐ^Ó_Ð_à#×'Ñ'¨Ö8ñ 5òô ×%Ò%Ð&=ÑZ€MÜ'×/Ò/Ø$Ø5ñÐô
 !×(Ò(¨ÐNeÐ>fÑgÐØÐrM   c                óÐ   • U(       d  U $ [        U [        R                  R                  5      (       a)  [        R                  R                  U R                  5      $ U R                  $ rÎ   )r•   rG   r–   r—   ÚT)r�  Úfan_in_fan_outs     rN   Ú	transposer\  à  sC   € ÞØˆä�&œ%Ÿ(™(×,Ñ,×-Ñ-Ü�x‰x×!Ñ! &§(¡(Ó+Ð+Ø�8‰8€OrM   c                óŠ   • U R                  U5      (       a-  [        U 5      [        U5      :”  a  U R                  SU-   5      $ gg)zœ
Helper function to match module names target_key and key. Makes sure that either the key is exactly the target_key
or the target_key is a submodule of key
r  TF)r  rw   )rI  r	  s     rN   Ú_is_valid_matchr^  é  s=   € ð
 ‡|�|�J×ÑÜˆs‹8”c˜*“oÓ%Ø—<‘<  jÑ 0Ó1Ð1ØØrM   c                ón   • U c  Uc  [        S5      eU b  U R                  S   nU$ UR                  S   nU$ )zfGet the batch size based on either input_ids or input_embeds

Raises an ValueError if both are None.

z5You have to provide either input_ids or inputs_embedsr   )r�   r‹   )r�   Úinputs_embedsÚ
batch_sizes      rN   Ú_get_batch_sizerb  õ  sO   € ð 	Ñ Ñ 5ÜÐPÓQÐQàÑØ—_‘_ QÑ'ˆ
ð Ðð #×(Ñ(¨Ñ+ˆ
ØÐrM   c                óª   • [        U S5      (       aB  [        U R                  S5      (       a'  [        U SS5      U:X  a  U R                  R                  $ g)z@
Get the quantization config of the related quantization method
ÚconfigÚquantization_configrS   N)rI   rd  re   re  )r{   Úmethods     rN   Úget_quantization_configrg    sH   € ô
 	��x× Ñ Ü�E—L‘LÐ"7×8Ñ8Ü�UÐ1°4Ó8¸FÓBà�|‰|×/Ñ/Ð/ØrM   c                ót  • U c  g[        5       (       d  gSSKJn  SSKJn  SSKJn  U R                  nU R                  nU R                  n[        U S5      (       a  U R                  OSnU R                  n	[        U S5      (       a  U R                  OSn
U" UUUU	UUUR                  U
UR                  S	S
9
nU$ )zK
Get the right GPTQQuantLinear class based on the quantization config file
Nr   )ÚBACKEND)ÚMETHOD)Úhf_select_quant_linear_v2Úcheckpoint_formatrT   ÚmetaF)
ÚbitsÚ
group_sizeÚdesc_actÚsymÚ
device_mapÚformatÚquant_methodrm  ÚbackendÚpack)r   Ú	gptqmodelri  Úgptqmodel.quantizationrj  Úgptqmodel.utils.importerrk  rp  ro  rn  rI   rl  rq  rm  ÚGPTQÚAUTO_TRAINABLE)Úgptq_quantization_configrr  ri  rj  rk  rp  ro  rn  rl  rq  rm  ÚQuantLinears               rN   Úget_gptqmodel_quant_linearr~    sÊ   € ð  Ñ'Øä!×#Ñ#Øå!Ý-ÝBà'×0Ñ0€HØ)×4Ñ4€JØ#×(Ñ(€Dô Ð+Ð-@×AÑAð 	!×2Ò2àð ð
 #×
&Ñ
&€CÜ,3Ð4LÈf×,UÑ,UÐ#×(Ò(Ð[_€Dá+ØØØØØØ Ø—[‘[ØØ×&Ñ&Øñ€Kð ÐrM   c                óÚ   • U R                   R                  S:X  a/  [        5       (       a   SSKnUR                  R                  U 5      nO[        U 5      nU R                   U[        U 5      4$ )ad  
Unique identifier to a tensor storage. Multiple different tensors can share the same underlying storage. For
example, "meta" tensors all share the same storage, and thus their identifier will all be equal. This identifier is
guaranteed to be unique and constant for this tensor's storage during its lifetime. Two tensor storages with
non-overlapping lifetimes may have the same id.

This method is the exact same copy of
https://github.com/huggingface/transformers/blob/main/src/transformers/pytorch_utils.py#L282C1-L300C58 but we added
it here manually to avoid import issue with old versions of transformers.
Úxlar   N)Údevicerç   r   Ú	torch_xlaÚ_XLACÚ_xla_get_tensor_idr   r   )Útensorr‚  Ú	unique_ids      rN   Úid_tensor_storager‡  ;  sX   € ð ‡}�}×Ñ˜UÓ"Ô'=×'?Ñ'?ó
 	à—O‘O×6Ñ6°vÓ>‰	ä Ó'ˆ	à�=‰=˜)¤\°&Ó%9Ð9Ð9rM   c                óÌ   • U R                  5        HP  nUR                  (       d  UR                  U5      Ul        M,  UR                  [        R
                  5      Ul        MR     g)a  
Cast all non-trainable parameters of the model to the given `dtype`. The `dtype` can be `torch.float16` or
`torch.bfloat16` as per the mixed-precision training you are performing. The trainable parameters are cast to full
precision. This is meant to reduce the GPU memory usage when using PEFT methods by using half-precision dtype for
non-trainable parameters. Having the trainable parameters in full-precision preserves training stability when using
automatic mixed-precision training.

Args:
    model (`torch.nn.Module`):
        The model to cast the non-trainable parameters of.
    dtype (`torch.dtype`):
        The dtype to cast the non-trainable parameters to. The `dtype` can be `torch.float16` or
`torch.bfloat16` as per the mixed-precision training you are performing.
N)rh   rg   ro   rn   rG   rp   )r{   ri   r  s      rN   Úcast_mixed_precision_paramsr‰  T  sA   € ð ×ÑÖˆØ��Ø—T‘T˜%“[ˆAŽFà—T‘Tœ%Ÿ-™-Ó(ˆAŽFò	  rM   c                óZ   • U R                  5       n U S;   a  gU S;   a  g[        SU  35      e)z»
Converts a string representation of truth to `True` (1) or `False` (0).

True values are `y`, `yes`, `t`, `true`, `on`, and `1`; False value are `n`, `no`, `f`, `false`, `off`, and `0`;
)ÚyÚyesÚtÚtrueÚonÚ1r   )rœ  ÚnoÚfÚfalseÚoffÚ0r   zinvalid truth value )Úlowerr�   )Úvalues    rN   Ústr_to_boolr˜  j  s:   € ð �K‰K‹M€EØÐ4Ó4ØØ	Ð7Ó	7ØäÐ/°¨wÐ7Ó8Ð8rM   c           
     ó  • Sn[        [        R                  R                  SS5      5      (       a  U$  [	        X40 UD6nU$ ! [
        [        4 a     U$ [         a+  n[        R                  " SU SU SU  S35         SnAU$ SnAff = f)zCheck if a file exists on HF Hub, if check was not successful returns None instead of erroring.

Respect offline mode if set.

NÚHF_HUB_OFFLINEr•  z7Unable to fetch remote file due to the following error z- - silently ignoring the lookup for the file z in r  )
r˜  rK  rL  rû   r   r   r   rM  rx   ry   )Úrepo_idÚfilenamer±   ÚexistsÚes        rN   Úcheck_file_exists_on_hf_hubrŸ  z  s§   € ð "€FÜ”2—:‘:—>‘>Ð"2°CÓ8×9Ñ9àˆð	
Ü˜WÑ9°&Ñ9ˆð €Møô Ô1Ð2ó àð €Mô ó 
Ü�ŠØEÀaÀSð IØ%˜J d¨7¨)°1ð6÷	
ð 	
ð
 €Mûð
ús   ´A ÁB	Á	B	Á BÂB	c                ó.   • [         R                  " X5      $ )z©Backing function for `target_modules` config parameter.

Having this as its own function ensures that target key matching can be implemented in the same way everywhere.
)ÚreÚ	fullmatch)Útarget_patternrI  s     rN   Úmatch_target_against_keyr¤  “  s   € ô
 �<Š<˜Ó,Ð,rM   c                ód   • U  H)  n[         R                  " SU S3U5      nU(       d  M'  Us  $    U$ )z1Match a substring of key_to_match in pattern keysz(.*\.)?(z)$)r¡  Úmatch)Úpattern_keysÚkey_to_matchrI  r¦  s       rN   Úget_pattern_keyr©  ›  s8   € ãˆÜ—’˜H S E¨Ð,¨lÓ;ˆÞÙØŠ
ñ	 ð ÐrM   c                óx  ^^^• [        USS5      b"  [        U UUR                  [        USS5      US9  [        USS5      bG  [        U R                  5       R                  U5      n[        U UUR                  [        USS5      UUS9  [        USS5      Gb  [        UR                  [        5      (       a  UR                  mO[        U S5      nXaR                  0m[        USS5      nUb   T H  nX‡;   d  M
  [        SU S	U S
35      e   UR                  SS5      n	[        USS5      n
Sn[        5       n/ n[        T5      S:”  GaY  U	(       GaQ  [        [        U 5      5      nU R                  5       m[        U4S jU R                  5        5       5      nT Hs  nUR!                  U5      (       a  UR#                  U5        M,  U HA  nUR!                  U5      (       d  X…R%                  S5      ;   d  M/  UR#                  U5          Mq     Mu     [        U5      S:¼  a‚  TUS      m['        UU4S jUSS  5       5      (       + nU(       a@  U
(       a9  SR)                  U Vs/ s H  nU STU    3PM     sn5      n[        SU S35      eU(       d  [        U5      U-  nTR+                  5        H,  u  nnXŒ;   a  M  [        U UUR                  U/S[,        UUS9  M.     U	(       d  U
(       a  [.        R0                  " S5        U	=(       a5    [        U R                  5       [,        5      =(       a    U
=(       d    U(       + nU(       ai  [        U 5      nU R                  5       R2                  n[        U UUR                  US[,        UR4                  U   U R                  5       R2                  S9  gggs  snf )aµ  Handle the resolution of additional trainable modules (also called AuxiliaryTrainingWrapper)
by checking the config if such modules are requested and adding them to the model.

Currently trainable tokens and modules to save are considered additional trainable modules.

If `activate_adapter` is set to `False`, the adapter won't be activated. This is typically the case when
`model.add_adapter` or `model.load_adapter` are being called.
rt  N)r=  r  r  Úmodules_to_tie)r=  r  r  rv  rÌ  Úembed_tokenszbThe embedding layer is already marked to be trained fully, either specify `modules_to_save=[..., "z ", ...]` or `trainable_tokens={'z': x}` but not both.Útie_word_embeddingsFÚensure_weight_tyingr   c              3  ó:   >#   • U  H  u  pUTL d  M  Uv •  M     g 7frÎ   rL   )r*  rœ  ÚmÚembedding_modules      €rN   r+  Ú3set_additional_trainable_modules.<locals>.<genexpr>è  s   øé € Ð!_Ò0E©¨ÈÐN^ÐI^§!¡!Ò0Eùs   ƒ’	r  r   r   c              3  ó4   >#   • U  H  nTU   T:H  v •  M     g 7frÎ   rL   )r*  rI  Úfirst_indicesÚtarget_layerss     €€rN   r+  r²  û  s   øé € Ð*nÒZmÐSV¨=¸Ñ+=ÀÖ+NÒZmùs   ƒr  z: zkCannot ensure weight tying when different token indices are specified for tied layers. Conflicting layers: zS. Please use the same indices for all tied layers or set ensure_weight_tying=False.T)r=  r  r  r  rÁ  r  zœensure_weight_tying=True but the model does not have tied weights (tie_word_embeddings=False). Weight tying will not be applied for trainable_token_indices.)r=  r  r  r  rÁ  rÂ  )re   r  r=  rq   rt  r•   rÌ  Údictrõ  r�   rû   r©   rw   Ú%_get_module_names_tied_with_embeddingÚnextrò  r  r  rø  Úallr  rE  r¾  rx   ry   rÅ  rÁ  )r{   r-  r.  r°   r  rv  rG  rt  Útarget_layer_nameÚweights_tiedr®  Úindices_mismatchÚlayers_to_skipÚtied_layer_keysÚtied_module_namesÚembedding_namerI  Útied_layers_inforÁ  Úshould_apply_tyingÚtied_weights_module_namesrÅ  r±  r´  rµ  s                         @@@rN   Ú set_additional_trainable_modulesrÄ  ¦  sï  ú€ ô ˆ{Ð-¨tÓ4Ñ@äØØØ&×5Ñ5Ü  Ð.?ÀÓFØ-ò	
ô ˆ{Ð,¨dÓ3Ñ?ô ˜e×8Ñ8Ó:×JÑJÈLÓYˆÜØØØ&×5Ñ5Ü  Ð.>ÀÓEØ-Ø#ò	
ô ˆ{Ð5°tÓ<ÒHÜ�k×9Ñ9¼4×@Ñ@Ø'×?Ñ?‰Mä3°E¸>ÓJˆJØ'×)LÑ)LÐMˆMä! +Ð/@À$ÓGˆØÑ&Û%2Ð!Ø$Õ7Ü$ð3Ø3DÐ2Eð F0Ø0AÐ/BÐBWðYóð ñ &3ð $×'Ñ'Ð(=¸uÓEˆÜ% kÐ3HÈ%ÓPÐð !ÐÜ›ˆØˆäˆ}Ó Ô!§lä #Ô$IÈ%Ó$PÓ QÐð  %×9Ñ9Ó;Ðä!Ô!_°×0CÑ0CÔ0EÓ!_Ó_ˆNó &3Ð!ð "×*Ñ*Ð+<×=Ñ=Ø#×*Ñ*Ð+<Ô=Ùã#4�KØ"×+Ñ+Ð,=×>Ñ>ÐBS×WhÑWhÐilÓWmÕBmØ'×.Ñ.Ð/@ÔAÚó $5ñ &3ô �?Ó# qÓ(à -¨o¸aÑ.@Ñ A�Ü'*Õ*nÐZiÐjkÐjlÑZmÓ*nÓ'nÔ#nÐ ö $Ö(;Ø'+§y¡yÑ\kÓ1lÒ\kÐUX°S°E¸¸MÈ#Ñ<NÐ;OÓ2PÑ\kÑ1lÓ'mÐ$Ü$ð/Ø/?Ð.@ð Alðmóð ö (Ü%(¨Ó%9Ð<MÑ%M�Nð 1>×0CÑ0CÖ0EÑ,Ð˜}Ø Ó2ÙäØØØ*×9Ñ9Ø/Ð0Ø$(Ü2Ø+Ø!1ô	ñ	 1Fö  Ö 3Ü�MŠMðmôð ÷ >Ü˜5×5Ñ5Ó7Ô9OÓP÷>à$×<Ð,<Ô(<ð 	ö ô )NÈeÓ(TÐ%Ø!×6Ñ6Ó8×FÑFˆMÜØØØ*×9Ñ9Ø6Ø$(Ü2Ø+×9Ñ9¸,ÑGØ"×7Ñ7Ó9×GÑGó	ð ðC Iùòp 2ms   É$N7c               óf  • [         R                  " [        R                  5      [         R                  " S5      :¬  nU(       a  SSKJn	  O[        S5      e[        X R                  U 5      n
[        U
S5      (       a  U
R                  5       OS n[        U
SS 5      nUc  Ub  [        USS 5      nUcP  [        USS 5      n[        U SU	5      nU" U R                  [        R                  " XV4U R                  S	9UUUUUS
9nU$ U" UUUR                  5       U R                  UUU R                  UUS9	nU$ )Nz4.53.1r   )Úcreate_masks_for_generatezDYour transformers version is too old, please upgrade it to >= 4.53.1Úget_decoderÚ5_prepare_4d_causal_attention_mask_with_cache_positionÚtoken_type_idsrÆ  )ri   )rd  Úinput_embedsÚattention_maskÚcache_positionÚpast_key_valuesrÉ  Úposition_ids)Úsequence_lengthÚtarget_lengthri   rÌ  ra  rd  rÍ  rÎ  )r   ÚparseÚtransformersÚ__version__Útransformers.masking_utilsrÆ  ÚImportErrorre   Úbase_model_prefixrI   rÇ  rd  rG   Úemptyri   Úget_max_cache_shape)r{   Úmodel_inputrË  rÍ  rÌ  ra  rÏ  rÎ  Útransformers_ge_4_53_1rÆ  Ú
base_modelÚdecoderÚcausal_mask_creation_functionrÉ  s                 rN   Úcreate_attention_maskrÞ  :  s=  € ô %Ÿ]š]¬<×+CÑ+CÓDÌÏÊÐV^ÓH_Ñ_ÐÞæHäÐ`ÓaÐaô ˜× 7Ñ 7¸Ó?€JÜ*1°*¸m×*LÑ*Lˆj×$Ñ$Ô&ÐRV€GÜ$+¨JÐ8oÐquÓ$vÐ!Ø$Ñ,°Ñ1DÜ(/°Ð9pÐrvÓ(wÐ%ð %Ñ,Ü  Ð.>ÀÓEˆä(/°Ð7RÐTmÓ(nÐ%Ù6Ø—<‘<äŸš jÐ%BÈ%Ï+É+ÑVØ)Ø)Ø+Ø)Ø%ñ	
ˆð, Ðñ 7ØØ+Ø)×=Ñ=Ó?Ø—+‘+Ø)Ø!Ø—<‘<Ø+Ø%ñ

ˆð ÐrM   c                óø  ^^• / n[        U S5      (       a  U R                  5       n [        U S5      (       a  U R                  n [        U S5      (       d  / $ [        R                  " S5      n[        U R                  [        5      (       Ga€  [        U S5      (       d  [        S5      e0 nU R                  5        H{  u  pE[        USS5      nU(       a  U(       d  UR                  U5        M3  U(       d  M<  UR                  UR                  5        VVs0 s H  u  pxU SU 3U SU 3_M     snn5        M}     [        U R                  5       R                  5       5      n	U R!                  S	S
9 V
Vs/ s H  u  p«X¹;   d  M  U
PM     snn
mT Vs0 s H  oÂR#                  SU5      U_M     snmTR                  " S0 T Vs0 s H  oÌR%                  SS5      U_M     snD6  UR'                  UU4S jUR                  5        5       5        O(U R                  b  UR'                  U R                  5        [)        U Vs1 s H  oÌR+                  S5      S   iM     sn5      $ s  snnf s  snn
f s  snf s  snf s  snf )aG  
Get the list of the fully qualified names of the modules that are tied to the input embeddings. In case of a
source-target-mapping `_tied_weights_keys`, it will attempt to identify the input embedding weights from the
mapping and return the list of tied modules accordingly. This gives a unified interface to both transformers v4
tied weights and v5 mapped tied weights.

For example: For models which have `embed_tokens` and `lm_head` as the tied keys, this function will return
[`lm_head`]. The PEFT model is assumed to be transparent: returned names will be relative to the base model, so
even though `model.base_model.lm_head` is tied, the returned name is `lm_head` since such attributes are forwarded
to the base model anyway. Non-transformer models have to provide a `_tied_weights_keys` attribute for this function
to work.

Note that this function will not check if weight tying is disabled by the model's config. There can be the case
that the weight tying definition is present but the tying is disabled via `model_config.tie_word_embeddings=False`.
You have to check that yourself.
Úget_base_modelÚtuner_layer_clsÚ_tied_weights_keysz[^.]+\.base_layer\.rq   z¥The supplied model implements `_tied_weights_keys` as a dict but doesn't implement 'get_input_embeddings' so we can't determine which weights are tied to embeddings.Nr  Fr  Ú zbase_layer.c              3  óx   >#   • U  H/  u  pTR                  X"5      T;   d  M  TR                  X5      v •  M1     g 7frÎ   )rû   )r*  rõ   ÚvÚ
candidatesÚpeft_reverse_mappings      €€rN   r+  Ú8_get_module_names_tied_with_embedding.<locals>.<genexpr>±  s>   øé € ð 
â1‘�Ø#×'Ñ'¨Ó-°Ñ;ó +Ð ×$Ñ$ Q×*Ð*Ú1ùs   ƒ:¢:r   rL   )rI   rà  r{   r¡  Úcompiler•   râ  r¶  r�   rò  re   r¬   rE  r©   rq   rh   rf   ÚsubÚreplaceÚextendÚsortedÚ
rpartition)r{   Útied_weightsÚbase_layer_patternÚtied_weights_keysÚmodule_namer_   Úmodule_tied_weights_keysrõ   rå  Úinput_embedding_paramsrœ  r  rƒ   ræ  rç  s                @@rN   r·  r·  o  sZ  ù€ ð" !€LäˆuÐ&×'Ñ'à×$Ñ$Ó&ˆäˆuÐ'×(Ñ(à—‘ˆä�5Ð.×/Ñ/Øˆ	äŸšÐ$:Ó;Ðä�%×*Ñ*¬D×1Ò1Ü�uÐ4×5Ñ5Üðeóð ð -/ÐØ#(×#6Ñ#6Ö#8ÑˆKÜ'.¨vÐ7KÈTÓ'RÐ$Þ'¶Ø!×(Ñ(Ð)AÖBß)Ð)Ø!×(Ñ(ØLd×LjÑLjÔLlÔmÒLlÁDÀA˜�} A a SÐ)¨k¨]¸!¸A¸3Ð+?Ò?ÑLlÒmöñ $9ô "% U×%?Ñ%?Ó%A×%LÑ%LÓ%NÓ!OÐØ$)×$:Ñ$:ÈEÐ$:Ñ$RÔrÒ$R™D˜AÐVWÑVq—aÑ$RÒrˆ
ñ
 T^Ó^ÒS]È4× 6Ñ 6°r¸4Ó @À$Ò FÑS]Ñ^Ðð 	×#Ò#ÑeÑYcÓ&dÒYcÐQU§|¡|°MÀ2Ó'FÈÒ'LÑYcÑ&dÒeà×Ñõ 
à)×/Ñ/Ô1ó
õ 	
ð 
×	!Ñ	!Ñ	-à×Ñ˜E×4Ñ4Ô5ô ±|ÓD²|¨t—?‘? 3Ó'¨Ô*±|ÑDÓEÐEùó= nùó sùò
  _ùò 'eùò Es$   ÄI!Å2I'ÆI'ÆI-Ç I2È=I7)rY  rÖ   )TN)r�   r\  r�   Úintr‘   rõ  )rg   rZ  rY  rb  rÎ   )FNT)r=  rZ  r  rZ  r  z"Optional[AuxiliaryTrainingWrapper]r  rZ  r`  )r°   r_  r=  rZ  rY  rb  rX  )rI  rÖ   r	  rÖ   )r�   úOptional[torch.Tensor]r`  rö  rY  rõ  )r{   rg  rf  rÖ   )r…  r\  rY  ztuple[torch.device, int, int])r—  rÖ   rY  rõ  )r›  rÖ   rœ  rÖ   rY  zOptional[bool])r£  rÖ   rI  rÖ   )r§  zSequence[str]r¨  rÖ   rY  rÖ   re  )r  rZ  r[  )uÚ
__future__r   r�  rN  rt   rK  r¡  rx   Úcollections.abcr   Ú
contextlibr   Úoperatorr   Útypingr   r   r	   rí   rG   rÒ  r
   Úaccelerate.hooksr   r   Úaccelerate.utilsr   r   Úhuggingface_hubr   Úhuggingface_hub.errorsr   r   Ú	packagingr   Úsafetensors.torchr   r   r   Úimport_utilsr   r   r   Ú	constantsr   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   rK   rÑ  rÓ  r?   Ú__all__rO   r‡   r“   r›   r–   ÚModuler�   rr  r¾  rõ  rü  r   r  r  r  r0  r5  rX  r\  r^  rb  rg  r~  r‡  r‰  r˜  rŸ  r¤  r©  rÄ  rÞ  r·  rL   rM   rN   Ú<module>r     sÃ  ðõ #ã Û Û Û 	Û 	Û Ý $Ý "Ý ß 'Ñ 'ã Û Û Ý 5ß Hß ?Ý 'ß HÝ ß 7Ý (ç dÑ d÷%÷ %÷ %÷ %÷ %÷ %÷ %÷ %÷ %ó %ðP €Ø
‡=‚=�×'Ñ'Ó(¨G¯MªM¸(Ó,CÓCÝ1á$Ó&€Mò%€ôRôUôrô*4ô&c"˜uŸx™xŸ™ô c"ôL	_0Ð3ô _0ôDpEÐ5ô pEôf	ò'ò	4ò$ð !&Ø6:Ø!ðVð ð	Vð
 ðVð 4ðVð õVörFò>ôBò>'òTô	ôô 
ô&ôR:ò2)ô,9ô ô2-ôöQòh2õjMFrM   