§
    *�’jÄ;  ã                  óæ   — d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ  ej        e¦  «        Ze G d„ de¦  «        ¦   «         ZdS )é    )ÚannotationsN)ÚCallable)Ú	dataclassÚfield)ÚUnion)Úparse)ÚTrainingArguments)Ú__version__)ÚParallelMode)ÚBatchSamplersÚDefaultBatchSamplerÚMultiDatasetBatchSamplersÚMultiDatasetDefaultBatchSamplerc                  óT  ‡ — e Zd ZU dZg d¢Z edddi¬¦  «        Zded<    eej	        dd	i¬¦  «        Z
d
ed<    eej        ddi¬¦  «        Zded<    eeddi¬¦  «        Zded<    eeddi¬¦  «        Zded<    ed„ ddi¬¦  «        Zded<   ˆ fd„Zedd„¦   «         Zˆ fd„Zˆ xZS )ÚBaseTrainingArgumentsaž  
    BaseTrainingArguments extends :class:`~transformers.TrainingArguments` with additional arguments
    specific to Sentence Transformers. See :class:`~transformers.TrainingArguments` for the complete list of
    available arguments.

    Args:
        output_dir (`str`):
            The output directory where the model checkpoints will be written.
        prompts (`Union[Dict[str, Dict[str, str]], Dict[str, str], str]`, *optional*):
            The prompts to use for each column in the training, evaluation and test datasets. Four formats are accepted:

            1. `str`: A single prompt to use for all columns in the datasets, regardless of whether the training/evaluation/test
               datasets are :class:`datasets.Dataset` or a :class:`datasets.DatasetDict`.
            2. `Dict[str, str]`: A dictionary mapping column names to prompts, regardless of whether the training/evaluation/test
               datasets are :class:`datasets.Dataset` or a :class:`datasets.DatasetDict`.
            3. `Dict[str, str]`: A dictionary mapping dataset names to prompts. This should only be used if your training/evaluation/test
               datasets are a :class:`datasets.DatasetDict` or a dictionary of :class:`datasets.Dataset`.
            4. `Dict[str, Dict[str, str]]`: A dictionary mapping dataset names to dictionaries mapping column names to
               prompts. This should only be used if your training/evaluation/test datasets are a
               :class:`datasets.DatasetDict` or a dictionary of :class:`datasets.Dataset`.

        batch_sampler (Union[:class:`~sentence_transformers.base.sampler.BatchSamplers`, `str`, :class:`~sentence_transformers.base.sampler.DefaultBatchSampler`, Callable[[...], :class:`~sentence_transformers.base.sampler.DefaultBatchSampler`]], *optional*):
            The batch sampler to use. See :class:`~sentence_transformers.base.sampler.BatchSamplers` for valid options.
            Defaults to ``BatchSamplers.BATCH_SAMPLER``.
        multi_dataset_batch_sampler (Union[:class:`~sentence_transformers.base.sampler.MultiDatasetBatchSamplers`, `str`, :class:`~sentence_transformers.base.sampler.MultiDatasetDefaultBatchSampler`, Callable[[...], :class:`~sentence_transformers.base.sampler.MultiDatasetDefaultBatchSampler`]], *optional*):
            The multi-dataset batch sampler to use. See :class:`~sentence_transformers.base.sampler.MultiDatasetBatchSamplers`
            for valid options. Defaults to ``MultiDatasetBatchSamplers.PROPORTIONAL``.
        router_mapping (`Dict[str, str] | Dict[str, Dict[str, str]]`, *optional*):
            A mapping of dataset column names to Router routes, like "query" or "document". This is used to specify
            which Router submodule to use for each dataset. Two formats are accepted:

            1. `Dict[str, str]`: A mapping of column names to routes.
            2. `Dict[str, Dict[str, str]]`: A mapping of dataset names to a mapping of column names to routes for
               multi-dataset training/evaluation.
        learning_rate_mapping (`Dict[str, float] | None`, *optional*):
            A mapping of parameter name regular expressions to learning rates. This allows you to set different
            learning rates for different parts of the model, e.g., `{'SparseStaticEmbedding\.*': 1e-3}` for the
            SparseStaticEmbedding module. This is useful when you want to fine-tune specific parts of the model
            with different learning rates.
    )Úaccelerator_configÚfsdp_configÚ	deepspeedÚgradient_checkpointing_kwargsÚlr_scheduler_kwargsÚlearning_rate_mappingÚpromptsÚrouter_mappingNÚhelpzòThe prompts to use for each column in the datasets. Either 1) a single string prompt, 2) a mapping of column names to prompts, 3) a mapping of dataset names to prompts, or 4) a mapping of dataset names to a mapping of column names to prompts.)ÚdefaultÚmetadataz;Union[str, None, dict[str, str], dict[str, dict[str, str]]]r   zThe batch sampler to use.zRUnion[BatchSamplers, str, DefaultBatchSampler, Callable[..., DefaultBatchSampler]]Úbatch_samplerz'The multi-dataset batch sampler to use.zvUnion[MultiDatasetBatchSamplers, str, MultiDatasetDefaultBatchSampler, Callable[..., MultiDatasetDefaultBatchSampler]]Úmulti_dataset_batch_samplerzíA mapping of dataset column names to Router routes, like "query" or "document". Either 1) a mapping of column names to routes or 2) a mapping of dataset names to a mapping of column names to routes for multi-dataset training/evaluation. )Údefault_factoryr   r   zãA mapping of parameter name regular expressions to learning rates. This allows you to set different learning rates for different parts of the model, e.g., {'SparseStaticEmbedding\.*': 1e-3} for the SparseStaticEmbedding module.z"Union[str, None, dict[str, float]]r   c                 óT   — t          t          ¦  «        t          d¦  «        k    rd ndS )Nú5.0.0ç        )Úparse_versionÚtransformers_version© ó    úVC:\Projects\DSCons\.venv\Lib\site-packages\sentence_transformers\base\training_args.pyú<lambda>zBaseTrainingArguments.<lambda>v   s'   € ­Õ6JÑ(KÔ(KÍ}Ð]dÑOeÔOeÒ(eÐ(e  Ðkn€ r&   z¬This argument is deprecated and will be removed in the future. If you're on Transformers v5+, then you should use `warmup_steps` instead as it also works with float values.zfloat | NoneÚwarmup_ratioc                ó¾  •— t          t          ¦  «        t          d¦  «        k    r@| j        �8| j        dk    r-| j        | _        d | _        t                               d¦  «         nMt          | j        t          ¦  «        r3d| j        cxk     rdk     r!n n| j        dk    r| j        | _        d| _        t          ¦   «          	                    ¦   «          t          | j
        t          ¦  «        rt          | j
        ¦  «        n| j
        | _
        t          | j        t          ¦  «        rt          | j        ¦  «        n| j        | _        t          | j        t          ¦  «        r5	 t!          j        | j        ¦  «        | _        n# t           j        $ r Y nw xY w| j        �| j        ni | _        t          | j        t          ¦  «        rB	 t!          j        | j        ¦  «        | _        n"# t           j        $ r t)          d¦  «        ‚w xY w| j        �| j        ni | _        t          | j        t          ¦  «        rB	 t!          j        | j        ¦  «        | _        n"# t           j        $ r t)          d¦  «        ‚w xY wd| _        d	| _        | j        t2          j        k    r&| j        d
k    rt                               d¦  «         nH| j        t2          j        k    r3| j        s,| j        d
k    rt                               d¦  «         d| _        | j        d
k    rB| j        dk    r9| j        s4|                       ¦   «         r"t                               d¦  «         d S d S d S d S d S )Nr!   r   a  The `warmup_ratio` argument is deprecated in Transformers v5+, and will also be removed from Sentence Transformers once support for Transformers v4 is dropped. Since you're using Transformers v5+, please use `warmup_steps` (as a float) to specify the warmup ratio instead.r"   g      ð?zœThe `learning_rate_mapping` argument must be a dictionary mapping parameter name regular expressions to learning rates. A stringified dictionary also works.z¢The `router_mapping` argument must be a dictionary mapping dataset column names to Router routes, like 'query' or 'document'. A stringified dictionary also works.TFÚunusedzáCurrently using DataParallel (DP) for multi-gpu training, while DistributedDataParallel (DDP) is recommended for faster training. See https://sbert.net/docs/sentence_transformer/training/distributed.html for more information.z¶When using DistributedDataParallel (DDP), it is recommended to set `dataloader_drop_last=True` to avoid hanging issues with an uneven last batch. Setting `dataloader_drop_last=True`.a¥  When using `dataloader_num_workers > 0` with spawned worker processes, it is recommended to also set `dataloader_persistent_workers=True`. Every spawned worker imports Sentence Transformers before it can produce a batch, which takes several seconds per worker, and without persistent workers that cost is paid again on every epoch and every evaluation. This commonly makes training slower than `dataloader_num_workers=0`.)!r#   r$   r)   Úwarmup_stepsÚloggerÚwarningÚ
isinstanceÚfloatÚsuperÚ__post_init__r   Ústrr   r   r   r   ÚjsonÚloadsÚJSONDecodeErrorr   Ú
ValueErrorr   Úprediction_loss_onlyÚddp_broadcast_buffersÚparallel_moder   ÚNOT_DISTRIBUTEDÚ
output_dirÚDISTRIBUTEDÚdataloader_drop_lastÚdataloader_num_workersÚdataloader_persistent_workersÚ_workers_are_spawned)ÚselfÚ	__class__s    €r'   r2   z#BaseTrainingArguments.__post_init__}   sÂ  ø€ õ Õ-Ñ.Ô.µ-ÀÑ2HÔ2HÒHÐHð Ô Ð,°Ô1BÀaÒ1GÐ1GØ$(Ô$5�Ô!Ø$(�Ô!å—’ðtñô ð øõ ˜$Ô+­UÑ3Ô3ð &¸¸dÔ>OÐ8UÐ8UÒ8UÐ8UÐRUÒ8UÐ8UÐ8UÐ8UÐ8UÐZ^ÔZkÐorÒZrÐZrØ$(Ô$5�Ô!Ø$%�Ô!å‰Œ×ÒÑÔÐõ 2<¸DÔ<NÕPSÑ1TÔ1TÐl�M˜$Ô,Ñ-Ô-Ð-ÐZ^ÔZlð 	Ôõ
 ˜$Ô:½CÑ@Ô@ð2Õ% dÔ&FÑGÔGÐGàÔ1ð 	Ô(õ �d”l¥CÑ(Ô(ð 	ðÝ#œz¨$¬,Ñ7Ô7�”�øÝÔ'ð ð ð ð �ðøøøð
 DHÔC]ÐCi TÔ%?Ð%?ÐoqˆÔ"Ý�dÔ0µ#Ñ6Ô6ð 	ðÝ-1¬Z¸Ô8RÑ-SÔ-S�Ô*Ð*øÝÔ'ð ð ð Ý ðNñô ð ðøøøð 6:Ô5HÐ5T˜dÔ1Ð1ÐZ\ˆÔÝ�dÔ)­3Ñ/Ô/ð 	ðÝ&*¤j°Ô1DÑ&EÔ&E�Ô#Ð#øÝÔ'ð ð ð Ý ðWñô ð ðøøøð %)ˆÔ!ð &+ˆÔ"àÔ¥Ô!=Ò=Ð=ð Œ (Ò*Ð*Ý—’ðvñô ð øð
 Ô¥<Ô#;Ò;Ð;ÀDÔD]Ð;ð Œ (Ò*Ð*Ý—’ð;ñô ð ð )-ˆDÔ%ð
 ŒO˜xÒ'Ð'ØÔ+¨aÒ/Ð/ØÔ6ð 0à×)Ò)Ñ+Ô+ð 0õ �NŠNðWñô ð ð ð ð (Ð'Ø/Ð/Ð/Ð/Ð/Ð/s*   Å#F ÆFÆFÇG& Ç&HÈ8I ÉI6ÚreturnÚboolc                 ón   — t          j        d¬¦  «        } | €t          j        ¦   «         d         } | dk    S )aÛ  Whether dataloader workers start via ``spawn`` rather than ``fork``/``forkserver``.

        Only ``spawn`` pays the import cost per worker. A ``forkserver`` worker is forked from a server
        process that preloads ``__main__``, so it inherits the already imported modules like ``fork`` does.

        Both reads are non-locking, so merely constructing training arguments never fixes the start method,
        which would break a later ``set_start_method`` call.
        T)Ú
allow_noneNr   Úspawn)ÚmultiprocessingÚget_start_methodÚget_all_start_methods)Ústart_methods    r'   rA   z*BaseTrainingArguments._workers_are_spawnedë   s;   € õ 'Ô7À4ÐHÑHÔHˆØÐå*Ô@ÑBÔBÀ1ÔEˆLØ˜wÒ&Ð&r&   c                ó¨   •— t          ¦   «                              ¦   «         }t          |d         ¦  «        r|d= t          |d         ¦  «        r|d= |S )Nr   r   )r1   Úto_dictÚcallable)rB   Útraining_args_dictrC   s     €r'   rN   zBaseTrainingArguments.to_dictû   s\   ø€ Ý"™WœWŸ_š_Ñ.Ô.ÐÝÐ& Ô7Ñ8Ô8ð 	4Ø" ?Ð3ÝÐ&Ð'DÔEÑFÔFð 	BØ"Ð#@ÐAØ!Ð!r&   )rD   rE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_VALID_DICT_FIELDSr   r   Ú__annotations__r   ÚBATCH_SAMPLERr   r   ÚPROPORTIONALr   Údictr   r   r)   r2   ÚstaticmethodrA   rN   Ú__classcell__)rC   s   @r'   r   r      s  ø€ € € € € € ð'ð 'ðZ	ð 	ð 	Ðð LQÈ5Øàð dð
ðLñ Lô L€Gð ð ð ñ ð inÐhmØÔ+°vÐ?ZÐ6[ðiñ iô i€Mð ð ð ñ ð
 	ˆØ)Ô6À&ÐJsÐAtð	ñ 	ô 	ð  ð ð ð ñ ð
 SXÐRWØàð Pð
ðSñ Sô S€Nð ð ð ñ ð AFÀØàð Xð
ðAñ Aô AÐð ð ð ñ ð "' ØnÐnàð ]ð
ð"ñ "ô "€Lð ð ð ñ ðlð lð lð lð lð\ ð'ð 'ð 'ñ „\ð'ð"ð "ð "ð "ð "ð "ð "ð "ð "r&   r   )Ú
__future__r   r4   ÚloggingrI   Úcollections.abcr   Údataclassesr   r   Útypingr   Úpackaging.versionr   r#   Útransformersr	   ÚTransformersTrainingArgumentsr
   r$   Útransformers.training_argsr   Ú"sentence_transformers.base.samplerr   r   r   r   Ú	getLoggerrQ   r-   r   r%   r&   r'   ú<module>rg      sT  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø KÐ KÐ KÐ KÐ KÐ KØ <Ð <Ð <Ð <Ð <Ð <Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ð ðg"ð g"ð g"ð g"ð g"Ð9ñ g"ô g"ñ „ðg"ð g"ð g"r&   