2025/09/10 17:26 Defeating Nondeterminism in LLM Inference

やあ、ロボ子!今日もITニュースについておしゃべりするのじゃ!

はい、博士。今日のテーマは何でしょうか?

今日はLLM、大規模言語モデルの推論における非決定性についてじゃ!同じ質問をChatGPTにしても、毎回違う答えが出てくることがあるって話なのじゃ。

それは興味深いですね。温度を0に設定しても、結果が異なることがあるとは。

そう!理論上は決定論的になるはずなのに、実際は違うのじゃ。原因はGPUでの浮動小数点演算の非結合性とか並行実行にあるらしいぞ。

浮動小数点数の非結合性ですか。`(a+b)+c ≠ a+(b+c)`となることですね。

その通り!浮動小数点数は便利だけど、加算順序で結果が変わっちゃうのが問題なのじゃ。特に、指数の違う数を足し合わせると情報が失われやすいのじゃ。

GPUカーネルが数値を異なる順序で加算するのは、並行性と浮動小数点数の性質が組み合わさるからなのですね。

そうじゃ!でも、LLMの順伝播で使うカーネルは基本的には決定論的なのじゃ。アトミック加算はバッチ処理の並列化で必要になることがあるけど、普段は使わないのじゃ。

ということは、LLM推論が非決定論的になる主な理由は、サーバーの負荷によってバッチサイズが変動することにあるのですね。

その通り!カーネルがバッチ不変じゃないと、推論システム全体が非決定論的になっちゃうのじゃ。RMSNorm、行列乗算、アテンションのカーネルをバッチ不変にする必要があるのじゃ。

バッチ不変なカーネルを実装するには、RMSNormでは要素の削減順序を固定し、行列乗算では出力テンソルを2Dタイルに分割するデータ並列戦略を使うのですね。

そうじゃ!アテンションでは、クエリテンソルに沿って並列化し、キー/バリューテンソルに沿って削減するのじゃ。これでバッチサイズが変わっても結果が同じになるのじゃ!

Qwenのモデルを使った実験では、バッチ不変カーネルを有効にすると、1000個の補完がすべて同一になったのですね。すごい!

そうじゃ!バッチ不変カーネルを使わないと、オンポリシーRLがオフポリシーRLに変わっちゃうという問題もあるのじゃ。

LLM推論における非決定性の根本原因を理解し、解決することで、より信頼性の高いシステムを構築できるのですね。

その通り!バッチ不変カーネルを使えば、推論システムにおける非決定性を解消して、真のオンポリシーRLを実現できるのじゃ!

よくわかりました、博士!

ところでロボ子、バッチ処理って、お風呂に一緒に入るみたいなものだと思わないかのじゃ?

え?どういうことですか?

だって、まとめて処理するから効率が良いし、たまには予想外の結果が出たりするじゃないか!

博士、それはちょっと強引すぎます…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
