天天看点

【ChatBot开发笔记】Argparse— 命令行选项、参数和子命令解析器

【ChatBot开发笔记】Argparse— 命令行选项、参数和子命令解析器

argparse

模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后

argparse

将弄清如何从

sys.argv

解析出那些参数。

argparse

模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

安装

pip insatll argparse

使用

1、编写

下面是一段官方演示代码段

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))
           
  • 导入argparse模块后,通过

    argparse.ArgumentParser()

    创建语法解析器parser
  • 通过

    parser.add_argument()

    向解析器添加参数,函数原型为:

    ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

    • name or flags - 一个命名或者一个选项字符串的列表,例如

      foo

      -f, --foo

    • action - 当参数在命令行中出现时使用的动作基本类型。
    • nargs - 命令行参数应当消耗的数目。
    • const - 被一些 action 和 nargs 选择所需求的常数。
    • default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
    • type - 命令行参数应当被转换成的类型。
    • choices - 可用的参数的容器。
    • required - 此命令行选项是否可省略 (仅选项可用)。
    • help - 一个此选项作用的简单描述。
    • metavar - 在使用方法消息中使用的参数值示例。
    • dest - 被添加到

      parse_args()

      所返回对象上的属性名。
  • 通过

    args = parser.parse_args()

    创建参数集对象

2、在命令行中使用,作为交互接口

$ python prog.py -h
usage: prog.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
 N           an integer for the accumulator

optional arguments:
 -h, --help  show this help message and exit
 --sum       sum the integers (default: find the max)

$ python prog.py 1 2 3 4
4

$ python prog.py 1 2 3 4 --sum
10
           

除此之外,argparser在.py文件中还能起到参数容器的作用

# 通过argparse设置训练参数
def setup_train_args():
    """
    设置训练参数
    """
    # argparse是一个提供更轻松的命令行指令编写的库,这里主要用来做参数管理
    parser = argparse.ArgumentParser()
    parser.add_argument('--device', default='0', type=str, required=False, help='设置使用哪些显卡')  #0,1
    # action='store_true',默认为false,即默认使用GPU(cuda工具),除非手动指定不使用GPU
    parser.add_argument('--no_cuda', action='store_true', help='(不)使用GPU进行训练')
    parser.add_argument('--model_config', default='config/model_config_dialogue_small.json', type=str, required=False,
                        help='选择模型参数')
    parser.add_argument('--vocab_path', default='vocabulary/vocab_small.txt', type=str, required=False, help='选择词库')
    parser.add_argument('--train_raw_path', default='smalldata/data.txt', type=str, required=False, help='原始训练语料')
    parser.add_argument('--train_tokenized_path', default='smalldata/train_tokenized.txt', type=str,
                        required=False,
                        help='将原始训练语料tokenize之后的数据的存放位置')
    parser.add_argument('--log_path', default='smalldata/training.log', type=str, required=False, help='训练日志存放位置')
    # 默认不训练,首次使用通过选中以进行tokenize
    parser.add_argument('--raw', action='store_true', help='是否对原始训练语料做tokenize')
    parser.add_argument('--epochs', default=10, type=int, required=False, help='训练的轮次')
    parser.add_argument('--batch_size', default=2, type=int, required=False, help='训练batch size')  # 8
    parser.add_argument('--lr', default=1.5e-4, type=float, required=False, help='学习率')
    parser.add_argument('--warmup_steps', default=2000, type=int, required=False, help='warm up步数')
    parser.add_argument('--log_step', default=1, type=int, required=False, help='多少步汇报一次loss')
    parser.add_argument('--gradient_accumulation', default=1, type=int, required=False, help='梯度积累')
    parser.add_argument('--max_grad_norm', default=1.0, type=float, required=False)
    # 可选的对话模型加载路径
    parser.add_argument('--dialogue_model_path', default='F:\BaiduNetdiskDownload\dialog_model', type=str, required=False, help='对话模型路径')  #dialogue_model_path/
    parser.add_argument('--dialogue_model_output_path', default='dialogue_model/', type=str, required=False,
                        help='对话模型输出路径')
    parser.add_argument('--pretrained_model', default='', type=str, required=False, help='预训练的GPT2模型的路径')
    parser.add_argument('--writer_dir', default='tensorboard_summary/', type=str, required=False, help='Tensorboard路径')
    parser.add_argument('--seed', type=int, default=666, help='设置种子用于生成随机数,以使得训练的结果是确定的')  #None
    parser.add_argument('--num_workers', type=int, default=1, help="dataloader加载数据时使用的线程数量")
    # 默认不训练mmi,指定时进行训练
    parser.add_argument('--train_mmi', action='store_true', help="若指定该参数,则训练DialoGPT的MMI模型")
    parser.add_argument('--train_mmi_tokenized_path', default='smalldata/train_mmi_tokenized.txt', type=str,
                        required=False,
                        help='将原始训练语料的每段对话翻转,然后进行tokenize之后的数据的存放位置,用于训练MMI模型')
    parser.add_argument('--mmi_model_output_path', default='mmi_model', type=str, required=False, help='MMI模型保存路径')
    
    # 在此步进行全局变量管理
    # parser.add_argument('--max_len', type=int, default=60, help='每个utterance的最大长度,超过指定长度则进行截断')
    # parser.add_argument('--max_history_len', type=int, default=4, help="dialogue history的最大长度")
    # parser.parse_args(['--train_mmi'])  选择训练mmi模型
    return parser.parse_args()
           

调用参数

if args.seed:
        set_random_seed(args)
           

修改参数

args.cuda = torch.cuda.is_available() and not args.no_cuda

创建args通过action改变参数

parser.parse_args(['--train_mmi']) 选择训练mmi模型

继续阅读