⚠️ 注意:維護有限
本專案不再積極維護。雖然現有版本仍然可用,但沒有計劃進行更新、錯誤修復、新功能或安全補丁。使用者應注意漏洞可能不會得到解決。
效能指南¶
如果您有興趣最佳化使用 TorchServe 服務的 PyTorch 模型的記憶體使用、延遲或吞吐量,本指南將為您提供幫助。
我們還在此處建立了一份快速清單,列出了本頁面未涵蓋的其他可嘗試事項。您可以在此處找到該清單。
最佳化 PyTorch¶
有許多技巧可以最佳化用於生產環境的 PyTorch 模型,包括但不限於蒸餾、量化、融合、剪枝、設定環境變數等,我們鼓勵您進行基準測試,看看哪種方法最適合您。
一般來說,最佳化模型很困難,最簡單的方法可能是匯出到某些執行時,如 ORT、TensorRT、IPEX 或 FasterTransformer。我們在 TorchServe GitHub 頁面上提供了許多關於如何整合這些執行時的示例。如果您喜歡的執行時不受支援,請隨時提交 PR。
torch.compile
從 PyTorch 2.0 開始,torch.compile 為大量模型提供了開箱即用的加速(約 1.8 倍)。您可以參考此 儀表板,它每晚跟蹤此情況。
使用 torch.compile 完全最佳化的模型效能提升高達 10 倍
使用較小批次大小時,將 torch.compile 與 mode="reduce-overhead" 配合使用可以提高效能,因為它利用了 CUDA graphs。
您可以在此處找到 torch.compile 與 TorchServe 配合使用的所有示例。
關於 torch.compile GenAI 示例的詳細資訊可以在此連結中找到。
ONNX 和 ORT 支援
TorchServe 原生支援 ONNX 模型,這些模型可以透過 ORT 載入,用於加速 CPU 和 GPU 推理。ONNX 的操作方式與常規 PyTorch 模型略有不同,在進行轉換時,您需要明確設定輸入和輸出維度並命名。請參閱此示例。
概括來說,TorchServe 允許您執行以下操作:
打包序列化的 ONNX 權重
torch-model-archiver --serialized-file model.onnx ...使用
ort_session = ort.InferenceSession(self.model_pt_path, providers=providers, sess_options=sess_options)從base_handler.py載入這些權重,該方法支援 CPU 和 GPU 推理的合理預設設定允許您使用自定義處理器定義自定義預處理和後處理函式,以按 ONNX 模型期望的格式傳入資料
要在 TorchServe Docker 上使用 ONNX 和 GPU,我們需要構建一個以 NVIDIA CUDA 執行時 作為基礎映象的映象,如此處所示。
TensorRT
TorchServe 也支援透過 TensorRT 最佳化的模型。要利用 TensorRT 執行時,您可以按照這些說明轉換模型,完成後,您將獲得序列化的權重,可以使用 torch.jit.load() 載入這些權重。
轉換後,PyTorch 對待 Torchscript 模型和 TensorRT 模型的方式沒有區別。
Better Transformer
來自 PyTorch 的 Better Transformer 為 Transformer 編碼器推理實現了 torch.nn.TransformerEncoder 的向後相容的快速路徑,並且不需要模型作者修改其模型。BetterTransformer 的改進在許多常見執行場景下可以帶來超過 2 倍的加速和吞吐量提升。您可以在此處和此處找到有關 Better Transformer 的更多資訊。
最佳化 TorchServe¶
如果您嘗試從 config.properties 檔案中提高 TorchServe 的效能,您應該更改的主要設定是 batch_size 和 batch_delay。更大的批次大小意味著更高的吞吐量,但會犧牲延遲。
其次重要的設定是 worker 數量和 GPU 數量,這將對 CPU 和 GPU 效能產生顯著影響。
併發和 worker 數量
TorchServe 暴露了配置,允許使用者配置 CPU 和 GPU 上的 worker 執行緒數量。有一個重要的配置屬性可以根據工作負載加快伺服器速度。注意:以下屬性在重負載下影響更大。
在 CPU 上執行 TorchServe
如果在 CPU 上使用 TorchServe,您可以透過在 config.properties 中設定以下項來提高效能:
cpu_launcher_enable=true
cpu_launcher_args=--use_logical_core
這些設定透過啟動器核心繫結顯著提高了效能。有關此改進背後的理論,請參閱此部落格,其要點可快速概括如下:
在啟用超執行緒的系統中,透過核心繫結將執行緒親和性僅設定為物理核心,從而避免使用邏輯核心。
在具有 NUMA 的多插槽系統中,透過核心繫結將執行緒親和性設定為特定插槽,從而避免跨插槽遠端記憶體訪問。
在 GPU 上執行 TorchServe
有一個配置屬性 number_of_gpu,它告訴伺服器每個模型使用特定數量的 GPU。在我們向伺服器註冊多個模型的情況下,這適用於所有已註冊的模型。如果此值設定得較低(例如:0 或 1),將導致 GPU 利用不足。相反,如果設定得較高(>= 系統上可用的最大 GPU 數量),則每個模型將生成相應數量的 worker。顯然,這將導致對 GPU 的不必要爭用,並可能導致執行緒到 GPU 的排程次優。
ValueToSet = (Number of Hardware GPUs) / (Number of Unique Models)
NVIDIA MPS
雖然 NVIDIA GPU 允許多個程序在 CUDA 核心上執行,但這也有其自身的缺點,即:
核心的執行通常是序列化的
每個程序建立自己的 CUDA 上下文,這會佔用額外的 GPU 記憶體
為了克服這些缺點,您可以利用 NVIDIA 多程序服務 (MPS) 來提高效能。您可以在此處找到有關如何在 TorchServe 中利用 NVIDIA MPS 的更多資訊。
NVIDIA DALI
NVIDIA 資料載入庫 (DALI) 是一個用於資料載入和預處理以加速深度學習應用的庫。它可以作為流行深度學習框架中內建資料載入器和資料迭代器的可移植替代品。DALI 提供了一系列高度最佳化的構建塊,用於載入和處理影像、影片和音訊資料。您可以在此處找到 DALI 最佳化與 TorchServe 整合的示例。
基準測試¶
為了更輕鬆地比較各種模型和 TorchServe 配置,我們添加了一些輔助指令碼,它們將效能資料(如 p50、p90、p99 延遲)以清晰的報告形式輸出到此處,並且大多需要您透過 JSON 或 YAML 指定一些配置。您可以在此處找到有關 TorchServe 基準測試的更多資訊。
效能分析¶
TorchServe 原生支援 PyTorch profiler(效能分析器),這將幫助您找到程式碼中的效能瓶頸。
如果您建立了自定義的 handle 或 initialize 方法覆蓋 BaseHandler,則必須定義 self.manifest 屬性才能執行 _infer_with_profiler。
export ENABLE_TORCH_PROFILER=TRUE
訪問此連結,瞭解更多關於 PyTorch profiler(效能分析器)的資訊。
更多資源¶
TorchServe 在 Animated Drawings 應用中的應用
要深入瞭解如何在應用程式中微調 TorchServe 效能,請參閱此文章。此處顯示的案例研究使用了 Meta 的 Animated Drawings App 來提高 TorchServe 效能。
效能清單
我們還在此處建立了一份快速清單,列出了本頁面未涵蓋的其他可嘗試事項。您可以在此處找到該清單。