閘北專業(yè)做網(wǎng)站seo搜索引擎實訓心得體會
一、導讀
本系列文章將圍繞《大模型微調》進行學習(也是我個人學習的筆記,所以會持續(xù)更新),最后以上手實操模型微調的目的。
(本文如若有錯誤的地方,歡迎批評指正)
(寫作不易,方便的話點個贊,謝謝)
?《大模型微調》往期系列文章
01 | 大模型微調 | 從0學習到實戰(zhàn)微調 | AI發(fā)展與模型技術介紹
02 | 大模型微調 | 從0學習到實戰(zhàn)微調 | 從數(shù)學概率到千億參數(shù)大模型
1、本文摘要
本文內(nèi)容很長,我不喜歡[ 碎片化信息 ],不想拆成幾個文章,本文內(nèi)容其實每一節(jié)都可以拆成很多文章發(fā)布
但是我覺得沒意義,為了保證思路連貫性,所以全部寫在一起了
- 學會安裝transformers框架環(huán)境
- 學會使用hugging Face 平臺
- 掌握transformers的核心模塊
- 學會如何看源碼
- 深入業(yè)務場景進行學習理解
2、往期文章推薦
你可以閱讀我下列文章
1?? 關于langchain的系列文章(相信我把Langchain全部學一遍,你能深入理解AI的開發(fā))
01|LangChain | 從入門到實戰(zhàn)-介紹
02|LangChain | 從入門到實戰(zhàn) -六大組件之Models IO
03|LangChain | 從入門到實戰(zhàn) -六大組件之Retrival
04|LangChain | 從入門到實戰(zhàn) -六大組件之Chain
05|LangChain | 從入門到實戰(zhàn) -六大組件之Memory
06|LangChain | 從入門到實戰(zhàn) -六大組件之Agent
2?? 關于Langchain的實戰(zhàn)案例(自認為本地問答機器人的案例寫的很好,很好理解ReAct)
Langchain-實戰(zhàn)篇-搭建本地問答機器人-01
都2024了,還在糾結圖片識別?fastapi+streamlit+langchain給你答案!
3?? 關于Agent智能體開發(fā)案例(MCP協(xié)議)
在dify構建mcp,結合fastapi接口,以實際業(yè)務場景理解MCP
4?? 推薦閱讀一下transformer 文章,以便能更好的理解大模型
Transformer模型詳解(圖解最完整版)
Attention Is All You Need (Transformer) 論文精讀
5?? 除了在 CSDN 分享這些技術內(nèi)容,我還將在微信公眾號持續(xù)輸出優(yōu)質文章,內(nèi)容涵蓋以下板塊:?
(當然我也希望能夠跟你們學習探討😀)
關注😄「穩(wěn)穩(wěn)C9」😄公眾號
- 爬蟲逆向:分享爬蟲開發(fā)中的逆向技術與技巧,探索數(shù)據(jù)獲取的更多可能。?
- AI 前沿內(nèi)容:緊跟 AI 發(fā)展潮流,解讀大模型、算法等前沿技術動態(tài)。?
- 騎行分享:工作之余,用騎行丈量世界,分享旅途中的所見所感。
二、Hugging Face Transformers 介紹
Hugging Face 通過開源社區(qū)與技術創(chuàng)新,重新定義了 NLP 的開發(fā)范式。
其核心價值在于 降低技術門檻、促進協(xié)作共享,并推動從學術研究到工業(yè)落地的全鏈條發(fā)展。
無論是個人開發(fā)者還是企業(yè)用戶,均可通過其生態(tài)快速實現(xiàn)從原型驗證到生產(chǎn)部署的跨越。
1、Hugging Face 地址
- 官網(wǎng)地址:https://huggingface.co/
- 國內(nèi)鏡像地址:https://hf-mirror.com/
2、發(fā)展歷史與技術組成
發(fā)展歷史
Hugging Face 成立于2016年,最初以聊天機器人起家,后轉型為 NLP 開源社區(qū)。其核心產(chǎn)品 Transformers
庫于2019年發(fā)布,迅速成為 NLP 領域的事實標準。關鍵節(jié)點包括:
- 2018年:支持 BERT、GPT 等早期模型,推動預訓練模型的普及。
- 2019年:推出
Pipeline
API,實現(xiàn)三行代碼調用復雜 NLP 任務。 - 2020年:整合多模態(tài)模型,擴展至計算機視覺和語音領域。
- 2024年:中國智源研究院的 BGE 模型登頂 Hugging Face 月度下載榜,成為首個下載量破億的國產(chǎn)模型。
技術組成
Hugging Face 生態(tài)由四大核心組件構成:
- 預訓練模型庫:涵蓋 30+ 架構(如 BERT、GPT、T5)和 2000+ 預訓練模型,支持 100+ 語言。
- Pipeline API:封裝模型加載、預處理、推理全流程,支持情感分析、文本生成、翻譯等任務。
- Model Hub:開源社區(qū)平臺,支持模型托管、版本管理、在線演示(如
Write With Transformer
)。 - 多框架兼容:無縫支持 PyTorch、TensorFlow、JAX,支持跨框架模型轉換。
3、價值與作用
核心價值
- 開源共享:降低模型使用門檻,避免重復訓練,減少碳排放。
- 技術普惠:通過簡單 API 讓非專業(yè)開發(fā)者也能調用 SOTA 模型。
- 社區(qū)驅動:全球開發(fā)者貢獻模型與工具,形成良性生態(tài)循環(huán)(如國產(chǎn) BGE 模型的成功)。
實際作用
- 加速研發(fā):
- 研究者可基于預訓練模型快速微調,如智源 BGE 通過社區(qū)反饋迭代優(yōu)化。
- 企業(yè)利用
Infinity
容器實現(xiàn)毫秒級推理延遲,降低生產(chǎn)環(huán)境成本。
- 多場景適配:
- 情感分析:3 行代碼判斷文本情感傾向(例:
pipeline("sentiment-analysis")
)。 - 跨語言檢索:BGE M3 支持 100+ 語言統(tǒng)一表征,提升 RAG 系統(tǒng)的多語言適配能力。
- 情感分析:3 行代碼判斷文本情感傾向(例:
- 教育與創(chuàng)新:
- 提供
Datasets
和Tokenizer
庫,簡化數(shù)據(jù)預處理與特征提取。 - 開發(fā)者可通過
Spaces
快速部署交互式應用(如對話機器人、文本生成器)。
- 提供
三、Transformers介紹與安裝
論文:Attention Is All You Need
本章節(jié)講解的內(nèi)容為摘要方式,如果需要完全學習,可以去官網(wǎng)看完整的
如果沒有空,其實也不影響后續(xù)達到微調的目的
1、Transformers庫
github:https://github.com/huggingface/transformers
Transformers 是由 Hugging Face 開發(fā)的開源 Python 庫,專注于提供先進的預訓練模型和工具,支持自然語言處理(NLP)、計算機視覺(CV)、語音等多模態(tài)任務。
其核心理念是通過標準化接口,讓開發(fā)者無需從零實現(xiàn)復雜模型,即可快速調用、微調和部署 SOTA(State-of-the-Art)模型,如 BERT、GPT、Stable Diffusion 等。
2、Transformers環(huán)境搭建
本次主要以windows,GPU安裝為主,linux安裝方案大同小異
(后面會講解租用云服務器linux微調,不必擔心)
2.1 安裝python環(huán)境
conda create -n hf-env python=3.10.16 -y
conda activate hf-env
2.2 安裝NVIDIA驅動及工具包
- GPU用戶 已安裝的可以跳過,可以輸出下面命令檢測
nvidia-smi
nvcc -V
2.2.1 安裝顯卡驅動
官方地址:https://www.nvidia.cn/drivers/lookup/
WIN+R 輸入 dxdiag ,然后回車
在欄目中多點擊選擇一下,直到看到顯卡參數(shù)
來到官網(wǎng)根據(jù)自己的顯卡選擇合適的參數(shù)
后面根據(jù)內(nèi)容下載安裝即可
2.2.2 安裝CUDA工具包
官網(wǎng)網(wǎng)址:https://developer.nvidia.com/cuda-downloads
選擇適合自己的安裝即可,注意 nvidia-smi 有顯示驅動版本,你要結合官方的實際情況下載CUDA 工具版本
官方說明:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions
選擇自己合適的版本即可:
https://developer.nvidia.com/cuda-toolkit-archive
2.3 安裝pytorch
GPU版本
PyTorch版本 | 最低CUDA | Game Ready驅動版本 | Studio驅動版本 |
---|---|---|---|
2.0+ | 11.7 | 525.85+ | R525 U2+ |
1.12 | 11.6 | 516.94+ | R516 U5+ |
1.10 | 11.3 | 471.96+ | R470 U3+ |
激活你的虛擬環(huán)境,開始準備安裝!!!!!!!!!!!!!!!!!!!!!!
通過pip下載方式,你可以執(zhí)行下面自動檢測腳本來
import subprocess
import re
import sys
import osdef get_cuda_version():"""通過多種方式檢測系統(tǒng)CUDA版本"""# 方式1: 通過nvcc編譯器檢測try:output = subprocess.check_output(["nvcc", "--version"], stderr=subprocess.STDOUT).decode()if match := re.search(r"release (\d+\.\d+)", output):return match.group(1)except Exception:pass# 方式2: 通過CUDA安裝目錄檢測cuda_home = os.environ.get('CUDA_HOME', '') or os.environ.get('CUDA_PATH', '')if cuda_home and os.path.isfile(ver_file := os.path.join(cuda_home, "version.txt")):with open(ver_file) as f:if match := re.search(r"CUDA Version (\d+\.\d+)", f.read()):return match.group(1)# 方式3: 通過NVIDIA驅動檢測try:output = subprocess.check_output(["nvidia-smi", "--query-gpu=cuda_version", "--format=csv,noheader"],stderr=subprocess.DEVNULL).decode()if output.strip():return output.strip().split('\n')[0]except Exception:passreturn Nonedef build_install_command():"""構建安裝命令"""version_map = {12: ("2.3.1+cu121", "0.18.1+cu121", "2.3.1+cu121", "cu121"),11: ("2.3.1+cu118", "0.18.1+cu118", "2.3.1+cu118", "cu118")}if not (cuda_version := get_cuda_version()):return "pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://pypi.tuna.tsinghua.edu.cn/simple"try:major_ver = int(cuda_version.split('.')[0])except ValueError:major_ver = 0if major_ver not in version_map:return "pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://pypi.tuna.tsinghua.edu.cn/simple"torch_ver, vision_ver, audio_ver, cuda_tag = version_map[major_ver]line_cont = "^" if sys.platform == "win32" else "\\"return (f"pip install torch=={torch_ver} torchvision=={vision_ver} torchaudio=={audio_ver} {line_cont}\n"f"--extra-index-url https://download.pytorch.org/whl/{cuda_tag} {line_cont}\n"f"--index-url https://pypi.tuna.tsinghua.edu.cn/simple")if __name__ == "__main__":print("自動生成的PyTorch安裝命令:")print(build_install_command())
pip install torch==2.3.1+cu121 torchvision==0.18.1+cu121 torchaudio==2.3.1+cu121 ^
--extra-index-url https://download.pytorch.org/whl/cu121 ^
--index-url https://pypi.tuna.tsinghua.edu.cn/simple
官網(wǎng)手動下載地址:https://download.pytorch.org/whl/cu121/torch_stable.html
如果你網(wǎng)絡不好,可以選擇手動安裝whl方式
官網(wǎng)手動下載地址:https://download.pytorch.org/whl/cu121/torch_stable.html
pip install torch-2.3.1+cu121-cp310-cp310-win_amd64.whl
pip install torchvision-0.18.1+cu121-cp310-cp310-win_amd64.whl
pip install torchaudio-2.3.1+cu121-cp310-cp310-win_amd64.whl
CPU版本
雖然transformer部分模型支持CPU運行,但是還是建議大家搞個顯卡吧,CPU版本不過講解,跟上面流程一樣
(未來微調模型必定要GPU的,第四章節(jié)的案例CPU本次可以運行起來部分)
pip install torch==2.3.1+cpu torchvision==0.18.1+cpu torchaudio==2.3.1+cpu
2.4 安裝其它依賴
requirements.txt
# ------------------------
# Hugging Face 生態(tài)系統(tǒng)
# ------------------------
transformers==4.37.2 # 預訓練語言模型庫(BERT/GPT等)
datasets==2.16.1 # 超大規(guī)模數(shù)據(jù)集加載工具
accelerate==0.26.1 # 分布式訓練加速框架
peft==0.7.1 # 參數(shù)高效微調工具(LoRA/Adalora)
trl==0.8.1 # 強化學習與人類反饋訓練庫# ------------------------
# 模型量化與優(yōu)化
# ------------------------
autoawq==0.2.2 # 4-bit 激活感知量化推理框架 依賴 triton(linux) windows安裝: https://blog.csdn.net/Changxing_J/article/details/139785954
auto-gptq==0.6.0 # GPT模型量化工具(支持GPU推理加速)# ------------------------
# 計算加速與量化支持
# ------------------------
bitsandbytes==0.41.3.post2 # 8-bit/4-bit CUDA量化核心庫(需系統(tǒng)級CUDA支持) # https://pypi.org/project/bitsandbytes/#files# ------------------------
# 數(shù)據(jù)處理與機器學習
# ------------------------
timm==0.9.12 # 前沿視覺模型庫(ResNet/ViT等)
scikit-learn==1.3.2 # 經(jīng)典機器學習算法庫
pandas==2.1.1 # 結構化數(shù)據(jù)分析工具# ------------------------
# 音頻處理工具鏈
# ------------------------
ffmpeg==1.4 # 音視頻編解碼核心庫(需通過conda安裝)
ffmpeg-python==0.2.0 # FFmpeg 的 Python 接口
soundfile==0.12.1 # 音頻文件讀寫庫(支持WAV/FLAC等格式)
librosa==0.10.1 # 音頻特征提取與處理
jiwer==3.0.3 # 語音識別評估工具(計算WER等指標)# ------------------------
# 應用開發(fā)與部署
# ------------------------
gradio==4.13.0 # 快速構建AI演示界面(支持Web/API)
langchain==0.2.0 # 大語言模型應用開發(fā)框架(核心)
langchain-openai==0.1.7 # OpenAI 官方集成模塊
langchain-core==0.2.1 # LangChain 核心依賴
langchain-community==0.2.0 # 社區(qū)貢獻的擴展模塊
openai==1.30.1 # OpenAI 官方SDK(GPT/DALL-E等接口)jupyter # 安裝 https://jupyter.org/install
2.5 驗證環(huán)境
import torch
import bitsandbytes as bnbprint("\n=== 環(huán)境診斷報告 ===")
print(f"PyTorch 版本: {torch.__version__}")
print(f"CUDA 可用性: {torch.cuda.is_available()}")
print(f"GPU 設備: {torch.cuda.get_device_name(0)}")
print(f"bitsandbytes 版本: {bnb.__version__}")# 新版獲取CUDA版本方式
if hasattr(bnb, 'cuda_setup'):print(f"CUDA 主版本: {bnb.cuda_setup.main_cuda_version()}")
else:print("CUDA 版本檢測接口已變更,請嘗試以下方法驗證:")print(">>> 測試8-bit優(yōu)化器:")optimizer = bnb.optim.Adam8bit(torch.nn.Linear(1,1).parameters())print("? bitsandbytes CUDA 支持正常")
四、Transformers庫核心功能模塊
-
統(tǒng)一接口設計:AutoClass體系實現(xiàn)模型無關編程
-
模塊解耦:各組件可獨立替換(如單獨使用Tokenizer)
-
跨框架兼容:同時支持PyTorch/TensorFlow/JAX
-
生態(tài)集成:與Datasets/Accelerate等庫深度整合
建議有空還是閱讀一下官方文檔的內(nèi)容,本章節(jié)只采用深入淺出的方式
官方文檔:https://hf-mirror.com/docs/transformers/v4.52.2/zh/index
transformers能做什么:https://hf-mirror.com/docs/transformers/v4.52.3/zh/task_summary
通過Hugging Face的Transformers庫自動下載模型,會先緩存在默認路徑:
Linux:~/.cache/huggingface/hub
Windows :C:\Users\<你的用戶名>\.cache\huggingface\hub
當然你可以,選擇設置運行模塊下載的模型放置別的目錄
import osos.environ['HF_HOME'] = '/mnt/new_volume/hf'
os.environ['HF_HUB_CACHE'] = '/mnt/new_volume/hf/hub'
1、模型配置文件
1.1 文件說明
1.1.1 常見文件說明
理解這些文件的作用后,就能更好地解決模型加載問題,調試錯誤,甚至創(chuàng)建自己的模型配置。
PS:僅列舉經(jīng)常見到的,不同模型還有其他類型文件!!!!!!看到新的,可以官方發(fā)布github查看相應文檔說明
文件 | 用途 | 說明 |
---|---|---|
config.json | 模型配置文件 | 定義模型架構參數(shù)(如隱藏層維度、注意力頭數(shù)等),用于初始化模型 |
pytorch_model.bin | 模型權重文件(PyTorch) | 保存模型訓練后的參數(shù)值 |
tf_model.h5 | 模型權重文件(TensorFlow) | 保存模型訓練后的參數(shù)值(TensorFlow 格式) |
model.onnx | 模型權重文件(ONNX 格式) | 用于模型部署,支持跨平臺推理 |
tokenizer_config.json | 分詞器配置文件 | 定義分詞器類型和參數(shù)(如最大長度、特殊標記等) |
vocab.json | 詞匯表文件 | 存儲分詞器的詞匯表(適用于 BPE 等分詞方法) |
merges.txt | 合并規(guī)則文件 | 定義 BPE 分詞中的合并規(guī)則 |
special_tokens_map.json | 特殊標記映射文件 | 定義特殊標記(如 [CLS] 、[SEP] )及其對應符號 |
training_args.bin | 訓練參數(shù)文件 | 記錄模型訓練時的超參數(shù)(如學習率、批次大小等) |
tokenizer.json | 分詞器完整配置文件 | 包含分詞器的完整配置(可獨立用于初始化分詞器) |
added_tokens.json | 自定義標記文件 | 存儲用戶添加的自定義標記或詞匯 |
比如:https://hf-mirror.com/google-bert/bert-base-chinese/tree/main
- 核心必需文件:
config.json
+ 權重文件(pytorch_model.bin
或model.safetensors
或tf_model.h5
) +tokenizer_config.json
+special_tokens_map.json
- 詞表文件:根據(jù)模型類型選擇:
vocab.txt
(BERT)或merges.txt
+vocab.json
(GPT-2) - 安全權重:
model.safetensors
是推薦的安全權重格式,尤其適合不信任的模型來源。 - Tokenizer 文件:
tokenizer_config.json
:配置參數(shù)tokenizer.json
:實際詞匯表和規(guī)則(用于快速加載)- 若只有
vocab.txt
也能工作,但加載速度可能慢
1.1.2 權重文件格式對比
權重格式 | 框架支持 | 安全 | 加載速度 | 大小 |
---|---|---|---|---|
pytorch_model.bin | PyTorch | ? | 快 | 中等 |
model.safetensors | PyTorch/TF/JAX | ? | 快 | 中等 |
tf_model.h5 | TensorFlow | ? | 慢 | 大(含優(yōu)化器狀態(tài)) |
1.1.3 如何加載模型
1.2 文件調用流程
PS:僅列舉經(jīng)常見到的,不同模型還有其他類型文件!!!!!!看到新的,可以官方發(fā)布github查看相應文檔說明
from transformers import AutoConfig, AutoTokenizer, AutoModel# 加載配置
config = AutoConfig.from_pretrained("bert-base-chinese")# 加載分詞器(會自動找到tokenizer_config.json和vocab.txt等)
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")# 加載模型(自動識別權重文件)
model = AutoModel.from_pretrained("bert-base-chinese")
1.2.1 深度解析
1. config.json:模型的DNA
from transformers import AutoConfig# 加載配置
config = AutoConfig.from_pretrained("bert-base-chinese")# 創(chuàng)建自定義配置
custom_config = AutoConfig.from_pretrained("bert-base-chinese")
custom_config.num_hidden_layers = 6 # 輕量版模型# 無預訓練權重建模
model = AutoModel.from_config(custom_config)
2. tokenizer 文件組:文本處理的流水線
from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("gpt2")# 查看組件關系
print("特殊Token:", tokenizer.special_tokens_map) # ← special_tokens_map.json
print("配置參數(shù):", tokenizer.init_kwargs) # ← tokenizer_config.json
print("詞匯大小:", tokenizer.vocab_size) # ← vocab.json
print("合并規(guī)則:", tokenizer.merge_file) # ← merges.txt (如存在)
3. 權重文件的跨框架支持
PS: 這里為手動調用模型框架,一定要看《 模型加載方法比對》加深理解
`PS: 這里為手動調用模型框架,一定要看《 模型加載方法比對》加深理解``
# PyTorch用戶
from transformers import BertModel
model = BertModel.from_pretrained("bert-base-chinese")# TensorFlow用戶
from transformers import TFBertModel
model = TFBertModel.from_pretrained("bert-base-chinese") # 自動查找 tf_model.h5
4. 生成配置的使用
# 自定義生成參數(shù)
generation_config = {"temperature": 0.8,"top_p": 0.95,"max_length": 200
}# 保存為generation_config.json
with open("generation_config.json", "w") as f:json.dump(generation_config, f)# 加載模型時自動應用
pipe = pipeline("text-generation", model="path/to/model")
1.3 模型加載方法比對
特性 | 手動調用 | Auto Classes | Pipeline |
---|---|---|---|
模型/框架指定 | 手動選擇具體的模型類(如 BertModel ) | 自動根據(jù) config.json 選擇模型架構 | 自動選擇模型和框架 |
Tokenizer 加載 | 手動加載分詞器(如 BertTokenizer ) | 自動加載匹配的分詞器(AutoTokenizer ) | 自動加載匹配的分詞器 |
預處理 | 手動實現(xiàn)分詞、編碼、填充等 | 手動實現(xiàn) | 自動處理 |
模型推理 | 手動調用模型,處理輸入輸出 | 手動調用模型,處理輸入輸出 | 自動處理 |
后處理 | 手動實現(xiàn)(如 softmax、實體聚合、標簽映射) | 手動實現(xiàn) | 自動處理(根據(jù)任務標準化輸出) |
單行代碼實現(xiàn)能力 | ? 需要多行代碼 | ? 需要多行代碼 | ? 一行代碼啟動 |
內(nèi)置最佳實踐 | ? 需用戶自行實現(xiàn) | ?? 部分通過配置實現(xiàn) | ? 自動應用行業(yè)最佳實踐 |
自定義靈活性 | ? 完全控制(可修改任意中間過程) | ? 高靈活性(可訪問模型各層) | ?? 中等(通過參數(shù)調整,無法修改內(nèi)部邏輯) |
項目啟動速度 | ?? 慢(需寫大量代碼) | ?? 中等(需寫部分代碼) | ? 極快(開箱即用) |
適合人群 | 研究人員、框架開發(fā)者 | 進階開發(fā)者、定制任務用戶 | 初學者、應用工程師、快速原型 |
典型用例 | 模型架構修改、定制訓練、調試 | 遷移學習、微調、模型分析 | 生產(chǎn)部署、API 服務、demo 演示 |
任務支持 | 所有任務(需自行實現(xiàn)) | 所有任務(需自行實現(xiàn)預處理和后處理) | 內(nèi)置 60+ 任務(分類、NER、生成等) |
硬件優(yōu)化 | 手動實現(xiàn)(如 fp16、設備放置) | 手動實現(xiàn) | 自動優(yōu)化(如設備切換、批處理) |
2、Pipeline(流程管道)
意義:
-
任何模型進行任何語言、計算機視覺、語音以及多模態(tài)任務的推理變得非常簡單。
-
即使您對特定的模態(tài)沒有經(jīng)驗,或者不熟悉模型的源碼,您仍然可以使用pipeline()進行推理!
傳統(tǒng) NLP 開發(fā) vs Pipeline
已支持的任務和可用參數(shù)的完整列表
https://hf-mirror.com/docs/transformers/v4.52.3/zh/main_classes/pipelines#transformers.pipeline
模塊/功能 | 參數(shù)/方法 | 說明 | 示例 |
---|---|---|---|
創(chuàng)建Pipeline | pipeline() | 核心創(chuàng)建函數(shù),自動選擇模型和配置 | pipe = pipeline("text-classification") |
task (str) | 指定任務類型(必需參數(shù)) | task="sentiment-analysis" | |
model (str) | 指定預訓練模型 | model="distilbert-base-uncased" | |
framework (str) | 指定框架(“pt”=PyTorch, “tf”=TensorFlow) | framework="pt" | |
參數(shù)配置 | device (int) | 指定設備(-1=CPU, 0=第一塊GPU) | device=0 |
batch_size (int) | 批處理大小 | batch_size=32 | |
num_workers (int) | 數(shù)據(jù)加載線程數(shù) | num_workers=4 | |
音頻任務 | audio-classification | 音頻分類 | pipe = pipeline("audio-classification", model="speechbrain/spkrec-xvect") |
automatic-speech-recognition | 語音識別 | pipe = pipeline("automatic-speech-recognition", model="openai/whisper-small") | |
視覺任務 | image-classification | 圖像分類 | pipe = pipeline("image-classification", model="google/vit-base-patch16-224") |
object-detection | 目標檢測 | pipe = pipeline("object-detection", model="facebook/detr-resnet-50") | |
文本任務 | text-classification | 文本分類/情感分析 | pipe("I love transformers!") |
token-classification | 命名實體識別 | pipe("My name is Sarah and I live in London") | |
question-answering | 問答系統(tǒng) | pipe(question="Why?", context="Transformers are...") | |
text-generation | 文本生成 | pipe("The future of AI is", max_length=50) | |
多模態(tài)任務 | visual-question-answering | 視覺問答 | pipe(image=image, question="What is in this picture?") |
功能方法 | .save_pretrained() | 保存Pipeline到本地 | pipe.save_pretrained("my_pipeline") |
from_pretrained() | 加載保存的Pipeline | pipe = pipeline.from_pretrained("my_pipeline") | |
.__call__() | 執(zhí)行推理的核心調用方法 | pipe(輸入數(shù)據(jù)) | |
高級特性 | PipelineRegistry | 注冊自定義Pipeline(高級功能) | PipelineRegistry.register_pipeline() |
自定義后處理 | 覆蓋后處理方法 | 繼承Pipeline 類并重寫postprocess 方法 | |
輸入?yún)?shù) | kwargs | 任務特定參數(shù)(如max_length , temperature 等) |
小技巧-玩轉Hugging Face
https://hf-mirror.com/models
我們可以點擊這些板塊,找到開源模型,跟數(shù)據(jù)集使用
小技巧-讀源碼,定位方法的使用
QA小技巧,學習的過程中沒必要記住所有的方法,以創(chuàng)建了piplines怎么確認傳參為例子
Pipline 源代碼位置 https://github.com/huggingface/transformers/blob/main/src/transformers/pipelines/init.py
我在這里演示,指定了QA任務,傳入什么參數(shù)的查找過程,可以看到為傳去 question context
2.1 自然語言處理
官網(wǎng)鏈接-自然語言處理
任務類型 | 任務描述 | 常見應用場景 | 代表性模型/方法 |
---|---|---|---|
文本分類 | 將文本劃分到預定義的類別中 | 垃圾郵件識別、新聞分類、情感分析等 | 傳統(tǒng)機器學習(如SVM、樸素貝葉斯)+TF-IDF特征;深度學習(如BERT、TextCNN) |
Token分類 | 對文本中的每個Token(如單詞、字符等)進行分類標注 | 命名實體識別(NER)、詞性標注等 | BERT+CRF、BiLSTM+CRF |
問答 | 根據(jù)給定問題生成對應的答案 | 智能客服、知識問答系統(tǒng)等 | T5、GPT系列、BERT-based問答模型 |
摘要 | 從長文本中提取關鍵信息生成簡短摘要 | 新聞摘要、學術文獻摘要等 | BART、PEGASUS、Transformer-based編碼器-解碼器架構 |
翻譯 | 將一種語言的文本轉換為另一種語言的文本 | 跨語言交流、多語言文檔處理等 | Transformer、 MarianMT、百度翻譯模型等 |
語言模型 | 預測文本序列中下一個Token的概率分布 | 文本生成、自動補全、語言理解等 | GPT系列、Transformer-XL、XLNet |
自然語言處理案例有很多,我就不按照案例講解,以串聯(lián)過程,講解重點功能
2.1.1 Text classification(文本分類)
1. 默認模型
在這里,我指定了任務類型為情感分類
,model參數(shù)沒有指定
默認使用的模型為:distilbert-base-uncased-finetuned-sst-2-english
task 優(yōu)先原則
:當指定任務而不指定模型時,Pipeline 會自動選擇最適合該任務的默認模型
from transformers import pipeline# 僅指定任務時,使用默認模型(不推薦)
pipe = pipeline(task="sentiment-analysis", device='cuda')
print(pipe("小明是好人"))
print(pipe("小紅是壞人"))print(pipe("This restaurant is awesome"))
print(pipe("This restaurant is bad"))
可以看到中文的score置信度很低,英文的卻很高
[{'label': 'NEGATIVE', 'score': 0.5197433233261108}]
[{'label': 'NEGATIVE', 'score': 0.774127721786499}][{'label': 'POSITIVE', 'score': 0.9998743534088135}] # 積極的
[{'label': 'NEGATIVE', 'score': 0.9998098015785217}] # 消極的
2.指定模型
在這里我替換一下模型使用,再來看看中文的效果
https://hf-mirror.com/lxyuan/distilbert-base-multilingual-cased-sentiments-student
from transformers import pipelinepipe = pipeline(task="sentiment-analysis", model="lxyuan/distilbert-base-multilingual-cased-sentiments-student",device='cuda')print(pipe("小明是好人"))
print(pipe("小紅是壞人"))print(pipe("This restaurant is awesome"))
print(pipe("This restaurant is bad"))
可以看到對于中文置信度很高了
[{'label': 'positive', 'score': 0.9678574204444885}]
[{'label': 'negative', 'score': 0.9101658463478088}]
[{'label': 'positive', 'score': 0.9811712503433228}]
[{'label': 'negative', 'score': 0.9343340396881104}]
3.批量調用模型推理
from transformers import pipeline
pipe = pipeline(task="sentiment-analysis", model="lxyuan/distilbert-base-multilingual-cased-sentiments-student",device='cuda')
print(pipe(["小明是好人","小明是壞人"]))
輸出
[{'label': 'positive', 'score': 0.9678574204444885},{'label': 'negative', 'score': 0.911962628364563}]
2.1.2 Token Classification (token分類)
在任何NLP任務中,文本都經(jīng)過預處理,將文本序列分成單個單詞或子詞。這些被稱為tokens。
Token Classification(Token分類)將每個token分配一個來自預定義類別集的標簽。
兩種常見的 Token 分類是:
命名實體識別(NER)
:根據(jù)實體類別(如組織、人員、位置或日期)對token進行標記。NER在生物醫(yī)學設置中特別受歡迎,可以標記基因、蛋白質和藥物名稱。詞性標注(POS)
:根據(jù)其詞性(如名詞、動詞或形容詞)對標記進行標記。
POS對于幫助翻譯系統(tǒng)了解兩個相同的單詞如何在語法上不同很有用(作為名詞的銀行與作為動詞的銀行)。
1.命名實體識別(NER)
下面我們調用一個命名實體ner模型
模型主頁:https://hf-mirror.com/ckiplab/bert-base-chinese-ner
在模型的files,config.json 有說明標簽
https://hf-mirror.com/ckiplab/bert-base-chinese-ner/blob/main/config.json
每個標簽是對歸屬的簡寫,比如"30": "I-ORG", ORG
代表的是組織
import os
# 設置鏡像源(推薦國內(nèi)源)
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 國內(nèi)鏡像源
from transformers import pipeline# 創(chuàng)建NER管道(使用中文預訓練模型)
ner = pipeline(# grouped_entities=True,task="token-classification",model="ckiplab/bert-base-chinese-ner",device='cuda' # 使用GPU加速,)
# 待分析文本
text = "小紅是中國人,在上海大學讀書"
# 進行實體識別
entities = ner(text)
# 打印原始結果
print("===== 原始識別結果 =====")
for entity in entities:print(f"{entity['word']} → {entity['entity']} (置信度: {entity['score']:.3f})")
輸出
===== 原始識別結果 =====
小 → B-PERSON (置信度: 1.000)
紅 → E-PERSON (置信度: 1.000)
中 → B-NORP (置信度: 1.000)
國 → I-NORP (置信度: 1.000)
人 → E-NORP (置信度: 1.000)
上 → B-ORG (置信度: 1.000)
海 → I-ORG (置信度: 1.000)
大 → I-ORG (置信度: 1.000)
學 → E-ORG (置信度: 1.000)
上面效果看起來不是很好看,我們可以加以合并更修飾
2.實體合并
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'from transformers import pipeline# 創(chuàng)建NER管道(使用聚合策略)
ner = pipeline(task="token-classification",model="ckiplab/bert-base-chinese-ner",aggregation_strategy="simple", # 關鍵設置device='cuda'
)text = "小紅是中國人,在上海大學讀書"
entities = ner(text)# 打印結果
print("===== 完整實體識別結果 =====")
for entity in entities:print(f"{entity['word']} → {entity['entity_group']} (置信度: {entity['score']:.3f})")# 補充:理解實體類型
print("\n===== 實體類型解釋 =====")
entity_types = {'PERSON': '人名','ORG': '組織機構','NORP': '民族/宗教團體','LOC': '地點','GPE': '國家/城市','MISC': '其他','FAC': '設施','PRODUCT': '產(chǎn)品'
}
for entity in entities:print(f"{entity['word']}: {entity_types.get(entity['entity_group'], '未知類型')}")
輸出
可以看到效果還是挺好的,輸出內(nèi)容不再單個割裂,國家也能組合出來 “中國”
===== 完整實體識別結果 =====
小 → PERSON (置信度: 1.000)
紅 → PERSON (置信度: 1.000)
中 國 → NORP (置信度: 1.000)
人 → NORP (置信度: 1.000)
上 海 大 → ORG (置信度: 1.000)
學 → ORG (置信度: 1.000)===== 實體類型解釋 =====
小: 人名
紅: 人名
中 國: 民族/宗教團體
人: 民族/宗教團體
上 海 大: 組織機構
學: 組織機構
2.1.3 Question Answering(問答)
問答類型 | 核心特點 | 典型模型 | 適用場景 | 優(yōu)勢 | 局限性 |
---|---|---|---|---|---|
抽取式問答 (Extractive QA) | 從上下文直接抽取答案文本片段 | BERT, RoBERTa, XLNet | 閱讀理解、文檔問答 | 準確度高、支持事實性回答 | 答案必須在原文中 |
生成式問答 (Generative QA) | 生成自然語言答案文本 | T5, BART, GPT系列 | 開放域問答、解釋性回答 | 答案不受原文限制 | 可能產(chǎn)生事實錯誤 |
開放域問答 (Open-Domain QA) | 不依賴給定上下文 | DPR (Dense Passage Retrieval), REALM | 百科問答、智能助手 | 無需預設知識庫 | 依賴外部知識檢索 |
基于知識的問答 (KBQA) | 利用知識圖譜推理 | DrQA, UNIK-QA | 專業(yè)領域問答 | 支持復雜推理 | 依賴預構建知識庫 |
多跳問答 (Multi-Hop QA) | 跨多文檔/段落推理 | HotpotQA, PathNet | 復雜問題回答 | 支持深層次推理 | 計算復雜度高 |
視覺問答 (VQA) | 結合圖像理解 | ViLBERT, LXMERT | 圖文混合問答 | 多模態(tài)融合 | 依賴視覺識別能力 |
問答的模型有很多,本文不做過多展示,下面就展示傳統(tǒng)的抽取式問答
模型地址:https://hf-mirror.com/uer/roberta-base-chinese-extractive-qa
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipelinemodel = pipeline(task="question-answering",model="uer/roberta-base-chinese-extractive-qa",device='cuda'
)# res = model(
# {'question': "穩(wěn)穩(wěn)C9是誰",
# 'context': "穩(wěn)穩(wěn)C9是CSDN一名博主,處理爬蟲,以及前沿AI\n 小明是小紅的男朋友"}
#
# )
res = model(question="穩(wěn)穩(wěn)C9是誰", context="穩(wěn)穩(wěn)C9是CSDN一名博主,處理爬蟲,以及前沿AI\n 小明是小紅的男朋友")
print(res)
輸出
還是挺不錯的,我輸入了1個干擾內(nèi)容
{'score': 0.07943948358297348, 'start': 11, 'end': 13, 'answer': '博主'}
2.1.4 Summarization(文本摘要)
摘要類型 | 核心特點 | 典型模型 | 適用場景 | 優(yōu)勢 | 局限性 |
---|---|---|---|---|---|
抽取式摘要 | 從原文中直接抽取關鍵句子或片段 | BERT, TextRank, BM25+ | 新聞摘要、長文檔概覽 | 保留原文準確性,避免事實錯誤 | 摘要不夠流暢,無法生成新詞 |
生成式摘要 | 理解原文后重新生成簡潔摘要 | T5, BART, PEGASUS, GPT系列 | 生成流暢摘要、個性化摘要 | 摘要更自然、簡潔 | 可能偏離原意,存在幻覺風險 |
多文檔摘要 | 從多個相關文檔中生成統(tǒng)一摘要 | MultiDoc, HMNet | 輿情分析、跨文檔信息整合 | 支持跨文檔信息融合 | 整合難度大,需要處理冗余信息 |
引導式摘要 | 根據(jù)用戶指定的關鍵詞或主題生成摘要 | CTRLSum, Concept-guided Summarization | 個性化摘要生成、領域聚焦摘要 | 定制化摘要內(nèi)容 | 依賴引導信息的質量 |
對話摘要 | 提取和整合對話中的核心信息 | TODSum, DialoGPT | 會議記錄、客服對話總結 | 處理多輪對話結構 | 對話信息分散,主題不連貫 |
長文檔摘要 | 處理超長文本(10K token以上) | LED, PRIMERA | 學術論文摘要、長篇小說概覽 | 支持長上下文建模 | 資源消耗大,復雜度高 |
本小節(jié),演示抽取式摘要模型
模型地址:https://hf-mirror.com/utrobinmv/t5_summary_en_ru_zh_base_2048
這里多說一下,該模型還有挺多用法,可以往下瀏覽
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipelinemodel = pipeline(task="summarization",model="utrobinmv/t5_summary_en_ru_zh_base_2048",device='cuda',
)
res = model("""summary: 央廣網(wǎng)北京6月10日消息(總臺中國之聲記者韓雪瑩 朱宏源)據(jù)中央廣播電視總臺中國之聲報道,一群看上去只有十幾歲的少年,騎著山地自行車,
不戴護具、無視人流,在城市的商圈樓宇、公園廣場,從臺階、高坡等數(shù)米高的位置急速俯沖而下,
過往行人不得不緊急避讓……近期,一些未成年人在公共場所騎速降自行車炫技的短視頻廣泛傳播,引發(fā)市民擔憂。
其中,部分“速降少年”因操作失誤引發(fā)危險傷及自身,更有甚者,自行車失控撞倒路人。看似炫酷的極限運動,存在哪些安全隱患?
速降山地自行車運動又該如何規(guī)范發(fā)展、不負熱愛
""")print(res)
輸出
[{'summary_text': '一群看上去只有十幾歲的少年,騎著山地自行車,不戴護具、無視人流,在城市的商圈樓宇、公園廣場,從臺階、高坡等數(shù)米高的位置急速俯沖而下。'}]
2.2 音頻處理
音頻處理有很多好玩的,比如識別音頻中多少人,等等
本小節(jié)演示,音頻的情感分類
在 huggingface上面有很多數(shù)據(jù)集可以公開使用,這里我們要找一個音頻,你也可以自己找
(我在下面代碼里面已經(jīng)準備了一個)
2.1 環(huán)境安裝
安裝windows FFmpeg
訪問 FFmpeg 官方網(wǎng)站:https://ffmpeg.org/download.html
下載 Windows 版本(推薦:https://github.com/BtbN/FFmpeg-Builds/releases)
- 解壓下載的 ZIP 文件(例如到 C:\ffmpeg)
- 將 FFmpeg 添加到系統(tǒng)環(huán)境變量:
- 打開 “系統(tǒng)屬性” > “高級” > “環(huán)境變量”
- 在 “系統(tǒng)變量” 中找到Path,點擊編輯
- 添加 FFmpeg 的 bin 目錄路徑(例如 C:\ffmpeg\bin)點擊確定保存
記得重啟IDE
驗證環(huán)境
ffmpeg -version
2.2 音頻情感分類
本次使用模型:https://hf-mirror.com/firdhokk/speech-emotion-recognition-with-openai-whisper-large-v3
這是一段語氣激昂的一段錄音,聽起來有點生氣
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipeline
model = pipeline(task="audio-classification",model="firdhokk/speech-emotion-recognition-with-openai-whisper-large-v3",device='cuda',
)
res = model("https://hf-mirror.com/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
print(res)
輸出
[{'score': 0.9832255244255066, 'label': 'angry'}, # 可以看到置信度很高
{'score': 0.014977349899709225, 'label': 'happy'},
{'score': 0.0007455425802618265, 'label': 'fearful'},
{'score': 0.0005094102816656232, 'label': 'neutral'},{'score': 0.00019644349231384695, 'label': 'sad'}]
2.3 圖片處理
模型地址: https://hf-mirror.com/google/vit-base-patch16-224
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipeline
model = pipeline(task="image-classification",model="google/vit-base-patch16-224",device='cuda',
)
res = model("https://img0.baidu.com/it/u=2156020984,3145770830&fm=253&fmt=auto&app=138&f=JPEG")
print(res)
輸出
[{'label': 'Pomeranian', 'score': 0.5816799402236938},{'label': 'Eskimo dog, husky', 'score': 0.10331527143716812}, {'label': 'Chihuahua', 'score': 0.09424787759780884},{'label': 'Japanese spaniel', 'score': 0.018894687294960022}, {'label': 'Pembroke, Pembroke Welsh corgi', 'score': 0.01833692565560341}]
可以看到輸出了博美犬
其余標簽請查看
https://hf-mirror.com/google/vit-base-patch16-224/blob/main/config.json
2.3 視頻處理
視頻處理的模型很多,比如暴力,顏色檢測,等等
模型地址:https://hf-mirror.com/MCG-NJU/videomae-large-finetuned-kinetics
安裝一個包
pip install decord
數(shù)據(jù)集地址:
https://hf-mirror.com/datasets/sayakpaul/ucf101-subset/blob/main/v_BasketballDunk_g14_c06.avi
這是一段NBA,籃球比賽的視頻
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from transformers import pipeline
model = pipeline(task="video-classification",model="MCG-NJU/videomae-large-finetuned-kinetics",device='cuda',
)
res = model("https://hf-mirror.com/datasets/sayakpaul/ucf101-subset/resolve/main/v_BasketballDunk_g14_c06.avi?download=true")
print(res)
輸出
[{'score': 0.44488775730133057, 'label': 'dunking basketball'},{'score': 0.12890341877937317, 'label': 'playing basketball'},{'score': 0.04511522129178047, 'label': 'dribbling basketball'}, {'score': 0.03531673923134804, 'label': 'shooting basketball'}, {'score': 0.0020291220862418413, 'label': 'ski jumping'}]
3、Datasets & Tokenizers(數(shù)據(jù)預處理)
在 Hugging Face 生態(tài)中,Datasets
和 Tokenizers
是數(shù)據(jù)預處理的核心組件,它們共同構成了高效數(shù)據(jù)處理的基石。
3.1 Datasets
核心特點:
- 海量數(shù)據(jù)集 & 簡單加載: 提供對成千上萬公開數(shù)據(jù)集(涵蓋 NLP、CV、音頻等)的一鍵式訪問 (
load_dataset
)。 - 高性能處理: 底層使用 Apache Arrow 內(nèi)存格式和零拷貝讀取,處理速度極快,特別適合處理大規(guī)模數(shù)據(jù)集。
- 內(nèi)存映射 (Memory-Mapping): 數(shù)據(jù)集只在訪問時加載到內(nèi)存,極大節(jié)省內(nèi)存開銷,輕松處理超大數(shù)據(jù)集(超過內(nèi)存大小)。
- 流式處理 (Streaming): 支持數(shù)據(jù)集流式讀取(
load_dataset(..., streaming=True)
),無需下載整個數(shù)據(jù)集到本地,即可逐條或小批量處理,極大加速處理超大、遠程數(shù)據(jù)集的開局速度。 - 靈活的轉換 (Transforms): 提供類似
map
和filter
的轉換方法,可以輕松地對數(shù)據(jù)集進行清洗、分詞、格式轉換等操作。轉換通常是惰性執(zhí)行的。 - 版本管理與緩存: 自動緩存處理過的數(shù)據(jù)集和加載的數(shù)據(jù)集,避免重復加載和轉換。支持數(shù)據(jù)集版本管理。
- 與框架集成: 方便地轉換為 PyTorch
DataLoader
(to_torch_dataset
/DataLoader(dataset, ...)
) 或 TensorFlowtf.data.Dataset
(to_tf_dataset
)。
官方文檔
https://hf-mirror.com/docs/datasets/v2.16.1/en/loading
官方文檔寫的很詳細,所以本小節(jié)主要還是以經(jīng)常使用的場景進行分享即可,深入了解,我覺得根據(jù)實際需求
去到官方文檔找對應的內(nèi)容即可,無需糾結
3.1.1 加載數(shù)據(jù)
- load_dataset_builder 檢查數(shù)據(jù)不下載本地
- load_dataset 完全下載到本地
如果不想下載完整數(shù)據(jù),想預覽一下數(shù)據(jù)集可以到hub查看,或者通過load_dataset_builder
確認
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from datasets import load_dataset_builder
ds_builder = load_dataset_builder("stanfordnlp/imdb")
print(ds_builder.info.description)
print(ds_builder.info.features)
輸出
Downloading readme: 7.81kB [00:00, ?B/s]{'text': Value(dtype='string', id=None), 'label': ClassLabel(names=['neg', 'pos'], id=None)}
利用 load_dataset
下載數(shù)據(jù)到本地
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from datasets import load_dataset
# 加載 電影數(shù)據(jù)集
dataset = load_dataset("stanfordnlp/imdb")
print(dataset)
輸出
Downloading data: 100%|██████████| 21.0M/21.0M [00:04<00:00, 4.56MB/s]
Downloading data: 100%|██████████| 20.5M/20.5M [00:04<00:00, 4.92MB/s]
Downloading data: 100%|██████████| 42.0M/42.0M [00:08<00:00, 5.01MB/s]
Generating train split: 100%|██████████| 25000/25000 [00:00<00:00, 431023.20 examples/s]
Generating test split: 100%|██████████| 25000/25000 [00:00<00:00, 625022.95 examples/s]
Generating unsupervised split: 100%|██████████| 50000/50000 [00:00<00:00, 617288.72 examples/s]DatasetDict({train: Dataset({features: ['text', 'label'],num_rows: 25000})test: Dataset({features: ['text', 'label'],num_rows: 25000})unsupervised: Dataset({features: ['text', 'label'],num_rows: 50000})
})
windows默認加載路徑
- Datasets 庫支持從
本地加載
數(shù)據(jù)集,支持多種格式(如 CSV、JSON、文本文件等)
dataset = load_dataset("csv", data_files="path/to/file.csv")
- 查看加載后的數(shù)據(jù)信息
load_dataset 還有很多常用屬性,這里提及一下split
可以只加載訓練集,這塊是根據(jù)開源數(shù)據(jù)標簽區(qū)分的
并不是所有數(shù)據(jù)集的都有 train
dataset_train = load_dataset("stanfordnlp/imdb",split="train")
- 更多方法可以查看源碼
https://github.com/huggingface/datasets/blob/2.16.1/src/datasets/load.py#L2251
3.1.2 訪問數(shù)據(jù)
-
查看數(shù)據(jù)相關信息
data_train = dataset['train']
data_train.info
data_train.features
-
索引訪問某一行
data_train[0]
-
根據(jù)列名訪問
data_train.column_names # ['text', 'label'] data_train['text']
-
還有很多聚合復雜訪問,請看開頭官方文檔
3.1.3 操作數(shù)據(jù)
-
過濾數(shù)據(jù)
data_train.filter(lambda x:x['label'] == 1)
-
排序數(shù)據(jù)
使用 sort() 根據(jù)其數(shù)值對列值進行排序。提供的列必須是 NumPy 兼容的’
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#sortdata_train.sort('text')
-
拆分數(shù)據(jù)
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#split
將部分數(shù)據(jù)拆成為測試數(shù)據(jù)data_train.train_test_split(test_size=0.1)
DatasetDict({train: Dataset({features: ['text', 'label'],num_rows: 22500})test: Dataset({features: ['text', 'label'],num_rows: 2500}) })
-
分片數(shù)據(jù)
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#shard
原本數(shù)據(jù)有25000行,分成4等份,從第0位開始data_train.shard(num_shards=4, index=0)
-
數(shù)據(jù)映射
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#map
通過map方法,將原本里面內(nèi)容全部大寫def preprocess_function(example):example['text'] = example['text'].upper()return exampledata_train2 = data_train.map(preprocess_function)
當然支持批量處理,減少map時間data_train3 = data_train.map(preprocess_function,batched=True,batch_size=100)
3.1.4 導出數(shù)據(jù)
這個沒有什么好說的,自己看一下就好了
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#save
https://hf-mirror.com/docs/datasets/v2.16.1/en/process#export
3.2 Tokenizers
Tokenizers原生
官方代碼:https://github.com/huggingface/tokenizers/tree/v0.15.2
官方文檔:https://hf-mirror.com/docs/tokenizers/main/en/index
transformers的集成API文檔
https://hf-mirror.com/docs/transformers/v4.37.2/en/main_classes/tokenizer
調用方式
-
from transformers import AutoTokenizer
- 這是Hugging Face Transformers庫提供的高級API,它封裝了底層的tokenizers庫,并提供了與Transformers模型的無縫集成。
- 使用
AutoTokenizer
可以自動根據(jù)模型名稱加載對應的分詞器(如’bert-base-uncased’),并且返回的是transformers.PreTrainedTokenizer
(或其子類)的實例,這類分詞器可以直接用于Transformers模型的輸入處理。
-
from tokenizers import Tokenizer
- 這是直接使用Hugging Face的tokenizers庫,這是一個用Rust編寫的快速分詞庫。它提供了構建和使用分詞器的底層接口。
- 這里的
Tokenizer
類是一個通用的分詞器,可以通過配置文件或者代碼來構建分詞器(如BPE、WordPiece等),然后進行訓練和使用。
關系
-
transformers
庫中的分詞器(如BertTokenizer
)通常使用tokenizers
庫作為后端引擎(特別是新版的Transformers庫)。例如,當你調用AutoTokenizer.from_pretrained
加載一個分詞器時,對于許多模型,它實際上是在內(nèi)部使用了tokenizers
庫的Tokenizer
類。 -
但是,
transformers
庫的分詞器類(PreTrainedTokenizer
)提供了額外的功能,比如與模型類對齊的特殊標記(如[CLS]
、[SEP]
)的自動處理,以及提供與模型輸入格式一致的方法(如返回attention_mask
、token_type_ids
等)。
總結
-
如果你使用的是Transformers庫中的模型,那么推薦使用
transformers
中的分詞器(如AutoTokenizer
),因為這樣能確保分詞方式與模型預訓練時一致,并且可以方便地處理模型輸入所需的各種字段。 -
如果你需要訓練一個新的分詞器,或者想要直接使用底層分詞庫的高性能特性,那么你可以使用
tokenizers
庫。然后,你也可以通過transformers
庫的PreTrainedTokenizerFast
將這個分詞器包裝成Transformers庫可以使用的格式。
特性維度 | tokenizers 庫 (原生) | transformers.AugTokenizer (集成) |
---|---|---|
開發(fā)定位 | 獨立高性能分詞引擎 | Transformers 模型的配套組件 |
主要語言 | Rust (核心) + Python 綁定 | Python |
性能特點 | 優(yōu)化極致速度 (比transformers快5-10倍) | 接口友好但速度較慢 |
使用復雜度 | 需要構建訓練管道 (中高級) | 一行代碼加載預訓練 (入門友好) |
適用場景 | 定制化分詞器訓練/高性能需求 | 直接使用預訓練模型 |
PS:本節(jié)內(nèi)容基本以transformers框架的 分詞器講解
3.2.1 為什么需要分詞器?
假設現(xiàn)在我們要處理一個文本
text = "📌@穩(wěn)穩(wěn)C9 最愛🚴?騎行,不喜歡釣魚,#技術分享時! 說:'關注我的博客!' 網(wǎng)址https://blog.csdn.net/weixin_44238683"
-
傳統(tǒng)方案
直接字符串切割處理字符列表 = [📌, @, 穩(wěn), 穩(wěn), C, 9, , 最, 愛, 🚴, ...]
問題產(chǎn)生
- URL 被拆成碎片:長 URL 變成無意義字符序列
- 無法識別專業(yè)平臺:博客地址包含 “csdn” 技術社區(qū)名卻被拆分
- 用戶名處理不當:“@穩(wěn)穩(wěn) C9” 中的用戶名關聯(lián)被破壞
- 關鍵符號丟失:博客 URL 中的下劃線 (_) 和點 (.) 被忽略
-
Tokenizer 方案
tokens = ["📌", "@", "穩(wěn)穩(wěn)", "C9", "最愛", "🚴?騎行", ",","不喜歡", "釣魚", ",", "#", "技術分享", "時","!", "說", ":", "'", "關注", "我的", "博客", "!", "'","網(wǎng)址", "https://blog.csdn.net/weixin_44238683" ]
-
分析比對
問題類型 Tokenizer 解決方案 案例體現(xiàn) 平臺識別 保留完整URL 完整保留CSDN博客地址 技術內(nèi)容處理 識別技術社區(qū)名稱"csdn" 保護技術專有名詞 用戶標識 保護用戶名關聯(lián) "@穩(wěn)穩(wěn)C9"保持整體關聯(lián) 符號保護 保留URL中的特殊字符 下劃線和點號完整保留
3.2.2 以工作流程來理解分詞器
預清洗
可以看到文本有個特殊符號 "hello,how are you? ?"
預清洗:就像是為分詞器打掃 “工作臺”,只有干凈的環(huán)境,才能實現(xiàn)精準的分詞結果!
- 防止噪聲干擾:去除多余的空白、不可見字符和非語義符號,確保分詞器專注于有意義內(nèi)容
- 統(tǒng)一格式標準:將所有文本轉換為統(tǒng)一編碼(如 UTF-8),避免特殊字符錯誤
- 信息安全保護:處理敏感信息(如完整 URL),避免隱私泄露
- 規(guī)范化表達:將變體表達(如不同形式的引號)轉換為標準形式
- 提高模型魯棒性:為后續(xù)處理準備干凈的輸入源,降低錯誤傳遞風險
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
input_text = "hello,how are you? ?"
def clean_text(text):# 替換特殊符號text = text.replace("?", "")return text.strip()
cleaned_text = clean_text(input_text)
print(cleaned_text)
執(zhí)行分詞器
模型地址:https://hf-mirror.com/google-bert/bert-base-chinese
官方文檔:https://hf-mirror.com/docs/transformers/v4.37.2/en/main_classes/tokenizer
from transformers import AutoTokenizer
# 加載預訓練的分詞器
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
tokens_1 = tokenizer(input_text) # 沒進行清洗的輸入
print(tokens_1)
tokens_2 = tokenizer(cleaned_text) # 清洗后的輸入
print(tokens_2)
輸出
{'input_ids': [101, 8701, 117, 9510, 8995, 8357, 136, 100, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}{'input_ids': [101, 8701, 117, 9510, 8995, 8357, 136, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]}
鍵值對說明
-
input_ids
:token 對應的 ID 列表。
https://hf-mirror.com/docs/transformers/v4.37.2/en/glossary#input-ids -
attention_mask
:注意力掩碼,1 實際內(nèi)容,0 填充內(nèi)容 。
https://hf-mirror.com/docs/transformers/v4.37.2/en/glossary#attention-mask -
token_type_ids
(可選):用于區(qū)分句子對的任務(如 BERT)。
https://hf-mirror.com/docs/transformers/v4.37.2/en/glossary#token-type-ids
[101, 8701, 117, 9510, 8995, 8357, 136, 100, 102] 說明
獲取完整詞匯表,其實就是內(nèi)容鍵值關系,你可以查看
vocab_dict = tokenizer.get_vocab()
為什么2個,清洗前后開頭都是 101,跟102?
在BERT分詞器中,有固定的特殊標記系統(tǒng)
特殊標記 | ID | 功能 | 在序列中的位置 |
---|---|---|---|
[CLS] | 101 | 分類標記(Classification) | 序列開頭 |
[SEP] | 102 | 分隔標記(Separator) | 序列結尾或句子間 |
[PAD] | 0 | 填充標記(Padding) | 填充位置 |
[UNK] | 100 | 未知標記(Unknown) | 未知詞位置 |
[MASK] | 103 | 掩碼標記(Masked ) | 掩碼語言 |
其實從堆棧也能看到
解碼
在前面,我們編碼了兩個內(nèi)容,現(xiàn)在編碼查看效果
tokenizer.decode(tokens_1['input_ids'])
tokenizer.decode(tokens_2['input_ids'])
可以看到我們的解碼后的,沒有進《清洗的數(shù)據(jù)》出現(xiàn)了[UNK]代表未知標記
當然為了更形象,你也可以運行如下代碼
# 解碼演示
def decode_demo(ids):"""解碼并顯示差異"""text = tokenizer.decode(ids)print(f"IDs: {ids}")print(f"解碼: {text}")print("="*50)# 原始文本解碼
decode_demo(tokens_1['input_ids'])# 清洗后解碼
decode_demo(tokens_2['input_ids'])
輸出
IDs: [101, 8701, 117, 9510, 8995, 8357, 136, 100, 102]
解碼: [CLS] hello, how are you? [UNK] [SEP]
==================================================
IDs: [101, 8701, 117, 9510, 8995, 8357, 136, 102]
解碼: [CLS] hello, how are you? [SEP]
==================================================
3.2.3 分詞器深入理解
PS:這章節(jié)最好!最好是動手操作,理解一下這個參數(shù)意義
源代碼位置: https://github.com/huggingface/transformers/blob/v4.37.2/src/transformers/tokenization_utils_base.py
from transformers import AutoTokenizer
# 加載預訓練的分詞器
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
tokens_1 = tokenizer(input_text) # 沒進行清洗的輸入
運行這段代碼在tokens_1 單步調試DEBUG進去(本文文章開頭GIF 里面有跳轉路徑)
BERT 模型都是繼承 PreTrainedTokenizerBase
其實我們可以看一下這個基類的所有子類方法,點擊紅色
可以看到很多子類分詞器,都是繼承于他
官方源碼文檔
https://github.com/huggingface/transformers/blob/v4.37.2/src/transformers/tokenization_utils_base.py#L1544
transformer文檔
https://hf-mirror.com/docs/transformers/v4.37.2/zh/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.call
1.核心參數(shù)詳解
基本文本輸入
參數(shù)名 | 類型 | 默認值 | 說明 |
---|---|---|---|
text | str/list[str] | None | 要分詞的文本(單條或多條) |
text_pair | str/list[str] | None | 用于句子對任務(如NLI)的第二個句子 |
is_split_into_words | bool | False | 輸入是否已預處理為單詞列表 |
特殊標記控制
參數(shù)名 | 類型 | 默認值 | 說明 |
---|---|---|---|
add_special_tokens | bool | True | 是否添加模型特定的特殊標記([CLS]/[SEP]等) |
return_special_tokens_mask | bool | False | 是否返回標記特殊token位置的掩碼 |
長度控制
參數(shù)名 | 類型 | 默認值 | 說明 | 推薦值 |
---|---|---|---|---|
padding | bool/str | False | 填充策略:True/‘longest’(批內(nèi)最長),‘max_length’(指定長度) | ‘max_length’ |
truncation | bool/str | False | 截斷策略:True(使用max_length),‘longest_first’(優(yōu)先截較長句) | True |
max_length | int | None | 最大長度(截斷/填充依據(jù)) | 512 |
stride | int | 0 | 當截斷返回所有片段時,連續(xù)片段間的重疊token數(shù) | 128(長文檔處理) |
pad_to_multiple_of | int | None | 填充至該數(shù)的倍數(shù)(優(yōu)化GPU計算) | 8(GPU高效) |
返回值控制
參數(shù)名 | 類型 | 默認值 | 說明 | 常用場景 |
---|---|---|---|---|
return_tensors | str | None | 返回張量格式:‘pt’(PyTorch), ‘tf’(TensorFlow), ‘np’(NumPy) | ‘pt’ |
return_token_type_ids | bool | None | 是否返回token_type_ids(句子A/B標識) | BERT類模型設為True |
return_attention_mask | bool | None | 是否返回attention_mask(實詞/填充區(qū)分) | 使用填充時設為True |
return_overflowing_tokens | bool | False | 是否返回所有截斷片段(用于處理長文檔) | 處理長文本 |
return_offsets_mapping | bool | False | 是否返回每個token在原始文本中的位置(起始和結束索引) | NER任務 |
return_length | bool | False | 是否返回每個序列的長度 | 調試 |
2. 完整參數(shù)使用示例
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")# 處理句子對(如問答)
inputs = tokenizer(text="Where is Paris located?", # 問題text_pair="Paris is the capital of France.", # 上下文add_special_tokens=True, # 添加[CLS]和[SEP]padding="max_length", # 填充至最大長度truncation="longest_first", # 優(yōu)先截斷較長序列max_length=512, # 最大長度限制return_tensors="pt", # 返回PyTorch張量return_token_type_ids=True, # 返回句子類型IDreturn_attention_mask=True # 返回注意力掩碼
)print("input_ids:", inputs["input_ids"].shape)
print("token_type_ids:", inputs["token_type_ids"][0, :20].tolist())
print("attention_mask:", inputs["attention_mask"][0, :20].tolist())
3.2.4 特殊標簽進一步理解
我們現(xiàn)在這節(jié)著重講一下,這些特殊標記,的意義,更使用場景
-
利用
tokenizer.tokenize
分詞,以及token編碼,可以看到出現(xiàn)[UNK]
from transformers import AutoTokenizer # 加載預訓練的分詞器 tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese") input_text = "hello,how are you? ?" print(tokenizer.tokenize(input_text)) print(tokenizer(input_text)['input_ids']) ['hello', ',', 'how', 'are', 'you', '?', '[UNK]'] [101, 8701, 117, 9510, 8995, 8357, 136, 100, 102]
如果大量的出現(xiàn)的 未知標記,對于模型理解來說是一個災難,不明白輸入,無法反饋輸出
- 大量未知不影響用戶語義,可以清洗掉
- 也可以創(chuàng)建特定標標簽
我們用一個實際的場景來比喻:
想象你開了一家"洗車店"
-
原始車輛進店(原始文本輸入)
input_text = "聯(lián)系客服:support@company.com 了解詳情 ?"
這輛"數(shù)據(jù)車"臟兮兮的:
- 車身沾滿泥點(特殊符號
?
) - 車窗貼著聯(lián)系電話的便簽(郵箱
support@company.com
) - 后備箱貼著公司網(wǎng)址貼紙(但我們還看不到網(wǎng)址)
- 車身沾滿泥點(特殊符號
-
預清洗工位(Clean)
def clean_text(text):text = text.replace("?", "") # 洗掉車身泥點text = re.sub(r"\S+@\S+", "[EMAIL]", text) # 用統(tǒng)一貼紙覆蓋聯(lián)系方式return text.strip()cleaned_text = "聯(lián)系客服:[EMAIL] 了解詳情"
現(xiàn)在車輛煥然一新:
- 車身干凈無泥點
- 聯(lián)系方式被統(tǒng)一標識覆蓋
- 保持核心信息完整(聯(lián)系客服了解詳情) -
貼標工位(Tokenizer)
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese") tokens = tokenizer(cleaned_text) print(tokens)
洗車店為車輛貼上統(tǒng)一標識貼紙:
- 101: 🚗 洗車店入場貼紙 (CLS)
- 1234: “聯(lián)系”
- 5678: “客服”
- 9999: [EMAIL] 特殊貼紙
- 2345: “了解詳情”
- 102: 🛣? 洗車店出場貼紙 (SEP)
-
轉運至工廠(模型處理)
model_input = {'input_ids': [101, 1234, 5678, 9999, 2345, 102],'attention_mask': [1,1,1,1,1,1] }
洗干凈的車輛被送至不同工廠:
- 客服機器人工廠:看到 [EMAIL] 標識,會換成真實的客服郵箱
- 數(shù)據(jù)分析工廠:保留 [EMAIL] 標識,用于統(tǒng)計客服咨詢數(shù)量
- 審計部門:看到統(tǒng)一標識知道這里有私人信息,加強安全措施
3.2.4 常用功能總結
1. 基礎分詞 (tokenize
)
input_text = "hello,how are you? ?"
cleaned_text = input_text.replace("?", "").strip()# 基礎分詞
print("原始文本分詞:", tokenizer.tokenize(input_text))
print("清洗后分詞:", tokenizer.tokenize(cleaned_text))
輸出結果:
原始文本分詞: ['hello', ',', 'how', 'are', 'you', '?', '[UNK]']
清洗后分詞: ['hello', ',', 'how', 'are', 'you', '?']
功能說明:
- 基礎文字拆分:將文本拆分為最小語義單元
- 特殊符號處理:
[UNK]
標記表示不可識別內(nèi)容 - 使用場景:快速查看分詞效果,無需生成模型輸入
2. 完整分詞處理 (__call__
)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
input_text = "hello,how are you? ?"
cleaned_text = input_text.replace("?", "").strip()
inputs = tokenizer(cleaned_text,padding="max_length", # 自動填充到設置的max_length為10的長度truncation=True, # 自動截斷max_length=10, # 最大長度return_tensors="pt" # 返回PyTorch張量
)pprint(inputs)
輸出結構: 可以看到attention_mask 最后出現(xiàn)0為,為填充的內(nèi)容
{
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0]]), 'input_ids': tensor([[ 101, 8701, 117, 9510, 8995, 8357, 136, 102, 0, 0]]),'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])}
功能特點:
- 自動化處理:一鍵完成分詞、填充、特殊標記添加等
- 框架支持:通過
return_tensors
指定TensorFlow/PyTorch格式 - 批處理優(yōu)化:支持多文本同時處理
在這里重點講一下
3. 編碼與解碼
文本 → ID (encode
)
# 單條文本編碼
input_ids = tokenizer.encode(cleaned_text)
print(f"編碼結果: {input_ids}")# 批量編碼(性能提升10倍)
texts = [cleaned_text, "你好世界", "NLP很有趣"]
batch_ids = tokenizer.batch_encode_plus(texts, padding=True,return_tensors="pt"
)
print("批量編碼:", batch_ids)
輸出結果
編碼結果: [101, 8701, 117, 9510, 8995, 8357, 136, 102]
批量編碼: {'input_ids': tensor([[ 101, 8701, 117, 9510, 8995, 8357, 136, 102],[ 101, 872, 1962, 686, 4518, 102, 0, 0],[ 101, 100, 2523, 3300, 6637, 102, 0, 0]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 0, 0],[1, 1, 1, 1, 1, 1, 0, 0]])}
ID → 文本 (decode
)
# 基本解碼
decoded_text = tokenizer.decode(input_ids)
print("解碼結果:", decoded_text)# 去特殊標記解碼
clean_decoded = tokenizer.decode(input_ids, skip_special_tokens=True)
print("干凈解碼:", clean_decoded)# 保留特殊標記
full_decoded = tokenizer.decode(input_ids, skip_special_tokens=False)
print("完整解碼:", full_decoded)
輸出結果
解碼結果: [CLS] hello, how are you? [SEP]
干凈解碼: hello, how are you?
完整解碼: [CLS] hello, how are you? [SEP]
4. 詞匯表操作
詞匯表查詢
# 查看詞匯量
print(f"詞匯表大小: {len(tokenizer)}")# 查看特定token信息
print("hello的ID:", tokenizer.convert_tokens_to_ids("hello"))
print("ID 102對應的token:", tokenizer.convert_ids_to_tokens(102))# 特殊標記信息
print(f"[CLS]標記: {tokenizer.cls_token} (ID: {tokenizer.cls_token_id})")
輸出結果
詞匯表大小: 21128
hello的ID: 8701
ID 102對應的token: [SEP]
[CLS]標記: [CLS] (ID: 101)
擴展詞匯表
# 添加新詞匯
new_tokens = ["穩(wěn)扎穩(wěn)打", "C++", "?", "transformers"]
num_added = tokenizer.add_tokens(new_tokens)
print(f"添加了{num_added}個新詞匯")# 驗證添加效果
for token in new_tokens: print(f"{token}的ID:", tokenizer.convert_tokens_to_ids(token))# 獲取所有特殊標記
print("特殊標記映射:", tokenizer.special_tokens_map)
咱可以看看效果
# 查看編碼后的
tokens = tokenizer("hello,how are you? ?")
pprint(tokens)
# 查看分詞后的
res = tokenizer.tokenize("hello,how are you? ?")
pprint(res)
# 查看ID解碼
print(tokenizer.decode(tokens["input_ids"]))
輸出,可以看到?jīng)]有 [UNK] 未知標簽
{'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1],'input_ids': [101, 8701, 117, 9510, 8995, 8357, 136, 21130, 102],'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0]}
['hello', ',', 'how', 'are', 'you', '?', '?']
[CLS] hello, how are you? ? [SEP]
擴展詞匯表場景:
- 領域專業(yè)術語(醫(yī)療、法律等)
- 新出現(xiàn)詞匯(網(wǎng)絡用語、新興技術)
- 特殊符號(表情、公式符號)
五、相關閱讀
- How Transformers work in deep learning and NLP: an intuitive introduction
深度學習和自然語言處理中 Transformers 的工作原理:直觀入門 - Transformer Architecture Transformer 架構
- Attention Is All You Need
- 深入淺出 Hugging Face:解鎖 NLP 的強大工具