PyTorch 2.15 MPS リリースノート
概要
PyTorch 2.15 は、ネイティブな FP8 サポート、最適化された LLM デコードパス、および専用の Metal カーネルへの移行を導入することで、Apple Silicon ユーザーのパフォーマンスとメモリ効率を大幅に向上させます。これらのアップデートにより MPSGraph への依存が軽減され、密行列モデルや Mixture-of-Experts (MoE) モデルの推論が高速化されるほか、動画生成のような複雑なワークロードにおけるメモリ使用量がより安定します。
主な技術的改善
FP8 サポート
PyTorch 2.15 では、MPS バックエンドで torch.float8_e4m3fn テンソルがサポートされました。これにより、開発者は要素あたり 1 バイトのみを使用して値を格納できるようになり、FP16 や BF16 と比較してメモリフットプリントを実質的に半分に削減できます。今回のリリースには、GPU 上での直接的な FP8 行列乗算を行うための F.scaled_mm が含まれており、テンソル単位および行単位のスケーリングの両方をサポートしています。
LLM デコードの最適化
MPSGraph をバイパスしてネイティブな Metal カーネルを採用することで、密行列モデルと MoE モデルの両方でデコードパフォーマンスが大幅に向上しました。
- 線形層:
F.linearが専用の行列ベクトルカーネルを利用するようになり、一般的なデコード形状全体で 1.23 倍の幾何平均速度向上を実現しました。 - MoE モデル: 新しいネイティブなグループ化行列乗算の実装により、トークンのルーティングが高速化されました。M3 Ultra で
torch.compileを使用した場合、Qwen3.6-35B-A3B のような MoE モデルのスループットは 9.4 トークン/秒から 61.3 トークン/秒に向上しました。 - Softmax: 専用の Metal カーネルにより、従来の MPSGraph 実装と比較して softmax および log_softmax 操作のレイテンシが約 8 倍削減されました。
動画ワークロードにおけるメモリ管理
MPSGraph ベースのパディングを専用の Metal カーネルに置き換えることで、PyTorch 2.15 は動画処理における重大なメモリオーバーヘッドの問題を解決しました。例えば、Wan2.2 のタイル化 VAE デコードプロセスでは、以前のバージョンで 270 GiB 必要だったメモリが最大 8 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 カーネルへ移行します。
- コマンドバッファの最適化: デコード中の GPU/CPU 並列実行を可能にするため、16 カーネルごとにコマンドバッファをコミットします。
- バイナリサイズの削減:
libtorch_cpu.dylibのサイズを削減するため、デフォルトで Metal 3.1 用のバンドルシェーダーをコンパイルします。
Sources
- OriginalMPS in PyTorch 2.15