# Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from argparse import ArgumentParser from typing import Any, Dict, List, Optional, Union def add_optimizer_args( parent_parser: ArgumentParser, optimizer: str = 'adam', default_lr: float = None, default_opt_args: Optional[Union[Dict[str, Any], List[str]]] = None, ) -> ArgumentParser: """Extends existing argparse with support for optimizers. # Example of adding optimizer args to command line : python train_script.py ... --optimizer "novograd" --lr 0.01 \ --opt_args betas=0.95,0.5 weight_decay=0.001 Args: parent_parser (ArgumentParser): Custom CLI parser that will be extended. optimizer (str): Default optimizer required. default_lr (float): Default learning rate that should be overriden during training. default_opt_args (list(str)): List of overriding arguments for the instantiated optimizer. Returns: ArgumentParser: Parser extended by Optimizers arguments. """ if default_opt_args is None: default_opt_args = [] parser = ArgumentParser(parents=[parent_parser], add_help=True, conflict_handler='resolve') parser.add_argument('--optimizer', type=str, default=optimizer, help='Name of the optimizer. Defaults to Adam.') parser.add_argument('--lr', type=float, default=default_lr, help='Learning rate of the optimizer.') parser.add_argument( '--opt_args', default=default_opt_args, nargs='+', type=str, help='Overriding arguments for the optimizer. \n Must follow the pattern : \n name=value separated by spaces.' 'Example: --opt_args weight_decay=0.001 eps=1e-8 betas=0.9,0.999', ) return parser def add_scheduler_args(parent_parser: ArgumentParser) -> ArgumentParser: """Extends existing argparse with default LR scheduler args. Args: parent_parser (ArgumentParser): Custom CLI parser that will be extended. Returns: ArgumentParser: Parser extended by LR Scheduler arguments. """ parser = ArgumentParser(parents=[parent_parser], add_help=False, conflict_handler='resolve') parser.add_argument("--warmup_steps", type=int, required=False, default=None, help="Number of warmup steps") parser.add_argument( "--warmup_ratio", type=float, required=False, default=None, help="Number of warmup steps as a percentage of total training steps", ) parser.add_argument("--hold_steps", type=int, required=False, default=None, help="Number of hold LR steps") parser.add_argument( "--hold_ratio", type=float, required=False, default=None, help="Number of hold LR steps as a percentage of total training steps", ) parser.add_argument("--min_lr", type=float, required=False, default=0.0, help="Minimum learning rate") parser.add_argument( "--last_epoch", type=int, required=False, default=-1, help="Last epoch id. -1 indicates training from scratch" ) return parser def add_asr_args(parent_parser: ArgumentParser) -> ArgumentParser: """Extends existing argparse with default ASR collection args. Args: parent_parser (ArgumentParser): Custom CLI parser that will be extended. Returns: ArgumentParser: Parser extended by NeMo ASR Collection arguments. """ parser = ArgumentParser(parents=[parent_parser], add_help=False, conflict_handler='resolve') parser.add_argument("--asr_model", type=str, required=True, default="bad_quartznet15x5.yaml", help="") parser.add_argument("--train_dataset", type=str, required=True, default=None, help="training dataset path") parser.add_argument("--eval_dataset", type=str, required=True, help="evaluation dataset path") return parser def add_nlp_args(parent_parser: ArgumentParser) -> ArgumentParser: """Extends existing argparse with default NLP collection args. Args: parent_parser (ArgumentParser): Custom CLI parser that will be extended. Returns: ArgumentParser: Parser extended by NeMo NLP Collection arguments. """ parser = ArgumentParser(parents=[parent_parser], add_help=False, conflict_handler='resolve') parser.add_argument( "--data_dir", type=str, required=False, help="data directory to training or/and evaluation dataset" ) parser.add_argument( "--config_file", type=str, required=False, default=None, help="Huggingface model configuration file" ) parser.add_argument( "--pretrained_model_name", default='bert-base-uncased', type=str, required=False, help="pretrained model name" ) parser.add_argument( "--tokenizer_name", default='nemobert', type=str, choices=['sentencepiece', 'nemobert'], help="Tokenizer type" ) parser.add_argument("--tokenizer_model", default=None, type=str, help="Tokenizer file for sentence piece") parser.add_argument("--do_lower_case", action='store_true', required=False, help="lower case data") return parser