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),專為提升分詞速度而設計。以下是 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。
🤗 transformers.AutoConfig
是 Hugging Face Transformers 庫中用于自動加載和管理模型配置的工具類。它是模型架構的“藍圖”,定義了模型的結構參數(如層數、隱藏層維度等),無需加載完整的模型權重即可操作配置。
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, 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 關鍵優化技巧
-
加速訓練:
? 設置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 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 外,其他了解即可。