实战Transformers模型微调

近期以工作和考试为中心,停更了近一个半月。休息了半个月以后,目前可以重新进入持续且专注的学习状态。同时基于现有的工作环境和原有的知识框架,对比软考架构师的知识大纲,笔者新增了一个架构学习系列,从而映射到工作中所听所想,帮助自己建立知识体系,也欢迎大家阅读指正。

数据集处理库——Hugging Face Datasets

什么是Hugging Face Datasets库?

Datasets 是一个用于轻松访问和共享音频、计算机视觉和自然语言处理(NLP)任务数据集的 Python 库。只需一行代码即可加载数据集,借助强大的数据处理方法,使用户能快速准备好数据集以进行深度学习模型的训练。与Hugging Face Hub深度整合,在更广泛的机器学习社区中轻松加载和共享数据集。
Hugging Face Datasets
上图为Hugging Face Datasets的官网界面。

为什么需要Hugging Face Datasets库?

Hugging Face Datasets库可以解决模型训练的数据来源问题。由于大模型训练的前提是有数据源,而Hugging Face Datasets库可以便捷提供多种类型的数据,例如文本、音频、视频等,以支持模型的训练或推理。
模型推理的流程

如何加载数据集?

从Hugging Face Datasets库中“yelp_review_full”数据集为例,利用transformers生态的这些库,如datasets ,就可以很轻松的把这些数据模型下载到本地,再进一步训练处理及部署。

from datasets import load_dataset
dataset = load_dataset("yelp_review_full")

Yelp评论数据集包括来自Yelp的评论。它是从Yelp Dataset Challenge 2015数据中提取的。该数据集主要用于文本分类、预测情感。
text:评论文本,利用双引号转义;
label:对应评论的分数(1~5)。

预处理数据

下载数据集到本地后,使用Tokenizer来处理文本,对于长度不等的输入数据,可以使用填充(padding)和截断(truncation)策略来处理Datasets的nap方法,支持一次性在整个数据集上应用预处理函数。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")


def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)


tokenized_datasets = dataset.map(tokenize_function, batched=True)

加载界面
图1 数据加载运行界面

数据抽样

使用1000个数据样本,在BERT上基于Pytorch Trainer演示小规模训练。shuffle()函数会随机重新排列列的值。如果希望对用于洗牌数据集的算法有更多控制,可以在函数中指定generetor参效来使用不同的numpy.random.Generetor。

small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

Transformers 微调训练模块 Trainer

加载BERT模型

警告通知我们正在丢弃一些权重(vocab_transform 和 vocab_layer_norm层),并随机初始化其他一些权重(pre_classifier和classifier层)。在微调模型前提下绝对是正常的,因为我们正在测试用于预训练模型的掩码语言建模任务的头部,并用一个新的头部替换它。对于这个新头部,我们没有预训练的权量,所以库会警告我们在用它进行维理之前应该对这个模型进行微调。

from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)

运行界面
图2

训练超参数

完整的配置参数与默认值:https://github.com/DjangoPeng/LLM-quickstart/blob/main/docs/version_info.txt

torch>=2.1.2==2.3.0.dev20240116+cu121
transformers==4.37.2
ffmpeg==1.4
ffmpeg-python==0.2.0
timm==0.9.12
datasets==2.16.1
evaluate==0.4.1
scikit-learn==1.3.2
pandas==2.1.1
peft==0.7.2.dev0
accelerate==0.26.1
autoawq==0.2.2
optimum==1.17.0.dev0
auto-gptq==0.6.0
bitsandbytes>0.39.0==0.41.3.post2
jiwer==3.0.3
soundfile>=0.12.1==0.12.1
librosa==0.10.1
langchain==0.1.0
gradio==4.13.0

源代码定义:https://github.com/huggingface/transformers/blob/v4.36.1/src/transformers/training_args.py#L161
最重要配置:模型权重保存路径

from transformers import TrainingArguments
model_dir = "models/bert-base-cased"

# logging_steps 默认值微500,根据训练数据和步长,将其设置为100
training_args = TrainingArguments(output_dir=f"{models_dir}/test_trainer",
                                 logging_dir=f"{models_dir}/test_trainer/runs",
                                 logging_steps=100)

模型训练评估库 Hugging Face Evaluate

Hugging Face Evaluate 库支持使用一行代码,获得数十种不同领域(自然语言处理、计算机视觉、强化学习等)的评估方法。当前支持完整评估指标:https://huggingface.co/evaluate-metric。
训练器(Trainer)在训练过程中不会自动评估模型性能。因此,我们需要向训练器传递一个函数来计算和报告报标。
Evaluate库提供了一个简单的准确率函数,可以通过使用 evaluate.load 函数加载。

import numpy as np
import evaluate

metric = evaluate.load("accuracy")

然后,调用compute函数计算预测的准确率,在将预测传递给compute函数之前,需要将logits转化为预测值,即所有Transformers模型都返回logits。

开始训练

实例化训练器

实例化一个trainer主要分成三步:
第一步:加载一个预训练的模型;第二步:超参数评估指标computer matrix;第三步:通过train点train完成模型微调。

train=Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eva_dataset=small_eva_dataset,
    compute_metrics=compute_metrics
)

保存训练模型和训练状态

使用trainer.save_model方法保存模型,后续可以通过from_pretrained()方法重新加载;
使用trainer.save_state方法保存训练状态

trainer.save_model()
trainer.save_state()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitney_mao

您的认可和鼓励是持续分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值