大模型基础(五):transformers库(下):快速分词器、自动配置类、快速微调

transformers库(下)

  • 1 快速分词器
    • 1.1 Fast 分词器的核心特点
    • 1.2 对比示例
    • 1.3 何时使用 Fast 分词器?
    • 1.4 注意事项
  • 2 自动配置类 AutoConfig
    • 2.1 核心功能
    • 2.2 基本用法
    • 2.3 主要应用场景
    • 2.4 常用函数
    • 2.5 与具体配置类的区别
    • 2.6 注意事项
  • 3 快速微调
    • 3.1 快速微调流程(以文本分类为例)
    • 3.2 关键优化技巧
    • 3.3 替代方案:使用 `accelerate` 库(更灵活)
  • 4 总结

1 快速分词器

经常使用Bert的同学,可以会遇到BertTokenizerFast,它是快速分词器的意思。

在 Hugging Face Transformers 库中,BertTokenizerFast 的 “Fast” 表示这是一个高性能分词器,基于 Rust 语言实现(而非纯 Python),专为提升分词速度而设计。以下是 BertTokenizerFastBertTokenizer 关键区别和意义:

1.1 Fast 分词器的核心特点

  1. 速度优势
    • 比普通分词器(如 BertTokenizer)快 10-100 倍,尤其对长文本或批量数据处理更高效。
    • 底层使用 Rust 实现,避免了 Python 的全局解释器锁(GIL),支持多线程加速。
    • 快速分词器只有在并行处理大量文本时才能发挥出速度优势,在处理单个句子时甚至可能慢于慢速分词器。

  2. 后处理优化
    • 支持动态截断(truncation=True)、填充(padding=True)等操作的快速批处理。

  3. 支持追踪映射
    • 能够追踪原文到 token 之间的映射,例如encoding = tokenizer("Hello world!")encoding.word_ids()可以获取每一个 token 在原文中的索引,这对于处理序列标注、自动问答等任务非常重要,。

  4. 功能兼容性
    • 提供与普通分词器(BertTokenizer)完全一致的 API(如 encode(), decode()),用法无差异。
    • 支持所有 BERT 系列模型的分词逻辑(如 WordPiece 分词)。

1.2 对比示例

普通分词器(纯 Python)

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
text = "Hugging Face Transformers is awesome."
output = tokenizer(text)  # 相对较慢

Fast 分词器(Rust 加速)

from transformers import BertTokenizerFast
tokenizer = BertTokenizerFast.from_pretrained("bert-base-uncased")
text = "Hugging Face Transformers is awesome."
output = tokenizer(text)  # 更快,尤其批量处理

1.3 何时使用 Fast 分词器?

  1. 推荐默认使用:除非需要特殊分词逻辑(如完全控制分词细节),否则优先选择 XXXTokenizerFastAutoTokenizer 类默认选择快速分词器。
  2. 大数据场景:处理长文本、批量数据或实时应用时,性能提升显著。
  3. pipeline 集成:Transformers 的 pipeline 函数默认自动选择 Fast 分词器(如果存在)。

1.4 注意事项

• 并非所有模型都有对应的 Fast 分词器,但主流模型(如 BERT、RoBERTa、GPT-2)均已支持。
• 可通过 AutoTokenizer 自动加载 Fast 版本:

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased", use_fast=True)

总结来说,“Fast” 是性能优化的标志,通过底层 Rust 实现大幅提升了分词效率,是生产环境和大规模处理的首选。

2 自动配置类 AutoConfig

我们之前学了AutoTokenizer 和 AutoModel,其实还有一个组件也挺常见的,那就是 AutoConfig。

🤗 transformers.AutoConfig 是 Hugging Face Transformers 库中用于自动加载和管理模型配置的工具类。它是模型架构的“蓝图”,定义了模型的结构参数(如层数、隐藏层维度等),无需加载完整的模型权重即可操作配置。

2.1 核心功能

  1. 统一接口
    自动识别模型类型(如 BERT、GPT-2),无需手动指定配置类。
  2. 灵活加载
    支持从预训练模型名称、本地文件或自定义字典加载配置。
  3. 配置修改
    允许动态调整模型结构参数(如隐藏层大小、注意力头数),用于定制化模型。

2.2 基本用法

  1. 加载预训练模型配置
from transformers import AutoConfig# 从 Hugging Face Hub 加载配置(不加载模型权重)
config = AutoConfig.from_pretrained("bert-base-uncased")
print(config.hidden_size)  # 输出: 768(BERT-base 的隐藏层维度)
  1. 修改配置并初始化新模型
# 修改配置参数
config.num_hidden_layers = 6  # 减少 BERT 的层数# 用新配置创建模型(权重随机初始化)
from transformers import AutoModel
model = AutoModel.from_config(config)
  1. 从本地文件加载配置
# 假设有本地配置文件 config.json
config = AutoConfig.from_pretrained("./my_config_directory/")

2.3 主要应用场景

  1. 查看模型超参数
    快速获取模型的超参数(如层数、激活函数类型),可以没有预训练模型的权重,但配置文件(如 config.json)必须得有。

  2. 模型轻量化
    通过减少层数 (num_hidden_layers) 或隐藏层维度 (hidden_size) 创建更小的模型。

    from transformers import AutoConfig
    config = AutoConfig.from_pretrained("bert-base-uncased")# 示例:创建一个更小的 BERT 变体
    config.num_hidden_layers = 6    # 减少层数(从 12 到 6)
    config.hidden_size = 384        # 缩小隐藏层维度(从 768 到 384)
    config.num_attention_heads = 6  # 减少注意力头数(从 12 到 6)
    config.intermediate_size = 1536 # 缩小 FFN 层维度(从 3072 到 1536)# 使用新配置创建模型
    from transformers import AutoModel
    model = AutoModel.from_config(config)
    print(model.num_parameters())  # 查看参数量(对比原始模型约 1.1 亿参数)
    

    修改配置后的模型是 ​​随机初始化​​ 的,​​无法直接加载原模型的预训练权重​​(维度不匹配)。

  3. 迁移学习适配
    调整分类任务的标签数 (num_labels) 以适配下游任务:

    config.num_labels = 10  # 适配 10 分类任务
    model = AutoModelForSequenceClassification.from_config(config)
    
  4. 跨框架转换
    从 PyTorch 配置初始化 TensorFlow 模型:

    # 加载 PyTorch 配置
    config = AutoConfig.from_pretrained("bert-base-uncased")
    # 创建 TensorFlow 模型
    from transformers import TFBertModel
    tf_model = TFBertModel.from_config(config, from_pt=True)
    

2.4 常用函数

方法用途
from_pretrained()从模型名称或路径加载配置
to_dict()将配置转换为字典格式
save_pretrained()保存配置到本地目录

示例:保存自定义配置

config.save_pretrained("./custom_config/")  # 生成 config.json

2.5 与具体配置类的区别

通用性:AutoConfig 自动匹配模型类型,而具体类(如 BertConfig)需手动指定。
代码兼容性:使用 AutoConfig 使代码与模型解耦,切换模型时无需修改配置加载逻辑。

2.6 注意事项

直接修改配置不会影响预训练权重,若需加载预训练权重,应确保配置与原模型一致。
自定义配置可能导致模型无法加载某些预训练权重(如维度不匹配时)。

通过 AutoConfig,开发者可以高效管理模型结构,为模型轻量化、任务适配和跨框架迁移提供基础支持。

3 快速微调

在 Hugging Face Transformers 库中,快速微调模型的最高效方法是使用内置的 Trainer 类 和 TrainingArguments,结合 datasets 库处理数据。以下是完整步骤和示例代码:

3.1 快速微调流程(以文本分类为例)

1. 安装依赖

pip install datasets evaluate

2. 加载模型和分词器

from transformers import AutoTokenizer, AutoModelForSequenceClassificationmodel_name = "bert-base-uncased"  # 选择预训练模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2  # 根据任务调整标签数(如二分类)
)

3. 准备数据集(以 IMDB 影评分类为例)

from datasets import load_datasetdataset = load_dataset("imdb")  # 加载 Hugging Face 数据集
# 或从本地文件加载:
# dataset = load_dataset("csv", data_files={"train": "train.csv", "test": "test.csv"})# 定义分词函数
def tokenize_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True)# 对数据集分词(批处理加速)
tokenized_datasets = dataset.map(tokenize_function, batched=True)# 重命名标签列(适配模型)
tokenized_datasets = tokenized_datasets.rename_column("label", "labels")# 转换为 PyTorch 格式
train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))  # 选子集快速测试
eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(200))

4. 配置训练参数

from transformers import TrainingArgumentstraining_args = TrainingArguments(output_dir="./results",          # 输出目录(日志、模型)evaluation_strategy="epoch",     # 每轮评估learning_rate=2e-5,             # 学习率per_device_train_batch_size=8,  # 批次大小per_device_eval_batch_size=8,num_train_epochs=3,             # 训练轮次weight_decay=0.01,              # 权重衰减save_strategy="no",             # 不保存中间模型report_to="none",               # 禁用第三方日志(如wandb)
)

5. 定义评估指标

import numpy as np
import evaluatemetric = evaluate.load("accuracy")def compute_metrics(eval_pred):logits, labels = eval_predpredictions = np.argmax(logits, axis=-1)return metric.compute(predictions=predictions, references=labels)

6. 创建 Trainer 并启动训练

from transformers import Trainertrainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=eval_dataset,compute_metrics=compute_metrics,
)trainer.train()  # 启动训练(自动使用GPU)

7. 保存微调后的模型

model.save_pretrained("./my_finetuned_model")
tokenizer.save_pretrained("./my_finetuned_model")

3.2 关键优化技巧

  1. 加速训练:
    • 设置 fp16=True 启用混合精度训练(需GPU支持)。
    • 增加 per_device_train_batch_size(根据显存调整)。

  2. 提升效果:
    • 尝试不同的学习率(如 1e-55e-5)。
    • 调整 num_train_epochs 避免过拟合(结合早停)。

  3. 处理大数据:
    • 使用 datasets 库的流式加载(streaming=True)避免内存不足。

3.3 替代方案:使用 accelerate 库(更灵活)

Hugging Face Accelerate​​ 是一个用于 ​简化 PyTorch 分布式训练​​ 的开源库,其核心目标是让开发者无需大量修改代码,即可轻松实现多 GPU/TPU 训练、混合精度计算和跨设备部署。

要想掌握这个库的使用,特别是高级功能,还是得花一些时间的,我们这里不做展开,就讲一下如何替换 transformers 的 Trainer 类 和 TrainingArguments 实现模型微调:

from accelerate import Acceleratoraccelerator = Accelerator()
model, optimizer, train_dataloader = accelerator.prepare(model, optimizer, train_dataloader
)for epoch in range(num_epochs):model.train()for batch in train_dataloader:outputs = model(**batch)loss = outputs.lossaccelerator.backward(loss)optimizer.step()optimizer.zero_grad()

4 总结

本文的内容没有上一篇那么重要,除了 AutoConfig 外,其他了解即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)

今天写个小代码,用到了PySimpleGUI。 在pycharm profession 2020.3的项目中的Terminal里运行如下代码即可安装。 python3 -m pip install --force-reinstall --extra-index-url https://PySimpleGUI.net/install PySimpleGUI 安装方法如图: 安装后使用…

SpringBoot整合RabbitMQ(Java注解方式配置)

1.生产端 1. 创建生产者SpringBoot工程 2. 引入start&#xff0c;依赖坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 3. 编写yml配置&#xff0c;基本…

分析strtol(),strtoul()和strtod()三个函数的功能

字符串转换为数值部分和子字符串首地址的函数有strtol(),strtoul()和strtod()三个函数。 1、strtol()函数 long int strtol(const char *str, char **endptr, int base) //当base0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制…

Spring 的事务隔离

在Spring框架中&#xff0c;事务管理是一个非常重要的方面&#xff0c;它允许开发者以声明式的方式定义事务边界&#xff0c;并且通过配置不同的隔离级别来控制并发事务的行为。Spring支持多种事务管理方式&#xff0c;包括编程式事务管理和声明式事务管理&#xff08;如使用Tr…

单片机自动排列上料控制程序

/****L2233 CODE11549 2025 4 18 08:53*******/ /***轴承上料机控制 提升 摇摆 光电检测***/ /***2025 3 21 电机控制PCB板 PAST ***/ /*2.3 2.2 1.2 1.3 1.4 1.5 1.6 1.7 5.3 3.2 ***/ /*启动 解锁 光电 接近 前停 后停 电机前 电机后*/ #include &quo…

力扣119题解

记录 2025.5.5 题目&#xff1a; 思路&#xff1a; 代码: class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row new ArrayList<Integer>();row.add(1);for (int i 1; i < rowIndex; i) {row.add((int) ((long) row.get(i…

国产化海光C86架构服务器安装windows实录

最近几年与红蓝关系急转直下&#xff0c;尤其是科技领域尤为突出。随之而来的就是软硬件的国产化大潮。由于行业的原因根据要求必须使用国产化服务器、国产化操作系统、国产化数据库、国产化中间件。虽然闭关锁国断开红蓝联系可以在一定程度激发国产化发展&#xff0c;但是不得…

Oracle OCP证书有效期是三年?

这一段时间&#xff0c;网上经常传出消息Oracle OCM认证证书有效期为三年&#xff0c;其实这个假消息&#xff0c;通过博睿谷与Oracle官方人员确认&#xff0c;OCP认证证书有效期是永久的。 OCP证书本身永久有效&#xff0c;但老版本的OCP证书代表着更多的项目经验&#xff0c…

Python 闭包:函数式编程中的魔法变量容器

闭包与匿名函数的常见混淆 在编程社区中&#xff0c;闭包(closure)和匿名函数(anonymous function)经常被混为一谈&#xff0c;这种混淆有其历史根源&#xff1a; 历史发展因素&#xff1a;在早期编程实践中&#xff0c;在函数内部定义函数并不常见&#xff0c;直到匿名函数广…

迅睿CMS导入别站数据库

<?php if (isset($_GET[go])) {$host localhost;// 数据库服务器$username uname;// 数据库用户名$password pwd;// 数据库密码$database database;// 数据库名$cmscid $_GET[cmscid];$mtabcid $_GET[mtabcid];if ($_GET[go] step1) {//第一步&#xff1a;先获取CMS…

基于C++、JsonCpp、Muduo库实现的分布式RPC通信框架

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;项目 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 项目介绍JsonCpp库简单介绍Muduo库简单介绍C11异步操作——std::future1. 使用 std::async 关联异步任务2. std::packaged_task 配…

EPSG:3857 和 EPSG:4326 的区别

EPSG:3857 和 EPSG:4326 是两种常用的空间参考系统&#xff0c;主要区别在于坐标表示方式和应用场景。以下是它们的核心差异&#xff1a; 1. 坐标系类型 EPSG:4326&#xff08;WGS84&#xff09; 地理坐标系&#xff08;Geographic Coordinate System&#xff09;&#xff0c;基…

Docker 使用与部署(超详细)

目录 引入 入门使用 部署对比 镜像仓库 命令解释 基础 常见命令 示例 数据卷的使用 数据卷的概念 数据卷的使用 挂载本地目录文件 镜像 结构 Dockerfile 容器网络 部署 DockerCompose 语法 ​编辑 基础命令 引入 当我们在 Linux 上部署一个集成了很多中间件…

JAVA在线考试系统考试管理题库管理成绩查询重复考试学生管理教师管理源码

一、源码描述 这是一套在线考试源码&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA语言&#xff0c;可以用于重复考试&#xff0c;一、管理员功能&#xff1a;1、考试管理&#xff1a;包括考试查询与添加考试功能&#xff0c;2、题库管理&#xff1a;管理所有题库…

在Qt Creator中使用CUDA

要在Qt Creator项目中使用CUDA进行GPU加速计算&#xff0c;你需要进行一些配置。以下是详细步骤&#xff1a; 1. 安装必要软件 安装最新版本的NVIDIA CUDA Toolkit 确保已安装Qt Creator和兼容的编译器(如MSVC或GCC) 2. 创建Qt项目 打开Qt Creator&#xff0c;创建一个新的…

qml显示视频帧(QQuickImageProvider)

一、实现方式 解码视频可以选择:opencv、ffmpeg等。 显示视频可以选择:Qt Multimedia、QQuickImageProvider、ShaderEffect、自定义QQuickItem等。 本文使用opencv解码视频,QQuickImageProvider显示视频。 二、QQuickImageProvider 中,requestImage 和 requestTexture区…

深度实时美颜:Deep-Live-Cam

深度实时美颜:Deep-Live-Cam 在这个数码化加速的时代,如何用一张图片,捕捉瞬间,将虚拟与现实无缝融合在一起?Deep-Live-Cam给出了惊人的答案。这个应用程序不仅实现了实时脸部替换和一键视频深度伪装,还通过一张图片完成了这些操作,其独特的技术让人在视频通话和直播中…

OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈

文章目录 5.1 观察视图5.1.1 视图模型—相机模型OpenGL的整个处理过程中所用到的坐标系统&#xff1a;视锥体视锥体的剪切 5.1.2 视图模型--正交视图模型 5.2 用户变换5.2.1 矩阵乘法的回顾5.2.2 齐次坐标5.2.3 线性变换与矩阵SRT透视投影正交投影 5.2.4 法线变换逐像素计算法向…

卷积神经网络实战(2)

接上一篇文章&#xff0c;说到模型定义&#xff1a; class CNN(nn.Module):def __init__(self, activation"relu"):super(CNN, self).__init__()self.activation F.relu if activation "relu" else F.selu#输入通道数&#xff0c;图片是灰度图&#xff…

方案精读:业财融合转型路径和华为实践【附全文阅读】

在当今快速变化、竞争激烈的时代,业务面临不确定性,业财融合至关重要。以华为为例,其从财务到财经的转型,历经财务四统一变革、IFS 变革等,构建了包含财经能力中心(COE)、业务伙伴(BP)和财经共享中心(SSC)的财务组织架构 。通过实现财务四算拉通、提升预算预测、项目…