概述
🤗 Optimum 提供了一個名為 BetterTransformer 的 API,這是標準 PyTorch Transformer API 的快速路徑,能夠通過稀疏性和融合內核(如 Flash Attention)在 CPU 和 GPU 上實現有趣的加速。目前,BetterTransformer 支持來自原生 nn.TransformerEncoderLayer
的快速路徑,以及 torch.nn.functional.scaled_dot_product_attention
中的 Flash Attention 和 Memory-Efficient Attention。
快速入門
自 1.13 版本以來,PyTorch 發布 了其標準 Transformer API 的穩定版本,為基于 Transformer 的模型提供了開箱即用的性能改進。你可以在大多數消費類設備上獲得有趣的加速,包括 CPU、舊版和新版的 NVIDIA GPU。現在,你可以在 🤗 Optimum 中與 Transformers 一起使用這個功能,并將其用于 Hugging Face 生態系統中的主要模型。
在 2.0 版本中,PyTorch 將本地縮放點積注意力運算符 (SDPA) 包含在 torch.nn.functional
中。這個函數包含了幾種實現方式,可以根據輸入和使用的硬件進行應用。有關更多信息,請參見官方文檔和此博客文章中的基準測試。
我們在 🤗 Optimum 中提供了這些優化的開箱即用集成,因此你可以轉換任何支持的 🤗 Transformers 模型,使其在相關情況下使用優化路徑和 scaled_dot_product_attention
函數。
PyTorch 原生的 scaled_dot_product_attention
正在慢慢成為默認值,并在 🤗 Transformers 中集成。對于在 Transformers 中支持 SDPA 的模型,我們不再推薦使用 BetterTransformer,而是建議直接使用 Transformers 和 PyTorch 的最新版本進行注意力優化(Flash Attention 和 memory-efficient attention),通過 SDPA 實現。
PyTorch 原生的 scaled_dot_product_attention
運算符只能在未提供 attention_mask
的情況下調度到 Flash Attention。
因此,默認情況下,在訓練模式中,BetterTransformer 集成 放棄了 mask 支持,僅可用于不需要批量訓練填充 mask 的訓練。例如,這種情況適用于掩碼語言模型或因果語言模型。BetterTransformer 不適用于需要填充 mask 任務的模型微調。
在推理模式中,為了保證正確性,保留填充 mask,因此僅在 batch size = 1 的情況下可以預期加速。
支持的模型
以下是支持的模型列表:
- AlBERT
- Bark
- BART
- BERT
- BERT-generation
- BLIP-2
- BLOOM
- CamemBERT
- CLIP
- CodeGen
- Data2VecText
- DistilBert
- DeiT
- Electra
- Ernie
- Falcon (無需使用 BetterTransformer,因其已被 Transformers 直接支持)
- FSMT
- GPT2
- GPT-j
- GPT-neo
- GPT-neo-x
- GPT BigCode (SantaCoder, StarCoder - 無需使用 BetterTransformer,因其已被 Transformers 直接支持)
- HuBERT
- LayoutLM
- Llama & Llama2 (無需使用 BetterTransformer,因其已被 Transformers 直接支持)
- MarkupLM
- Marian
- MBart
- M2M100
- OPT
- ProphetNet
- RemBERT
- RoBERTa
- RoCBert
- RoFormer
- Splinter
- Tapas
- ViLT
- ViT
- ViT-MAE
- ViT-MSN
- Wav2Vec2
- Whisper (無需使用 BetterTransformer,因其已被 Transformers 直接支持)
- XLMRoberta
- YOLOS
如果你希望支持更多模型,請在 🤗 Optimum 中打開一個 issue,或者查看貢獻指南 以了解如何自行添加!
快速使用
為了使用 BetterTransformer
API,只需運行以下命令:
from transformers import AutoModelForSequenceClassification
from optimum.bettertransformer import BetterTransformer
model_hf = AutoModelForSequenceClassification.from_pretrained("bert-base-cased")
model = BetterTransformer.transform(model_hf, keep_original_model=False)#不保留原模型
以bge-m3-reranker-v2為例,3090下fp16+bettertransformer 對比fp32可以加速2.5x左右