Hugging Face tokenizers v1 發布說明

Hugging Face 已推出 tokenizers v1 的發行候選版本,專注於極致的效能優化,確保隨著模型速度與工作負載的提升,分詞不會成為瓶頸。在 Apple M4 Max 上,v1 在十個測量的模型家族中,編碼速度比 v0.23 快 3 到 30 倍,其中 GPT-2 的提升最為顯著。

核心技術優化

v1 的效能提升來自於對分詞流程的全面重構,特別針對大多數運算發生的模型階段進行優化。該程式庫與 v0.23 完全相容,產生相同的 token ID、API 和詞彙表。

SIMD-based Splitting (Bitcannon)

BPE 模型通常使用正規表示式將輸入文字分割為預分詞。v1 以「bitcannon」取代通用的 regex 引擎,這是一個手寫的分割函數,使用 SIMD(Single Instruction, Multiple Data)指令。透過將輸入位元視為平行的位元流,它能在整個暫存器上執行布林運算以識別邊界,每次暫存器操作可處理 64 個位元。此方法適用於大多數位元級 BPE 模型,包括 GPT-2、cl100k、o200k、Tekken 和 DeepSeek。

Word Caching

為避免重複運算,v1 實作了執行緒本地的詞彙快取。由於 BPE 對任何給定的預分詞會產生決定性的 token ID,因此程式庫現在將預分詞位元映射至完成的 ID。當文字中重複出現某個詞時,分詞器會完全跳過合併流程,直接從快取中取得結果。

Allocation-Free Merge Loop

BPE 合併迴圈已重寫,以消除重複的記憶體配置。主要變更包括:

  • Scratch Buffers: 合併的工作集現在位於呼叫者擁有的暫存緩衝區中,避免在迴圈中觸及配置器。
  • Intrusive Doubly-Linked Lists: 符號儲存在平坦陣列中,並透過位置連結,使合併可透過更新兩個索引完成,而非移動資料。
  • Integer Comparison: 候選配對被打包成 64 位元值,合併等級位於高位元,使迴圈能透過簡單的整數比較找出下一個合併,無需分支。

性能與擴展性

透過 tokbench 個人程式庫進行的基準測試顯示,v1 在八個工作執行緒下可達 76% 的線性擴展效率。程式庫也已重新結構化為工作區,以減少二進位檔大小與相依性開銷:

  • tk-encode:編碼所需的執行時。
  • tk-serialize、tk-convert 和 tk-train:僅在需要特定功能時才連結的可選套件。

實作路線圖

發行候選版本功能

除了核心編碼加速外,目前的發行候選版本還包含:

  • 可平行解碼,直接將位元寫入可重用的緩衝區,避免中間字串。
  • Node.js 繫結。
  • 支援 role_to_token。
  • 批次模型呼叫,可在單一呼叫中處理多個預分詞區段。

預計 v1.0.0 及未來更新

即將推出的穩定版 1.0.0 將包含:

  • 統一編碼: 在訓練驗證期間使用 tk-encode,確保訓練與推論之間的一致性。
  • 繫結改進: 更簡單的 Python 繫結,減少鎖定並支援自由執行緒的 CPython,以及針對 llama.cpp 和 ExecuTorch 的僅推論 C/C++ 繫結。
  • 優化元資料: 可選計算偏移與遮罩,以保持僅 token-ID 的路徑輕量。

在 1.0.0 版本發布後,Hugging Face 計畫探索 tok-devices,這是一個可選元件,支援 GPU 基於的編碼與批次解碼,以在大型批次中將文字與 token ID 保留在裝置上。

Sources