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
- OriginalMPS in PyTorch 2.15