迷你版ChatGPT开源,教你怎么用nanoGPT训练一个写小说的AI机器人!

954 阅读4分钟

大家好,我是千与千寻,好久不见,最近太忙了,去医院拔了颗智齿,这不是刚休息一天,就立刻来给大家分享ChatGPT的新奇项目了。

ChatGPT的功能确实是好用,但是我觉得有一个小缺点,就是反应的时间比较慢,原因是GPT-3.5/GPT-4.0的模型体积较大,比较占用内存空间。

同时大模型的运行是在国外的主机上,在一定程度上网络传输也消耗时间。

今天给大家带来的项目是nanoGPT模型,他是minGPT模型的重写,但是比minGPT模型的体积更小,性能更好!

我们今天手动复现一下nanoGPT模型,可能说到现在,你可能有些一头雾水,千寻哥到底要做什么?

放心,程序员同行之间禁止废话

nanoGPT可以简单理解为构建ChatGPT的框架,我今天带领大家手把手使用nanoGPT框架,训练一个微型的ChatGPT,GPT的全称是“Generative Pre-trained Transformer”。就是文本预训练的生成模型。

NanoGPT地址: github.com/karpathy/na…

我们首先复现官方的Demo,训练一个在莎士比亚的作品上训练一个角色级别的GPT。

首先,我们将其下载莎士比亚的戏剧文本作为训练模型的数据集。

1、莎士比亚戏剧数据集的部分文本内容:

第一公民:
在我们继续之前,请听我说话。

全部:
说话,说话。

第一公民:
你们都下定决心宁死不饿?

全部:
解决。 解决。

第一公民:
首先,你知道 Caius Marcius 是人民的主要敌人。

全部:
我们不知道,我们不知道。

第一公民:
让我们杀了他,我们将以自己的价格获得玉米。
不是判决书吗?

2、将训练数据集从原始文本(.txt)转换为一个大的整数流(.bin)

# 划分数据集,训练集:验证集=9:1
train_data = data[:int(n*0.9)]
val_data = data[int(n*0.9):]

# 将两者都编码为整数
train_ids = encode(train_data)
val_ids = encode(val_data)
print(f"train has {len(train_ids):,} tokens")
print(f"val has {len(val_ids):,} tokens")

# 转换为bin整数流文件
train_ids = np.array(train_ids, dtype=np.uint16)
val_ids = np.array(val_ids, dtype=np.uint16)
train_ids.tofile(os.path.join(os.path.dirname(__file__), 'train.bin'))
val_ids.tofile(os.path.join(os.path.dirname(__file__), 'val.bin'))

操作中,将数据集进行划分90%用于GPT模型的训练,10%的数据用于GPT模型在训练过程中的验证。

3、进行模型训练之前,进行训练环境的依赖包的安装

pytorch <3
numpy <3
pip install transformers for huggingface transformers <3 (to load GPT-2 checkpoints)
pip install datasets for huggingface datasets <3 (if you want to download + preprocess OpenWebText)
pip install tiktoken for OpenAI's fast BPE code <3
pip install wandb for optional logging <3
pip install tqdm <3

按照以上的指令,逐一安装就好。

4、配置模型训练的超参数

# 网络模型输出文件夹
out_dir = 'out-shakespeare-char'
eval_interval = 250 # keep frequent because we'll overfit
eval_iters = 200

# 数据文件夹名称
dataset = 'shakespeare_char'

# GPT模型的大小事宜
n_layer = 6
n_head = 6
n_embd = 384
dropout = 0.2

warmup_iters = 100 # not super necessary potentially

以上列举了部分超参数的设定,所谓“超参数”是深度学习上的一个术语。

超参数是指,无明确要求设定,无法精确选择的参数设定,比如,训练次数,可能训练100轮达到最优,也可能训练500轮达到最优效果。

所以综上所述,训练次数就是一个超参数。

5、进行模型训练,执行训练命令

python train.py config/train_shakespeare_char.py

部分训练截图:

6、进行模型的推理,进行莎士比亚戏剧的续写创作,检验效果,执行预测指令;

python sample.py --out_dir=out-shakespeare-char

好的,本次分享到此结束。

什么?结束了?这可能吗?当然是不可能得了。

稚晖君曾说:我希望我每一次做的项目,都是迄今为止最复杂的项目。

向稚晖君学习,我自己也是这么学过来的,我在官方Demo的基础之上,做了一个使用nanoGPT训练一个写唐诗的机器人模型。

原有模型使用的莎士比亚的戏剧数据集,写唐诗机器人,自然而然需要使用唐诗的文本数据,那么怎么做呢?

经过多方调研,我找到了一个不错的唐诗,宋词数据的下载资源地址:

github.com/chinese-poe…

这个数据集里面包含搜集到的唐诗,宋词,元曲小说文本数据。

1、数据集中整理出具体的唐诗文本数据,在这里我们需要进行数据的预处理

存储形式:Json字符串形式存储,以python的字典形式进行存储。

我们需要把它进行处理为之前莎士比亚戏剧那种的文本txt文件。

编写核心处理的python代码:

# -*- coding: utf-8 -*-
import glob
import json
import os
datas_json=glob.glob("./chinese-poetry-master/全唐诗/poet*.json"#1匹配所有唐诗json文件

for data_json in datas_json[:]: #2处理匹配的每一个文件
    with open(data_json,"r",encoding="utf-8"as f:
        ts_data =json.load(f)
        for each_ts in ts_data[:]: #3处理文件中每段数据,只要五言诗和2句的
            paragraphs_list =each_ts["paragraphs"]
            if len(paragraphs_list) == 2 and len(paragraphs_list[0])==12 and len(paragraphs_list[1]) == 12:
                with open("tang_poet.txt","a",encoding="utf-8"as f2:
                    f2.write("".join(paragraphs_list))
                    f2.write("\n")

f =open("tang_poet.txt","r",encoding="utf-8")
print(len(f.readlines()))

处理之后的唐诗数据集格式存储如下所示:

同样进行文本数据的转换,执行转化命令,替换数据集读取路径:

# download the tiny shakespeare dataset
input_file_path = os.path.join(os.path.dirname(__file__), 'tang_poet.txt')

执行官方Demo的预处理命令。完成唐诗数据集的预处理操作。

2、训练撰写唐诗的神经网络模型,修改配置如下,config文件夹下,新建gu_char.py代码文件

gu_char.py

# 修改一个新的文件夹,作为输出的新文件夹,命名为‘out-poemtext’
out_dir = 'out-poemtext'
eval_interval = 250 # keep frequent because we'll overfit
eval_iters = 200
log_interval = 10 # don't print too too often

# 修改加载的数据集为 ‘poemtext’
dataset = 'poemtext'
gradient_accumulation_steps = 1
batch_size = 32 

训练中显卡显存占用:

3、使用RTX 2080Ti 训练大概20分钟,完成模型训练。模型训练的最终loss损失。

4、唐诗生成效果检验

可以看出,模型训练的loss还算可以,用来进行样本的唐诗生成效果检验。

生成古诗1:

生成古诗2:

怎么样,生成的效果感觉还是不错的吧!还可以更换数据集,比如使用nanoGPT训练一个生成宋词,或者小说的生成器,效果也很酷炫!

现在已经是深夜凌晨了,这篇文章,写了太久太久,各位读者一定点个赞!

我是千与千寻,一个只讲干活的码农!我们下期再见~