加载模块前,请记得升级 transformers的版本到最新版 pip install -U transformers,开始没升级,用的 4.27 各种报错,尤其是刚接触一度怀疑本地包的参数有问题浪费了不少时间,其实发现升级到新版就都可以正常使用了。
另外由于每个模型在训练的时候,会有固定对应的分词器,因此在导入模型的时候,我们同样需要同步导入对应的分词器。
自动加载
如果网络好,模型加载可以直接自动联网下载并完成模型的加载.1
2
3
4from transformers import AutoModelForSeq2SeqLM # import LLM
model_name='google/flan-t5-base'
model = AutoModelForSeq2SeqLM.from_pretrained(model_name) # 导入模型
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True) #导入分词器
指定的模型如果存在,会自动从huggingface上下载对应的模型,并完成模型的加载,
加载本地模型
1 | from transformers import AutoModel #自动判断模型,如果指导具体模型也可以使用其他的模块,比如AutoModelForSeq2SeqLM、LlamaForCausalLM |
可以看到transformers本身存在很多模型类,不同的模型类对应不同的属性功能,所以在使用前一定要确认要使用到模型,和要解决的问题。具体模型分类可以查看transformers官方文档。
模型的使用
完成模型的加载后,我们就可以使用模型进行一些数据的处理。1
2
3
4
5
6
7
8
9
10
11
12
13# 获得要处理的文本
# dialogue=“who are you” # 可以是我们直接提供的文本,也可以从测试数据集中获取。
dialogue = dataset['test'][index]['dialogue']
# 对待处理的文本进行编码,基于模型中提供的分词器,将文本转换成数字编码
inputs = tokenizer(dialogue, return_tensors='pt')
# 生成模型结果,并对结果进行解码
output = tokenizer.decode( # 对模型生成的数字编码结果进行解码,生成具备可读性的文本。
model.generate( # 根据模型和编码后的输入文件,获取输出数字编码的结果
inputs["input_ids"], #输入结果编码后的数组
max_new_tokens=50, # 模型参数,控制输出文本的长度。
)[0],
skip_special_tokens=True
)
微调模型
我们前面已经介绍了,如何加载一个模型,其实加载完模型,我们就可以通过模型获得我们想要的结果,但是有些时候,原始获取的模型获得的结果并不是很符合我们的预期。
这时候,我们就需要对模型进行一些微调,这里我们会开始介绍一些模型进行本地化微调的方法。
数据和模型的加载
既然是微调,前提其实就是我们已经有一套预训练的参数,同时我们有一套数据集,可以用于进行参数的进一步调整,所以在开始预训练前,首先我们需要做的就是加载数据集和模型。1
2
3
4
5
6
7
8 # 加载数据集
dataset_name = "knkarthick/dialogsum"
dataset = load_dataset(dataset_name)
# 加载模型
model_name='google/flan-t5-base'
original_model = AutoModelForSeq2SeqLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained(model_name)
提前了解模型的情况
模型的可调节参数
其实所谓的模型微调,就是通过训练数据,对神经网络中的参数进行不断的修正调整,所以在动手调节前,我们肯定需要先了解, 我们使用的模型,一共有多少参数。可以通过下面的方法了解我们的参数情况。1
2
3
4
5
6
7
8
9
10
11
12def print_number_of_trainable_model_parameters(model):
trainable_model_params = 0
all_model_params = 0
for _, param in model.named_parameters():
all_model_params += param.numel()
if param.requires_grad:
trainable_model_params += param.numel()
return f"trainable model parameters: {trainable_model_params}\n"+
f"all model parameters: {all_model_params}\n"+
f"percentage of trainable model parameters: {100 * trainable_model_params / all_model_params:.2f}%"
print(print_number_of_trainable_model_parameters(model))
我们以 Meta-Llama-3-8B 为例,可以看到该模型共计 8.03B 的参数,可以训练的模型参数占比 100%。1
2
3trainable model parameters: 8030261248
all model parameters: 8030261248
percentage of trainable model parameters: 100.00%
模型的性能表现
不同模型的预期用途不一样,所以这部分可能会在不同用途的模型上不具备通用型,但是如果刚接触,可以以此为例。
简单讲,就是直接使用模型对手上测试数据的输入进行处理,然后比较生成的结果和测试数据的预期结果之间有多大差别。
总结性模型
1 | index = 200 |