本文最后更新于 2024-11-28 11:47

一.概述

本教程提供了使用 GPT-2 模型进行文本生成任务的完整步骤。

GPT-2(Generative Pre-trained Transformer 2)是 OpenAI 提出的一个基于 Transformer 的语言模型,具有强大的文本生成能力。通过预训练和微调,GPT-2 可以在多种自然语言处理(NLP)任务中取得优异表现。

本教程:

使用数据集: German Recipes 数据集

预训练模型german-gpt2

本教程将引导你从环境准备到模型训练与微调的全过程,帮助你快速上手并实现自己的文本生成应用。

二.快速开始

2.1 环境准备

运行硬件环境:

类别 详细信息
CPU 16 vCPU Intel(R) Xeon(R) Platinum 8352V CPU @ 2.10GHz
GPU RTX 4090 * 1
GPU 显存 24GB
CUDA 版本 12.1
操作系统 Ubuntu 18.04.5 LTS (Bionic Beaver)
Python 版本 3.8.20
PyTorch 版本 2.4.1

创建一个 conda 环境 gpt2 ,并激活环境

conda create -n gpt2 python=3.8
conda activate gpt2   

2.2 从资源站下载实例源码

mkdir run-gpt2
cd run-gpt2
# 从aheadai资源站下载资源包
wget https://mirrors.aheadai.cn/scripts/gpt2_example.zip

解压资源包

unzip gpt2_example

确保解压后文件结构如下:

./gpt2_example/
    ├── Data_download.py       # 数据下载.py文件
    ├── Data_process.py        # 数据处理.py文件
    ├── Train.py               # 模型训练.py文件
    ├── Test.py                # 模型测试.py文件
    ├── recipes.json           # 数据文件
    ├── Details.py             # 模型微调及日志输出.py文件
    ├── Config/                # 配置文件
    └── requirements.txt       # 其余依赖文件

2.3 安装pytorch

pip install torch==2.4.1
conda install cudatoolkit=12.1

2.4 安装transformers及其他依赖

cd gpt2_example
pip install transformers
pip install -r requirements.txt

三.训练教程

3.1 下载数据集

下载数据 "recipes.json" 到当前目录:

python Data_download.py

如无法科学上网,可以跳过这一步,资源包已经为你准备了数据集哦。

3.2 数据集处理

将数据集拆分为训练集测试集,比例在代码中可以修改:

# 使用train_test_split函数将数据分割为训练集和测试集
train, test = train_test_split(data, test_size=0.15)  # 设定测试集占15%,剩下的85%为训练集

命令窗口输入:

python Data_process.py

最后会得到示例输出:

Train dataset length: 10361
Test dataset length: 1829

3.3 模型训练

3.31 配置准备

此处提醒一下,不同的GPT模型以下分词器及配置文件不同,根据实现需要下载。

我们需要的模型预训练配置文件要科学上网从GPT社区下载(推荐操作)。如是,代码需要小小的改动:

# 1. 加载预训练的Tokenizer(分词器)
#tokenizer = AutoTokenizer.from_pretrained("./Config")
tokenizer = AutoTokenizer.from_pretrained("anonymous-german-nlp/german-gpt2")
# 2. 加载预训练的GPT-2模型,模型类型为CausalLM(因其适用于语言模型训练)
#model = AutoModelForCausalLM.from_pretrained("./Config")
model = AutoModelForCausalLM.from_pretrained("anonymous-german-nlp/german-gpt2")

Train.py 中改为 “tokenizer = AutoTokenizer.from_pretrained("anonymous-german-nlp/german-gpt2")”,表示直接连接 https://huggingface.co 下载相应配置文件。如需测试,在 Details.py 也需做同样改动。

当然,无法科学上网的读者也无需担心,我们提供了本教程使用的配置文件,并且这一步无需修改代码。

./Config/
    ├── config.json              # 配置文件,通常包含模型的超参数或训练设置
    ├── merges.txt               # 用于分词的合并规则文件,包含子词合并规则
    ├── pytorch_model.bin        # PyTorch模型权重文件,保存训练后的模型参数
    ├── tokenizer_config.json    # 分词器的配置文件,包含分词器的设置参数
    └── vocab.json               # 词汇表文件,保存模型所使用的词汇及其对应的索引     
3.32 开始训练

此处使用 tokenizer:german-gpt2

# 1. 加载预训练的Tokenizer(分词器)
tokenizer = AutoTokenizer.from_pretrained("./Config")
#tokenizer = AutoTokenizer.from_pretrained("anonymous-german-nlp/german-gpt2")

创建一个 gpt2 训练实例,在 TrainingArguments 中,可以调整训练超参数:

# 5. 设置训练参数
training_args = TrainingArguments(
    output_dir="./gpt2-gerchef",  # 模型训练输出目录
    overwrite_output_dir=True,  # 如果输出目录已存在,是否覆盖其内容
    num_train_epochs=3,  # 训练轮数,3轮
    per_device_train_batch_size=32,  # 每个设备(例如GPU)上的训练批量大小
    per_device_eval_batch_size=64,  # 每个设备上的评估批量大小
    eval_steps=400,  # 每 400 步进行一次评估
    save_steps=800,  # 每 800 步保存一次模型
    warmup_steps=500,  # 500步作为热身阶段,逐步提高学习率
)

开始训练模型,在本环境中大概需要 5-6min .

python Train.py

将模型保存等待进一步测试,会生成一个 "../run-gpt2/gpt2_example/gpt2-gerchef" 文件,里面就是已经训练好的模型。

3.4 模型测试

Test.py 文件中(关于具体参数作用在 Test.py 中有详细注释):

# 1. 加载模型配置
config = AutoConfig.from_pretrained("./gpt2-gerchef")
# 2. 加载 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained("./tt")
model = AutoModelForCausalLM.from_pretrained("./gpt2-gerchef", config=config)
# 3. 创建生成模型的 pipeline,确保配置了设备(GPU 或 CPU)
chef = pipeline('text-generation',
                model=model,
                tokenizer=tokenizer,
                config=config,
                device=0 if torch.cuda.is_available() else -1,
                pad_token_id=50256)
# 4. 使用生成模型进行文本生成
result = chef('Zuerst Tomaten')[0]['generated_text']
# 5. 输出结果
print(result)

其中 'Zuerst Tomaten' 就是需要测试生成文本的起点,在命令行中输入:

python Test.py

最后可以得到类似于:

Zuerst Tomatenwürfel und eine Handvoll Lorbeerblätter hinzufügen. Alles mit der Flüssigkeit ablöschen, den Fond aufkochen und etwa eine halbe Stunde sanft köcheln lassen. Mit Salz, Pfeffer und Muskat würzen. Ab und zu um

的输出结果。

四. 模型微调

命令行窗口输入:

python Details.py

4.1 模型参数设计

以下是关于模型参数设计部分代码:

# 训练参数设置
training_args = TrainingArguments(
    output_dir="./gpt2-gerchef",
    overwrite_output_dir=True,
    num_train_epochs=3,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=64,
    eval_steps=400,
    save_steps=800,
    warmup_steps=500,
)

可根据读者使用情况调整设计。

4.2 模型训练信息

另外,运行 Details.py 可以得到一个日志文件 “./logs/training_log.txt” ,包含信息:

  • 训练步骤和损失值(Loss)
  • 吞吐量(Throughput)
  • GPU 资源使用情况
  • 训练时间
  • 训练成本(Cost)

training_log.txt示例:

Step   Loss    LR    Throughput    GPU Memory Used   GPU Memory Free    Power Draw    Total Time      Cost
1        4.1811        1.0e-07        58.06        7629        16582        96.81        0.55        $0.00
2        4.0396        2.0e-07        117.72       9245        14966        133.25       0.82        $0.00
3        4.0120        3.0e-07        119.55       9245        14966        172.54       1.09        $0.00
4        4.0576        4.0e-07        132.36       9245        14966        202.45       1.33        $0.00
5        4.1365        5.0e-07        131.52       9245        14966        217.66       1.58        $0.00
6        4.1391        6.0e-07        119.99       9245        14966        223.04       1.84        $0.00
7        4.0573        7.0e-07        132.75       9245        14966        244.15       2.08        $0.00
8        4.0143        8.0e-07        144.14       9245        14966        257.36       2.31        $0.00
9        3.9753        9.0e-07        130.32       9245        14966        240.17       2.55        $0.00
10       4.0922        1.0e-06        131.27       9245        14966        229.98       2.79        $0.00
本文系作者 @ admin 原创发布在 文档中心 | AheadAI ,未经许可,禁止转载。