⚠️ 注意:有限維護
本專案不再積極維護。現有版本仍然可用,但沒有計劃的更新、錯誤修復、新功能或安全補丁。使用者應注意漏洞可能得不到解決。
模型推理最佳化清單¶
本清單描述了診斷模型推理效能問題時應完成的一些步驟。其中一些建議僅適用於 NLP 模型(例如,確保輸入不過度填充和序列分桶),但通用原則對其他模型也很有用。
通用系統最佳化¶
檢查 PyTorch、Nvidia 驅動程式和其他元件的版本,並更新到最新的相容版本。通常已知效能錯誤已得到修復。
收集系統級活動日誌以瞭解整體資源利用率。作為最佳化的第一步,瞭解模型推理管線在高層次上如何使用系統資源非常有用。即使像 nvidia-smi 和 htop 這樣簡單的 CLI 工具也很有幫助。
從對效能影響最大的目標開始。從系統活動日誌中應該可以清楚地看出最大的瓶頸在哪裡——看看模型推理之外的地方,因為預處理和後處理可能開銷很大,並且對端到端吞吐量的影響同樣大。
量化並減輕慢速 I/O(例如磁碟和網路)對端到端效能的影響。雖然最佳化 I/O 不在本清單範圍內,但可以尋找使用非同步、併發、流水線等技術來有效“隱藏”I/O 開銷的方法。
對於長度動態的輸入序列(例如,用於 NLP 的 transformer)的模型推理,確保分詞器不過度填充輸入。如果一個 transformer 是用填充到固定長度(例如 512)進行訓練,並以相同的填充進行部署,那麼在短序列上執行時會不必要地慢(數量級)。
輸入為 JPEG 格式的視覺模型通常受益於更快的 JPEG 解碼:在 CPU 上可以使用 libjpeg-turbo 和 Pillow-SIMD,在 GPU 上可以使用 torchvision.io.decode_jpeg 和 Nvidia DALI。正如這個示例所示,即使在舊的 K80 GPU 上,Nvidia DALI 也比 torchvision 快約 20%。
模型推理最佳化¶
僅在其他因素(“低垂的果實”)經過廣泛評估和解決後,才開始模型推理最佳化。
在對模型呼叫前向傳播之前使用
with torch.inference_mode()上下文或在inference()方法上使用@torch.inference_mode()裝飾器可以提高推理效能。這是透過停用檢視跟蹤和版本計數器遞增來實現的。對 GPU 推理使用 fp16。在帶有 Tensor Cores 的新 GPU 上,速度很可能會翻倍,精度損失可忽略不計。從技術上講,fp16 是一種量化型別,但由於它在推理時很少出現精度損失,因此應該始終嘗試。正如這篇文章所示,使用 fp16 可以加速大型神經網路應用。
對 CPU 推理使用模型量化(即 int8)。探索不同的量化選項:動態量化、靜態量化和量化感知訓練,以及 Intel Neural Compressor 等提供更復雜量化方法的工具。值得注意的是,量化會帶來一定的精度損失,並且在某些硬體上可能無法始終提供顯著的加速,因此這可能並非總是正確的方法。
透過智慧批處理平衡吞吐量和延遲。在滿足延遲 SLA 的同時,嘗試更大的批次大小以增加吞吐量。
嘗試最佳化的推理引擎,如 onnxruntime、tensorRT、lightseq、ctranslate-2 等。這些引擎通常除了模型量化之外,還提供額外的最佳化,如運算元融合。
嘗試模型蒸餾。這更為複雜,通常需要訓練資料,但潛在收益可能很大。例如,MiniLM 在精度上達到了原始 BERT base 模型的 99%,而速度快了 2 倍。
如果在 CPU 上工作,可以嘗試核心繫結。有關如何使用此功能的更多資訊,請參閱這篇博文。
對於長度不同的序列的批處理,序列分桶可能將吞吐量提高 2 倍。在這種情況下,序列分桶的簡單實現是在將所有輸入饋送到模型之前按序列長度排序,因為這減少了批次處理序列時不必要的填充。
雖然本清單並非詳盡無遺,但檢查這些項可能會幫助您從模型推理管線中榨取更多效能。