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.

README.md 12 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. # fastNLP
  2. [//]: # ([![Build Status](https://travis-ci.org/fastnlp/fastNLP.svg?branch=master)](https://travis-ci.org/fastnlp/fastNLP))
  3. [//]: # ([![codecov](https://codecov.io/gh/fastnlp/fastNLP/branch/master/graph/badge.svg)](https://codecov.io/gh/fastnlp/fastNLP))
  4. [//]: # ([![Pypi](https://img.shields.io/pypi/v/fastNLP.svg)](https://pypi.org/project/fastNLP))
  5. [//]: # (![Hex.pm](https://img.shields.io/hexpm/l/plug.svg))
  6. [//]: # ([![Documentation Status](https://readthedocs.org/projects/fastnlp/badge/?version=latest)](http://fastnlp.readthedocs.io/?badge=latest))
  7. fastNLP是一款轻量级的自然语言处理(NLP)工具包,目标是减少用户项目中的工程型代码,例如数据处理循环、训练循环、多卡运行等。
  8. fastNLP具有如下的特性:
  9. - 便捷。在数据处理中可以通过apply函数避免循环、使用多进程提速等;在训练循环阶段可以很方便定制操作。
  10. - 高效。无需改动代码,实现fp16切换、多卡、ZeRO优化等。
  11. - 兼容。fastNLP支持多种深度学习框架作为后端。
  12. > :warning: **为了实现对不同深度学习架构的兼容,fastNLP 1.0.0之后的版本重新设计了架构,因此与过去的fastNLP版本不完全兼容,
  13. > 基于更早的fastNLP代码需要做一定的调整**:
  14. ## fastNLP文档
  15. [中文文档](http://www.fastnlp.top/docs/fastNLP/master/index.html)
  16. ## 安装指南
  17. fastNLP可以通过以下的命令进行安装
  18. ```shell
  19. pip install fastNLP>=1.0.0alpha
  20. ```
  21. 如果需要安装更早版本的fastNLP请指定版本号,例如
  22. ```shell
  23. pip install fastNLP==0.7.1
  24. ```
  25. 另外,请根据使用的深度学习框架,安装相应的深度学习框架。
  26. <details>
  27. <summary>Pytorch</summary>
  28. 下面是使用pytorch来进行文本分类的例子。需要安装torch>=1.6.0。
  29. ```python
  30. from fastNLP.io import ChnSentiCorpLoader
  31. from functools import partial
  32. from fastNLP import cache_results
  33. from fastNLP.transformers.torch import BertTokenizer
  34. # 使用cache_results装饰器装饰函数,将prepare_data的返回结果缓存到caches/cache.pkl,再次运行时,如果
  35. # 该文件还存在,将自动读取缓存文件,而不再次运行预处理代码。
  36. @cache_results('caches/cache.pkl')
  37. def prepare_data():
  38. # 会自动下载数据,并且可以通过文档看到返回的 dataset 应该是包含"raw_words"和"target"两个field的
  39. data_bundle = ChnSentiCorpLoader().load()
  40. # 使用tokenizer对数据进行tokenize
  41. tokenizer = BertTokenizer.from_pretrained('hfl/chinese-bert-wwm')
  42. tokenize = partial(tokenizer, max_length=256) # 限制数据的最大长度
  43. data_bundle.apply_field_more(tokenize, field_name='raw_chars', num_proc=4) # 会新增"input_ids", "attention_mask"等field进入dataset中
  44. data_bundle.apply_field(int, field_name='target', new_field_name='labels') # 将int函数应用到每个target上,并且放入新的labels field中
  45. return data_bundle
  46. data_bundle = prepare_data()
  47. print(data_bundle.get_dataset('train')[:4])
  48. # 初始化model, optimizer
  49. from fastNLP.transformers.torch import BertForSequenceClassification
  50. from torch import optim
  51. model = BertForSequenceClassification.from_pretrained('hfl/chinese-bert-wwm')
  52. optimizer = optim.AdamW(model.parameters(), lr=2e-5)
  53. # 准备dataloader
  54. from fastNLP import prepare_dataloader
  55. dls = prepare_dataloader(data_bundle, batch_size=32)
  56. # 准备训练
  57. from fastNLP import Trainer, Accuracy, LoadBestModelCallback, TorchWarmupCallback, Event
  58. callbacks = [
  59. TorchWarmupCallback(warmup=0.1, schedule='linear'), # 训练过程中调整学习率。
  60. LoadBestModelCallback() # 将在训练结束之后,加载性能最优的model
  61. ]
  62. # 在训练特定时机加入一些操作, 不同时机能够获取到的参数不一样,可以通过Trainer.on函数的文档查看每个时机的参数
  63. @Trainer.on(Event.on_before_backward())
  64. def print_loss(trainer, outputs):
  65. if trainer.global_forward_batches % 10 == 0: # 每10个batch打印一次loss。
  66. print(outputs.loss.item())
  67. trainer = Trainer(model=model, train_dataloader=dls['train'], optimizers=optimizer,
  68. device=0, evaluate_dataloaders=dls['dev'], metrics={'acc': Accuracy()},
  69. callbacks=callbacks, monitor='acc#acc',n_epochs=5,
  70. # Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
  71. evaluate_input_mapping={'labels': 'target'}, # 在评测时,将dataloader中会输入到模型的labels重新命名为target
  72. evaluate_output_mapping={'logits': 'pred'} # 在评测时,将model输出中的logits重新命名为pred
  73. )
  74. trainer.run()
  75. # 在测试集合上进行评测
  76. from fastNLP import Evaluator
  77. evaluator = Evaluator(model=model, dataloaders=dls['test'], metrics={'acc': Accuracy()},
  78. # Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
  79. output_mapping={'logits': 'pred'},
  80. input_mapping={'labels': 'target'})
  81. evaluator.run()
  82. ```
  83. 更多内容可以参考如下的链接
  84. ### 快速入门
  85. - [0. 10 分钟快速上手 fastNLP torch](http://www.fastnlp.top/docs/fastNLP/master/tutorials/torch/fastnlp_torch_tutorial.html)
  86. ### 详细使用教程
  87. - [1. Trainer 和 Evaluator 的基本使用](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_0.html)
  88. - [2. DataSet 和 Vocabulary 的基本使用](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_1.html)
  89. - [3. DataBundle 和 Tokenizer 的基本使用](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_2.html)
  90. - [4. TorchDataloader 的内部结构和基本使用](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_3.html)
  91. - [5. fastNLP 中的预定义模型](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_4.html)
  92. - [6. Trainer 和 Evaluator 的深入介绍](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_4.html)
  93. - [7. fastNLP 与 paddle 或 jittor 的结合](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_5.html)
  94. - [8. 使用 Bert + fine-tuning 完成 SST-2 分类](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_e1.html)
  95. - [9. 使用 Bert + prompt 完成 SST-2 分类](http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_e2.html)
  96. </details>
  97. <details>
  98. <summary>Paddle</summary>
  99. 下面是使用paddle来进行文本分类的例子。需要安装paddle>=2.2.0以及paddlenlp>=2.3.3。
  100. ```python
  101. from fastNLP.io import ChnSentiCorpLoader
  102. from functools import partial
  103. # 会自动下载数据,并且可以通过文档看到返回的 dataset 应该是包含"raw_words"和"target"两个field的
  104. data_bundle = ChnSentiCorpLoader().load()
  105. # 使用tokenizer对数据进行tokenize
  106. from paddlenlp.transformers import BertTokenizer
  107. tokenizer = BertTokenizer.from_pretrained('hfl/chinese-bert-wwm')
  108. tokenize = partial(tokenizer, max_length=256) # 限制一下最大长度
  109. data_bundle.apply_field_more(tokenize, field_name='raw_chars', num_proc=4) # 会新增"input_ids", "attention_mask"等field进入dataset中
  110. data_bundle.apply_field(int, field_name='target', new_field_name='labels') # 将int函数应用到每个target上,并且放入新的labels field中
  111. print(data_bundle.get_dataset('train')[:4])
  112. # 初始化 model
  113. from paddlenlp.transformers import BertForSequenceClassification, LinearDecayWithWarmup
  114. from paddle import optimizer, nn
  115. class SeqClsModel(nn.Layer):
  116. def __init__(self, model_checkpoint, num_labels):
  117. super(SeqClsModel, self).__init__()
  118. self.num_labels = num_labels
  119. self.bert = BertForSequenceClassification.from_pretrained(model_checkpoint)
  120. def forward(self, input_ids, token_type_ids=None, position_ids=None, attention_mask=None):
  121. logits = self.bert(input_ids, token_type_ids, position_ids, attention_mask)
  122. return logits
  123. def train_step(self, input_ids, labels, token_type_ids=None, position_ids=None, attention_mask=None):
  124. logits = self(input_ids, token_type_ids, position_ids, attention_mask)
  125. loss_fct = nn.CrossEntropyLoss()
  126. loss = loss_fct(logits.reshape((-1, self.num_labels)), labels.reshape((-1, )))
  127. return {
  128. "logits": logits,
  129. "loss": loss,
  130. }
  131. def evaluate_step(self, input_ids, token_type_ids=None, position_ids=None, attention_mask=None):
  132. logits = self(input_ids, token_type_ids, position_ids, attention_mask)
  133. return {
  134. "logits": logits,
  135. }
  136. model = SeqClsModel('hfl/chinese-bert-wwm', num_labels=2)
  137. # 准备dataloader
  138. from fastNLP import prepare_dataloader
  139. dls = prepare_dataloader(data_bundle, batch_size=16)
  140. # 训练过程中调整学习率。
  141. scheduler = LinearDecayWithWarmup(2e-5, total_steps=20 * len(dls['train']), warmup=0.1)
  142. optimizer = optimizer.AdamW(parameters=model.parameters(), learning_rate=scheduler)
  143. # 准备训练
  144. from fastNLP import Trainer, Accuracy, LoadBestModelCallback, Event
  145. callbacks = [
  146. LoadBestModelCallback() # 将在训练结束之后,加载性能最优的model
  147. ]
  148. # 在训练特定时机加入一些操作, 不同时机能够获取到的参数不一样,可以通过Trainer.on函数的文档查看每个时机的参数
  149. @Trainer.on(Event.on_before_backward())
  150. def print_loss(trainer, outputs):
  151. if trainer.global_forward_batches % 10 == 0: # 每10个batch打印一次loss。
  152. print(outputs["loss"].item())
  153. trainer = Trainer(model=model, train_dataloader=dls['train'], optimizers=optimizer,
  154. device=0, evaluate_dataloaders=dls['dev'], metrics={'acc': Accuracy()},
  155. callbacks=callbacks, monitor='acc#acc',
  156. # Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
  157. evaluate_output_mapping={'logits': 'pred'},
  158. evaluate_input_mapping={'labels': 'target'}
  159. )
  160. trainer.run()
  161. # 在测试集合上进行评测
  162. from fastNLP import Evaluator
  163. evaluator = Evaluator(model=model, dataloaders=dls['test'], metrics={'acc': Accuracy()},
  164. # Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
  165. output_mapping={'logits': 'pred'},
  166. input_mapping={'labels': 'target'})
  167. evaluator.run()
  168. ```
  169. 更多内容可以参考如下的链接
  170. ### 快速入门
  171. - [0. 10 分钟快速上手 fastNLP paddle](http://www.fastnlp.top/docs/fastNLP/master/tutorials/torch/fastnlp_torch_tutorial.html)
  172. ### 详细使用教程
  173. - [1. 使用 paddlenlp 和 fastNLP 实现中文文本情感分析](http://www.fastnlp.top/docs/fastNLP/master/tutorials/paddle/fastnlp_tutorial_paddle_e1.html)
  174. - [2. 使用 paddlenlp 和 fastNLP 训练中文阅读理解任务](http://www.fastnlp.top/docs/fastNLP/master/tutorials/paddle/fastnlp_tutorial_paddle_e2.html)
  175. </details>
  176. <details>
  177. <summary>oneflow</summary>
  178. </details>
  179. <details>
  180. <summary>jittor</summary>
  181. </details>
  182. ## 项目结构
  183. fastNLP的项目结构如下:
  184. <table>
  185. <tr>
  186. <td><b> fastNLP </b></td>
  187. <td> 开源的自然语言处理库 </td>
  188. </tr>
  189. <tr>
  190. <td><b> fastNLP.core </b></td>
  191. <td> 实现了核心功能,包括数据处理组件、训练器、测试器等 </td>
  192. </tr>
  193. <tr>
  194. <td><b> fastNLP.models </b></td>
  195. <td> 实现了一些完整的神经网络模型 </td>
  196. </tr>
  197. <tr>
  198. <td><b> fastNLP.modules </b></td>
  199. <td> 实现了用于搭建神经网络模型的诸多组件 </td>
  200. </tr>
  201. <tr>
  202. <td><b> fastNLP.embeddings </b></td>
  203. <td> 实现了将序列index转为向量序列的功能,包括读取预训练embedding等 </td>
  204. </tr>
  205. <tr>
  206. <td><b> fastNLP.io </b></td>
  207. <td> 实现了读写功能,包括数据读入与预处理,模型读写,数据与模型自动下载等 </td>
  208. </tr>
  209. </table>
  210. <hr>