PyTorch 2.15のMPS更新、MoEデコードを最大6.5倍に高速化

Hugging FaceのPyTorchチームは2026年10月20日、PyTorch 2.15のMPSバックエンド更新を公開しました。MoEモデルのデコードは2.14比で5〜6.5倍速くなり、M3 UltraでQwen3.6-35B-A3Bが9.4 tokens/sから61.3 tokens/sに伸びています。

Hugging FaceはモデルやデータセットをHugging Face Hubで共有する企業で、同チームはPyTorchメンテナーやコミュニティ貢献者と協力し、MPSGraphを専用Metalカーネルに置き換える作業を進めてきました。

何が新しいか

  • FP8対応: torch.float8_e4m3fnテンソルをMPSで扱えます。1値あたり1 byteで、FP16/BF16の半分のストレージです。F.scaled_mmはtensorwiseとrowwiseのスケーリングに対応します。
  • MoEデコード: F.grouped_mmにネイティブ実装を追加しました。2.14ではグループのオフセットをCPUにコピーしてループしていましたが、新しいMetalカーネルはGPU上で直接オフセットを読みます。デコード時の小グループ向け専用カーネルもあります。
  • 線形層: F.linearがGEMVカーネルを使うようになり、実モデル由来の96種のBF16レイヤー形状で幾何平均1.23倍の高速化を示しました。
  • softmax: softmaxとlog_softmaxを専用Metalカーネルに移し、FP32で[1, 128256]のlogitsに対する処理が57 µsから7 µs(約8倍)になりました。
  • 線形代数: complex64のLU分解、LU solve、triangular solveがMPSで動きます。4×4以下のFP32行列の逆行列、ブロック化QR、SVDの数値的頑健性も改善しました。
  • 畳み込み・padding・学習: conv1d forward、constant/reflection/replication padding、dropout、upsampling backward、channels-last conv2d backwardに新しいMetal経路を用意しました。
  • MPSストリーム: torch.mps.Stream、torch.mps.stream、Tensor.record_streamをPythonから使えます。

数値

項目 2.14/従来 2.15
Qwen3.6-35B-A3B(M3 Ultra、torch.compile) 9.4 tokens/s 61.3 tokens/s
LFM2.5-8B-A1B(M3 Ultra、torch.compile) 23.6 tokens/s 123.6 tokens/s
Wan2.2 VAEデコードの総ドライバーメモリピーク 270.135 GiB 8.108 GiB
Qwen-Image-2.1 VAE往復PSNR(CPU比較) 10.06 dB 29.95 dB

Wan2.2(Wan-AI/Wan2.2-TI2V-5B-Diffusers)のVAEデコードは、28タイルの処理で8,764回のpadding呼び出しを行います。paddingをMetalに移したことでメモリピークが下がりました。同じ変更により、2.14でMPS上のQwen-Image-2.1 VAEエンコーダーが画像を破損していた問題(ComfyUIで報告)も解消しています。

要件と試し方

  • Apple silicon Mac、macOS 15以降(MPSの要件)
  • Python 3.11以降(PyTorch 2.15の要件)

リリース候補版は別環境に次のコマンドでインストールできます。

uv pip install torch==2.15.0 --index-url https://download.pytorch.org/whl/test/cpu

OSが古い場合やMetal GPUがない場合、MPSの利用可否チェックが理由を表示するようになりました。

2.16の予定

チームは次期2.16で、attentionを完全にMetal上で実行すること、MPSGraphからMetalへの移行拡大、LLMデコードのさらなる高速化、インストールサイズの縮小を予告しています。

この記事の固有名詞

コメント (0)

まだコメントはありません。

コメントを書く

2000文字以内