本人经常会阅读苏神的科学空间网站,里面有很多对前言paper浅显易懂的解释,以及很多苏神自己的创新实践;并且基于bert4keras框架都有了相应的代码实现。但是由于本人主要用pytorch开发,因此参考bert4keras开发了bert4torch项目,实现了bert4keras的主要功能。
目录
简介
主要功能
实战
b. 使用DistributedDataParallel
简介
bert4torch是一个基于pytorch的训练框架,前期以效仿和实现bert4keras的主要功能为主,方便加载多类预训练模型进行finetune,提供了中文注释方便用户理解模型结构。主要是期望应对新项目时,可以直接调用不同的预训练模型直接finetune,或方便用户基于bert进行魔改,快速验证自己的idea;节省在github上clone各种项目耗时耗力,且本地文件各种copy的问题。
- pip安装
github链接
主要功能
1、加载预训练权重(bert、roberta、albert、nezha、bart、RoFormer、ELECTRA、GPT、GPT2、T5)继续进行finetune
目前支持的预训练模型一览
2、在bert基础上灵活定义自己模型:主要是可以接在bert的[btz, seq_len, hdsz]的隐含层向量后做各种魔改
3、调用方式和bert4keras基本一致,简洁高效
4、实现基于keras的训练进度条动态展示
仿照keras的模型训练进度条
5、配合torchinfo,实现打印各层参数量功能
打印参数
6、结合logger,或者tensorboard可以在后台打印日志
支持在训练开始/结束,batch开始/结束,epoch的开始/结束,记录日志,写tensorboard等
7、集成多个example,可以作为自己的训练框架,方便在同一个数据集上尝试多种解决方案
实现多个example可供参考
支持的预训练权重(bert4torch)
实战
1. 建模流程示例
2. 主要模块讲解
1) 数据处理部分
a. 精简词表,并建立分词器
b. 好用的小函数
-
text_segmentate()
: 截断总长度至不超过maxlen, 接受多个sequence输入,每次截断最长的句子,indices表示删除的token位置 -
tokenizer.encode()
: 把text转成token_ids,默认句首添加[CLS],句尾添加[SEP],返回token_ids和segment_ids,相当于同时调用tokenizer.tokenize()
和tokenizer.tokens_to_ids()
-
tokenizer.decode()
: 把token_ids转成text,默认会删除[CLS], [SEP], [UNK]等特殊字符,相当于调用tokenizer.ids_to_tokens()
并做了一些后处理 -
sequence_padding
: 将序列padding到同一长度, 传入一个元素为list, ndarray, tensor的list,返回ndarry或tensor
2) 模型定义部分
- 模型创建
- 定义loss,optimizer,scheduler等
- 自定义模型
- 自定义训练过程
- 模型保存和加载
- 加载transformers模型进行训练
3) 模型评估部分
3. 其他特性讲解
1) 单机多卡训练
a. 使用DataParallel
b. 使用DistributedDataParallel
2) tensorboard保存训练过程
3) 打印训练参数