当前位置: 首页 > article >正文

《AI大模型专家之路》No.1 如何利用一个小巧的语料库训练并生成一个AI大模型

技术实践和深度磨炼是创新之魂,为帮助更多的初级开发者进入AI大模型技术高手的行列,特开辟本专栏!

如何利用一个小巧的语料库训练并生成一个AI大模型

  • 【本文中所有代码都在python3.11.5环境下跑通,实现了通过自建语料库进行模型微调和训练并得到个人专有大模型,并进而使用专有大模型进行推理,并介绍了CPU和GPU两种训练和推理方法】

在当今的AI领域,大语言模型(LLM)已经成为研究和应用的热点。然而,训练一个大规模的语言模型通常需要庞大的计算资源和海量的数据集。对于个人开发者或小型团队来说,这可能是一个难以跨越的门槛。本文将介绍如何利用一个小巧的语料库,通过一些优化技术,训练出一个轻量级但功能强大的语言模型,并最终生成一个模型文件。
在这里插入图片描述

1. 环境准备

首先,我们需要准备好开发环境。我们将使用Python作为主要编程语言,并借助Hugging Face的transformers库来构建和训练模型。以下是所需的依赖项:

pip install transformers datasets torch
  • transformers: Hugging Face提供的开源库,支持多种预训练模型。
  • datasets: 用于处理数据集的工具。
  • torch: PyTorch深度学习框架。

2. 数据准备

为了简化过程,我们假设你有一个小巧的语料库,例如包含10,000条文本的小型数据集。你可以从公开的文本数据集中提取一部分,或者自己创建一个简单的语料库。

示例:加载自定义语料库

假设我们的语料库存储在一个文本文件中,每行是一句话。我们可以使用datasets库来加载和处理这些数据。

from datasets import Dataset

# 假设语料库存储在corpus.txt文件中
with open('corpus.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()

# 创建一个Dataset对象
dataset = Dataset.from_dict({'text': lines})

print(dataset)

运行结果(作者这里使用了一个有578行的 corpus.txt 论文文件)

  • 注意:如果出现utf-8编码解码错误,可以将 encoding =‘utf-8’ 改为 ‘gbk’
578

数据预处理

在训练模型之前,我们需要对文本进行分词、编码等预处理操作。我们将使用Hugging Face的AutoTokenizer来处理文本。

from transformers import AutoTokenizer

# 使用预训练的tokenizer,例如GPT-2
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)

tokenizer.pad_token = tokenizer.eos_token  
# 或者使用以下行添加新的填充token
# tokenizer.add_special_tokens({'pad_token': '[PAD]'})

# 定义一个函数来对文本进行tokenize
def tokenize_function(examples):
    return tokenizer(examples['text'], padding="max_length", truncation=True, max_length=512, return_tensors="pt")

# 添加标签
def tokenize_function_with_labels(examples):
    tokenized = tokenizer(examples['text'], padding="max_length", truncation=True, max_length=512)
    tokenized['labels'] = tokenized['input_ids'].copy()  # 假设标签与输入相同
    return tokenized
    
# 对整个数据集进行tokenize
tokenized_dataset = dataset.map(tokenize_function_with_labels,  batched=True)

# 设置格式为PyTorch张量
tokenized_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'labels'])

运行结果:

Map: 100%|█████████████████████████████████████████████████████████| 578/578 [00:00<00:00, 5661.65 examples/s]

3. 模型选择与微调

由于我们使用的是一个小巧的语料库,直接从头开始训练一个大模型是不现实的。因此,我们将采用迁移学习的方法,基于一个预训练模型进行微调(Fine-tuning)。这里我们选择GPT-2作为基础模型。

加载预训练模型

from transformers import AutoModelForCausalLM

# 加载预训练的GPT-2模型
model = AutoModelForCausalLM.from_pretrained(model_name)

微调模型

接下来,我们将使用Trainer API来进行模型的微调。Trainer是Hugging Face提供的一个高级API,可以简化训练过程。

  • 注意在程序文件目录下新建两个文件夹:results; logs
from transformers import Trainer, TrainingArguments

# 定义训练参数
training_args = TrainingArguments(
    output_dir="./results",          # 输出目录
    num_train_epochs=3,             # 训练轮数
    per_device_train_batch_size=4,  # 每个设备的批量大小
    save_steps=10_000,              # 每隔多少步保存一次模型
    save_total_limit=2,             # 最多保存几个模型
    logging_dir='./logs',           # 日志目录
    logging_steps=500,              # 每隔多少步记录一次日志
)

# 定义Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset,
)

# 开始训练
trainer.train()

保存模型

训练完成后,我们可以将模型保存到本地,以便后续使用。

model.save_pretrained("./my_finetuned_model")
tokenizer.save_pretrained("./my_finetuned_model")
运行中输出:

```bash
  0%|                                                                                 | 0/390 [00:00<?, ?it/s]`loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`.        
 32%|██████████████████████▉                                                | 126/390 [22:28<48:09, 10.95s/it]

训练结束后输出:

{'train_runtime': 4247.9913, 'train_samples_per_second': 0.366, 'train_steps_per_second': 0.092, 'train_loss': 0.3159656622470954, 'epoch': 3.0}
100%|██████████████████████████████████████████████████| 390/390 [1:10:47<00:00, 10.89s/it]

训练后的模型文件在 my_finetuned_model 文件夹下
在这里插入图片描述
同时在 results 文件夹下会有一个 checkpoint-数字 的子文件夹,存储模型的过程文件。

注意:这一步根据语料库大小,以及电脑配置和显卡的性能,训练和微调耗时存在差异

  • 本人电脑配置:
  • 设备型号 神州战神 Z8 CA5NA (CNH5S01)
    处理器 Intel® Core™ i5-10200H CPU @ 2.40GHz 8核
    机带 RAM 40.0 GB (39.8 GB 可用)
    Windows 11 64 位操作系统, 基于 x64 的处理器
    6G 独显 NVIDIA GeForce RTX 3060 Laptop GPU

本人电脑耗时:70 分钟 (仅使用CPU,未使用GPU)

如果要在GPU上进行训练,按照以下操作:

要在这个程序中使用GPU,您需要确保以下几个方面:

(1). 确保安装了CUDA支持的PyTorch

首先,您需要确保安装的PyTorch版本支持CUDA。您可以通过以下命令安装支持CUDA的PyTorch(根据您的CUDA版本选择合适的命令):

# 例如,如果您使用的是CUDA 11.7
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117

(2). 检查CUDA是否可用

在代码中,您可以使用以下代码检查CUDA是否可用:

import torch

print("CUDA可用:", torch.cuda.is_available())

(3). 将模型和数据移动到GPU

在训练之前,您需要将模型和数据移动到GPU。您可以在定义Trainer时指定设备,或者在训练循环中手动将数据移动到GPU。

以下是如何修改代码以使用GPU的示例:

from transformers import Trainer, TrainingArguments

# 定义训练参数
training_args = TrainingArguments(
    output_dir="./results",          # 输出目录
    num_train_epochs=3,             # 训练轮数
    per_device_train_batch_size=4,  # 每个设备的批量大小
    save_steps=10_000,              # 每隔多少步保存一次模型
    save_total_limit=2,             # 最多保存几个模型
    logging_dir='./logs',           # 日志目录
    logging_steps=500,              # 每隔多少步记录一次日志
    device='cuda' if torch.cuda.is_available() else 'cpu'  # 指定设备
)

# 定义Trainer
trainer = Trainer(
    model=model.to('cuda'),  # 将模型移动到GPU
    args=training_args,
    train_dataset=tokenized_dataset,
)

# 开始训练
trainer.train()

(4). 确保数据在GPU上

在使用Trainer时,数据会自动移动到GPU。如果您手动处理数据,确保在训练循环中将数据移动到GPU:

# 在训练循环中
for batch in tokenized_dataset:
    batch = {k: v.to('cuda') for k, v in batch.items()}  # 将数据移动到GPU

使用GPU训练总结

  • 确保安装了支持CUDA的PyTorch版本。
  • 检查CUDA是否可用。
  • 在定义Trainer时将模型移动到GPU。
  • 确保数据在训练时也在GPU上。

4. 模型推理

训练完成后,我们可以加载模型并进行推理。以下是如何使用训练好的模型生成文本的示例代码。

from transformers import pipeline
from transformers import AutoModelForCausalLM, AutoTokenizer

# 加载微调后的模型
model = AutoModelForCausalLM.from_pretrained("./my_finetuned_model")
tokenizer = AutoTokenizer.from_pretrained("./my_finetuned_model")

# 创建文本生成pipeline
generator = pipeline('text-generation', model=model, tokenizer=tokenizer)

# 生成文本
prompt = "how to enhancing product innovation"
output = generator(prompt, max_length=50, num_return_sequences=1)

print(output[0]['generated_text'])

程序运行结果:

Device set to use cpu
Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation=True` to explicitly truncate examples to max length. Defaulting to 'longest_first' truncation strategy. If you encode pairs of sequences (GLUE-style) with the tokenizer you can select this strategy more precisely by providing a specific strategy to `truncation`.
how to enhancing product innovation: Explains how to effectively recruit and integrate customers into innovative products.**

可以看到,大模型输出比较符合所训练的论文语料库。

如何在GPU中推理(注意,要先pip安装 torch GPU版本)

from transformers import pipeline
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

# 加载微调后的模型
model = AutoModelForCausalLM.from_pretrained("./my_finetuned_model").to('cuda')  # 将模型移动到GPU
tokenizer = AutoTokenizer.from_pretrained("./my_finetuned_model")

# 创建文本生成pipeline
generator = pipeline('text-generation', model=model, tokenizer=tokenizer, device=0)  # 指定使用GPU

# 生成文本
prompt = "what is your name"
output = generator(prompt, max_length=50, num_return_sequences=1, truncation=True)  # 添加truncation=True

print(output[0]['generated_text'])

5. 总结

通过上述步骤,我们成功地利用一个小巧的语料库训练了一个轻量级的语言模型。虽然这个模型的规模较小,但由于我们采用了迁移学习的方法,它仍然能够生成具有一定质量的文本。

关键点总结:

  1. 数据准备:我们使用了一个小型语料库,并通过datasets库进行了预处理。
  2. 迁移学习:我们基于GPT-2预训练模型进行了微调,避免了从头训练大模型的高昂成本。
  3. 模型保存与推理:训练完成后,我们将模型保存下来,并展示了如何使用它生成文本。

这种方法非常适合资源有限的开发者或团队,帮助他们在小规模数据上快速构建和部署语言模型。

本文也适合个人开发者学习大模型训练和微调的入门学习。

希望这篇博客对你有所帮助!如果你在实操中有任何问题或建议,欢迎在评论区留言。


http://www.kler.cn/a/554472.html

相关文章:

  • 编写dockercompose脚本,管理redis,activemq,mysql5.7
  • 第3章 3.2 配置系统 .NET Core配置系统
  • JavaScript 性能优化进阶:CPU、内存、I/O 与 V8 优化
  • 基于Java EE“陕西农特产品”网络交易平台设计与实现(源码+文档)
  • [算法学习笔记]1. 枚举与暴力
  • 第7章:在LangChain中如何调用函数Tools (Function Calling)
  • CD3.【C++ Dev】头文件、缺省参数
  • LeeCode题库第二十六题
  • 云服务中的“高可用性架构”是怎样的?
  • 2025-02-20 学习记录--C/C++-PTA 7-26 单词长度
  • SQLSTATE「42000」:Syntax error or access violation: 1055……
  • spring微服务+dubbo框架,某一服务启动时提示多个bean存在
  • playwright 实现自动上传,多元素操作
  • 芝加哥学派(Chicago School):金融与经济学的创新力量(中英双语)
  • 基于Openlayers对GeoServer发布的数据进行增删改
  • 芯谷D2038:高集成度六通道电子音量控制电路的音频解决方案
  • 为什么mvcc中?m_ids 列表并不等同于 min_trx_id 和 max_trx_id 之间的所有事务 ID
  • 在项目中调用本地Deepseek(接入本地Deepseek)
  • jQuery UI CSS 框架 API
  • 【并发测试】Redis并发性能测试