大模型基礎(五):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.pswp.cn/diannao/81794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81794.shtml
英文地址,請注明出處:http://en.pswp.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)的財務組織架構 。通過實現財務四算拉通、提升預算預測、項目…