《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. 总结
通过上述步骤,我们成功地利用一个小巧的语料库训练了一个轻量级的语言模型。虽然这个模型的规模较小,但由于我们采用了迁移学习的方法,它仍然能够生成具有一定质量的文本。
关键点总结:
- 数据准备:我们使用了一个小型语料库,并通过
datasets
库进行了预处理。 - 迁移学习:我们基于GPT-2预训练模型进行了微调,避免了从头训练大模型的高昂成本。
- 模型保存与推理:训练完成后,我们将模型保存下来,并展示了如何使用它生成文本。
这种方法非常适合资源有限的开发者或团队,帮助他们在小规模数据上快速构建和部署语言模型。
本文也适合个人开发者学习大模型训练和微调的入门学习。
希望这篇博客对你有所帮助!如果你在实操中有任何问题或建议,欢迎在评论区留言。