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