§
    ‚Štj&  ã                   ó|   — d dl Z d dlZd dlZd dlmZ ddlmZmZmZm	Z	  e	j
        e¦  «        Zdefd„Zd„ Zd	d„ZdS )
é    N)Ú
DataLoaderé   )ÚWEIGHTS_NAMEÚPushToHubMixinÚis_torch_xla_availableÚloggingÚ
dataloaderc                 óì   — t          ¦   «         redd lmc m} t	          | |j        ¦  «        s
J d¦   «         ‚dd lmc m} |                     | 	                    ¦   «         d¦  «        }|| j
        d<   | S | S )Nr   zPThe dataloader must be a `torch_xla.distributed.parallel_loader.MpDeviceLoader`.)ÚfsdpNÚinput_sharding)r   Ú%torch_xla.distributed.parallel_loaderÚdistributedÚparallel_loaderÚ
isinstanceÚMpDeviceLoaderÚtorch_xla.distributed.spmdÚspmdÚShardingSpecÚget_global_meshÚ_parallel_loader_kwargs)r	   ÚplÚxsÚsharding_specs       ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/integrations/tpu.pyÚtpu_spmd_dataloaderr      s«   € ÝÑÔð Ø:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:å˜* bÔ&7Ñ8Ô8ð 	
ð 	
Ø^ñ	
ô 	
Ð8ð 	0Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/àŸš¨×(:Ò(:Ñ(<Ô(<¸nÑMÔMˆØ?Lˆ
Ô*Ð+;Ñ<ØÐàÐó    c                 ó8  ‡‡‡‡‡‡— ddl mc mŠ ddlmc mŠ ddlm} 	 ddlm	Š ddlm
Š ddlm}m} ‰rddlmŠ n# t           $ r t!          d	¦  «        ‚w xY wd}d}t#          | d
d¦  «        }|j                             d|¦  «        }	|j        d         dk    r"t)          j        ||j        d         ¬¦  «        }n]|	�[t-          ¦   «         }
|	D ]4} || |¦  «        }|€t/          d¦  «        ‚|
                     |¦  «         Œ5t)          j        ||
¬¦  «        }|j        }|j        d         r:| j        j        r&t8                               d¦  «         d| j        _        ˆˆˆˆfd„}‰rˆfd„} ‰| |||¬¦  «        } n ‰| f||dœ|¤Ž} di fˆfd„	}|‰_        | S )a.  
    Wraps a model with XLA Fully Sharded Data Parallelism (FSDP).

    Handles both FSDP v1 (`XlaFullyShardedDataParallel`) and v2 (`SpmdFullyShardedDataParallel`),
    including auto-wrap policies, gradient checkpointing, and patching `xm.optimizer_step`.

    Args:
        model (`torch.nn.Module`): The model to wrap.
        args (`TrainingArguments`): The training arguments containing FSDP configuration.
        is_fsdp_xla_v2_enabled (`bool`): Whether FSDP v2 (SPMD) is enabled.

    Returns:
        `torch.nn.Module`: The FSDP-wrapped model.
    r   Nr   )Úget_module_class_from_name)ÚXlaFullyShardedDataParallel)Úcheckpoint_module)Úsize_based_auto_wrap_policyÚtransformer_auto_wrap_policy)ÚSpmdFullyShardedDataParallelzJMissing XLA FSDP related module; please make sure to use torch-xla >= 2.0.Ú_no_split_modulesÚtransformer_layer_cls_to_wrapÚmin_num_params)r&   z@Could not find the transformer layer class to wrap in the model.)Útransformer_layer_clsÚxla_fsdp_grad_ckptzX`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`.Fc                 ó:   •— ‰s‰n‰} | ‰| ¦  «        g|¢R i |¤ŽS ©N© )ÚmÚargsÚkwargsÚ
target_clsÚFSDPÚFSDPv2r    Úis_fsdp_xla_v2_enableds       €€€€r   Úauto_wrapper_callablez2wrap_model_xla_fsdp.<locals>.auto_wrapper_callablet   s=   ø€ Ø%;ÐG˜˜ÀˆJØ�:Ð/Ð/°Ñ2Ô2ÐD°TÐDÐDÐD¸VÐDÐDÐDr   c                 ó  •— ddl m} d }t          | t          j        ¦  «        r| }n5t          | t
          ¦  «        r	| d         }nt          | |¦  «        r| j        }|€t          d¦  «        ‚‰                     ||d¦  «         d S )Nr   )ÚCausalLMOutputWithPastr   zASomething went wrong, the output of the model shouldn't be `None`)r   NN)	Úmodeling_outputsr5   r   ÚtorchÚTensorÚtupleÚlogitsÚ
ValueErrorÚmark_sharding)ÚoutputÚmeshr5   Úreal_outputr   s       €r   Úshard_outputz)wrap_model_xla_fsdp.<locals>.shard_output{   s    ø€ ØAÐAÐAÐAÐAÐAàˆKÝ˜&¥%¤,Ñ/Ô/ð ,Ø$��Ý˜F¥EÑ*Ô*ð ,Ø$ Qœi��Ý˜FÐ$:Ñ;Ô;ð ,Ø$œm�àÐ"Ý Ð!dÑeÔeÐeØ×Ò˜[¨$Ð0DÑEÔEÐEÐEÐEr   )r@   Úauto_wrap_policyr3   )rA   r3   c                 óN   •—  | j         di |¤Ž}|r‰                     ¦   «          |S )Nr+   )ÚstepÚ	mark_step)Ú	optimizerÚbarrierÚoptimizer_argsÚlossÚxms       €r   Úpatched_optimizer_stepz3wrap_model_xla_fsdp.<locals>.patched_optimizer_stepš   s4   ø€ ØˆyŒ~Ð/Ð/ Ð/Ð/ˆØð 	Ø�LŠL‰NŒNˆNØˆr   )Útorch_xla.core.xla_modelÚcoreÚ	xla_modelr   r   r   Útrainer_pt_utilsr   Útorch_xla.distributed.fsdpr   r    Útorch_xla.distributed.fsdp.wrapr!   r"   Ú7torch_xla.experimental.spmd_fully_sharded_data_parallelr#   ÚImportErrorÚgetattrÚfsdp_configÚgetÚ	functoolsÚpartialÚsetÚ	ExceptionÚaddÚxla_fsdp_configÚconfigÚ	use_cacheÚloggerÚwarning_onceÚoptimizer_step)Úmodelr-   r2   r   r!   r"   rA   r3   Ú%default_transformer_cls_names_to_wrapÚ"fsdp_transformer_layer_cls_to_wrapÚtransformer_cls_to_wrapÚlayer_classÚtransformer_clsÚfsdp_kwargsr@   rJ   r0   r1   r    rI   r   s     `             @@@@@r   Úwrap_model_xla_fsdprh   .   s,  øøøøøø€ ð *Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+à=Ð=Ð=Ð=Ð=Ð=ðhØRÐRÐRÐRÐRÐRØ@Ð@Ð@Ð@Ð@Ð@ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 "ð 	ðð ð ð ð ð øøõ ð hð hð hÝÐfÑgÔgÐgðhøøøð ÐØ ÐÝ,3°EÐ;NÐPTÑ,UÔ,UÐ)Ø)-Ô)9×)=Ò)=Ø'Ð)Nñ*ô *Ð&ð ÔÐ(Ô)¨AÒ-Ð-Ý$Ô,Ø'¸Ô8HÐIYÔ8Zð
ñ 
ô 
ÐÐð 
,Ð	7Ý"%¡%¤%ÐØ=ð 	=ð 	=ˆKØ8Ð8¸ÀÑLÔLˆOØÐ&ÝÐ bÑcÔcÐcà'×+Ò+¨OÑ<Ô<Ð<Ð<å$Ô,Ø(à"9ð
ñ 
ô 
Ðð Ô&€KØÔÐ,Ô-ð 
EØŒ<Ô!ð 	+Ý×ÒØjñô ð ð &+ˆEŒLÔ"ð	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð
 ð 
ð	Fð 	Fð 	Fð 	Fð 	Fð �ØØ%Ø-Ø"7ð	
ñ 
ô 
ˆˆð �Øð
à-Ø"7ð
ð 
ð ð	
ð 
ˆð 38Èð ð ð ð ð ð ð /€BÔà€Ls	    = ½Ac           	      ó@  — ddl mc m} |�|n|j        }t                               d|› �¦  «         |                     ¦   «          |                     d¬¦  «        rIt          j	        |d¬¦  «         t          j        |t          j                             |d¦  «        ¦  «         t          f}|                     d	¦  «         |�rq|                      ¦   «         |                      ¦   «         d
œ}t          j                             |d|j        › d|j        › dt(          › �¦  «        }	|                     ||	d¬¦  «         |                     d¦  «         |j        rÚddlm}
  |
t          j                             |d¦  «        dt(          › �d¬¦  «        \  }}| j        j        } |                     | ¦  «        }t5          ||¦  «        r|                     ||¬¦  «         �n›t                               d¦  «         |                     |t          j                             |t(          ¦  «        ¦  «         �nFt5          | |¦  «        sôt5          |                     | ¦  «        |¦  «        rV|                     | ¦  «                             ||j        |                     |                      ¦   «         ¦  «        ¬¦  «         n½t                               d¦  «         |                     |                      ¦   «         ¦  «        }|                     |t          j                             |t(          ¦  «        ¦  «         nB|                      ||j        |                     |                      ¦   «         ¦  «        ¬¦  «         |�|j        r|                     |¦  «         dS dS dS )a”  
    Saves a model checkpoint on TPU/XLA devices.

    Handles FSDP v1 sharded checkpoints (with consolidation on master), as well as
    standard XLA model saving via `save_pretrained` or `xm.save`.

    Args:
        model (`torch.nn.Module`): The model to save.
        args (`TrainingArguments`): The training arguments.
        accelerator (`Accelerator`): The accelerator instance.
        processing_class: The processing class (tokenizer/processor) to save alongside the model.
        is_fsdp_xla_v1_enabled (`bool`): Whether FSDP XLA v1 is enabled.
        output_dir (`str`, *optional*): The directory to save to. Defaults to `args.output_dir`.
    r   NzSaving model checkpoint to F)ÚlocalT)Úexist_okztraining_args.binÚsaving_checkpoint)ra   Úshard_metadataÚrankz-of-ú-)Úmaster_onlyÚsave_full_checkpoints)Ú%consolidate_sharded_model_checkpointsÚ zrank*-of-*-)Úckpt_prefixÚckpt_suffixÚ
save_model)Ú
state_dictzETrainer.model is not a `PreTrainedModel`, only saving its state dict.)Úis_main_processrw   )rK   rL   rM   Ú
output_dirr^   ÚinforD   Úis_master_ordinalÚosÚmakedirsr7   ÚsaveÚpathÚjoinr   Ú
rendezvousrw   Úget_shard_metadataÚprocess_indexÚ
world_sizer   Úshould_saverO   rr   ÚmoduleÚunwrap_modelr   Úsave_pretrainedÚ_maybe_convert_to_cpu)ra   r-   ÚacceleratorÚprocessing_classÚis_fsdp_xla_v1_enabledry   rI   Úsupported_classesÚckptÚ	ckpt_pathrr   Úfull_state_dictÚ_Úunwrapped_modelrw   s                  r   Úsave_tpu_checkpointr“   ¥   s�  € ð *Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)à)Ð5��¸4¼?€Jå
‡K‚KÐ:¨jÐ:Ð:Ñ;Ô;Ð;Ø‡L‚L�N„N€Nà	×Ò %ÐÑ(Ô(ð HÝ
Œ�J¨Ð.Ñ.Ô.Ð.ÝŒ
�4�œŸš jÐ2EÑFÔFÑGÔGÐGõ (Ð)ÐØ‡M‚MÐ%Ñ&Ô&Ð&Øñ *
à×%Ò%Ñ'Ô'Ø#×6Ò6Ñ8Ô8ð
ð 
ˆõ ”G—L’L Ð-l°DÔ4FÐ-lÐ-lÈDÌOÐ-lÐ-lÕ^jÐ-lÐ-lÑmÔmˆ	à
�Š��i¨UˆÑ3Ô3Ð3à
�ŠÐ-Ñ.Ô.Ð.àÔð 	QØXÐXÐXÐXÐXÐXà!FÐ!FÝœGŸLšL¨°RÑ8Ô8Ø8­,Ð8Ð8Ø ð"ñ "ô "ÑˆO˜Qð
 ”LÔ'ˆEØ)×6Ò6°uÑ=Ô=ˆOÝ˜/Ð+<Ñ=Ô=ð QØ×/Ò/°
ÀÐ/ÑWÔWÐWÑWå—’ÐcÑdÔdÐdØ—’˜­¬¯ª°jÅ,Ñ)OÔ)OÑPÔPÐPùÝ˜Ð0Ñ1Ô1ð 
Ý�k×.Ò.¨uÑ5Ô5Ð7HÑIÔIð 		HØ×$Ò$ UÑ+Ô+×;Ò;ØØ $Ô 0Ø×3Ò3°E×4DÒ4DÑ4FÔ4FÑGÔGð <ñ ô ð ð õ �KŠKÐ_Ñ`Ô`Ð`Ø×1Ò1°%×2BÒ2BÑ2DÔ2DÑEÔEˆJØ�GŠG�J¥¤§¢¨Z½Ñ FÔ FÑGÔGÐGÐGà×ÒØØ Ô,Ø×/Ò/°×0@Ò0@Ñ0BÔ0BÑCÔCð 	ñ 	
ô 	
ð 	
ð
 Ð#¨Ô(8Ð#Ø×(Ò(¨Ñ4Ô4Ð4Ð4Ð4ð $Ð#Ð#Ð#r   r*   )rV   r|   r7   Útorch.utils.datar   Úutilsr   r   r   r   Ú
get_loggerÚ__name__r^   r   rh   r“   r+   r   r   ú<module>r˜      sÁ   ðð Ð Ð Ð Ø 	€	€	€	à €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ Qð 
ˆÔ	˜HÑ	%Ô	%€ð Jð ð ð ð ð&tð tð tðnJ5ð J5ð J5ð J5ð J5ð J5r   