§
    ‚Štj¼ƒ  ã                   ór  — d Z ddlZ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mZmZ  e¦   «         r
ddlZddlmZ  ej        e¦  «        Zd„ Z e¦   «         r e¦   «         rdd	lmZ ndd
lmZ  G d„ de¦  «        Z G d„ de¦  «        Zdad„ Zd„ Zd„ Zd„ Zd„ Zd„ Z dd„Z!d„ Z"dd„Z#dd„Z$dd„Z%d„ Z&dS ) z
Integration with Deepspeed
é    N)Úpartialmethodé   )Údep_version_check)Úis_accelerate_availableÚis_torch_availableÚlogging)Únnc                  óÆ   — t           j                             d¦  «        d u} | r=	 t           j                             d¦  «        }dS # t           j        j        $ r Y dS w xY wd S )NÚ	deepspeedTF)Ú	importlibÚutilÚ	find_specÚmetadataÚPackageNotFoundError)Úpackage_existsÚ_s     úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/integrations/deepspeed.pyÚis_deepspeed_availabler   $   sx   € Ý”^×-Ò-¨kÑ:Ô:À$ÐF€Nð ð ð	ÝÔ"×+Ò+¨KÑ8Ô8ˆAØ�4øÝÔ!Ô6ð 	ð 	ð 	Ø�5�5ð	øøøð	ð s   ¥A ÁAÁA)ÚHfDeepSpeedConfig)Úobjectc                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )r   aJ  
    This object contains a DeepSpeed configuration dictionary and can be quickly queried for things like zero stage.

    A `weakref` of this object is stored in the module's globals to be able to access the config from areas where
    things like the Trainer object is not available (e.g. `from_pretrained` and `_get_resized_embeddings`). Therefore
    it's important that this object remains alive while the program is still running.

    [`Trainer`] uses the `HfTrainerDeepSpeedConfig` subclass instead. That subclass has logic to sync the configuration
    with values of [`TrainingArguments`] by replacing special placeholder values: `"auto"`. Without this special logic
    the DeepSpeed configuration is not modified in any way.

    Args:
        config_file_or_dict (`Union[str, Dict]`): path to DeepSpeed config file or dict.

    c                 ó¤   •— t          | ¦  «         t          d¦  «         t          d¦  «         t          ¦   «                              |¦  «         d S )NÚ
accelerater   )Úset_hf_deepspeed_configr   ÚsuperÚ__init__©ÚselfÚconfig_file_or_dictÚ	__class__s     €r   r   zHfDeepSpeedConfig.__init__J   sL   ø€ å Ñ%Ô%Ð%Ý˜,Ñ'Ô'Ð'Ý˜+Ñ&Ô&Ð&Ý‰Œ×ÒÐ,Ñ-Ô-Ð-Ð-Ð-ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__©r    s   @r   r   r   9   sB   ø€ € € € € ðð ð .ð .ð .ð .ð .ð .ð .ð .ð .r!   r   c                   ó^   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zdd„Z eed¬	¦  «        Z	dd
„Z
d„ Zˆ xZS )ÚHfTrainerDeepSpeedConfigzž
    The `HfTrainerDeepSpeedConfig` object is meant to be created during `TrainingArguments` object creation and has the
    same lifespan as the latter.
    c                 óf   •— t          ¦   «                              |¦  «         d | _        g | _        d S ©N)r   r   Ú_dtypeÚ
mismatchesr   s     €r   r   z!HfTrainerDeepSpeedConfig.__init__X   s.   ø€ Ý‰Œ×ÒÐ,Ñ-Ô-Ð-ØˆŒØˆŒˆˆr!   c                 ó<   — | j         €t          d¦  «        ‚| j         S )Nz8trainer_config_process() wasn't called yet to tell dtype)r,   Ú
ValueError)r   s    r   ÚdtypezHfTrainerDeepSpeedConfig.dtype]   s!   € ØŒ;ÐÝÐWÑXÔXÐXØŒ{Ðr!   c                 ó@   — |                       |¦  «        }|€dS |dk    S )NFÚauto)Ú	get_value)r   Úds_key_longÚvals      r   Úis_autoz HfTrainerDeepSpeedConfig.is_autob   s'   € Ø�nŠn˜[Ñ)Ô)ˆØˆ;Ø�5à˜&’=Ð r!   NTc           
      ó  — |                       |¦  «        \  }}|€dS |                     |¦  «        dk    r|||<   dS |sdS |                     |¦  «        }|�.||k    r*| j                             d|› d|› d|› d|› �¦  «         dS dS dS )a¶  
        A utility method that massages the config file and can optionally verify that the values match.

        1. Replace "auto" values with `TrainingArguments` value.

        2. If it wasn't "auto" and `must_match` is true, then check that DS config matches Trainer
        config values and if mismatched add the entry to `self.mismatched` - will assert during
        `trainer_config_finalize` for one or more mismatches.

        Nr2   z- ds ú=z vs hf )Úfind_config_nodeÚgetr-   Úappend)r   r4   Úhf_valÚhf_keyÚ
must_matchÚconfigÚds_keyÚds_vals           r   Ú
fill_matchz#HfTrainerDeepSpeedConfig.fill_matchi   sÄ   € ð ×.Ò.¨{Ñ;Ô;‰ˆ�Øˆ>ØˆFà�:Š:�fÑÔ Ò'Ð'Ø#ˆF�6‰NØˆFàð 	ØˆFà—’˜FÑ#Ô#ˆØÐ &¨FÒ"2Ð"2ØŒO×"Ò"Ð#Y¨;Ð#YÐ#Y¸Ð#YÐ#YÈÐ#YÐ#YÐQWÐ#YÐ#YÑZÔZÐZÐZÐZð ÐÐ"2Ð"2r!   F)r>   c                 ó0  — |j         |j        z  |j        z  }|                      d|j        d| ¦  «         |                      d|j        d¦  «         |                      d|d| ¦  «         |                      d|j        d¦  «         |                      d|j        d	¦  «         |                      d
|j        |j        gd¦  «         |                      d|j        d¦  «         |                      d|j	        d¦  «         |  
                    dd¦  «         |                      d|j        d	¦  «         |j        r8| j                             di ¦  «        | j        d<   |j        | j        d         d<   |                      d|j        p|j        d¦  «         |                      d|j        p|j        d¦  «         |                      d¦  «        rt&          j        | _        dS |                      d¦  «        rt&          j        | _        dS t&          j        | _        dS )zŠ
        Adjust the config with `TrainingArguments` values. This stage is run during `TrainingArguments` object
        creation.
        Útrain_micro_batch_size_per_gpuÚper_device_train_batch_sizeÚgradient_accumulation_stepsÚtrain_batch_sizeztrain_batch_size (calculated)Úgradient_clippingÚmax_grad_normzoptimizer.params.lrÚlearning_ratezoptimizer.params.betaszadam_beta1+adam_beta2zoptimizer.params.epsÚadam_epsilonzoptimizer.params.weight_decayÚweight_decayzscheduler.params.warmup_min_lrr   zscheduler.params.warmup_max_lrÚ
checkpointÚuse_node_local_storagezfp16.enabledzfp16|fp16_full_evalzbf16.enabledzbf16|bf16_full_evalN)Ú
world_sizerE   rF   rB   rI   rJ   Ú
adam_beta1Ú
adam_beta2rK   rL   Ú	fill_onlyÚsave_on_each_noder?   r:   Úfp16Úfp16_full_evalÚbf16Úbf16_full_evalÚis_trueÚtorchÚbfloat16r,   Úfloat16Úfloat32)r   ÚargsÚauto_find_batch_sizerG   s       r   Útrainer_config_processz/HfTrainerDeepSpeedConfig.trainer_config_process…   s'  € ð  œ?¨TÔ-MÑMÐPTÔPpÑpÐØ�ŠØ,ØÔ,Ø)Ø$Ð$ñ		
ô 	
ð 	
ð 	�ŠØ)ØÔ,Ø)ñ	
ô 	
ð 	
ð
 	�ŠØØØ+Ø$Ð$ñ		
ô 	
ð 	
ð 	�ŠÐ+¨TÔ-?ÀÑQÔQÐQà�ŠÐ-¨tÔ/AÀ?ÑSÔSÐSØ�ŠØ$ØŒ_˜dœoÐ.Ø#ñ	
ô 	
ð 	
ð
 	�ŠÐ.°Ô0AÀ>ÑRÔRÐRØ�ŠÐ7¸Ô9JÈNÑ[Ô[Ð[à�ŠÐ7¸Ñ;Ô;Ð;Ø�ŠÐ8¸$Ô:LÈoÑ^Ô^Ð^ð Ô!ð 	Yà(,¬¯ª¸ÀbÑ(IÔ(IˆDŒK˜Ñ%ØBFÔBXˆDŒK˜Ô%Ð&>Ñ?ð 	�Š˜¨¬Ð)I°dÔ6IÐLaÑbÔbÐbØ�Š˜¨¬Ð)I°dÔ6IÐLaÑbÔbÐbð �<Š<˜Ñ'Ô'ð 	(Ýœ.ˆDŒKˆKˆKØ�\Š\˜.Ñ)Ô)ð 	(Ýœ-ˆDŒKˆKˆKåœ-ˆDŒKˆKˆKr!   c                 óJ  ‡ — g d¢}ˆ fd„|D ¦   «         }t          |¦  «        dk    �rud}t          |d¦  «        rßt          |j        d¦  «        r|j        j        }n½t          |j        d¦  «        rt	          |j        j        ¦  «        }nŽt          |j        d¦  «        r,t          |j        j        d¦  «        r|j        j        j        }nMt          |j        d¦  «        r8t          |j        j        d¦  «        rt	          |j        j        j        ¦  «        }|€t          d	|› d
�¦  «        ‚‰                      d||z  ¦  «         ‰  	                    ¦   «         rB‰                      dt          d|z  |z  ¦  «        ¦  «         ‰                      dd|z  ¦  «         ‰                      d|d¦  «         ‰                      d|                     |¦  «        d¦  «         t          ‰ j        ¦  «        dk    r-d                     ‰ j        ¦  «        }t          d|› d�¦  «        ‚dS )z�
        This stage is run after we have the model and know num_training_steps.

        Now we can complete the configuration process.
        )ú$zero_optimization.reduce_bucket_sizeú-zero_optimization.stage3_prefetch_bucket_sizeú4zero_optimization.stage3_param_persistence_thresholdc                 ó>   •— g | ]}‰                      |¦  «        ¯|‘ŒS © )r6   )Ú.0Úxr   s     €r   ú
<listcomp>zDHfTrainerDeepSpeedConfig.trainer_config_finalize.<locals>.<listcomp>Í   s)   ø€ Ð VÐ VÐ V qÀdÇlÂlÐSTÁoÄoÐ V Ð VÐ VÐ Vr!   r   Nr?   Úhidden_sizeÚhidden_sizesÚtext_configz½The model's config file has neither `hidden_size` nor `hidden_sizes` entry, therefore it's not possible to automatically fill out the following `auto` entries in the DeepSpeed config file: zb. You can fix that by replacing `auto` values for these keys with an integer value of your choice.ra   rb   gÍÌÌÌÌÌì?rc   é
   z scheduler.params.total_num_stepsznum_training_steps (calculated)z!scheduler.params.warmup_num_stepsÚwarmup_stepsú
z]Please correct the following DeepSpeed config values that mismatch TrainingArguments values:
zF
The easiest method is to set these DeepSpeed config values to 'auto'.)ÚlenÚhasattrr?   ri   Úmaxrj   rk   r/   rR   Úis_zero3ÚintrB   Úget_warmup_stepsr-   Újoin)r   r]   ÚmodelÚnum_training_stepsÚhidden_size_based_keysÚhidden_size_auto_keysri   r-   s   `       r   Útrainer_config_finalizez0HfTrainerDeepSpeedConfig.trainer_config_finalize¿   sˆ  ø€ ð"
ð "
ð "
Ðð
 !WÐ VÐ VÐ VÐ,BÐ VÑ VÔ VÐåÐ$Ñ%Ô%¨Ò)Ñ)ØˆKÝ�u˜hÑ'Ô'ð 
MÝ˜5œ<¨Ñ7Ô7ð 	MØ"'¤,Ô":�K�KÝ˜Uœ\¨>Ñ:Ô:ð Må"% e¤lÔ&?Ñ"@Ô"@�K�KÝ˜Uœ\¨=Ñ9Ô9ð M½gÀeÄlÔF^Ð`mÑ>nÔ>nð MØ"'¤,Ô":Ô"F�K�KÝ˜Uœ\¨=Ñ9Ô9ð M½gÀeÄlÔF^Ð`nÑ>oÔ>oð Må"% e¤lÔ&>Ô&KÑ"LÔ"L�KàÐ"Ý ðYà5JðYð Yð Yñô ð ð �NŠNÐAÀ;ÐQ\ÑC\Ñ]Ô]Ð]Ø�}Š}‰Œð 	à—’ØCÝ˜˜kÑ)¨KÑ7Ñ8Ô8ñô ð ð —’ØJØ˜Ñ$ñô ð ð 	�ŠØ.ØØ-ñ	
ô 	
ð 	
ð
 	�ŠØ/Ø×!Ò!Ð"4Ñ5Ô5Øñ	
ô 	
ð 	
õ ˆtŒÑÔ !Ò#Ð#ØŸš 4¤?Ñ3Ô3ˆJÝðqØ'ðqð qð qñô ð ð $Ð#r!   )NT©F)r"   r#   r$   r%   r   r0   r6   rB   r   rR   r_   rz   r&   r'   s   @r   r)   r)   R   s¹   ø€ € € € € ðð ð
ð ð ð ð ð
ð ð ð
!ð !ð !ð[ð [ð [ð [ð4 �˜j°UÐ;Ñ;Ô;€Ið8(ð 8(ð 8(ð 8(ðtCð Cð Cð Cð Cð Cð Cr!   r)   c                 ó.   — t          j        | ¦  «        ad S r+   )ÚweakrefÚrefÚ_hf_deepspeed_config_weak_ref)Úhf_deepspeed_config_objs    r   r   r   	  s   € õ
 %,¤KÐ0GÑ$HÔ$HÐ!Ð!Ð!r!   c                  ó
   — d a d S r+   )r   re   r!   r   Úunset_hf_deepspeed_configr‚     s   € ð %)Ð!Ð!Ð!r!   c                  óp   — t           �.t          ¦   «         � t          ¦   «                              ¦   «         S dS )NF)r   rr   re   r!   r   Úis_deepspeed_zero3_enabledr„     s1   € Ý$Ð0Õ5RÑ5TÔ5TÐ5`Ý,Ñ.Ô.×7Ò7Ñ9Ô9Ð9àˆur!   c                  óV   — t           �!t          ¦   «         �t          ¦   «         j        S d S r+   )r   r?   re   r!   r   Údeepspeed_configr†     s(   € Ý$Ð0Õ5RÑ5TÔ5TÐ5`Ý,Ñ.Ô.Ô5Ð5àˆtr!   c                 ó$  ‡‡‡‡— ddl Šddl}ddlm} ddlmŠ |                      ¦   «         Šˆˆˆˆfd„Š |j        ¦   «         5   |¦   «         5   ‰| | j        ¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )aA  
    DeepSpeed ZeRO-3 variant of `PreTrainedModel.initialize_weights`. Mirrors the `smart_apply`
    dispatch logic but gathers each module's partitioned parameters before calling
    `_initialize_weights`, so initialization operates on full tensors instead of empty shards.
    Only rank 0 performs the actual init.
    r   Nr   )Úguard_torch_init_functions)ÚPreTrainedModelc                 ó´  •— |                       ¦   «         D ]0}t          |‰¦  «        r ‰||j        ¦  «         Œ$ ‰||¦  «         Œ1t          |                      d¬¦  «        ¦  «        }|r`‰j                             |d¬¦  «        5  ‰j                             ¦   «         dk    r || ‰¦  «         d d d ¦  «         d S # 1 swxY w Y   d S  || ‰¦  «         d S )NF)Úrecurser   ©Úmodifier_rank)	ÚchildrenÚ
isinstanceÚ_initialize_weightsÚlistÚ
parametersÚzeroÚGatheredParametersÚcommÚget_rank)Úmodel_or_moduleÚfnÚchildÚparamsr‰   Ú_apply_zero3r   Úis_remote_codes       €€€€r   r›   z.initialize_weights_zero3.<locals>._apply_zero34  sG  ø€ Ø$×-Ò-Ñ/Ô/ð 	(ð 	(ˆEÝ˜% Ñ1Ô1ð (Ø�˜U EÔ$=Ñ>Ô>Ð>Ð>à�˜U BÑ'Ô'Ð'Ð'å�o×0Ò0¸Ð0Ñ?Ô?Ñ@Ô@ˆØð 	0Ø”×2Ò2°6ÈÐ2ÑKÔKð 8ð 8Ø”>×*Ò*Ñ,Ô,°Ò1Ð1Ø�B�¨Ñ7Ô7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð 8ð 8ð ˆBˆ Ñ/Ô/Ð/Ð/Ð/s   Â*B?Â?CÃC)	r   rY   Úinitializationrˆ   Úmodeling_utilsr‰   rœ   Úno_gradr�   )rv   rY   rˆ   r‰   r›   r   rœ   s      @@@@r   Úinitialize_weights_zero3r    %  sg  øøøø€ ð ÐÐÐØ€L€L€Là;Ð;Ð;Ð;Ð;Ð;Ø0Ð0Ð0Ð0Ð0Ð0à×)Ò)Ñ+Ô+€Nð0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 
ˆŒ‰Œð ;ð ;Ø'Ð'Ñ)Ô)ð 	;ð 	;ØˆL˜ Ô 9Ñ:Ô:Ð:ð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð ;ð ;s6   ÁBÁA-Á!BÁ-A1	Á1BÁ4A1	Á5BÂB	ÂB	c                 ó  ‡‡‡— t          ¦   «         }|�¢|                     di ¦  «                             dd¦  «        }|                     di ¦  «        }t          |t          ¦  «        r8t	          ||                     di ¦  «                             dd¦  «        ¦  «        }|dk    rt          d¦  «        ‚dd	lmŠmŠm	Šm
} t          |d
d¦  «        }| j        }i }	|                      ¦   «                              ¦   «         D ])\  }
}t          j        |j        |j        d¬¦  «        |	|
<   Œ*ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }t'          |¦  «        dk    rCi }|                     ¦   «         D ]!\  }} |||g ||	¬¦  «        \  }}||	v r|||<   Œ"|�||_        |S d„ |D ¦   «         }i }i }t+          |                     ¦   «         ˆfd„¬¦  «        }|D ]‰}|                     |¦  «        } ||||||	¬¦  «        \  }}||	v r[|�T||         } ‰|j        |j        |j        ¬¦  «        }|                     ||¦  «        }|                     ||||¦  «         Œ„|||<   ŒŠ|                     ¦   «         D ]‰\  }}	 |                     || | j        ¬¦  «        }|                     ¦   «         D ])\  }}t          |t>          ¦  «        r|d         n|}|||<   Œ*Œb# t@          $ r}tC          d|› d|› �¦  «        |‚d}~ww xY w|�||_        |S )z¼
    Apply weight conversions (renaming and merging/splitting operations) to a state dict.
    This is a simplified version that handles the conversion without loading into the model.
    NÚtensor_parallelÚautotp_sizeé   Ú	inferenceÚtp_sizezóWeight conversions (e.g., MoE expert fusion) with DeepSpeed Tensor Parallelism are not yet implemented but support is coming soon. Please disable tensor_parallel in your DeepSpeed config or convert your checkpoint to the expected format first.r   )ÚWeightConverterÚWeightRenamingÚdot_natural_keyÚrename_source_keyÚ	_metadataÚmeta)r0   Údevicec                 ó4   •— g | ]}t          |‰¦  «        ¯|‘ŒS re   ©r�   )rf   Úentryr¨   s     €r   rh   z;_apply_weight_conversions_to_state_dict.<locals>.<listcomp>k  s(   ø€ ÐXÐXÐX˜5µjÀÈÑ6WÔ6WÐX�ÐXÐXÐXr!   c                 ó4   •— g | ]}t          |‰¦  «        ¯|‘ŒS re   r¯   )rf   r°   r§   s     €r   rh   z;_apply_weight_conversions_to_state_dict.<locals>.<listcomp>l  s(   ø€ ÐZÐZÐZ˜EµzÀ%ÈÑ7YÔ7YÐZ�%ÐZÐZÐZr!   r   )Úbase_model_prefixÚmeta_state_dictc                 ó(   — i | ]}|j         D ]}||“ŒŒS re   )Úsource_patterns)rf   Ú	converterÚks      r   ú
<dictcomp>z;_apply_weight_conversions_to_state_dict.<locals>.<dictcomp>}  s*   € ÐhÐhÐh¨YÈiÔNgÐhÐhÈ˜A˜yÐhÐhÐhÐhr!   c                 ó   •—  ‰| ¦  «        S r+   re   )r·   r©   s    €r   ú<lambda>z9_apply_weight_conversions_to_state_dict.<locals>.<lambda>„  s   ø€ ¸/¸/È!Ñ:LÔ:L€ r!   )Úkey)rµ   Útarget_patternsÚ
operations)rv   r?   z'Failed to apply weight conversion for 'zb'. This likely means the checkpoint format is incompatible with the current model version. Error: )"r†   r:   r�   Údictrq   ÚNotImplementedErrorÚcore_model_loadingr§   r¨   r©   rª   Úgetattrr²   Ú
state_dictÚitemsrY   ÚemptyÚshaper0   ro   r«   ÚsortedÚkeysÚpoprµ   r¼   r½   Ú
setdefaultÚ
add_tensorÚconvertr?   r‘   Ú	ExceptionÚRuntimeError) rv   rÂ   Úweight_mappingÚ	ds_configr¦   Úinference_configrª   r   r²   Úmodel_state_dictr»   ÚparamÚ	renamingsÚ
convertersÚnew_state_dictÚoriginal_keyÚtensorÚrenamed_keyr   Úpattern_to_converterÚconversion_mappingÚsorted_keysÚsource_patternr¶   Únew_converterÚmappingÚrealized_valueÚtarget_nameÚer§   r¨   r©   s                                 @@@r   Ú'_apply_weight_conversions_to_state_dictrâ   H  s5  øøø€ õ !Ñ"Ô"€IØÐà—-’-Ð 1°2Ñ6Ô6×:Ò:¸=È!ÑLÔLˆà$Ÿ=š=¨°bÑ9Ô9ÐÝÐ&­Ñ-Ô-ð 	bÝ˜'Ð#3×#7Ò#7Ð8IÈ2Ñ#NÔ#N×#RÒ#RÐS\Ð^_Ñ#`Ô#`ÑaÔaˆGØ�QŠ;ˆ;Ý%ðdñô ð ð iÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhõ �z ;°Ñ5Ô5€HàÔ/Ðð ÐØ×&Ò&Ñ(Ô(×.Ò.Ñ0Ô0ð [ð [‰
ˆˆUÝ %¤¨E¬K¸u¼{ÐSYÐ ZÑ ZÔ ZÐ˜ÑÐàXÐXÐXÐX NÐXÑXÔX€IØZÐZÐZÐZ ^ÐZÑZÔZ€Jõ ˆ:�„˜!ÒÐØˆØ$.×$4Ò$4Ñ$6Ô$6ð 	5ð 	5Ñ ˆL˜&Ø.Ð.Ø˜i¨Ð?PÐbrðñ ô ‰NˆK˜ð Ð.Ð.Ð.Ø.4�˜{Ñ+øàÐØ'/ˆNÔ$ØÐð iÐh¸*ÐhÑhÔhÐð
 ÐØ€NÝ˜ŸšÑ*Ô*Ð0LÐ0LÐ0LÐ0LÐMÑMÔM€KØ#ð 5ð 5ˆØ—’ Ñ-Ô-ˆØ&7Ð&7Ø˜) ZÐCTÐfvð'
ñ '
ô '
Ñ#ˆ�^ð
 Ð*Ð*Ð*àÐ)ð 1°Ô@�	Ø / Ø$-Ô$=Ø$-Ô$=Ø(Ô3ð!ñ !ô !�ð
 -×7Ò7¸À]ÑSÔS�Ø×"Ò" ;°¸nÈfÑUÔUÐUÐUð /5�˜{Ñ+øð !3× 8Ò 8Ñ :Ô :ð ð Ñˆ�Wð	Ø$Ÿ_š_ØØØ”|ð -ñ ô ˆNð
 '5×&:Ò&:Ñ&<Ô&<ð 4ð 4Ñ"�˜UÝ$.¨uµdÑ$;Ô$;ÐF˜˜aœ˜À�Ø.3�˜{Ñ+Ð+ð4øõ ð 	ð 	ð 	Ýð¸+ð ð àðð ñô ð ð	øøøøð	øøøð ÐØ#+ˆÔ àÐs   É:AKË
K;Ë K6Ë6K;c                 ó  ‡‡‡‡‡‡	— t          |dd¦  «        Š|                     ¦   «         }‰�‰|_        d}|�t          |dd¦  «        }|�+t          |¦  «        dk    rt	          | ||¦  «        }|| _        g Š|                      ¦   «         Št          ‰                     ¦   «         ¦  «        Št          | dd¦  «        Š	ˆˆ	fd„| 	                    ¦   «         D ¦   «         }dd	t          j        fˆˆˆˆfd
„Š ‰| |d¬¦  «         ‰‰fS )a°  
    Loads state dict into a model specifically for Zero3, since DeepSpeed does not support the `transformers`
    tensor parallelism API.

    Nearly identical code to PyTorch's `_load_from_state_dict`

    Args:
        model_to_load: The model to load weights into
        state_dict: The state dict containing the weights
        load_config: Optional LoadStateDictConfig containing weight_mapping and other loading options
    r«   NrÎ   r   r²   c                 ó^   •— i | ])\  }}‰                      ‰› d |› �¦  «        �‰› d |› �n||“Œ*S )ú.)r:   )rf   r·   ÚvÚmeta_model_state_dictÚprefix_models      €€r   r¸   z5_load_state_dict_into_zero3_model.<locals>.<dictcomp>Ú  se   ø€ ð ð ð áˆAˆqð #8×";Ò";¸|Ð<QÐ<QÈaÐ<QÐ<QÑ"RÔ"RÐ"^ˆLÐ	Ð	˜1Ð	Ð	Ð	ÐdeÐhiðð ð r!   Ú FÚmodulec                 ó  •— ‰€i n‰                      |d d…         i ¦  «        }||d<   |||dg g ‰f}t          ¦   «         �r•dd l}t          |                      |d d…         d¬¦  «        ¦  «        }g }|D ]?}	|	|v r9||	         }
d|
_        |                     |
¦  «         ‰                     |	¦  «         Œ@t          |¦  «        dk    r`|j	         
                    |d¬¦  «        5  t          j                             ¦   «         dk    r
 | j        |Ž  d d d ¦  «         n# 1 swxY w Y   t          |                      |d d…         d¬¦  «        ¦  «        }|                     ¦   «         D ]m\  }	}|	|v rd|�b‰                     |	¦  «         t          j        ¦   «         5  |                     ||	         ¦  «         d d d ¦  «         n# 1 swxY w Y   d|_        Œn| j                             ¦   «         D ]\  }}|� ‰||||z   dz   |¦  «         Œd S )	NéÿÿÿÿÚassign_to_params_buffersTr   F)Úprefixr‹   rŒ   rå   )r:   r„   r   r¾   Únamed_parametersÚ_is_hf_initializedr;   Údiscardro   r“   r”   rY   Údistributedr–   Ú_load_from_state_dictÚnamed_buffersrÃ   rŸ   Úcopy_Ú_modules)rê   rÂ   rî   rí   Úlocal_metadatar]   r   rï   Úparams_to_gatherr·   rÒ   rô   ÚbufÚnamer™   Ú
error_msgsÚloadr   Úmissing_keyss                  €€€€r   rü   z/_load_state_dict_into_zero3_model.<locals>.loadá  sÚ  ø€ Ø'Ð/˜˜°X·\²\À&ÈÈ"ÈÄ+ÈrÑ5RÔ5RˆØ5MˆÐ1Ñ2à˜F N°D¸"¸bÀ*ÐMˆõ &Ñ'Ô'ñ 	2ØÐÐÐõ  $ F×$;Ò$;À6È#È2È#Ä;ÐX]Ð$;Ñ$^Ô$^Ñ_Ô_ÐØ!ÐØ%ð ,ð ,�Ø˜
�?�?Ø,¨QÔ/�Eà/3�EÔ,Ø$×+Ò+¨EÑ2Ô2Ð2Ø ×(Ò(¨Ñ+Ô+Ð+øåÐ#Ñ$Ô$ qÒ(Ð(ð ”^×6Ò6Ð7GÐWXÐ6ÑYÔYð <ð <ÝÔ(×1Ò1Ñ3Ô3°qÒ8Ð8Ø4˜Ô4°dÐ;Ð;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <õ
 ! ×!5Ò!5¸VÀCÀRÀC¼[ÐRWÐ!5Ñ!XÔ!XÑYÔYˆMØ'×-Ò-Ñ/Ô/ð 2ð 2‘��3Ø˜
�?�? s Ø ×(Ò(¨Ñ+Ô+Ð+Ýœ™œð 1ð 1ØŸ	š	 *¨Q¤-Ñ0Ô0Ð0ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1à-1�CÔ*øà!œ?×0Ò0Ñ2Ô2ð 	Wð 	W‰KˆD�%ØÐ Ø��U˜J¨°©¸Ñ(;Ð=UÑVÔVÐVøð	Wð 	Ws$   Ã$-DÄD!Ä$D!ÆGÇG	Ç
G	)rí   )ré   F)rÁ   Úcopyr«   ro   râ   Ú_weight_conversionsrÂ   ÚsetrÇ   rÃ   r	   ÚModule)
Úmodel_to_loadrÂ   Úload_configrÎ   rû   rü   rç   r   rý   rè   s
       @@@@@@r   Ú!_load_state_dict_into_zero3_modelr  ·  sr  øøøøøø€ õ �z ;°Ñ5Ô5€HØ—’Ñ"Ô"€JØÐØ'ˆ
Ôð €NØÐÝ  Ð.>ÀÑEÔEˆð Ð!¥c¨.Ñ&9Ô&9¸AÒ&=Ð&=Ý<¸]ÈJÐXfÑgÔgˆ
à,:ˆÔ)à€JØ)×4Ò4Ñ6Ô6ÐÝÐ,×1Ò1Ñ3Ô3Ñ4Ô4€Lå˜=Ð*=¸tÑDÔD€Lðð ð ð ð à×$Ò$Ñ&Ô&ðñ ô €Jð)Wð )W•R”Yð )Wð )Wð )Wð )Wð )Wð )Wð )Wð )Wð )WðV 	€Dˆ˜
¸UÐCÑCÔCÐCà�|Ð#Ð#r!   c                 óJ  ‡ ‡— ddl m}m} |j        }d}d|v r ||¬¦  «        }nG|                     ¦   «         rt
                               d¦  «         ‰                      ¦   «         }d|d<   d}	d	|v r ||¦  «        }	n#t          ||¦  «        rˆˆ fd
„}
 |||
¬¦  «        }	||	fS )zY
    A convenience wrapper that deals with optimizer and lr scheduler configuration.
    r   )Ú
DummyOptimÚDummySchedulerNÚ	optimizer)rš   z¢Detected ZeRO Offload and non-DeepSpeed optimizers: This combination should work as long as the custom optimizer has both CPU and GPU implementation (except LAMB)TÚzero_allow_untested_optimizerÚ	schedulerc                 ól   •— t          j         ‰¦  «        }d |_        |                     ‰| ¬¦  «        }|S )N)rw   r  )rþ   Úlr_schedulerÚcreate_scheduler)r  Útrainer_copyr  rw   Útrainers      €€r   Ú_lr_scheduler_callablez5deepspeed_optim_sched.<locals>._lr_scheduler_callable7  sC   ø€ å#œy¨Ñ1Ô1�ð -1�Ô)Ø+×<Ò<Ø'9ÀYð  =ñ  ô  �ð $Ð#r!   )Úlr_scheduler_callable)	Úaccelerate.utilsr  r  r?   Ú
is_offloadÚloggerÚinfoÚcreate_optimizerr�   )r  Úhf_deepspeed_configr]   rw   Úmodel_parametersr  r  r?   r  r  r  s   `  `       r   Údeepspeed_optim_schedr    s  øø€ ð <Ð;Ð;Ð;Ð;Ð;Ð;Ð;à Ô'€Fð €IØ�fÐÐØ�JÐ&6Ð7Ñ7Ô7ˆ	ˆ	à×)Ò)Ñ+Ô+ð 	Ý�KŠKðVñô ð ð ×,Ò,Ñ.Ô.ˆ	à26ˆÐ.Ñ/à€LØ�fÐÐØ%�~ iÑ0Ô0ˆˆå�i Ñ,Ô,ð 	cð	$ð 	$ð 	$ð 	$ð 	$ð 	$ð *˜>¨)ÐKaÐbÑbÔbˆLà�lÐ"Ð"r!   Fc                 óô  — ddl m} | j        }| j        }| j        j        j        j        }|                     |||¦  «         | 	                    | 
                    ¦   «         ¦  «         |rU|                     ¦   «         st          d¦  «        ‚|                     d¦  «         |                     d¦  «         d\  }}d}	n¶d| _        |j                             di ¦  «                             d	d
¦  «        }
|
d
k    r4ddl}|                     ||
|                     ¦   «         |j        ¬¦  «        }t)          t+          d„ |                     ¦   «         ¦  «        ¦  «        }	t/          | ||||	¦  «        \  }}||fS )a  
    Init DeepSpeed, after updating the DeepSpeed configuration with any relevant Trainer's args.

    If `resume_from_checkpoint` was passed then an attempt to resume from a previously saved checkpoint will be made.

    Args:
        trainer: Trainer object
        num_training_steps: per single gpu
        resume_from_checkpoint: path to a checkpoint if to resume from after normal DeepSpeedEngine load
        inference: launch in inference mode (no optimizer and no lr scheduler)
        auto_find_batch_size: whether to ignore the `train_micro_batch_size_per_gpu` argument as it's being
            set automatically by the auto batch size finder

    Returns: optimizer, lr_scheduler

    We may use `deepspeed_init` more than once during the life of Trainer, when we do - it's a temp hack based on:
    https://github.com/deepspeedai/DeepSpeed/issues/1394#issuecomment-937405374 until Deepspeed fixes a bug where it
    can't resume from a checkpoint after it did some stepping https://github.com/deepspeedai/DeepSpeed/issues/1612

    r   )r  zMZeRO inference only makes sense with ZeRO Stage 3 - please adjust your configr  r  )NNNr¢   r£   r¤   )rv   r¦   r0   r?   c                 ó   — | j         S r+   )Úrequires_grad)Úps    r   rº   z deepspeed_init.<locals>.<lambda>  s   € °´€ r!   )Údeepspeed.utilsr  rv   r]   ÚacceleratorÚstateÚdeepspeed_pluginÚhf_ds_configrz   ÚsetLevelÚget_process_log_levelrr   r/   Údel_config_sub_treer  r?   r:   r   Útp_model_initr0   r‘   Úfilterr’   r  )r  rw   r¥   Ú	ds_loggerrv   r]   r  r  r  r  Údeepspeed_tp_sizer   s               r   Údeepspeed_initr*  G  sµ  € ð* 4Ð3Ð3Ð3Ð3Ð3àŒM€EØŒ<€Dà!Ô-Ô3ÔDÔQÐð ×/Ò/°°eÐ=OÑPÔPÐPð ×Ò�t×1Ò1Ñ3Ô3Ñ4Ô4Ð4àð 
à"×+Ò+Ñ-Ô-ð 	nÝÐlÑmÔmÐmð 	×/Ò/°Ñ<Ô<Ð<Ø×/Ò/°Ñ?Ô?Ð?Ø",Ñˆ	�<ØÐÐà ˆÔØ/Ô6×:Ò:Ð;LÈbÑQÔQ×UÒUÐVcÐefÑgÔgÐØ˜qÒ Ð ØÐÐÐà×+Ò+ØØ)Ø)×/Ò/Ñ1Ô1Ø*Ô1ð	 ,ñ ô ˆEõ  ¥Ð'@Ð'@À%×BRÒBRÑBTÔBTÑ UÔ UÑVÔVÐÝ"7ØÐ(¨$Ð0BÐDTñ#
ô #
Ñˆ	�<ð �lÐ"Ð"r!   Tc                 ó<  — dd l }t          |                      |› d�¦  «        ¦  «        }t          |¦  «        dk    rOt                               d|› �¦  «         |                      ||dd¬¦  «        \  }}|€t          d|› �¦  «        ‚d S t          d|› �¦  «        ‚)Nr   z/global_step*zAttempting to resume from T)Úload_module_strictÚload_optimizer_statesÚload_lr_scheduler_statesz-[deepspeed] failed to resume from checkpoint z!Can't find a valid checkpoint at )ÚglobrÆ   ro   r  r  Úload_checkpointr/   )Údeepspeed_engineÚcheckpoint_pathr,  r/  Údeepspeed_checkpoint_dirsÚ	load_pathr   s          r   Údeepspeed_load_checkpointr5  Š  sÉ   € ð
 €K€K€Kå & t§y¢y°OÐ1RÐ1RÐ1RÑ'SÔ'SÑ TÔ TÐå
Ð$Ñ%Ô%¨Ò)Ð)Ý�ŠÐB°ÐBÐBÑCÔCÐCà'×7Ò7ØØ1Ø"&Ø%)ð	 8ñ 
ô 
‰ˆ	�1ð ÐÝÐ^È_Ð^Ð^Ñ_Ô_Ð_ð Ðõ ÐN¸_ÐNÐNÑOÔOÐOr!   c                 ó²   — | j         j        }t          |j        j        ¦  «        |_        |j        j        |_        |j                             ||¦  «         dS )a“  
    Sets values in the deepspeed plugin based on the TrainingArguments.

    Args:
        accelerator (`Accelerator`): The Accelerator object.
        args (`TrainingArguments`): The training arguments to propagate to DeepSpeed config.
        auto_find_batch_size (`bool`, *optional*, defaults to `False`):
            Whether batch size was auto-discovered by trying increasingly smaller sizes.
    N)r   r!  r)   r"  r?   r†   r_   )r  r]   r^   Ú	ds_plugins       r   Úpropagate_args_to_deepspeedr8  ¢  sS   € ð Ô!Ô2€Iå5°iÔ6LÔ6SÑTÔT€IÔØ!*Ô!7Ô!>€IÔØÔ×1Ò1°$Ð8LÑMÔMÐMÐMÐMr!   c                 óf  — d|vrd|v r|d         |d<    |di |¤Ž}|j         }|j        dk    r&|j        dk    rddlm} |                     ¦   «         }n6| j        � | j        d                              ¦   «         }nt          d	¦  «        ‚t          j
        j        j                             ||¬
¦  «        }	|d         dk                         d¦  «                             ¦   «         }
t          j
        j        j                             |
|¬
¦  «        }t          j        |	¦  «        }t          j        |¦  «        }|dk    }t          j        ||t          j        |¦  «        ¦  «        }||z                       ¦   «         }|                     ¦   «         }||                     d¬¦  «        z  }|r||fn|S )aq  
    Computes the loss under sequence parallelism with `sp_backend="deepspeed"` and `sp_size > 1`.

    Performs weighted loss aggregation across SP ranks, accounting for varying numbers of valid tokens per rank
    (e.g., when some ranks receive only padding or prompt tokens that are masked with -100).

    Args:
        accelerator (`Accelerator`): The accelerator instance with `torch_device_mesh` support.
        model (`torch.nn.Module`): The model to compute the loss for.
        inputs (`dict[str, torch.Tensor | Any]`): The input data for the model. Must include `"shift_labels"` key.
        return_outputs (`bool`): Whether to return the model outputs along with the loss.
        pc (`accelerate.parallelism_config.ParallelismConfig`): The parallelism configuration.

    Returns:
        The loss, or a tuple of `(loss, outputs)` if `return_outputs` is `True`.
    ÚlabelsÚshift_labelsr   r¤   r   )ÚgroupsNÚspz™Sequence parallelism is enabled but no SP process group is available. Ensure torch_device_mesh is initialized or sp_backend='deepspeed' with sp_size > 1.)Úgroupiœÿÿÿrì   )Úminre   )ÚlossÚ
sp_backendÚsp_sizer  r<  Ú_get_sequence_parallel_groupÚtorch_device_meshÚ	get_groupr/   rY   rò   r	   Ú
functionalÚ
all_gatherÚviewÚsumÚstackÚwhereÚ
zeros_likeÚclamp)r  rv   ÚinputsÚreturn_outputsÚpcÚoutputsr@  r<  Úsp_groupÚlosses_per_rankÚgood_tokensÚgood_tokens_per_rankÚlosses_stackedÚgood_tokens_stackedÚmaskÚsafe_lossesÚ
total_lossÚtotal_good_tokenss                     r   Údeepspeed_sp_compute_lossr\  ³  sÉ  € ð, �vÐÐ .°FÐ":Ð":à! .Ô1ˆˆxÑØˆeˆoˆo�fˆoˆo€GØŒ<€Dð 
„}˜Ò#Ð#¨¬
°Qª¨Ø*Ð*Ð*Ð*Ð*Ð*à×6Ò6Ñ8Ô8ˆˆØ	Ô	&Ð	2ØÔ0°Ô6×@Ò@ÑBÔBˆˆåðbñ
ô 
ð 	
õ
 Ô'Ô*Ô5×@Ò@ÀÈXÐ@ÑVÔV€Oà˜.Ô)¨TÒ1×7Ò7¸Ñ;Ô;×?Ò?ÑAÔA€KÝ Ô,Ô/Ô:×EÒEÀkÐYaÐEÑbÔbÐÝ”[ Ñ1Ô1€NÝœ+Ð&:Ñ;Ô;ÐØ Ò"€DÝ”+˜d NµEÔ4DÀ^Ñ4TÔ4TÑUÔU€KØÐ 3Ñ3×8Ò8Ñ:Ô:€JØ+×/Ò/Ñ1Ô1ÐØÐ)×/Ò/°AÐ/Ñ6Ô6Ñ6€Dà,Ð6ˆD�'ˆ?ˆ?°$Ð6r!   r+   r{   )T)'r%   rþ   Úimportlib.metadatar   Úimportlib.utilr}   Ú	functoolsr   Údependency_versions_checkr   Úutilsr   r   r   rY   r	   Ú
get_loggerr"   r  r   Úaccelerate.utils.deepspeedr   ÚDeepSpeedConfigÚbuiltinsr   r)   r   r   r‚   r„   r†   r    râ   r  r  r*  r5  r8  r\  re   r!   r   ú<module>rf     sn  ððð ð €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hð ÐÑÔð Ø€L€L€LØÐÐÐÐÐð 
ˆÔ	˜HÑ	%Ô	%€ð
ð 
ð 
ð ÐÑÔð 3Ð!7Ð!7Ñ!9Ô!9ð 3ØOÐOÐOÐOÐOÐOÐOð 3Ð2Ð2Ð2Ð2Ð2ð.ð .ð .ð .ð .˜ñ .ô .ð .ð2pð pð pð pð pÐ0ñ pô pð pðh !%Ð ðIð Ið Ið)ð )ð )ðð ð ðð ð ð ;ð  ;ð  ;ðFlð lð lð^W$ð W$ð W$ð W$ðt3#ð 3#ð 3#ðl@#ð @#ð @#ð @#ðFPð Pð Pð Pð0Nð Nð Nð Nð"57ð 57ð 57ð 57ð 57r!   