FP8 張量與縮放矩陣乘法正式登陸 Mac

PyTorch 2.15 在 MPS 後端新增了 torch.float8_e4m3fn 張量類型,每個數值僅佔用一 byte,儲存空間為 FP16 或 BF16 的一半。這讓使用者能在 Mac 上以更低的記憶體成本載入與處理大型模型權重。

開發者現在可以使用 F.scaled_mm 函數直接在 GPU 上進行縮放矩陣乘法,該功能支援張量級(tensorwise)與行級(rowwise)的縮放策略。這意味著 FP8 不僅僅是儲存格式,更已整合進核心的計算流程中,可直接用於推理加速。

混合專家模型解碼效能顯著提升

針對大型語言模型(LLM)的解碼階段,PyTorch 2.15 優化了單行線性層與混合專家(MoE)層的處理路徑。過去 MoE 層的分組矩陣乘法需將偏移量複製到 CPU 並進行迴圈處理,現在則透過原生 Metal 核心直接在 GPU 上讀取偏移量,並針對解碼常見的小分組情況提供了專用核心。

實測數據顯示,在 M3 Ultra 硬體搭配 torch.compile 的情況下,Qwen3.6-35B-A3B 模型的生成速度從 PyTorch 2.14 的每秒 9.4 tokens 大幅提升至 61.3 tokens,增幅約為 6.5 倍。另一款模型 LFM2.5-8B-A1B 的速度則從每秒 23.6 tokens 提升至 123.6 tokens。

除了 MoE 模型,密集型(Dense)LLM 也受益於線性層與 Softmax 的優化。單行輸入現在會使用專用的矩陣向量核心,而詞彙表上的 Softmax 運算速度提升了約 8 倍,這直接降低了每個 token 生成的延遲。

影片生成記憶體佔用大幅降低

在影片生成任務中,PyTorch 2.15 透過將常數填充(Constant padding)操作從 MPSGraph 遷移至專用 Metal 核心,解決了嚴重的記憶體膨脹問題。以 Wan-AI/Wan2.2-TI2V-5B-Diffusers 模型的 VAE 解碼為例,完整解碼過程涉及 8,764 次填充呼叫。

數據顯示,採用新的 Metal 填充實作後,驅動程式記憶體峰值從約 270 GiB 驟降至 8.1 GiB。雖然分配器保留的記憶體峰值維持在 8 GiB 左右,但整體系統資源需求已大幅降低,使得原本因記憶體不足而無法執行的影片生成工作流現在可以在 Mac 上順利運行。

此外,Qwen-Image-2.1 VAE 編碼器在舊版本中會導致影像損壞的問題也已修復。經過修正後,編碼與解碼的往返測試結果與 CPU 處理結果一致,峰值信噪比(PSNR)從 10.06 dB 提升至 29.95 dB,確保了影像編輯工作流的正確性。

線性代數與基礎運算效能優化

PyTorch 2.15 擴展了 MPS 後端對複雜數值計算的支援,包括 complex64 的 LU 分解、LU 求解以及三角矩陣求解。這使得依賴這些操作的梯度計算與行列式運算也能在 GPU 上執行。

針對小型矩陣(如相機幾何變換常用的 4x4 FP32 矩陣),新增了單次 Metal 核心即可完成因式分解與求解的快速路徑。QR 分解現在使用區塊更新技術,三角求解則將部分工作轉化為高效的矩陣乘法,進一步提升了線性代數運算的整體吞吐量。

在基礎運算方面,Softmax 與 log_softmax 現在運行於專用 Metal 核心上。對於包含 128,256 個詞彙的大型詞彙表,FP32 Softmax 的執行時間從 57 微秒降至 7 微秒。其他如卷積、填充、Dropout 以及插值反向傳播等操作也獲得了針對性的 Metal 核心優化。

開發者控制權與未來版本展望

為了提供更精細的控制,PyTorch 2.15 開放了公開的 MPS 串流(Streams)介面,允許開發者透過 Python 直接指定工作執行的串流,並提供了更可靠的事件計時功能。這有助於開發者更好地管理併發任務與資源分配。

展望 PyTorch 2.16,團隊計畫將縮放點積注意力機制(Scaled dot-product attention)完全遷移至 Metal 核心,徹底移除對 MPSGraph 的依賴。初步測試顯示,在 M5 Pro 上進行分組查詢注意力解碼時,延遲可從 465 微秒降至 65 微秒。

此外,2.16 版本預計將透過預設編譯 Metal 3.1 著色器來縮減安裝包大小,預計可使 libtorch_cpu.dylib 檔案減少約 25%。團隊也承諾將持續遷移更多操作從 MPSGraph 到專用 Metal 核心,並改進 torch.compile 以減少圖斷裂(graph breaks),提升端到端的編譯效率。