PyTorch 2.15でMPSのFP8とMoE復号が高速化
これまでの経緯
FP8では、torch.float8_e4m3fnのテンソルがMPSで使えるようになり、BF16の半分の容量で保持できる。F.scaled_mmはtensorwiseとrowwiseのスケーリングに対応する。LLMのデコードでは、単一行のlinear層にGEMVカーネルを接続し、96種類のBF16層形状で幾何平均1.23倍になった。MoE向けにはgrouped matmulのネイティブ実装を追加し、デコード用の専用カーネルも用意した。語彙サイズが大きいsoftmaxはMetalカーネルになり、[1, 128256]のFP32行で57 µsから7 µsに短縮された。 線形代数では、complex64のLU分解、LU solve、三角solveがMPSで動く。4×4以下のFP32行列の逆行列は単一のMetalカーネルで処理され、QRはブロック化された更新を使う。SVDも極端に小さい特異値や、大きさが極端な入力を正しく扱えるようになった。音声や動画、学習向けには、conv1d forward、constant padding、reflection・replication padding、dropout、upsampling backwardなどがMetal経由になった。Wan2.2のタイル型VAEデコードは8,764回のpadding呼び出しを含み、Metal化でメモリ暴走が解消した。Qwen-Image-2.1のVAEエンコーダが2.14で画像を壊していた問題も、同じpadding変更で直り、往復のPSNRは10.06 dBから29.95 dBになった。 Pythonからは、torch.mps.Streamとtorch.mps.streamでMPSストリームを指定でき、Tensor.record_streamも使える。frexpやlogspaceなど複数の演算もMPSで動く。動作環境は、macOS 15以上とPython 3.11以上が必要になった。リリース候補はuv pip install torch==2.15.0 --index-url https://download.pytorch.org/whl/test/cpuで試せる。 PyTorch 2.16では、10数カーネルごとにコマンドバッファをコミットする方式でデコードが速くなる計画で、Qwen3.6-35B-A3Bは52.9から62.8トークン/sになった。注意機構は全面的にMetalへ移行し、MPSGraphからの移行はbatch normなどで続く。Metal 3.1をデフォルトにすることで、libtorch_cpu.dylibは384 MiBから287 MiBに縮小する見込みである。
Hugging Face Blogより
報道タイムライン
報道を追って、ストーリーのさまざまな側面を確認しましょう。
- Hugging Face Blog注目記事PyTorch 2.15、MPSでFP8に対応しMoEモデルのデコードを5〜6.5倍高速化
Hugging FaceのPyTorchチームは、PyTorch 2.15のMPSバックエンドでFP8対応、LLMデコードの高速化、Metalカーネルへの移行を進めたと発表した。M3 Ultraでは、Qwen3.6-35B-A3Bが2.14の9.4トークン/sから61.3トークン/sに向上した。Wan2.2のビデオVAEデコードでは、ドライバメモリのピークが270 GiBから8 GiBに下がった。
このニュースの注目度の推移
推移を表示するための継続的な観測データがまだ足りません。