只需幾個小操作,就能讓transformer模型推理速度加3.5倍

機器之心報道

編輯:澤南

你在用 PyTorch 寫 transformer 嗎?請關注下這個專案。

大多數關於在生產中部署 Transformer 類模型的教程都是基於 PyTorch 和 FastAPI 構建的。兩者都是很好的工具,但在推理方面的效能不是很好。

而如果你花費時間進行研究,可以在 ONNX Runtime 和 Triton 推理伺服器上構建一些更好的東西。與普通 PyTorch 相比,推理速度通常會快 2 到 4 倍。

如果你想要在 GPU 上獲得一流的效能,那麼只有一種可能的組合:Nvidia TensorRT 和 Triton。與普通 PyTorch 相比,最終可以獲得 5 倍的推理速度。有時它甚至能將推理速度提高 10 倍。

然而 TensorRT 並不是以簡單易用著稱的,對於 Transformer 模型更是如此,它需要使用特定的技巧。

只需幾個小操作,就能讓transformer模型推理速度加3.5倍

然後,如果你花一些時間,你可以在 ONNX Runtime 和 Triton 推理伺服器上構建一些東西。與普通 Pytorch 相比,你的推理速度通常會快 2 到 4 倍。

近日,Hugging Face 釋出了一款名為 Infinity 的商業產品,可以以非常高的效能進行推理(與 PyTorch + FastAPI 部署相比,速度非常快)。不幸的是,根據該公司產品總監的說法,即使對於部署在一臺機器上的單個模型,這也是一種付費產品,成本為 2 萬美元(沒有公開的具體規模資訊)。

在 GitHub 上有一個專案 Transformer-deploy,它是一種基於企業級軟體的開源替代版:

推理伺服器:Nvidia Triton(它接受查詢,傳輸給引擎,並新增對推理有用的功能,如動態批處理或多推理引擎排程)

推理引擎:Microsoft ONNX Runtime(用於 CPU 和 GPU 推理)和 Nvidia TensorRT(僅限 GPU)

我們似乎不費吹灰之力,就可以輕鬆匹敵極少數 HF Infinity 公共基準。

但事實上,現在仍然有機會進一步加快推理效能,AFAIK 尚未被任何其他 OSS 專案利用:對所有 Transformer 模型的 GPU 量化!

如下是對 Roberta-base、seq len 256、batch 32、MNLI 資料集的測試結果:

只需幾個小操作,就能讓transformer模型推理速度加3.5倍

原始碼:https://github。com/ELS-RD/transformer-deploy/blob/main/demo/quantization/quantization_end_to_end。ipynb

專案 GitHub:https://github。com/ELS-RD/transformer-deploy

執行 GPU 量化需要修改模型原始碼(在矩陣乘法等代價高昂的操作上新增一些稱為 QDQ 的特定節點),這既容易出錯,又很枯燥,並且是件自己給自己挖坑的事。對此,專案作者已經為多個模型手動完成了這項工作。在作者看來,只需修補模型模組抽象語法樹(也就是原始碼)就可以自動完成這項工作。

從使用者端看,在 GPU 上執行模型的基本量化看起來就像這樣:

只需幾個小操作,就能讓transformer模型推理速度加3.5倍

如基準測試結果所示,要獲得比普通 PyTorch 快 4。5 倍的模型,在 MNLI 資料集上的準確率需要犧牲 0。4 個百分點,這在許多情況下是一個合理的權衡。如果不希望損失準確度,加速也可以降到 3。2 倍左右。當然,實際應用時的 trade-off 取決於模型、資料集等,但它給出了一個基本概念。與該專案的先前版本相比,這是一個很大的改進。

成倍加速的背後,transformer 的原始碼被解析為 AST,像 matmul 或 LayerNorm 這樣的運算元被一個量化器包裝,線性層被它們的量化版本替換,一些不支援的 TensorRT 運算元被替換等等。然後還有一部分新的原始碼替換。

作者表示,他們目前已經成功測試了 ALBERT、BERT(包括 miniLM)、DistilBERT、Roberta(包括 Camembert、XLM-R、DistilRoberta 等)、Electra 的推理。對於任何可以匯出為 ONNX 格式的 transformer 模型,它應該都是開箱即用的,或者只需很少的努力。

關於 CPU 的推理、量化非常容易,且也是由 Transformer-deploy 專案支援的。但是在極端情況下,transformer 的效能會變得非常差(如沒有批處理、非常短的序列和蒸餾模型時)。另外如使用基於上代英特爾 CPU 的例項,如 C6 或 M6,與像 Nvidia T4 這樣的廉價 GPU 相比,在 AWS 上的價效比會很低。

綜上所述,在 Transformer 推理上,除非你對慢速推理感到滿意並採用小例項,否則並不推薦使用 CPU 推理。

參考連結:https://www。reddit。com/r/MachineLearning/comments/rr17f9/p_45_times_faster_hugging_face_transformer/

TAG: 推理TransformerGPU模型PyTorch