PyTorch 2.15 MPS 发行说明

概述

PyTorch 2.15 通过引入原生 FP8 支持、优化的 LLM 解码路径以及向专用 Metal 内核的转变,显著提升了 Apple Silicon 用户的性能和内存效率。这些更新减少了对 MPSGraph 的依赖,从而加快了密集模型和混合专家 (MoE) 模型的推理速度,并为视频生成等复杂工作负载提供了更稳定的内存使用。

关键技术改进

FP8 支持

PyTorch 2.15 在 MPS 后端增加了对 torch.float8_e4m3fn 张量的支持。这允许开发人员每个元素仅使用一个字节来存储值,与 FP16 或 BF16 相比,有效地将内存占用减半。此版本包含用于 GPU 上直接 FP8 矩阵乘法的 F.scaled_mm,支持张量级和行级缩放。

LLM 解码优化

通过绕过 MPSGraph 转而使用原生 Metal 内核,密集模型和 MoE 模型的解码性能均得到了大幅提升:

  • 线性层: F.linear 现在利用专门的矩阵向量内核,在常见的解码形状中提供了 1.23 倍的几何平均加速。
  • MoE 模型: 新的原生分组矩阵乘法实现允许更快的 Token 路由。在 M3 Ultra 上使用 torch.compile 时,Qwen3.6-35B-A3B 等 MoE 模型的吞吐量从 9.4 tokens/s 提升至 61.3 tokens/s。
  • Softmax: 与之前的 MPSGraph 实现相比,专用的 Metal 内核将 softmax 和 log_softmax 操作的延迟降低了约 8 倍。

视频工作负载中的内存管理

通过用专用 Metal 内核替换基于 MPSGraph 的填充,PyTorch 2.15 解决了视频处理中严重的内存开销问题。例如,Wan2.2 的分块 VAE 解码过程现在峰值内存占用为 8 GiB,而之前版本高达 270 GiB。

线性代数与运算

线性代数功能已扩展,包括:

  • 复值 LU 分解、LU 求解和三角求解。
  • 针对小矩阵求逆(最大 4x4)的优化内核,以及提高了 SVD 操作的鲁棒性。
  • 针对 conv1d、常量/反射/复制填充以及上采样反向传播的基于 Metal 的新路径。

开发人员控制与要求

开发人员现在可以通过 torch.mps.Stream 和 torch.mps.stream 上下文管理器对执行进行更细粒度的控制,从而实现显式的流管理和同步。

系统要求:

  • macOS: 15 或更高版本。
  • Python: 3.11 或更高版本。

未来展望:PyTorch 2.16

2.16 版本的开发重点是进一步减少对 MPSGraph 的依赖。计划的改进包括:

  • 全 Metal 注意力机制: 将缩放点积注意力机制完全过渡到 Metal 内核。
  • 命令缓冲区优化: 每 16 个内核提交一次命令缓冲区,以允许在解码期间进行并发的 GPU/CPU 执行。
  • 二进制大小缩减: 默认编译用于 Metal 3.1 的捆绑着色器,以减小 libtorch_cpu.dylib 的大小。

Sources