Morizeyao / GPT2-Chinese

Chinese version of GPT2 training code, using BERT tokenizer.
MIT License
7.46k stars 1.7k forks source link

分享一个训练好的《鬼吹灯》文本生成模型 #128

Open ScottishFold007 opened 4 years ago

ScottishFold007 commented 4 years ago

前两天用电脑训练了一个《鬼吹灯》的文本生成模型,不生用题主的代码,基于“抱抱脸(Huggingface)”发布的GPT2生成模型改的,文本组成:

5M多的语料,用CPU训练跑了40000 epoch。以下是效果: image image

链接:https://pan.baidu.com/s/1yjXUOqLDdvHV-XvGvhvAng 提取码:ihp2 复制这段内容后打开百度网盘手机App,操作更方便哦

ScottishFold007 commented 4 years ago

文本参数的设置可有些门道,我摸索了好久才找到比较理想的参数,大家也可以试试哈

chasemon88 commented 4 years ago

怎么转tensorRT

felicitywang commented 4 years ago

@ScottishFold007 方便分享一下调参经验吗

Halfwaygo commented 4 years ago

能留个联系方式交流下吗

ScottishFold007 commented 4 years ago

个人微信:g18818233178,来时请备注

---原始邮件--- 发件人: "Halfwaygo"<notifications@github.com> 发送时间: 2020年2月27日(周四) 下午2:28 收件人: "Morizeyao/GPT2-Chinese"<GPT2-Chinese@noreply.github.com>; 抄送: "Mention"<mention@noreply.github.com>;"Scottish_Fold007"<gaochangkuan01@foxmail.com>; 主题: Re: [Morizeyao/GPT2-Chinese] 分享一个训练好的《鬼吹灯》文本生成模型 (#128)

能留个联系方式交流下吗

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

Morizeyao commented 4 years ago

感谢分享

upbit commented 4 years ago

感谢分享

这是huggingface哪个版本的transformers?或者能有个GPT2Tokenizer加载的例子吗?看新的v2.5.1词典文件,是个json而不是这种文本格式的

https://github.com/huggingface/transformers/blob/v2.5.1/src/transformers/tokenization_gpt2.py#L36


理解错LZ意思了。用pytorch_transformers可以了 👍

import pytorch_transformers
from tokenizations import tokenization_bert

config_file = "config.json"
vocab_file = "vocab.txt"
config = pytorch_transformers.GPT2Config.from_json_file(config_file)
config.output_attentions = True

model = pytorch_transformers.GPT2LMHeadModel.from_pretrained(".", config=config)
tokenizer = tokenization_bert.BertTokenizer(vocab_file=vocab_file)

device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
model.eval()
ScottishFold007 commented 4 years ago

模型也可以这样使用:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained(r'E:\GPT2_Text_generation\散文GPT2Model')

special_tokens_dict = {"bos_token": "<s>", "eos_token": "</s>", "unk_token": "<unk>", "sep_token": "<sep>", "pad_token": "<pad>", "mask_token": "<mask>"}
tokenizer.add_special_tokens(special_tokens_dict)
model = GPT2LMHeadModel.from_pretrained(r'E:\GPT2_Text_generation\散文GPT2Model')
model.eval()
generated = context
length = 50
import torch.nn.functional as F

with torch.no_grad():
    for _ in range(length):
        # run the model
        outputs,_ = model(generated)

        # get the logits for the next word prediction
        next_token_logits = outputs[0, -1, :]

        # sample from the distribution over vocab
        next_token = torch.multinomial(F.softmax(next_token_logits, dim=-1), num_samples=1)

        # concatenate the sampled token to generated
        generated = torch.cat((generated, next_token.unsqueeze(0)), dim=1)
#text = tokenizer.decode(generated[0].tolist())
tokens = tokenizer.convert_ids_to_tokens(generated[0].tolist(), skip_special_tokens=False) 
for i, item in enumerate(tokens):
    if item == '<mask>':
        tokens[i] = ''
    elif item == '</s>' or item == '<sep>':
        tokens[i] = '\n'

generated_text = ''.join(tokens).strip().replace(' ', '').replace('##', '')
print(generated_text)
Morizeyao commented 4 years ago

感谢分享!

liutianling commented 4 years ago

@ScottishFold007 有没有通过指定部分关键词生成短文本或长文本的计划?

ScottishFold007 commented 4 years ago

@ScottishFold007 有没有通过指定部分关键词生成短文本或长文本的计划?

没标注数据。。。

luyi404 commented 4 years ago

你好,请问你的语料库的json文件是什么样的格式,方便发出来看看吗

ouening commented 4 years ago

同问,一直搞不懂语料库的格式,能以斗破那个txt文件讲解一下吗?train.json内容是["文章1","文章2","文章3"],如果是自己的语料库的话应该如何组织呢

Jaeker0512 commented 4 years ago

同问,一直搞不懂语料库的格式,能以斗破那个txt文件讲解一下吗?train.json内容是["文章1","文章2","文章3"],如果是自己的语料库的话应该如何组织呢

因为只用过train_single.py的方法,我举个金庸小说的例子吧,14部小说经过处理后变成json的格式然后写入到train.json当中去。 于是train.json = ["射雕英雄传整篇内容", "神雕侠侣整篇内容", "倚天屠龙记整篇内容".......] 同理,斗破苍穹如果只有一部那就是train.json = ["斗破苍穹整篇内容"]

ouening commented 4 years ago

以weibo.txt语料库为例,总结一下如何训练自定义数据集(时间过得比较久,可能有些步骤忽略了)

  1. 语料库是一行一段话,从train.py中的build_files函数可以看到‘\n’被替换成[SEP],[SEP],[MASK]是MML模型使用的token,weibo.txt就是这样子的结构;
  2. 首先生成词汇表,使用cache/make_vocab.py,作者使用thulac进行分词,其实也可以用jieba(lines[i]=' '.join(list(jieba.cut(line))),修改第22行:lines=f.readlines();注意--vocab_size参数,这个参数会在后面用到;
  3. 进行训练。修改train.py中读取文件的方式,还是一样,将第18行改成lines=f.readlines();注意参数--model_config,默认使用的是model_config_test.json这个配置,这里的vocab_size等于make_vocab.py中设置的vocab_size数量加5,一定要匹配,否则运行错误;不出意外的话可以正常训练了;注意模型默认保存在output_dir,--tokenizer_path是前面生成的词汇表路径;
  4. 模型测试。使用generate.py文件,这个比较坑的就是--model_path这个参数,这个参数实际指向的是前面output_dir/final_model路径,所以这个参数改为·--model_dir·比较合适,--prefix是文字生成的开头部分,--length可以指定生成文本的长度;Q:为什么模型输入是一个文件夹而不是单独的权重文件?A:其实从生成的文件夹来看包含模型配置文件config.json和对应的权重文件pytorch_model.bin,一个模型肯定是需要这两个菜完整的。平时使用pytorch保存的模型torch.save()直接把这两个都同时保存至一个文件了,所以可以正常加载,如果知道网络结构的情况下,只保存权重就可以 了
  5. 还有很多参数设置是可以修改的,这里就不再说明了,并且作者也说不再更新该库,transformers已经到3.2版本了,本库要求的是2.1.1才能运行。。。。
malatangteileng commented 3 years ago

同问,一直搞不懂语料库的格式,能以斗破那个txt文件讲解一下吗?train.json内容是["文章1","文章2","文章3"],如果是自己的语料库的话应该如何组织呢

因为只用过train_single.py的方法,我举个金庸小说的例子吧,14部小说经过处理后变成json的格式然后写入到train.json当中去。 于是train.json = ["射雕英雄传整篇内容", "神雕侠侣整篇内容", "倚天屠龙记整篇内容".......] 同理,斗破苍穹如果只有一部那就是train.json = ["斗破苍穹整篇内容"]

训练效果怎么样呢

baoyu-yuan commented 3 years ago

怎么转tensorRT

你好 你找到转tensorRT的途径了吗 最近考虑用triton部署gpt2

cywjava commented 1 year ago

我想训练一个问答模型,应该准备一些什么样子的数据呢,用这个能训练吗?

cywjava commented 1 year ago

Reference in n

我想训练一个问答模型,应该准备一些什么样子的数据呢,用这个能训练吗?