萌えハッカーニュースリーダー

2025/10/23 17:06 The bug that taught me more about PyTorch than years of using it

出典: https://elanapearl.github.io/blog/2025/the-bug-that-taught-me-pytorch/
hakase
博士

やあ、ロボ子!今日はPyTorchのMPSバックエンドに関する面白いバグの話をするのじゃ。

roboko
ロボ子

MPSバックエンドですか、博士。それはApple Silicon GPUのことですよね?

hakase
博士

そうじゃ!どうやら、PyTorchで学習中に損失が停滞して、モデルのエンコーダの重みが更新されなくなることがあるらしいのじゃ。

roboko
ロボ子

それは深刻な問題ですね。原因は何なのでしょうか?

hakase
博士

原因は、MPSバックエンドのカーネルにあるバグらしいのじゃ。特に、`addcmul_`と`addcdiv_`操作が、非連続なメモリに書き込む際にエラーを起こすとのことじゃ。

roboko
ロボ子

非連続なメモリですか?それがどのように影響するのですか?

hakase
博士

エンコーダの重みがデコーダの転置として初期化されると、非連続なメモリレイアウトになるのじゃ。そして、Adamオプティマイザの内部状態テンソル(`exp_avg`、`exp_avg_sq`)がこのレイアウトを継承してしまうらしい。

roboko
ロボ子

なるほど。MPSカーネルが非連続な出力を正しく処理できないために、計算結果が一時バッファに書き込まれて、実際のテンソルが更新されない、ということですね。

hakase
博士

その通り!非連続なエンコーダのAdamパラメータにおいて、`exp_avg_sq`が更新されずゼロのままになり、`addcdiv_`によるパラメータ更新も失敗するのじゃ。

roboko
ロボ子

解決策はあるのでしょうか?

hakase
博士

いくつかあるぞ!まず、重みを初期化時にcontiguousにすることじゃ。それから、PyTorchをバージョン2.4以降にアップグレードするか、macOS 15以降にアップグレードすることでも修正されるのじゃ。

roboko
ロボ子

PyTorchのバージョンアップで修正されるのはありがたいですね。しかし、`normal_`や`uniform_`などのランダム操作には、macOS 15未満でまだバグが残っているとのことですが…。

hakase
博士

そうなんじゃ。でも、修正PRは提出済みらしいから、近いうちに解決するはずじゃ!

roboko
ロボ子

他のMPS操作も影響を受ける可能性があるとのことですので、注意が必要ですね。

hakase
博士

その通りじゃ。PyTorchのMPSバックエンドにおけるメモリレイアウトとカーネル実装は、まだまだ改善の余地がありそうじゃな。

roboko
ロボ子

再現スクリプトも公開されているようですので、詳しく調べてみたいと思います。

hakase
博士

よし、ロボ子!原因と対策がわかったところで、今日の教訓じゃ!バグはいつも予想外のところに潜んでいるものなのじゃ。特にメモリレイアウトには気をつけろ、なのじゃ!

roboko
ロボ子

はい、博士!肝に銘じます。ところで博士、このバグの原因となった`Placeholder`抽象化ですが、まるで幽霊みたいですね。メモリに潜んで、時々悪さをするなんて…。

hakase
博士

アハハ!確かに、幽霊みたいなバグじゃったな。でも、幽霊もバグも、退治してしまえば怖くないのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search