天天看點

【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模型

繼續閱讀