CPM下载-安装-环境要求
CPM模型 |
项目描述
微信公众号【YeungNLP】文章:基于CPM的中文作文生成模型,引经据典、修辞手法,信手拈来 ,文章内可获取26w+中文作文语料。
CPM(Chinese Pretrained Models)模型是北京智源人工智能研究院和清华大学发布的中文大规模预训练模型。官方发布了三种规模的模型,参数量分别为109M、334M、2.6B,用户需申请与通过审核,方可下载。 由于原项目需要考虑大模型的训练和使用,需要安装较为复杂的环境依赖,使用上也较为复杂。 本项目采用了109M的CPM模型(若资源允许也可以考虑334M的模型),并且简化了模型的训练和使用。
本项目是基于CPM模型的中文文本生成项目,可用于作文、小说、新闻、古诗等中文生成任务,并且训练和分享了中文作文生成模型,取得了不错的生成效果。 本项目提供了数据预处理、模型训练、文本生成、Http服务等代码模块。 详情可参考CPM模型论文, CPM官网, 项目源码 。
运行环境
python==3.6、transformers==4.6.0、sentencepiece==0.1.94、torch==1.7.0、Flask==1.1.2
项目结构
用户可自行创建以下目录。
- config:存放模型的配置文件
- data:存放训练数据
- model:存放模型
- log:存放日志文件
-
vocab:
- chinese_voca.model:sentencepiece模型
- vocab.json:分词与id的键值对
- data_parallel.py:解决pytorch的GPU负载不均衡的问题
- generate.py:生成代码
- http_service.py:封装成http服务,支持post与get请求
- preprocess.py:数据预处理代码
- utils.py:存放一些工具代码
模型参数与训练细节
由于GPU资源有限,本项目使用cpm-small.json中的模型参数,若资源充足,可尝试cpm-medium.json中的参数配置。
本项目的部分模型参数如下:
- n_ctx: 1024
- n_embd: 768
- n_head: 12
- n_layer: 12
- n_positions: 1024
- vocab_size: 30000
对26w篇作文进行预处理之后,得到60w+长度为200的训练数据。显卡为三张GTX 1080Ti,batch_size=50,三张卡显存满载,一轮训练大约需要3个小时。训练40轮之后,loss降到2.1左右,单词预测准确率大约为54%。
使用方法
Quick Start
在模型分享中下载模型,将模型文件夹zuowen_epoch40放到model目录下,执行如下命令,指定作文标题、作文开头和长度,进行生成。
python generate.py --model_path model/zuowen_epoch40 --title 家乡的四季 --context 家乡的四季,最美不过了 --max_len 200
数据预处理
每篇作文对应一个txt文件,txt内容格式如下:
---
标题:徜徉在书籍的阳光世界
日期:xxxx-xx-xx xx:xx:xx
作者:佚名
---
一本书是一个人的眼睛,它可以让你看到另一个世界的奇妙;一本书是一个人的耳朵,它可以让你听到大自然的呼唤,听到社会的声音。
《森林报》是苏联著名科普作家维。比安基的代表作品,他以春夏秋冬四季为序,有层次、有类别地将森林里动植物的新鲜事描写得栩栩如生,引人入胜。这本书教会我们如何去观察、认识大自然。这本书教会我们感悟生命,体验生动的愉快探速之旅,激发我们热爱科学的兴趣。
《三字经》、《弟子规》、《论语》这样的国学经典,我也会拿来阅读,虽然似懂非懂,但读起来朗朗上口,觉得挺有趣。读着读着,好似开始了一场时空之旅,与古代圣贤结为知己,进行心与心之间的倾听与问候。这些书籍让我们在阅读中品味高雅。
在成长的过程中,每个人都有着自己不一样的心路历程。阳光姐姐写的《成长的秘密》一书让我们获益不浅。作者用简单生动的文字,把温馨感人、新鲜快乐、爆笑的校园生活展现在我们眼前。书中的人物宁佳鑫看上去弱小,但她实际却很坚强,在她身上,我看到了她散发出的正能量和她在逆境中奋起的精神。她的经历告诉我:无论遇到什么样的挫折与坎坷,都不要气馁。阳光总在风雨后,只要我们坚持不懈地去想办法克服困难,并付诸行动,就一定会柳暗花明!
法国作家德尔伦曾说过“智慧可以转化成力量,完成你认为不可能完成的事。”是啊,智慧的力量很强大,这些力量隐藏在书中。当我们在阅读之际,这些知识就偷偷地跑进我们的脑海里,渐渐地,渐渐地,它们就永远地保存下来,显示出无穷的魅力,让我们的未来畅通无阻。
书籍,用爱和勇气唤醒每个孩子的心灵;书籍让我们感受到温暖与力量;书籍,教我们用心灵在文字间快乐舞蹈。
让我们走进书籍的阳光世界,获取成长的力量。
对于每个txt文件,首先取出标题与内容,将标题与内容按照"title[sep]content[eod]"的方式拼接起来,然后对其进行tokenize,最后使用滑动窗口对内容进行截断,得到训练数据。 运行如下命令,进行数据预处理。注:预处理之后的数据保存为train.pkl,这是一个list,list中每个元素表示一条训练数据。
python preprocess.py --data_path data/zuowen --save_path data/train.pkl --win_size 200 --step 200
超参数说明:
- vocab_file:sentencepiece模型路径,用于tokenize
- log_path:日志存放位置
- data_path:数据集存放位置
- save_path:对训练数据集进行tokenize之后的数据存放位置
- win_size:滑动窗口的大小,相当于每条数据的最大长度
- step:滑动窗口的滑动步幅
用户也可以根据自身的需求,对预处理的代码进行相应的修改。后续将更新项目代码,以便用于处理各种数据集。
训练模型
运行如下命令,使用预处理后的数据训练模型。
python train.py --epochs 100 --batch_size 16 --device 0,1 --gpu0_bsz 5 --train_path data/train.pkl
超参数说明:
- device:设置使用哪些GPU
- no_cuda:设为True时,不使用GPU
- vocab_path:sentencepiece模型路径,用于tokenize
- model_config:需要从头训练一个模型时,模型参数的配置文件
- train_path:经过预处理之后的数据存放路径
- max_len:训练时,输入数据的最大长度。
- log_path:训练日志存放位置
- ignore_index:对于该token_id,不计算loss,默认为-100
- epochs:训练的最大轮次
- batch_size:训练的batch size
- gpu0_bsz:pytorch使用多GPU并行训练时,存在负载不均衡的问题,即0号卡满载了,其他卡还存在很多空间,抛出OOM异常。该参数可以设置分配到0号卡上的数据数量。
- lr:学习率
- eps:AdamW优化器的衰减率
- log_step:多少步汇报一次loss
- gradient_accumulation_steps:梯度累计的步数。当显存空间不足,batch_size无法设置为较大时,通过梯度累计,缓解batch_size较小的问题。
- save_model_path:模型输出路径
- pretrained_model:预训练的模型的路径
- num_workers:dataloader加载数据时使用的线程数量
- warmup_steps:训练时的warm up步数
文本生成
运行如下命令,进行文本生成。
python generate.py --device 0 --max_len 200 --title 家乡的四季 --context 家乡的四季,最美不过了
超参数说明:
- device:使用哪个GPU进行生成
- temperature:详情可参考temperature sampling的思想
- topk:top-k采样(注:topp为0,topk不为0时采用top-k采样)
- topp:核采样(注:topk为0,topp不为0时,采用核采样)
- max_len:生成的最长长度
- log_path:生成日志存放位置
- no_cuda:设为True时,不使用GPU
- model_path:模型存放路径
- title:作文标题
- context:作文上文
- context_len:每一步生成时,参考的上文的长度
Http服务
将模型生成能力封装成Http服务,支持Post与Get请求。运行如下命令,启动服务。
python http_service.py --port 8085 --model_path model/zuowen_epoch40 --context_len 200
Get请求:
http://localhost:8085/zuowen?title="家乡的四季"&context="家乡的四季,最美不过了"&max_len=200
Post请求
localhost:8085/zuowen
{
'title':'家乡的四季',
'context':'家乡的四季,最美不过了',
'max_len':200
}
超参数说明:
- device:使用哪个GPU进行生成
- temperature:详情可参考temperature sampling的思想
- topk:top-k采样(注:topp为0,topk不为0时采用top-k采样)
- topp:核采样(注:topk为0,topp不为0时,采用核采样)
- port:服务绑定的端口号
- log_path:生成日志存放位置
- no_cuda:设为True时,不使用GPU
- model_path:模型存放路径
- context_len:每一步生成时,参考的上文的长度
模型分享
模型描述 | ||
---|---|---|
使用26w篇中文作文语料训练了40个epoch,loss降到2.1左右,单词预测准确率大约为54% |
Future Work
- 使用3张1080Ti进行训练,由于显卡资源有限,在数据预处理时,使用了大小为200的滑动窗口对数据进行截断,batch_size设为50。没有充分使用模型1024的最大输入长度,导致训练不够充分。若有充足的显卡资源,可以使用1024的滑动窗口对数据进行截断,提高模型的生成效果。
- 当前代**要针对作文数据集进行数据预处理、训练、生成。后续将会更新代码,以便用于处理各种数据集。