Code前端首页关于Code前端联系我们

nanoGPT:以古诗集为例,训练自己的GPT模型

terry 2年前 (2023-09-23) 阅读数 107 #AI人工智能

使用nanoGPT一步步训练自己的GPT模型,基于gpt2,好处也能做到。 CPU,简单快速(LLaMa模型训练gpu很费时间,很多跑不了,所以我选择这个)

最终实现:以古诗集为例,可以继续写诗的gpt模型训练

地址开源

github.com/karpathy/nanoGPT
github.com/chinese-poetry/poetry-chinese♶♶可以在下面创建一个保存。环境是模型训练所必需的。这是小编 Build过程编译的最简单的基础环境,编译不会丢失

1 conda(python环境)

#网址:https://conda.io/en/latest/miniconda.html
wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh #下载脚本
sh Miniconda3-py39_4.12.0-Linux-x86_64.sh # 执行
~/miniconda3/bin/conda init #初始化Shell,以便直接运行conda
conda create --name nanogpt python=3.9  #关启shell,创建虚拟环境
conda activate nanogpt #激活 

2 下载代码

wget https://github.com/karpathy/nanoGPT/archive /refs /heads/master.zip

3 安装依赖项:

pip install Transformer tiktoken tqdm

4 torch 安装

https://pytorch.org❀/get-started/lo : pip3 install torch Vision torchaudio nanoGPT:古诗集为例,训练一个自己的gpt模型

测试:nanoGPT:古诗集为例,训练一个自己的gpt模型

运行demo示例

环境准备好后,进入项目目录,立即执行:

data python #Dataparepy/shakespeare.处理
python train.py config/train_shakespeare_char .py #训练,有GPU

无GPU
python train.py config/train_shakespeare_char.py --device-=cpuF_char.py --device-=eval0F - -log_interval=1 --block_size=64 - -batch_size=12 --n_layer=4 --n_head=4 --n_embd=128 --max_iters=2000 --lr_decay_iters=2000 --dropout=0.0

错误解决:
1个错误:
运行时错误:当前CUDA设备不支持bfloat16。请将 dtype 切换为 float16。nanoGPT:古诗集为例,训练一个自己的gpt模型

AttributeError: module 'torch' does not have attribute 'compile'nanoGPT:古诗集为例,训练一个自己的gpt模型

2 解决上述两个问题:
打开 train.py 文件并更改以下参数(第 73 行附近)
dtype = 'float16'
编译= FalsenanoGPT:古诗集为例,训练一个自己的gpt模型

结束标志:

最佳验证损失为1.4697;默认情况下,模型每250轮保存一次;训练过程中按ctrl+c可以立即停止nanoGPT:古诗集为例,训练一个自己的gpt模型

模型保存路径:nanoGPT:古诗集为例,训练一个自己的gpt模型

运行演示模型(采样/推理)

python example.py -- out_dir=out-shakespeare-char
.py - -out_dir=out-shakespeare-char --device=cpu ## 无gpu

成功标志:nanoGPT:古诗集为例,训练一个自己的gpt模型

训练自己的数据集

下面以古诗词集为例,训练可以继续写的gpt模型诗歌

数据如下,下载到根目录(/nanoGPT-master/XX)

github.com/chinese-poetry/chinese-poetry
最全的中国古代诗歌数据库,近14000位古代诗人唐宋两代唐诗近5.5万首,宋词26万首。 1564位宋代诗人,21050首诗

nanoGPT:古诗集为例,训练一个自己的gpt模型

还下载了一本诗集所以这里我们以唐诗为例,所以第一步就是处理数据,收集所有唐诗数据(nanoGPT-master\china-poetry -master\所有唐诗)并过滤

1 数据预处理

提取相关唐诗数据

# -*- coding: utf-8 -*-
"""
目标:获取数据集中全唐诗,并提取五言诗词,两句的数据
 示例:
{
        "author": "郭向",
        "paragraphs": [
            "抱玉三朝楚,懷書十上秦。",
            "年年洛陽陌,花鳥弄歸人。"
        ],
        "title": "途中口號",
        "id": "32898701-8d9c-4b4d-b192-510564f63b2f"
    },
"""

import glob
import json
import os
datas_json=glob.glob("../../chinese-poetry-master/全唐诗/poet*.json") #1匹配所有唐诗json文件
# print(datas_json,"\n",len(datas_json))

if os.path.exists("tang_poet.txt"):
    os.remove("tang_poet.txt")
    print("已经删除原数据-tang_poet.txt")

print("总共处理文件个数:", len(datas_json))
print("预处理中,请稍后。。")
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()))
print("success")
nanoGPT:古诗集为例,训练一个自己的gpt模型

2 生成网络数据

修改prepare.py:nanoGPT:古诗集为例,训练一个自己的gpt模型

py;复制train_shakespeare_char.py的内容,大功告成

修改:out_dir = 'out-gu-char'
dataset = 'gu_poems'nanoGPT:古诗集为例,训练一个自己的gpt模型

3 Training
data python/gu_poems/prepare.pynanoGPT:古诗集为例,训练一个自己的gpt模型

python train.py config/gu_char.pynanoGPT:古诗集为例,训练一个自己的gpt模型

检查train和val的loss,评估模型是否存在问题;如果val一开始不收敛 好吧,可能数据太少了nanoGPT:古诗集为例,训练一个自己的gpt模型

4推理

开始写一首古诗。
python Sample.py --out_dir=out-gu-charnanoGPT:古诗集为例,训练一个自己的gpt模型

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门