• 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 运行即可

  • 相关阅读:
    Aip接口自动化测试框架pytest+allure+request+jsonpath+excle
    词!自然语言处理之词全解和Python实战!
    嵌入式Linux驱动开发基础知识(一)——hello驱动程序开发
    解决stable diffusion webui1.6 wd1.4 tagger加载失败的问题
    框架分析(11)-测试框架
    《InnoDB引擎七》InnoDB关键特性-插入缓存
    全国省市区三级地区MySQL数据(三张表)
    什么是过期域名?做网站用过期域名好不好?
    ROS 学习笔记4.TF变换
    非线性优化问题基本形式概述
  • 原文地址:https://blog.csdn.net/qq_42902997/article/details/128164046