使用 Hugging Face Transformers 與 AWS Inferentia 加速 BERT 推論

TL;DR

Hugging Face 已展示如何透過使用 AWS Neuron SDK 編譯 Transformers 模型,並經由 Amazon SageMaker 部署於 AWS Inferentia 晶片上,來加速 BERT 推論。這種方法將序列長度為 128 時的延遲降低至 5-6ms,且與傳統基於 GPU 的 EC2 執行個體相比,提供了更高的吞吐量與更低的成本。

用於 Transformer 加速的 AWS Inferentia

AWS Inferentia 是專為優化推論工作負載而設計的自定義機器學習晶片。根據 AWS 的說法,與同世代的基於 GPU 的 Amazon EC2 執行個體相比,Inferentia 可提供高達 80% 的更低推論成本,以及高達 2.3 倍的更高吞吐量。

該架構利用「Neuron Cores」,即晶片內的自定義加速器。每個 Inferentia 晶片包含四個 Neuron Cores,允許使用者進行以下操作之一:

  • 每核心載入一個模型以最大化吞吐量。
  • 在所有核心上載入一個模型以最小化延遲。

BERT 部署的技術工作流程

在 AWS Inferentia 上部署類似 BERT 的模型(例如 distilbert-base-uncased-finetuned-sst-2-english)涉及多步驟的編譯與部署流程。

1. 透過 AWS Neuron SDK 進行模型轉換

AWS Neuron SDK 提供深度學習編譯器與執行環境,可將 PyTorch 與 TensorFlow 模型轉換為適用於 EC2 Inf1 執行個體的 Neuron 相容格式。

由於 AWS Neuron SDK 不支援動態形狀(dynamic shapes),輸入大小在編譯與推論期間必須是靜態的。例如,若模型是以批次大小(batch size)為 1 且序列長度為 128 編譯的,則它只能處理該精確形狀的輸入。

2. 自定義推論腳本編寫

雖然 Hugging Face Inference Toolkit 支援許多模型的零代碼(zero-code)部署,但 AWS Inferentia 目前仍需要自定義的 inference.py 腳本。此腳本必須定義:

  • model_fn: 用於載入 tokenizer、neuron 模型以及模型配置。
  • predict_fn: 用於處理輸入嵌入(embeddings),確保其符合靜態序列長度(透過填充與截斷),並執行推論。

為了最大化吞吐量,會使用環境變數 NEURON_RT_NUM_CORES=1 以確保每個 HTTP worker 利用單個 Neuron core。

效能結果

在包含 10,000 次同步請求的負載測試中,BERT 模型在序列長度為 128 時達到了平均 5-6ms 的延遲。

Hugging Face 得出結論,此設定比基於 CPU 的推論更快,且透過在 Neuron Cores 上並行執行四個模型,提供了比 GPU 更高的吞吐量。這使得 AWS Inferentia 成為使用類似 BERT 的 Transformers 進行編碼器任務(如文本分類、標記分類與問答系統)的公司之可行選擇。

Sources

相關