You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

train.py 6.7 kB

Dev0.4.0 (#149) * 1. CRF增加支持bmeso类型的tag 2. vocabulary中增加注释 * BucketSampler增加一条错误检测 * 1.修改ClipGradientCallback的bug;删除LRSchedulerCallback中的print,之后应该传入pbar进行打印;2.增加MLP注释 * update MLP module * 增加metric注释;修改trainer save过程中的bug * Update README.md fix tutorial link * Add ENAS (Efficient Neural Architecture Search) * add ignore_type in DataSet.add_field * * AutoPadder will not pad when dtype is None * add ignore_type in DataSet.apply * 修复fieldarray中padder潜在bug * 修复crf中typo; 以及可能导致数值不稳定的地方 * 修复CRF中可能存在的bug * change two default init arguments of Trainer into None * Changes to Callbacks: * 给callback添加给定几个只读属性 * 通过manager设置这些属性 * 代码优化,减轻@transfer的负担 * * 将enas相关代码放到automl目录下 * 修复fast_param_mapping的一个bug * Trainer添加自动创建save目录 * Vocabulary的打印,显示内容 * * 给vocabulary添加遍历方法 * 修复CRF为负数的bug * add SQuAD metric * add sigmoid activate function in MLP * - add star transformer model - add ConllLoader, for all kinds of conll-format files - add JsonLoader, for json-format files - add SSTLoader, for SST-2 & SST-5 - change Callback interface - fix batch multi-process when killed - add README to list models and their performance * - fix test * - fix callback & tests * - update README * 修改部分bug;调整callback * 准备发布0.4.0版本“ * update readme * support parallel loss * 防止多卡的情况导致无法正确计算loss“ * update advance_tutorial jupyter notebook * 1. 在embedding_loader中增加新的读取函数load_with_vocab(), load_without_vocab, 比之前的函数改变主要在(1)不再需要传入embed_dim(2)自动判断当前是word2vec还是glove. 2. vocabulary增加from_dataset(), index_dataset()函数。避免需要多行写index dataset的问题。 3. 在utils中新增一个cache_result()修饰器,用于cache函数的返回值。 4. callback中新增update_every属性 * 1.DataSet.apply()报错时提供错误的index 2.Vocabulary.from_dataset(), index_dataset()提供报错时的vocab顺序 3.embedloader在embed读取时遇到不规则的数据跳过这一行. * update attention * doc tools * fix some doc errors * 修改为中文注释,增加viterbi解码方法 * 样例版本 * - add pad sequence for lstm - add csv, conll, json filereader - update dataloader - remove useless dataloader - fix trainer loss print - fix tests * - fix test_tutorial * 注释增加 * 测试文档 * 本地暂存 * 本地暂存 * 修改文档的顺序 * - add document * 本地暂存 * update pooling * update bert * update documents in MLP * update documents in snli * combine self attention module to attention.py * update documents on losses.py * 对DataSet的文档进行更新 * update documents on metrics * 1. 删除了LSTM中print的内容; 2. 将Trainer和Tester的use_cuda修改为了device; 3.补充Trainer的文档 * 增加对Trainer的注释 * 完善了trainer,callback等的文档; 修改了部分代码的命名以使得代码从文档中隐藏 * update char level encoder * update documents on embedding.py * - update doc * 补充注释,并修改部分代码 * - update doc - add get_embeddings * 修改了文档配置项 * 修改embedding为init_embed初始化 * 1.增加对Trainer和Tester的多卡支持; * - add test - fix jsonloader * 删除了注释教程 * 给 dataset 增加了get_field_names * 修复bug * - add Const - fix bugs * 修改部分注释 * - add model runner for easier test models - add model tests * 修改了 docs 的配置和架构 * 修改了核心部分的一大部分文档,TODO: 1. 完善 trainer 和 tester 部分的文档 2. 研究注释样例与测试 * core部分的注释基本检查完成 * 修改了 io 部分的注释 * 全部改为相对路径引用 * 全部改为相对路径引用 * small change * 1. 从安装文件中删除api/automl的安装 2. metric中存在seq_len的bug 3. sampler中存在命名错误,已修改 * 修复 bug :兼容 cpu 版本的 PyTorch TODO:其它地方可能也存在类似的 bug * 修改文档中的引用部分 * 把 tqdm.autonotebook 换成tqdm.auto * - fix batch & vocab * 上传了文档文件 *.rst * 上传了文档文件和若干 TODO * 讨论并整合了若干模块 * core部分的测试和一些小修改 * 删除了一些冗余文档 * update init files * update const files * update const files * 增加cnn的测试 * fix a little bug * - update attention - fix tests * 完善测试 * 完成快速入门教程 * 修改了sequence_modeling 命名为 sequence_labeling 的文档 * 重新 apidoc 解决改名的遗留问题 * 修改文档格式 * 统一不同位置的seq_len_to_mask, 现统一到core.utils.seq_len_to_mask * 增加了一行提示 * 在文档中展示 dataset_loader * 提示 Dataset.read_csv 会被 CSVLoader 替换 * 完成 Callback 和 Trainer 之间的文档 * index更新了部分 * 删除冗余的print * 删除用于分词的metric,因为有可能引起错误 * 修改文档中的中文名称 * 完成了详细介绍文档 * tutorial 的 ipynb 文件 * 修改了一些介绍文档 * 修改了 models 和 modules 的主页介绍 * 加上了 titlesonly 这个设置 * 修改了模块文档展示的标题 * 修改了 core 和 io 的开篇介绍 * 修改了 modules 和 models 开篇介绍 * 使用 .. todo:: 隐藏了可能被抽到文档中的 TODO 注释 * 修改了一些注释 * delete an old metric in test * 修改 tutorials 的测试文件 * 把暂不发布的功能移到 legacy 文件夹 * 删除了不能运行的测试 * 修改 callback 的测试文件 * 删除了过时的教程和测试文件 * cache_results 参数的修改 * 修改 io 的测试文件; 删除了一些过时的测试 * 修复bug * 修复无法通过test_utils.py的测试 * 修复与pytorch1.1中的padsequence的兼容问题; 修改Trainer的pbar * 1. 修复metric中的bug; 2.增加metric测试 * add model summary * 增加别名 * 删除encoder中的嵌套层 * 修改了 core 部分 import 的顺序,__all__ 暴露的内容 * 修改了 models 部分 import 的顺序,__all__ 暴露的内容 * 修改了文件名 * 修改了 modules 模块的__all__ 和 import * fix var runn * 增加vocab的clear方法 * 一些符合 PEP8 的微调 * 更新了cache_results的例子 * 1. 对callback中indices潜在None作出提示;2.DataSet支持通过List进行index * 修改了一个typo * 修改了 README.md * update documents on bert * update documents on encoder/bert * 增加一个fitlog callback,实现与fitlog实验记录 * typo * - update dataset_loader * 增加了到 fitlog 文档的链接。 * 增加了 DataSet Loader 的文档 * - add star-transformer reproduction
6 years ago
Dev0.4.0 (#149) * 1. CRF增加支持bmeso类型的tag 2. vocabulary中增加注释 * BucketSampler增加一条错误检测 * 1.修改ClipGradientCallback的bug;删除LRSchedulerCallback中的print,之后应该传入pbar进行打印;2.增加MLP注释 * update MLP module * 增加metric注释;修改trainer save过程中的bug * Update README.md fix tutorial link * Add ENAS (Efficient Neural Architecture Search) * add ignore_type in DataSet.add_field * * AutoPadder will not pad when dtype is None * add ignore_type in DataSet.apply * 修复fieldarray中padder潜在bug * 修复crf中typo; 以及可能导致数值不稳定的地方 * 修复CRF中可能存在的bug * change two default init arguments of Trainer into None * Changes to Callbacks: * 给callback添加给定几个只读属性 * 通过manager设置这些属性 * 代码优化,减轻@transfer的负担 * * 将enas相关代码放到automl目录下 * 修复fast_param_mapping的一个bug * Trainer添加自动创建save目录 * Vocabulary的打印,显示内容 * * 给vocabulary添加遍历方法 * 修复CRF为负数的bug * add SQuAD metric * add sigmoid activate function in MLP * - add star transformer model - add ConllLoader, for all kinds of conll-format files - add JsonLoader, for json-format files - add SSTLoader, for SST-2 & SST-5 - change Callback interface - fix batch multi-process when killed - add README to list models and their performance * - fix test * - fix callback & tests * - update README * 修改部分bug;调整callback * 准备发布0.4.0版本“ * update readme * support parallel loss * 防止多卡的情况导致无法正确计算loss“ * update advance_tutorial jupyter notebook * 1. 在embedding_loader中增加新的读取函数load_with_vocab(), load_without_vocab, 比之前的函数改变主要在(1)不再需要传入embed_dim(2)自动判断当前是word2vec还是glove. 2. vocabulary增加from_dataset(), index_dataset()函数。避免需要多行写index dataset的问题。 3. 在utils中新增一个cache_result()修饰器,用于cache函数的返回值。 4. callback中新增update_every属性 * 1.DataSet.apply()报错时提供错误的index 2.Vocabulary.from_dataset(), index_dataset()提供报错时的vocab顺序 3.embedloader在embed读取时遇到不规则的数据跳过这一行. * update attention * doc tools * fix some doc errors * 修改为中文注释,增加viterbi解码方法 * 样例版本 * - add pad sequence for lstm - add csv, conll, json filereader - update dataloader - remove useless dataloader - fix trainer loss print - fix tests * - fix test_tutorial * 注释增加 * 测试文档 * 本地暂存 * 本地暂存 * 修改文档的顺序 * - add document * 本地暂存 * update pooling * update bert * update documents in MLP * update documents in snli * combine self attention module to attention.py * update documents on losses.py * 对DataSet的文档进行更新 * update documents on metrics * 1. 删除了LSTM中print的内容; 2. 将Trainer和Tester的use_cuda修改为了device; 3.补充Trainer的文档 * 增加对Trainer的注释 * 完善了trainer,callback等的文档; 修改了部分代码的命名以使得代码从文档中隐藏 * update char level encoder * update documents on embedding.py * - update doc * 补充注释,并修改部分代码 * - update doc - add get_embeddings * 修改了文档配置项 * 修改embedding为init_embed初始化 * 1.增加对Trainer和Tester的多卡支持; * - add test - fix jsonloader * 删除了注释教程 * 给 dataset 增加了get_field_names * 修复bug * - add Const - fix bugs * 修改部分注释 * - add model runner for easier test models - add model tests * 修改了 docs 的配置和架构 * 修改了核心部分的一大部分文档,TODO: 1. 完善 trainer 和 tester 部分的文档 2. 研究注释样例与测试 * core部分的注释基本检查完成 * 修改了 io 部分的注释 * 全部改为相对路径引用 * 全部改为相对路径引用 * small change * 1. 从安装文件中删除api/automl的安装 2. metric中存在seq_len的bug 3. sampler中存在命名错误,已修改 * 修复 bug :兼容 cpu 版本的 PyTorch TODO:其它地方可能也存在类似的 bug * 修改文档中的引用部分 * 把 tqdm.autonotebook 换成tqdm.auto * - fix batch & vocab * 上传了文档文件 *.rst * 上传了文档文件和若干 TODO * 讨论并整合了若干模块 * core部分的测试和一些小修改 * 删除了一些冗余文档 * update init files * update const files * update const files * 增加cnn的测试 * fix a little bug * - update attention - fix tests * 完善测试 * 完成快速入门教程 * 修改了sequence_modeling 命名为 sequence_labeling 的文档 * 重新 apidoc 解决改名的遗留问题 * 修改文档格式 * 统一不同位置的seq_len_to_mask, 现统一到core.utils.seq_len_to_mask * 增加了一行提示 * 在文档中展示 dataset_loader * 提示 Dataset.read_csv 会被 CSVLoader 替换 * 完成 Callback 和 Trainer 之间的文档 * index更新了部分 * 删除冗余的print * 删除用于分词的metric,因为有可能引起错误 * 修改文档中的中文名称 * 完成了详细介绍文档 * tutorial 的 ipynb 文件 * 修改了一些介绍文档 * 修改了 models 和 modules 的主页介绍 * 加上了 titlesonly 这个设置 * 修改了模块文档展示的标题 * 修改了 core 和 io 的开篇介绍 * 修改了 modules 和 models 开篇介绍 * 使用 .. todo:: 隐藏了可能被抽到文档中的 TODO 注释 * 修改了一些注释 * delete an old metric in test * 修改 tutorials 的测试文件 * 把暂不发布的功能移到 legacy 文件夹 * 删除了不能运行的测试 * 修改 callback 的测试文件 * 删除了过时的教程和测试文件 * cache_results 参数的修改 * 修改 io 的测试文件; 删除了一些过时的测试 * 修复bug * 修复无法通过test_utils.py的测试 * 修复与pytorch1.1中的padsequence的兼容问题; 修改Trainer的pbar * 1. 修复metric中的bug; 2.增加metric测试 * add model summary * 增加别名 * 删除encoder中的嵌套层 * 修改了 core 部分 import 的顺序,__all__ 暴露的内容 * 修改了 models 部分 import 的顺序,__all__ 暴露的内容 * 修改了文件名 * 修改了 modules 模块的__all__ 和 import * fix var runn * 增加vocab的clear方法 * 一些符合 PEP8 的微调 * 更新了cache_results的例子 * 1. 对callback中indices潜在None作出提示;2.DataSet支持通过List进行index * 修改了一个typo * 修改了 README.md * update documents on bert * update documents on encoder/bert * 增加一个fitlog callback,实现与fitlog实验记录 * typo * - update dataset_loader * 增加了到 fitlog 文档的链接。 * 增加了 DataSet Loader 的文档 * - add star-transformer reproduction
6 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. from util import get_argparser, set_gpu, set_rng_seeds, add_model_args
  2. from datasets import load_seqtag, load_sst, load_snli, EmbedLoader, MAX_LEN
  3. import torch.nn as nn
  4. import torch
  5. import numpy as np
  6. import fastNLP as FN
  7. from fastNLP.models.star_transformer import STSeqLabel, STSeqCls, STNLICls
  8. from fastNLP.core.const import Const as C
  9. import sys
  10. sys.path.append('/remote-home/yfshao/workdir/dev_fastnlp/')
  11. g_model_select = {
  12. 'pos': STSeqLabel,
  13. 'ner': STSeqLabel,
  14. 'cls': STSeqCls,
  15. 'nli': STNLICls,
  16. }
  17. g_emb_file_path = {'en': '/remote-home/yfshao/workdir/datasets/word_vector/glove.840B.300d.txt',
  18. 'zh': '/remote-home/yfshao/workdir/datasets/word_vector/cc.zh.300.vec'}
  19. g_args = None
  20. g_model_cfg = None
  21. def get_ptb_pos():
  22. pos_dir = '/remote-home/yfshao/workdir/datasets/pos'
  23. pos_files = ['train.pos', 'dev.pos', 'test.pos', ]
  24. return load_seqtag(pos_dir, pos_files, [0, 1])
  25. def get_ctb_pos():
  26. ctb_dir = '/remote-home/yfshao/workdir/datasets/ctb9_hy'
  27. files = ['train.conllx', 'dev.conllx', 'test.conllx']
  28. return load_seqtag(ctb_dir, files, [1, 4])
  29. def get_conll2012_pos():
  30. path = '/remote-home/yfshao/workdir/datasets/ontonotes/pos'
  31. files = ['ontonotes-conll.train',
  32. 'ontonotes-conll.dev',
  33. 'ontonotes-conll.conll-2012-test']
  34. return load_seqtag(path, files, [0, 1])
  35. def get_conll2012_ner():
  36. path = '/remote-home/yfshao/workdir/datasets/ontonotes/ner'
  37. files = ['bieso-ontonotes-conll-ner.train',
  38. 'bieso-ontonotes-conll-ner.dev',
  39. 'bieso-ontonotes-conll-ner.conll-2012-test']
  40. return load_seqtag(path, files, [0, 1])
  41. def get_sst():
  42. path = '/remote-home/yfshao/workdir/datasets/SST'
  43. files = ['train.txt', 'dev.txt', 'test.txt']
  44. return load_sst(path, files)
  45. def get_snli():
  46. path = '/remote-home/yfshao/workdir/datasets/nli-data/snli_1.0'
  47. files = ['snli_1.0_train.jsonl',
  48. 'snli_1.0_dev.jsonl', 'snli_1.0_test.jsonl']
  49. return load_snli(path, files)
  50. g_datasets = {
  51. 'ptb-pos': get_ptb_pos,
  52. 'ctb-pos': get_ctb_pos,
  53. 'conll-pos': get_conll2012_pos,
  54. 'conll-ner': get_conll2012_ner,
  55. 'sst-cls': get_sst,
  56. 'snli-nli': get_snli,
  57. }
  58. def load_pretrain_emb(word_v, lang='en'):
  59. print('loading pre-train embeddings')
  60. emb = EmbedLoader.fast_load_embedding(300, g_emb_file_path[lang], word_v)
  61. emb /= np.linalg.norm(emb, axis=1, keepdims=True)
  62. emb = torch.tensor(emb, dtype=torch.float32)
  63. print('embedding mean: {:.6}, std: {:.6}'.format(emb.mean(), emb.std()))
  64. emb[word_v.padding_idx].fill_(0)
  65. return emb
  66. class MyCallback(FN.core.callback.Callback):
  67. def on_train_begin(self):
  68. super(MyCallback, self).on_train_begin()
  69. self.init_lrs = [pg['lr'] for pg in self.optimizer.param_groups]
  70. def on_backward_end(self):
  71. nn.utils.clip_grad.clip_grad_norm_(self.model.parameters(), 5.0)
  72. def on_step_end(self):
  73. warm_steps = 6000
  74. # learning rate warm-up & decay
  75. if self.step <= warm_steps:
  76. for lr, pg in zip(self.init_lrs, self.optimizer.param_groups):
  77. pg['lr'] = lr * (self.step / float(warm_steps))
  78. elif self.step % 3000 == 0:
  79. for pg in self.optimizer.param_groups:
  80. cur_lr = pg['lr']
  81. pg['lr'] = max(1e-5, cur_lr*g_args.lr_decay)
  82. def train():
  83. seed = set_rng_seeds(1234)
  84. print('RNG SEED {}'.format(seed))
  85. print('loading data')
  86. ds_list, word_v, tag_v = g_datasets['{}-{}'.format(
  87. g_args.ds, g_args.task)]()
  88. print(ds_list[0][:2])
  89. embed = load_pretrain_emb(word_v, lang='zh' if g_args.ds == 'ctb' else 'en')
  90. g_model_cfg['num_cls'] = len(tag_v)
  91. print(g_model_cfg)
  92. g_model_cfg['init_embed'] = embed
  93. model = g_model_select[g_args.task.lower()](**g_model_cfg)
  94. def init_model(model):
  95. for p in model.parameters():
  96. if p.size(0) != len(word_v):
  97. nn.init.normal_(p, 0.0, 0.05)
  98. init_model(model)
  99. train_data = ds_list[0]
  100. dev_data = ds_list[2]
  101. test_data = ds_list[1]
  102. print(tag_v.word2idx)
  103. if g_args.task in ['pos', 'ner']:
  104. padding_idx = tag_v.padding_idx
  105. else:
  106. padding_idx = -100
  107. print('padding_idx ', padding_idx)
  108. loss = FN.CrossEntropyLoss(padding_idx=padding_idx)
  109. metrics = {
  110. 'pos': (None, FN.AccuracyMetric()),
  111. 'ner': ('f', FN.core.metrics.SpanFPreRecMetric(
  112. tag_vocab=tag_v, encoding_type='bmeso', ignore_labels=[''], )),
  113. 'cls': (None, FN.AccuracyMetric()),
  114. 'nli': (None, FN.AccuracyMetric()),
  115. }
  116. metric_key, metric = metrics[g_args.task]
  117. device = 'cuda' if torch.cuda.is_available() else 'cpu'
  118. ex_param = [x for x in model.parameters(
  119. ) if x.requires_grad and x.size(0) != len(word_v)]
  120. optim_cfg = [{'params': model.enc.embedding.parameters(), 'lr': g_args.lr*0.1},
  121. {'params': ex_param, 'lr': g_args.lr, 'weight_decay': g_args.w_decay}, ]
  122. trainer = FN.Trainer(train_data=train_data, model=model, optimizer=torch.optim.Adam(optim_cfg), loss=loss,
  123. batch_size=g_args.bsz, n_epochs=g_args.ep, print_every=10, dev_data=dev_data, metrics=metric,
  124. metric_key=metric_key, validate_every=3000, save_path=g_args.log, use_tqdm=False,
  125. device=device, callbacks=[MyCallback()])
  126. trainer.train()
  127. tester = FN.Tester(data=test_data, model=model, metrics=metric,
  128. batch_size=128, device=device)
  129. tester.test()
  130. def test():
  131. pass
  132. def infer():
  133. pass
  134. run_select = {
  135. 'train': train,
  136. 'test': test,
  137. 'infer': infer,
  138. }
  139. def main():
  140. global g_args, g_model_cfg
  141. import signal
  142. def signal_handler(signal, frame):
  143. raise KeyboardInterrupt
  144. signal.signal(signal.SIGINT, signal_handler)
  145. signal.signal(signal.SIGTERM, signal_handler)
  146. parser = get_argparser()
  147. parser.add_argument('--task', choices=['pos', 'ner', 'cls', 'nli'])
  148. parser.add_argument('--mode', choices=['train', 'test', 'infer'])
  149. parser.add_argument('--ds', type=str)
  150. add_model_args(parser)
  151. g_args = parser.parse_args()
  152. print(g_args.__dict__)
  153. set_gpu(g_args.gpu)
  154. g_model_cfg = {
  155. 'init_embed': (None, 300),
  156. 'num_cls': None,
  157. 'hidden_size': g_args.hidden,
  158. 'num_layers': 4,
  159. 'num_head': g_args.nhead,
  160. 'head_dim': g_args.hdim,
  161. 'max_len': MAX_LEN,
  162. 'cls_hidden_size': 600,
  163. 'emb_dropout': 0.3,
  164. 'dropout': g_args.drop,
  165. }
  166. run_select[g_args.mode.lower()]()
  167. if __name__ == '__main__':
  168. main()