在現代 CPU 上擴展類 BERT 模型推理 - 第二部分
TL;DR
Hugging Face 已證明,優化軟體組件——特別是記憶體配置器、並行化函式庫以及使用貝氏優化(Bayesian optimization)——可以顯著增強類 BERT 模型在 Intel Ice Lake Xeon CPU 上的推理性能。這些優化結合了 AVX-512 和 VNNI 等硬體特性,使得在基於 CPU 的基礎設施上更有效地擴展 NLP 工作負載。
利用 Intel 軟體提升 AI 效率
為了在 Intel 硬體上最大化 AI 工作負載的性能,開發者可以利用 Intel oneAPI 架構下的軟體優化堆疊。這些工具旨在縮小高階框架(如 PyTorch 和 TensorFlow)與底層 CPU 架構之間的差距。
關鍵軟體組件
- Intel oneMKL (Math Kernel Library): 提供高效的線性代數例程。
- Intel OpenMP 和 oneTBB (Threading Building Blocks): 用於計算的高階並行化框架。
- Intel oneDNN: 一個深度神經網路原語(例如 ReLU、全連接層)的函式庫,已原生整合至 PyTorch 和 TensorFlow(自 2.5.0 版本起)。
- Intel PyTorch Extension (IPEX): 一個專門的框架,在優化方案被併入 PyTorch 主函式庫之前,充當優化實驗室。
CPU 推理的性能調優參數
推理性能主要由三個因素驅動:記憶體中的數據表示、數學算子的實現,以及並行化的效率。
記憶體配置與管理
記憶體配置(向 OS 請求動態記憶體的過程)會影響速度與碎片化。雖然 glibc 等預設配置器是通用型的,但專用的配置器可以減少多執行緒深度學習工作負載中的同步開銷開銷。
- tcmalloc (Google): 透過為每個執行緒維護本地記憶體段,通常在各種工作負載中提供最佳性能,從而減少全域性的關鍵路徑。
- jemalloc (Facebook): 在特定的低併發情況下可能最快。
- mimalloc (Microsoft): 另一種改進記憶體管理的替代方案。
計算的並行化
高效利用多個 CPU 核心需要的不僅僅是增加核心數。CPU 快取失效(cache invalidation)和併發數據存取等因素可能會阻礙擴展性。 Hugging Face 建議在 Intel 硬體上使用 Intel 實現的 OpenMP 規範("IOMP")以優化執行緒派遣與資源綁定。
優化的數學算子
現代 CPU 使用 SIMD(Single Instruction Multiple Data)指令來在每個時鐘週期內處理多個項目。Intel CPU 支持 SSE2, AVX, AVX2, 和 AVX-512。Intel MKL 和 oneDNN 等函式庫高效地實現了這些算子,從而為常見模式(如 Linear + ReLU 或 Convolution)實現性能提升。
在 Intel Ice Lake Xeon CPU 上的基準測試
基準測試是在 Ubuntu 20.04.2 LTS 上使用 Intel Ice Lake Xeon Platinum 8380 CPU 進行的,測試了 PyTorch 1.9.0 和 TensorFlow 2.5.0 在各種批次大小(1 到 128)和序列長度(8 到 512)下的表現。
Eager 模式 vs. Graph 模式
- Eager Mode (PyTorch, TensorFlow): 計算圖是在執行期間發現的。這提供了靈活性,但會引入運行時開銷,並使算子融合(例如 Convolution + ReLU)變得更加困難。
- Graph Mode (TorchScript, TensorFlow Graph, Intel TensorFlow): 圖是預先先知的,允許進行剪枝、算子融合以及預先規劃的記憶體配置。
關於擴展性的關鍵發現
- Core Scaling: 增加核心數通常會降低延遲,但並非單調遞增。工作負載大小與分配的資源之間存在權衡。
- Inter-Socket Overhead: 在具有多個 CPU(多插槽)的系統上使用所有核心,通常會因為插槽間通信(inter-socket communication)而引入顯著的延遲開銷。
- Allocator Impact: 在需要動態管理記憶體的 Eager 模式下,配置器(例如 tcmalloc)的選擇對性能的影響比 Graph 模式更為顯著,因為在 Graph 模式下資源可以被預先保留。
使用 Intel SigOpt 進行自動性能調優
由於尋找最佳設置的搜索空間非常龐大(結合了核心數、記憶體配置器、並行化函式庫、Transparent Huge Pages 和 KMP block time),暴力搜索(brute-force)調優是低效的。 Hugging Face 利用了 Intel SigOpt,它使用貝氏優化(Bayesian optimization)來更快地找到接近最佳的配置。
SigOpt 結果
- Efficiency: SigOpt 提供的性能非常接近暴力搜索的結果,與最大差距僅為 8.6%。
- Parameter Importance: 核心數量始終是最關鍵的參數。然而,對於較長的序列長度(例如 512),並行化函式庫的選擇(OpenMP vs. Intel OpenMP)相對於記憶體配置器的重要性變得更加顯著。
- Resource Optimization: SigOpt 識別出使用較少的核心(例如 16 個核心)有時可以產生最佳延遲,從而允許多個模型實例並行運行以提高整體吞吐量。
結論
在 Intel Ice Lake Xeon CPU 上為生產環境優化 BERT-like 模型需要一種分層方法:從底層硬體特性開始,轉向框架特定的優化(如 oneDNN),最後調優系統層級的參數,例如記憶體配置器和 OpenMP 實現。這些工作已整合至 Hugging Face Optimum 函式庫和 Infinity 產品中,以提供高效率的容器化推理解決方案。