PyTorch 2.15为Apple MPS加入FP8并加速MoE解码,Hugging Face称最高提升 6.5 倍
Hugging Face PyTorch团队称,PyTorch 2.15在MPS后端新增FP8张量支持、原生grouped matmul与多项Metal内核;在M3 Ultra上用torch.compile运行时,Qwen3.6-35B-A3B解码速度从 9.4 提升到 61.3 tokens/s。
Hugging Face的PyTorch团队发文介绍PyTorch 2.15的MPS后端更新。该团队称,这一版本为Mac带来FP8张量、更快的语言模型解码路径,以及一批从MPSGraph迁移到Metal的内核。
据其发布说明,在M3 Ultra上配合torch.compile,MoE模型Qwen3.6-35B-A3B的解码速度从 2.14 的 9.4 tokens/s升至 61.3 tokens/s,LFM2.5-8B-A1B从 23.6 升至 123.6 tokens/s。上述数字由该团队提供。
使用门槛同步提高:团队称MPS现在要求macOS 15或更高版本,PyTorch 2.15要求Python 3.11或更高版本。
FP8与MoE解码的改动
团队称,PyTorch 2.15在MPS上新增torch.float8_e4m3fn张量,每个值占一字节,为FP16或BF16的一半,并可通过F.scaled_mm直接在GPU上相乘,支持tensorwise与rowwise缩放。
MoE解码加速来自原生grouped matmul:2.14 会把分组偏移复制到CPU再按组循环,2.15 的Metal内核在GPU上直接读取偏移,并为解码时常见的小分组提供单独内核。团队称这是MoE模型解码提升约 1.3 倍的原因之一。
稠密模型也受益于单行线性层接入GEMV内核,以及softmax和log_softmax改用专用Metal内核。团队称,在来自真实模型的 96 个BF16层形状上,线性层几何平均加速 1.23 倍,小投影获益最大,大型层和LM head已接近带宽上限,速度基本不变。
视频解码内存与图像编辑修复
团队称,Wan-AI/Wan2.2-TI2V-5B-Diffusers的VAE解码在完整 28 个tile中调用padding 8,764 次。constant padding改由Metal内核处理后,驱动内存峰值从约 270 GiB降至约 8 GiB;张量分配峰值从 4.422 GiB降至 4.095 GiB,分配器预留峰值保持 8.070 GiB。
同一padding改动还修复了Qwen-Image-2.1在 2.14 上VAE编码器静默损坏图像的问题。团队称该问题在ComfyUI中被报告,修复后编码解码往返与CPU的PSNR为 29.95 dB,此前为 10.06 dB。
其他运算与Python侧控制
团队称,2.15 为MPS增加复数LU分解、LU求解和三角求解,支持torch.frexp、torch.logspace、torch.take、Tensor.put_、torch.heaviside等运算,并修复了缩放点积注意力在批与头广播上的正确性问题。logspace暂不支持多元素整数或布尔输出。
Python侧新增torch.mps.Stream与torch.mps.stream上下文管理器,可指定工作运行的MPS流,Tensor.record_stream让分配器跟踪张量在其他流上的使用。
团队还预告 2.16:注意力将完全运行在Metal上,命令缓冲区每 16 个内核提交一次;在 2048 token上下文下,LFM2.5-8B-A1B从 108.8 升至 126.0 tokens/s,Qwen3.6-35B-A3B从 52.9 升至 62.8 tokens/s。团队称部分改动已进入nightly,细节可能变化。