大規模言語モデル(LLM)を使っていると、同じ入力でも毎回まったく同じ応答が返ってこないことがあります。実運用の推論エンドポイントでは特に顕著で、負荷や並列処理の具合で結果が変わることがあります。最新の解析は、この「非決定性」の主因をバッチサイズの揺らぎに絞って説明しています。ここでは、なぜバッチが影響するのかをわかりやすく掘り下げます。

バッチサイズって何が変わるのですか

バッチサイズとは、推論時に同時に処理する入力の数です。イメージすると、レストランでまとめて注文を受けて同時に料理するようなものです。負荷が変わると同時処理数が変わり、処理の順序や並列の仕方が変わることがあります。

たとえば同じ質問を繰り返しても、出力が微妙に異なることがよくあります。これは単に「トークンを確率的に選んでいるから」だけでなく、内部の計算の還元順序が変わることが原因になり得ます。還元順序とは、多数の値を足し合わせるときの順序のことです。順序が変わると丸め誤差が蓄積し、最終的な確率分布に差が出ます。

フォワード演算は決定的でも結果が変わる理由

ニューラルネットワークのフォワード(順伝播)は、一般に同じ入力では同じ計算をするよう設計されています。GPU上の一部カーネルは非決定的になることもありますが、言語モデルで使われる主要なカーネルは通常決定的です。

それでも出力がぶれるのは、バッチごとの並列化や還元の仕方が入力依存で変わるからです。料理の工程が同じでも、皿の並べ方が変わると味の見た目が変わるようなものです。これを「バッチ不変性の欠如」と呼びます。バッチ不変性とは、バッチサイズが変わっても同じ入力なら同じ計算順序で結果が出る性質です。

バッチ不変性を守るための工夫

研究と実装では、いくつかの手法でバッチ不変性を保とうとしています。主要なポイントを簡単に説明します。

RMSNorm:正規化手法の一つで、各バッチの要素を独立に扱う設計です。これにより、バッチのまとまり方に依存しない振る舞いを目指します。

Matmul(行列積):計算を2次元タイルに分けて並列化します。各コアで局所的に還元を完結させることで、還元順序のばらつきを減らします。

Attention(注意機構):クエリ(Q)、キー(K)、バリュー(V)という成分を使って文脈を計算します。FlashAttention2 のような実装では、Qを並列化しつつKとVを同時に還元することで順序の一貫性を保とうとします。

ただし、KVキャッシュという過去のキーとバリューを保存する仕組みが絡むと、境界条件でバッチ不変性が壊れることがあります。KVキャッシュはデコード効率を上げる便利な仕組みですが、扱いを誤ると計算順序に差が出ます。

KVキャッシュと固定サイズ分割のアイデア

KVキャッシュを前処理で整列して別扱いにすると、バッチ依存の振る舞いが生じます。これを避けるために、Attentionの前でKVキャッシュやページテーブルを更新して、常に同じ配列配置になるようにする工夫が紹介されています。

もう一つの案が Split-KV、特に Fixed Size Split-KV です。これは過去のKVを固定サイズに分割して扱う方式です。たとえばデコード時のクエリ長が短い場合でも、常に同じ分割で還元を行うことで順序の一貫性を保ちます。

利点はバッチサイズに依存せず同一の還元順序を保証できる点です。欠点は実装の複雑化や場合によっては性能面でのトレードオフが生じることです。

実務での落としどころと今後の展望

現場では、完全な最適化性能と決定性のどちらを優先するかの折り合いが重要です。検証では、batch-invariant カーネルを適用した場合に多数のテストで同一結果が得られることが示されています。これは実用的な前進です。

とはいえ、専用に最適化された核ほど高速にはならない場合もあります。実務では、安定性を高めつつ性能を大きく損なわないバランスを探ることが現実的なアプローチです。

今後は FlexAttention のようなバックエンド改良や、コミュニティに向けたバッチ不変性カーネルの upstream が進むことで、安定性とスループットの両立がより現実的になるでしょう。エンジニアリングの工夫で、まるでオーケストラが最後にきれいに合わせるように、推論結果のばらつきを小さくすることが期待できます。

まとめ:何を意識すればいいか

同じ入力で結果が変わる原因は単純なランダム性だけではありません。バッチサイズとそれに伴う計算順序の変化が大きな要因です。実務では、KVキャッシュの扱いと固定サイズ分割などの設計を見直すことが有効です。

結局はトレードオフです。性能を追うか、決定性を取るか。その間をどう設計するかが、運用の腕の見せどころです。少しの設計変更で応答の安定感が劇的に改善することもありますから、まずは現場の負荷変動を観察してみてください。