当前位置:   article > 正文

GPT-Chinese 复现

gpt-chinese

github

环境准备

conda -create gpt_cn python=3.7
conda activate gpt_cn
  • 1
  • 2
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 -c pytorch
pip install -r requirements.txt
  • 1
  • 2

错误

module 'distutils' has no attribute 'version'
  • 1
pip uninstall setuptools
pip install setuptools==59.5.0
  • 1
  • 2

构建数据集

测试 build_files 函数

  • 这一步的目的是为了看看数据被处理之后长什么样子。方便我们更加自由地构造能够符合训练的数据集
  • train.py 文件中,先测试一下 build_files 的功能,看看构造出来用于训练的数据集是什么样子的
      1. 从 huggingface 上下载一个 bert 预训练模型 然后按照我给出的代码中的方式加载这个 bert 预训练模型文件夹中的 vocab.txt 文件,(如何从 huggingface 中下载 bert 的预训练模型可以参考 这篇文章
      1. 在文件目录下创建一个 data 文件夹,并自己写一个简单的 train.json 文件放到里面作为测试

    在这里插入图片描述

    • 这个 train.json 中的内容作者给出了一个示例:就按照这种方式自己造点数据放进去就行
      在这里插入图片描述
def build_files(data_path, tokenized_data_path, num_pieces, full_tokenizer, min_length):
    """

    :param data_path: 原始训练语料,json 格式的数据
    :param tokenized_data_path: tokenized语料存放位置
    :param num_pieces: 将训练语料分成多少份
    :param full_tokenizer: 使用的分词器,用 bpe 构造的或者使用 bert-base-chinese 模型的分词器
    :param min_length: 最短收录文章长度
    :return:
    """
    with open(data_path, 'r', encoding='utf8') as f:
        print('reading lines')
        lines = json.load(f)
        lines = [line.replace('\n', ' [SEP] ') for line in lines]  # 用[SEP]表示换行, 段落之间使用SEP表示段落结束
    all_len = len(lines)
    if not os.path.exists(tokenized_data_path):
        os.mkdir(tokenized_data_path)
    for i in tqdm(range(num_pieces)):
        sublines = lines[all_len // num_pieces * i: all_len // num_pieces * (i + 1)]
        if i == num_pieces - 1:
            sublines.extend(lines[all_len // num_pieces * (i + 1):])  # 把尾部例子添加到最后一个piece
        sublines = [full_tokenizer.tokenize(line) for line in sublines if
                    len(line) > min_length]  # 只考虑长度超过min_length的句子
        sublines = [full_tokenizer.convert_tokens_to_ids(line) for line in sublines]
        full_line = []
        for subline in sublines:
            full_line.append(full_tokenizer.convert_tokens_to_ids('[MASK]'))  # 文章开头添加MASK表示文章开始
            full_line.extend(subline)
            full_line.append(full_tokenizer.convert_tokens_to_ids('[CLS]'))  # 文章之间添加CLS表示文章结束
        with open(tokenized_data_path + 'tokenized_train_{}.txt'.format(i), 'w') as f:
            for id in full_line:
                f.write(str(id) + ' ')
    print('finish')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
if __name__ == '__main__':
    # main()
    from tokenizations import tokenization_bert_word_level as tokenization_bert
    full_tokenizer = tokenization_bert.BertTokenizer(vocab_file='/Users/qinpeinuan/Desktop/清华/Bert/bert-base-chinese/vocab.txt')
    build_files("./data/train.json", "./data/tokenized/", 1, full_tokenizer, 100)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 运行这一步成功后,data 中会产生一个 data / tokenized 文件夹,其中放着经过 tokenize 处理之后的数据:
    在这里插入图片描述
  • 本文中,作者明确说,这个工作的所有分词都是借助 bert 的 vocab.txt 来完成的。所以大家不要一看这是 GPT 模型就觉得和 BERT 有什么关系?其实他用的就是 bert 的 tokenizer 来分词的。

加载 GPT 预训练模型

  • 和上一步的 bert 文件一样,还是从 huggingface 上找一个 GPT 的预训练模型。我下载的是 这个 gpt2-base-chinese
  • 然后把这个预训练的 gpt 模型放到自己构建的文件夹下面,我是这么放的:
    在这里插入图片描述

train.py 运行即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/785383
推荐阅读
相关标签
  

闽ICP备14008679号