transformers库(下)
1 快速分词器
经常使用Bert的同学,可以会遇到BertTokenizerFast
,它是快速分词器的意思。
在 Hugging Face Transformers 库中,BertTokenizerFast
的 “Fast” 表示这是一个高性能分词器,基于 Rust 语言实现(而非纯 Python),专为提升分词速度而设计。以下是 BertTokenizerFast
与 BertTokenizer
关键区别和意义:
1.1 Fast 分词器的核心特点
-
速度优势
• 比普通分词器(如BertTokenizer
)快 10-100 倍,尤其对长文本或批量数据处理更高效。
• 底层使用 Rust 实现,避免了 Python 的全局解释器锁(GIL),支持多线程加速。
• 快速分词器只有在并行处理大量文本时才能发挥出速度优势,在处理单个句子时甚至可能慢于慢速分词器。 -
后处理优化
• 支持动态截断(truncation=True
)、填充(padding=True
)等操作的快速批处理。 -
支持追踪映射
• 能够追踪原文到 token 之间的映射,例如encoding = tokenizer("Hello world!")
,encoding.word_ids()
可以获取每一个 token 在原文中的索引,这对于处理序列标注、自动问答等任务非常重要,。 -
功能兼容性
• 提供与普通分词器(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 分词器?
- 推荐默认使用:除非需要特殊分词逻辑(如完全控制分词细节),否则优先选择
XXXTokenizerFast
,AutoTokenizer
类默认选择快速分词器。 - 大数据场景:处理长文本、批量数据或实时应用时,性能提升显著。
- 与
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。AutoConfig是Transformers库中的一部分,旨在提供一种自动化的方式来加载预训练模型的配置,而不需要用户手动指定具体的配置类(如BertConfig、GPT2Config等)。通过使用AutoConfig,你可以仅凭模型名称就加载相应的配置,这极大地方便了代码的编写和维护。
🤗 transformers.AutoConfig
是 Hugging Face Transformers 库中用于自动加载和管理模型配置的工具类。它是模型架构的“蓝图”,定义了模型的结构参数(如层数、隐藏层维度等),无需加载完整的模型权重即可操作配置。
需要注意的是,AutoConfig并不适用于替换GenerationConfig。GenerationConfig主要用于控制文本生成过程中的参数设置,比如最大长度、解码方式等,通过调整GenerationConfig中的参数来优化生成效果,但它并不直接与特定模型架构相关联。
2.1 核心功能
- 统一接口
自动识别模型类型(如 BERT、GPT-2),无需手动指定配置类。 - 灵活加载
支持从预训练模型名称、本地文件或自定义字典加载配置。 - 配置修改
允许动态调整模型结构参数(如隐藏层大小、注意力头数),用于定制化模型。
2.2 基本用法
- 加载预训练模型配置
from transformers import AutoConfig
# 从 Hugging Face Hub 加载配置(不加载模型权重)
config = AutoConfig.from_pretrained("bert-base-uncased")
print(config.hidden_size) # 输出: 768(BERT-base 的隐藏层维度)
- 修改配置并初始化新模型
# 修改配置参数
config.num_hidden_layers = 6 # 减少 BERT 的层数
# 用新配置创建模型(权重随机初始化)
from transformers import AutoModel
model = AutoModel.from_config(config)
- 从本地文件加载配置
# 假设有本地配置文件 config.json
config = AutoConfig.from_pretrained("./my_config_directory/")
2.3 主要应用场景
-
查看模型超参数
快速获取模型的超参数(如层数、激活函数类型),可以没有预训练模型的权重,但配置文件(如 config.json)必须得有。 -
模型轻量化
通过减少层数 (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 亿参数)
修改配置后的模型是 随机初始化 的,无法直接加载原模型的预训练权重(维度不匹配)。
-
迁移学习适配
调整分类任务的标签数 (num_labels
) 以适配下游任务:config.num_labels = 10 # 适配 10 分类任务 model = AutoModelForSequenceClassification.from_config(config)
-
跨框架转换
从 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, AutoModelForSequenceClassification
model_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_dataset
dataset = 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 TrainingArguments
training_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 evaluate
metric = evaluate.load("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
6. 创建 Trainer 并启动训练
from transformers import Trainer
trainer = 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 关键优化技巧
-
加速训练:
• 设置fp16=True
启用混合精度训练(需GPU支持)。
• 增加per_device_train_batch_size
(根据显存调整)。 -
提升效果:
• 尝试不同的学习率(如1e-5
到5e-5
)。
• 调整num_train_epochs
避免过拟合(结合早停)。 -
处理大数据:
• 使用datasets
库的流式加载(streaming=True
)避免内存不足。
3.3 替代方案:使用 accelerate
库(更灵活)
Hugging Face Accelerate 是一个用于 简化 PyTorch 分布式训练 的开源库,其核心目标是让开发者无需大量修改代码,即可轻松实现多 GPU/TPU 训练、混合精度计算和跨设备部署。
要想掌握这个库的使用,特别是高级功能,还是得花一些时间的,我们这里不做展开,就讲一下如何替换 transformers 的 Trainer
类 和 TrainingArguments
实现模型微调:
from accelerate import Accelerator
accelerator = 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.loss
accelerator.backward(loss)
optimizer.step()
optimizer.zero_grad()
4 *ForCausalLM 类的 generate 函数
从事大模型开发,transformers
库中 *ForCausalLM
类(如 GPT2LMHeadModel
, LlamaForCausalLM
等)的 generate()
方法是十分重要的,它用于自回归生成文本的核心接口。它支持多种解码策略,并提供了丰富的参数控制生成过程。以下是主要参数和功能的详细介绍:
4.1 基础参数
-
输入相关
•input_ids
(torch.Tensor
):
• 输入的 token ID 张量,形状为(batch_size, sequence_length)
。
• 例如:input_ids = tokenizer.encode("Hello, how are you?", return_tensors="pt")
.•
attention_mask
(torch.Tensor
, 可选):
• 指定哪些 token 需要被模型关注(1 表示有效,0 表示填充)。
4.2 生成策略参数
-
生成长度控制
•max_length
(int
, 可选):
• 生成文本的最大总长度(输入 + 输出),默认 20。•
max_new_tokens
(int
, 可选):
• 生成的新 token 数量(不包含输入长度)。•
min_length
/min_new_tokens
(int
, 可选):
• 生成的最小长度。 -
解码策略
•num_beams
(int
, 可选):
• Beam search 的束宽(默认 1,即贪婪搜索)。•
do_sample
(bool
, 可选):
• 是否启用采样(默认False
,即贪婪搜索)。设为True
时,可使用temperature
,top_k
,top_p
等参数。 -
采样参数
•temperature
(float
, 可选):
• 温度参数,值越高生成越随机(>1 发散,<1 保守)。•
top_k
(int
, 可选):
• 保留概率最高的 k 个 token 进行采样。•
top_p
(float
, 可选):
• Nucleus 采样,保留累积概率超过 p 的最小 token 集合。•
typical_p
(float
, 可选):
• 典型性采样,平衡信息量和多样性。
4.3 控制生成结果
-
重复与惩罚
•repetition_penalty
(float
, 可选):
• 重复惩罚因子,>1 减少重复,<1 鼓励重复。•
no_repeat_ngram_size
(int
, 可选):
• 禁止重复的 n-gram 大小(例如 2 表示避免重复的双词短语)。 -
停止条件
•eos_token_id
(int
或List[int]
, 可选):
• 结束符的 token ID(如<EOS>
),生成遇到此 token 时停止。•
stop_sequence
(List[str]
, 可选):
• 自定义停止字符串(需在 tokenizer 中处理为对应的 token)。•
stopping_criteria
(StoppingCriteria
, 可选):
• 自定义停止条件(例如基于生成内容动态判断)。
4.4 高级功能
-
多候选生成
•num_return_sequences
(int
, 可选):
• 返回的独立生成序列数量(需num_beams >= num_return_sequences
)。•
diversity_penalty
(float
, 可选):
• 在 Diverse Beam Search 中控制不同束之间的多样性。 -
输出格式
•return_tensors
(bool
, 可选):
• 是否返回张量(默认返回字符串)。•
output_scores
(bool
, 可选):
• 是否返回每个步骤的概率分数。•
output_hidden_states
(bool
, 可选):
• 是否返回隐藏状态(需模型支持)。
4.5 示例代码
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
input_ids = tokenizer.encode("The meaning of life is", return_tensors="pt")
# 使用 Top-p 采样生成文本
output = model.generate(
input_ids,
max_new_tokens=50,
do_sample=True,
top_p=0.92,
temperature=0.7,
repetition_penalty=1.2,
eos_token_id=tokenizer.eos_token_id
)
print(tokenizer.decode(output[0], skip_special_tokens=True))
4.6 注意事项
• 参数冲突:某些参数互斥(例如 max_length
和 max_new_tokens
)。
• 模型支持:部分参数需要特定模型架构支持(如 output_hidden_states
)。
• 性能影响:Beam search 和采样策略会显著增加计算开销。
5 总结
本文的内容没有上一篇那么重要,除了 AutoConfig 和 *ForCausalLM 类的 generate 函数外,其他了解即可。