Hugging Face 的 TensorFlow 哲學

Hugging Face 採用「Keras 為先」的哲學來支援 TensorFlow,將 Keras 視為主要的高階 API,而非需要繞過的障礙。此方式確保 transformer 模型能完整相容於標準 Keras 工作流程,包括 fit()compile()predict(),同時利用 XLA 取得與 JAX 與 PyTorch 相當的效能。

與 Keras 的深度整合

transformers 套件中的所有 TensorFlow 模型與層皆以 Keras Model 與 Layer 物件實作。此設計讓使用者能使用標準 Keras 方法進行訓練與推論,無需自行撰寫低階訓練迴圈。

模型組合與彈性

Keras 子類化允許建立混合模型。使用者可以將多個預訓練模型(例如將語言模型與視覺 transformer 合併)結合成單一 Keras 模型。這使得在保有高階 API 好處的同時,仍能開發複雜的架構。

自動化損失函式

為簡化訓練流程,Hugging Face 提供與基礎模型與輸出類型相匹配的預設損失函式。若使用者在呼叫 compile() 時未提供 loss 參數,函式庫會自動提供能正確處理 padding 與 masking 的損失函式(例如 BERT 的 masked language modeling loss)。使用者可在 compile() 中指定自訂 loss,或在子類化模型中實作自己的 train_step() 以覆寫。

標準化標籤處理

現在的標籤會使用標準 Keras 的慣例傳遞(作為單獨的參數或作為 (inputs, labels) 元組的一部分),而非放在輸入字典中。此變更確保與標準 Keras 指標相容,並減少使用者的困惑。

資料管線最佳化

為避免將整個已分詞的資料集全部載入記憶體,Hugging Face 將 datasets 套件與 tf.data 整合。

使用 prepare_tf_dataset() 進行高效串流

雖然小型資料集可以直接轉換為 NumPy 陣列,但較大的資料集則受惠於 prepare_tf_dataset() 方法。此方法會將資料集包裝成 tf.data.Dataset 物件,具備以下優勢:

  • 即時載入:資料會從磁碟串流,而非一次性載入記憶體。
  • 動態 padding:在 batch 層面執行 padding,而非整個資料集,減少填充 token 數量並提升訓練速度。
  • 自動過濾:模型會自動過濾掉對特定架構而言不是有效輸入名稱的資料集欄位。

效能與部署

XLA 加速

Hugging Face 使用 XLA(Accelerated Linear Algebra),這是一個 TensorFlow 與 JAX 共享的 JIT 編譯器,用以最佳化線性代數程式碼,提升執行速度並降低記憶體使用量。

主要的效能提升包括:

  • 生成速度:使用 XLA 的更新版 generate() 程式碼,使文字生成速度快於 PyTorch,且可與 JAX 相媲美。
  • 訓練速度:TF 模型在語言模型訓練等任務上已達到接近 JAX 的速度。

XLA 的一個限制是需要靜態的輸入形狀;可變長度的序列可能會觸發重複編譯,從而抵消效能優勢。

端到端部署

為了簡化透過 TF Serving 與 TFX 的部署流程,Hugging Face 正在努力將分詞直接嵌入模型產物中。這樣在推論時就不再需要外部的 tokenizer 套件。以 BERT 為例,使用者可以透過將 tokenizer 與模型包裝成單一 Keras Model 來建立 EndToEndModel,使模型能直接接受原始字串作為輸入。

社群與模型共享

模型可使用 push_to_hub() 上傳至 Hugging Face Hub,該指令會自動建立模型頁面與生成模型卡。這讓微調模型能以與基礎模型相同的 API 方式使用,促進共享資產與實踐的開放生態系。

Sources