
    bi,                         d dl Z d dlZd dl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
mZ d dlmZmZ d dlZd dlmZ d dlmZmZ d dlmZ  ej.                  e      Ze
 G d d	             Zd
 Z G d de      Zd Zy)    N)Iterable)	dataclassfield)OptionalUnion)HfArgumentParser)	DataClassDataClassType)is_rich_availablec                      e Zd ZU dZ edddi      Zee   ed<    edddi      Z	ee   ed<    ed	dd
i      Z
eed<    edddi      Zeed<    edddi      Zeed<    edddi      Zeed<    edddi      Zeed<   y)ScriptArgumentsa  
    Arguments common to all scripts.

    Args:
        dataset_name (`str`):
            Dataset name.
        dataset_config (`str` or `None`, *optional*, defaults to `None`):
            Dataset configuration name. Corresponds to the `name` argument of the [`~datasets.load_dataset`] function.
        dataset_train_split (`str`, *optional*, defaults to `"train"`):
            Dataset split to use for training.
        dataset_test_split (`str`, *optional*, defaults to `"test"`):
            Dataset split to use for evaluation.
        dataset_streaming (`bool`, *optional*, defaults to `False`):
            Whether to stream the dataset. If True, the dataset will be loaded in streaming mode.
        gradient_checkpointing_use_reentrant (`bool`, *optional*, defaults to `False`):
            Whether to apply `use_reentrant` for gradient checkpointing.
        ignore_bias_buffers (`bool`, *optional*, defaults to `False`):
            Debug argument for distributed training. Fix for DDP issues with LM bias/mask buffers - invalid scalar
            type, inplace operation. See
            https://github.com/huggingface/transformers/issues/22482#issuecomment-1595790992.
    NhelpzDataset name.)defaultmetadatadataset_namezgDataset configuration name. Corresponds to the `name` argument of the `datasets.load_dataset` function.dataset_configtrainz"Dataset split to use for training.dataset_train_splittestz$Dataset split to use for evaluation.dataset_test_splitFzUWhether to stream the dataset. If True, the dataset will be loaded in streaming mode.dataset_streamingz<Whether to apply `use_reentrant` for gradient checkpointing.$gradient_checkpointing_use_reentrantzDebug argument for distributed training. Fix for DDP issues with LM bias/mask buffers - invalid scalar type, inplace operation. See https://github.com/huggingface/transformers/issues/22482#issuecomment-1595790992.ignore_bias_buffers)__name__
__module____qualname____doc__r   r   r   str__annotations__r   r   r   r   boolr   r        L/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/trl/scripts/utils.pyr   r   #   s    , #(?X"YL(3-Y$) 
%NHSM   %WHl?mnn#FfFl=mnn#qrt  27XY2($  !& `
! r"   r   c                      ddl ddl} d}t               rddlm}  |       }n j
                         } j                  |d|gj                         dfd	}|| _        y)	z
    Perform zero verbose init - use this method on top of the CLI modules to make logging and warning output cleaner.
    Uses Rich if available, falls back otherwise.
    r   Nz%(message)s)RichHandlerz[%X])formatdatefmthandlerslevelc           	      T     j                   | d| d|j                   d|         y )N:z: )warningr   )messagecategoryfilenamelinenofilelineloggings         r#   warning_handlerz*init_zero_verbose.<locals>.warning_handlerk   s/    8*AfXR0A0A/B"WINOr"   )NN)	r3   warningsr   rich.loggingr%   StreamHandlerbasicConfigERRORshowwarning)r5   FORMATr%   handlerr4   r3   s        @r#   init_zero_verboser=   W   s_    
 F,-'''')Gvv	QXQ^Q^_P +Hr"   c                        e Zd ZdZ	 ddeeeee   f      f fdZ	 	 	 ddeee	      de
de
deedf   fd	Zdee	   fd
Z xZS )	TrlParsera  
    A subclass of [`transformers.HfArgumentParser`] designed for parsing command-line arguments with dataclass-backed
    configurations, while also supporting configuration file loading and environment variable management.

    Args:
        dataclass_types (`Union[DataClassType, Iterable[DataClassType]]` or `None`, *optional*, defaults to `None`):
            Dataclass types to use for argument parsing.
        **kwargs:
            Additional keyword arguments passed to the [`transformers.HfArgumentParser`] constructor.

    Examples:

    ```yaml
    # config.yaml
    env:
        VAR1: value1
    arg1: 23
    ```

    ```python
    # main.py
    import os
    from dataclasses import dataclass
    from trl import TrlParser


    @dataclass
    class MyArguments:
        arg1: int
        arg2: str = "alpha"


    parser = TrlParser(dataclass_types=[MyArguments])
    training_args = parser.parse_args_and_config()

    print(training_args, os.environ.get("VAR1"))
    ```

    ```bash
    $ python main.py --config config.yaml
    (MyArguments(arg1=23, arg2='alpha'),) value1

    $ python main.py --arg1 5 --arg2 beta
    (MyArguments(arg1=5, arg2='beta'),) None
    ```
    dataclass_typesc                     |g }nt        |t              s|g}|D ])  }d|j                  v st        d|j                   d       t        |   dd|i| y )Nconfigz
Dataclass zu has a field named 'config'. This field is reserved for the config file path and should not be used in the dataclass.r@   r!   )
isinstancer   __dataclass_fields__
ValueErrorr   super__init__)selfr@   kwargsdataclass_type	__class__s       r#   rG   zTrlParser.__init__   s     " OOX6./O . 	N>>>>  !8!8 9 :P Q 	 	CCFCr"   argsreturn_remaining_stringsfail_with_unknown_argsreturn.c                    |t        |      nt        j                  dd }d|v r|j                  d      }|j	                  |       |j	                  |      }t        |      5 }t        j                  |      }ddd       dv ra|j	                  di       }t        |t              st        d      |j                         D ]!  \  }	}
t        |
      t        j                  |	<   #  | j                  d
i |}ng }| j!                  ||      }|r|d   }|dd ||z   fz   S |r|rt        d| d	      |S # 1 sw Y   xY w)a0  
        Parse command-line args and config file into instances of the specified dataclass types.

        This method wraps [`transformers.HfArgumentParser.parse_args_into_dataclasses`] and also parses the config file
        specified with the `--config` flag. The config file (in YAML format) provides argument values that replace the
        default values in the dataclasses. Command line arguments can override values set by the config file. The
        method also sets any environment variables specified in the `env` field of the config file.
        N   z--configenvz.`env` field should be a dict in the YAML file.)rL   rM   z$Unknown arguments from config file: zW. Please remove them, add them to the dataclass, or set `fail_with_unknown_args=False`.r!   )listsysargvindexpopopenyaml	safe_loadrC   dictrE   itemsr   osenvironset_defaults_with_configparse_args_into_dataclasses)rH   rL   rM   rN   config_indexconfig_path	yaml_filerB   env_varskeyvalueconfig_remaining_stringsoutputargs_remaining_stringss                 r#   parse_args_and_configzTrlParser.parse_args_and_config   sf    "-tDz388AB<::j1LHH\"((<0Kk" 3i	23 !::eR0!(D1$%UVV"*.."2 1JC&)%jBJJsO1 (Et'D'D'Nv'N$')$ 11tVn1o $%+BZ"#2;":=S"S!UUU#(@67O6P QD D 
 M;3 3s   #D66D?c           	          fd | |      }|j                         D cg c]!  \  }}||vsd| t        |      fD ]  }| # }}}}|S c c}}}w )a6  
        Overrides the parser's default values with those provided via keyword arguments, including for subparsers.

        Any argument with an updated default will also be marked as not required if it was previously required.

        Returns a list of strings that were not consumed by the parser.
        c                 l   t               }| j                  D ]  }t        |t        j                        r8|j
                  j                         D ]  }|j                   ||              U|j                  |v sd||j                     |_	        d|_
        |j                  |j                          |S )NF)set_actionsrC   argparse_SubParsersActionchoicesvaluesupdatedestr   requiredadd)parserkw	used_keysaction	subparserapply_defaultss        r#   r}   z:TrlParser.set_defaults_with_config.<locals>.apply_defaults   s    I // /fh&@&@A%+^^%:%:%< H	!((	2)FGH[[B&%'_FN&+FOMM&++./ r"   z--)r]   r   )rH   rI   rz   rf   rg   item	remainingr}   s          @r#   r`   z"TrlParser.set_defaults_with_config   s}    	 #40	 $*<<>
 
S%S	5IY[\_[`WacfglcmVn
NRD

	 
 
s
   AA)N)NFT)r   r   r   r   r   r   r
   r   rG   r   r    tupler	   rk   rT   r`   __classcell__)rK   s   @r#   r?   r?   r   s    -b TXD!%x7N(N"OPD. )-).'+	1x}%1 #'1 !%	1
 
y#~	1fDI r"   r?   c                 D   	 t        j                  |       }t        j                  j	                  t        j                  |            }t        j                  j                  t        j                  j                  |d            }t        j                  j                  |d      }t        j                  j                  |      r8t        j                  g d|      j                         j                  d      }|S y # t        $ r}dt        |       cY d }~S d }~ww xY w)Nz..z.git)gitz	rev-parseHEAD)cwdzutf-8zError: )	importlibimport_moduler^   pathdirnameinspectgetfileabspathjoinisdir
subprocesscheck_outputstripdecode	Exceptionr   )package_namepackagepackage_pathgit_repo_pathgit_dircommit_hashes          r#   get_git_commit_hashr     s    ")),7wwww'?@ \4(HI'',,}f577==! ''(D-X^^`gghop   "Q!!"s   C:C> >	DDDD)rp   r   r   r3   r^   r   rU   collections.abcr   dataclassesr   r   typingr   r   rZ   transformersr   transformers.hf_argparserr	   r
   transformers.utilsr   	getLoggerr   loggerr   r=   r?   r   r!   r"   r#   <module>r      sy        	  
 $ ( "  ) > 0 
		8	$ 0 0 0f+6S  Sl"r"   