使用 Hugging Face Optimum 將 Transformers 模型轉換為 ONNX
每天都有成百上千的 Transformers 實驗和模型被上傳到 Hugging Face Hub。進行這些實驗的機器學習工程師和學生使用各種框架,如 PyTorch、TensorFlow/Keras 等。這些模型已經被數千家公司使用,並構成了 AI 驅動產品的基礎。
如果您在生產環境中部署 Transformers 模型,我們建議首先將它們匯出為一種序列化格式,以便在專門的執行時和硬體上載入、最佳化和執行。
在本指南中,您將瞭解到:
讓我們開始吧!🚀
如果您有興趣最佳化您的模型以實現最高效率執行,請檢視 🤗 Optimum 庫。
1. 什麼是 ONNX?
ONNX 或開放神經網路交換 (Open Neural Network eXchange) 是一種表示機器學習模型的開放標準和格式。ONNX 定義了一套通用的運算元和一個通用的檔案格式,用於在包括 PyTorch 和 TensorFlow 在內的各種框架中表示深度學習模型。

當模型匯出為 ONNX 格式時,這些運算元被用來構建一個計算圖 (通常稱為“中間表示”),它表示資料在神經網路中的流動過程。
重要提示: ONNX 不是一個執行時。ONNX 僅是一種表示格式,可以與像 ONNX Runtime 這樣的執行時一起使用。您可以在這裡找到支援的加速器列表。
2. 什麼是 Hugging Face Optimum?
Hugging Face Optimum 是一個開源庫,是 Hugging Face Transformers 的擴充套件,它提供了一個統一的效能最佳化工具 API,以在加速硬體上實現訓練和執行模型的最大效率,包括用於在 Graphcore IPU 和 Habana Gaudi 上最佳化效能的工具包。
Optimum 可用於轉換、量化、圖最佳化、加速訓練和推理,並支援 transformers pipelines。
下面您可以看到一個典型的開發者旅程,展示瞭如何利用 Optimum 和 ONNX。

3. 支援哪些 Transformers 架構?
所有支援的 Transformers 架構列表可以在 Transformers 文件的 ONNX 部分中找到。以下是可轉換為 ONNX 並使用 Hugging Face Optimum 最佳化的最常用架構的摘錄:
- ALBERT
- BART
- BERT
- DistilBERT
- ELECTRA
- GPT Neo
- GPT-J
- GPT-2
- RoBERTa
- T5
- ViT
- XLM
- ...
4. 如何將 Transformers 模型 (BERT) 轉換為 ONNX?
目前有三種方法可以將您的 Hugging Face Transformers 模型轉換為 ONNX。在本節中,您將學習如何使用所有三種方法匯出用於“文字分類”的 distilbert-base-uncased-finetuned-sst-2-english,從底層的 torch
API 到最使用者友好的高層 optimum
API。每種方法都會做完全相同的事情。
使用 torch.onnx
匯出 (底層)
torch.onnx 允許您透過 export
方法將模型檢查點轉換為 ONNX 圖。但您必須提供許多值,如 input_names
、dynamic_axes
等。
您首先需要安裝一些依賴項
pip install transformers torch
使用 export
匯出我們的檢查點
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# load model and tokenizer
model_id = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
dummy_model_input = tokenizer("This is a sample", return_tensors="pt")
# export
torch.onnx.export(
model,
tuple(dummy_model_input.values()),
f="torch-model.onnx",
input_names=['input_ids', 'attention_mask'],
output_names=['logits'],
dynamic_axes={'input_ids': {0: 'batch_size', 1: 'sequence'},
'attention_mask': {0: 'batch_size', 1: 'sequence'},
'logits': {0: 'batch_size', 1: 'sequence'}},
do_constant_folding=True,
opset_version=13,
)
使用 transformers.onnx
匯出 (中層)
transformers.onnx 允許您透過利用配置物件將模型檢查點轉換為 ONNX 圖。這樣您就不必為 dynamic_axes
等提供複雜的配置。
您首先需要安裝一些依賴項
pip install transformers[onnx] torch
使用 transformers.onnx
匯出我們的檢查點。
from pathlib import Path
import transformers
from transformers.onnx import FeaturesManager
from transformers import AutoConfig, AutoTokenizer, AutoModelForSequenceClassification
# load model and tokenizer
model_id = "distilbert-base-uncased-finetuned-sst-2-english"
feature = "sequence-classification"
model = AutoModelForSequenceClassification.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
# load config
model_kind, model_onnx_config = FeaturesManager.check_supported_model_or_raise(model, feature=feature)
onnx_config = model_onnx_config(model.config)
# export
onnx_inputs, onnx_outputs = transformers.onnx.export(
preprocessor=tokenizer,
model=model,
config=onnx_config,
opset=13,
output=Path("trfs-model.onnx")
)
使用 Optimum 匯出 (高層)
Optimum 推理包含使用 ORTModelForXxx
類將原生 Transformers 模型轉換為 ONNX 的方法。要將您的 Transformers 模型轉換為 ONNX,您只需向 from_pretrained()
方法傳遞 from_transformers=True
,您的模型就會被載入並轉換為 ONNX,其底層利用了 transformers.onnx 包。
您首先需要安裝一些依賴項
pip install optimum[onnxruntime]
使用 ORTModelForSequenceClassification
匯出我們的檢查點
from optimum.onnxruntime import ORTModelForSequenceClassification
model = ORTModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english",from_transformers=True)
使用 Optimum 進行轉換的最大好處是,您可以立即使用該 model
來執行預測,或將其載入到 pipeline 中。
5. 下一步是什麼?
既然您已經成功將 Transformers 模型轉換為 ONNX,現在就可以使用整套最佳化和量化工具了。可能的後續步驟包括:
- 使用 onnx 模型透過 Optimum 和 Transformers Pipelines 進行加速推理
- 對您的模型應用靜態量化,以獲得約 3 倍的延遲改進
- 使用 ONNX runtime 進行訓練
- 將您的 ONNX 模型轉換為 TensorRT 以提高 GPU 效能
- ...
如果您有興趣最佳化您的模型以實現最高效率執行,請檢視 🤗 Optimum 庫。
感謝閱讀!如果您有任何問題,請隨時透過 Github 或在論壇上與我聯絡。您也可以在 Twitter 或 LinkedIn 上與我聯絡。