2 ポイント 投稿者 GN⁺ 2025-09-12 | まだコメントはありません。 | WhatsAppで共有
  • LLM(大規模言語モデル) の推論では、同一の入力と条件でも結果が異なる 非決定性(nondeterminism) の問題が発生する
  • 従来は 並行性(concurrency)浮動小数点(floating-point)演算の非結合性(non-associativity) が非決定性の主因と見なされてきた
  • 実際の決定的な原因は、バッチサイズ(batch size)の変化 に伴うカーネル(演算コード)内部の計算順序の変化にある
  • カーネル内のすべての演算が バッチ不変性(batch invariance) を持つように実装すれば、完全な 再現性(reproducibility) を保証できる
  • データ並列演算、split reduction、固定サイズの split 戦略 などにより、主要演算(RMSNorm、matmul、attention)についてバッチ不変カーネルを作成できる

序論と問題の概要

  • 科学的進歩の中核要素である再現性(reproducibility) は、LLM(大規模言語モデル)の推論では十分に守られていない
  • 同じ質問を ChatGPT に何度もしても、異なる回答 が生成されることがよくある
  • これは LLM が結果を サンプリング(sampling) する過程で、確率分布に基づく 確率的選択 を行うためである
  • しかし、temperature を 0 に設定 しても、実際には LLM API が必ずしも 決定的ではない(つまり、同じ入力に対して結果が常に同じとは限らない)
  • オープンソースの推論ライブラリ(vLLM、SGLang など)や自前ハードウェアで実行しても、非決定性 の問題は存在する

従来の仮説と限界

  • 広く知られている仮説: 並行性 + 浮動小数点の非結合性 によって非決定性が発生する
    • GPU における浮動小数点演算は、演算順序やスレッド終了順によって結果がわずかに変わる
  • しかし実際には、同じデータで同じ方法の行列積を繰り返しても、常に同一の(bw=bitwise equal)結果 が得られる
  • 真の原因を把握するには、より深い分析が必要

LLM推論の非決定性の原因に関する詳細分析

浮動小数点の非結合性の本質

  • 浮動小数点演算は (a+b)+c ≠ a+(b+c) の関係を持つ
  • 大きさ(exponent)の異なる値同士を演算すると精度損失や情報損失が生じ、演算順序によって結果が変わる
  • 演算順序が変わりうるため、複数回の総和をランダムに実行すると 多様な結果(実験的にも確認) が導かれる

カーネルの演算順序変化と並行性

  • 一般に非決定性の主因として、atomic add などにおける並行性の問題が指摘される
  • しかし、LLM 推論で使われる大半のカーネル(特に forward pass)は、atomic add なしでも動作 する
  • 適切な並列戦略や split(reduction)などにより、同一の演算順序を確保 できる

実質的な核心原因: 「バッチ不変性(batch invariance)」の欠如

  • 個々のカーネルは、入力が同じであれば常に同じ結果を返す(run-to-run deterministic
  • しかし、複数ユーザーの同時リクエストによってバッチサイズが非決定的に変化するため、各リクエストに対しては実質的に結果が一定しない
  • バッチサイズ に応じて内部で演算を分割したり結合したりする順序が変わり、非決定性が発生する
  • つまり、サーバー負荷と並列度(バッチサイズ)が非決定的だったこと が核心原因である

バッチ不変カーネル設計と主要演算の事例

RMSNorm

  • データ並列化(data-parallel) 戦略を適用: 各バッチ要素を独立に1つのコアが処理
  • バッチサイズが大きければ十分な並列性を維持でき、並列戦略が一定になるため バッチ不変性 が確保される
  • バッチサイズが非常に小さい場合は split reduction などの代替戦略を使うが、この場合は一部のバッチ不変性が犠牲になる

行列積(matmul)

  • タイル(tile)単位で並列化することでデータ並列戦略を活用
  • Tensor Core の利用最適化には 2D タイル分割が必要であり、バッチが非常に小さい場合には split-K のような特別な戦略が必要
  • split-K 戦略を使うとバッチ不変性が崩れる可能性がある
  • 一部の性能を犠牲にしても、同一のカーネル構成を強制することで一貫した(reproducible な)演算順序を確保できる

Attention

  • FlashAttention2 などでは、クエリ方向の並列化、Key/Value の同時 reduction 戦略によりバッチ不変性を確保する
  • バッチサイズやシーケンス分割(chunked prefill、prefix caching など)によって reduction 順序が変わると不変性が崩れる
  • split-KV(FlashDecoding)などの split-reduction 戦略では、split サイズを固定(fixed split-size) して演算順序を同一に保つ
  • 内部動作上、key/value キャッシュと新規トークンを別々に処理せず、すべての演算でキー/値レイアウトを一貫して維持する必要がある

実装

  • vLLM と torch.Library を活用して、batch-invariant カーネル を適用した決定的推論デモを提供
  • 関連演算の置き換えカーネルは GitHub リポジトリ(thinking-machines-lab/batch-invariant-ops)で閲覧できる

実験と性能

非決定性の測定実験

  • Qwen/Qwen3-235B-A22B-Instruct-2507 モデルで temperature 0 条件のもと、同一プロンプト(“Tell me about Richard Feynman”)を1000回生成
  • 80種類の異なる完了 が生成された(同一プロンプトでも非決定性が存在)
  • 最初の102トークンまでは同一で、103番目のトークンで最初の分岐が発生(“Queens, New York” vs “New York City”)
  • バッチ不変カーネルを使用すると1000回すべて同一結果 となり、完全な再現性を確保

性能評価

  • GPU 1台で Qwen-3-8B を実行し、それぞれ長さ90〜110のシーケンス1000件をリクエスト
    • vLLM デフォルト: 26秒
    • 非最適化 deterministic vLLM: 55秒
    • 改善版 attention カーネル適用: 42秒
  • 最適化は十分ではないものの、実用可能な性能水準を維持

On-policy RL における価値

  • 従来は training と inference の間の微細な数値差により、on-policy RL を正確に実装できなかった
  • 決定的推論が可能になれば、サンプリングとトレーニングをともに bitwise identical にでき、真の on-policy RL を実装できる
  • KL-divergence、reward など主要な metric で 完全に一致する結果 を確認

結論

  • LLM 推論システムでは非決定性や数値誤差が軽視されがちだが、この問題の 根本原因(バッチ不変性の欠如) を把握して改善すれば、完全な 再現性と決定性 を得られる
  • 本研究は LLM 推論の非決定性問題に対する解決策を示し、開発者が自社システム内で完全な再現性を確保できるよう支援する

引用情報

  • 本研究を引用する際は、以下の情報を使用
He, Horace and Thinking Machines Lab, "Defeating Nondeterminism in LLM Inference", 
Thinking Machines Lab: Connectionism, Sep 2025.

または

@article{he2025nondeterminism,
  author = {Horace He and Thinking Machines Lab},
  title = {Defeating Nondeterminism in LLM Inference},
  journal = {Thinking Machines Lab: Connectionism},
  year = {2025},
  note = {https://thinkingmachines.ai/blog/…},
  doi = {10.64434/tml.20250910}
}

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

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