前提
-
Python + PyTorch 環境がある(GPU 使用可能、CUDA 有効)。
-
thinking-machines-lab/batch_invariant_ops
ライブラリをインストール済みであること。 GitHub -
モデルが FlashAttention など高速な Attention バックエンドを使う場合、Attention 部分を固定戦略 (fixed splits, 固定チャンク・KV キャッシュの統一レイアウト等) に対応できることが望ましい。
セットアップ
まず、batch_invariant_ops
を使い始めるための準備。
または、PyPI で公開されていれば:
サンプルコード:非決定モード → 決定モード切り替え
以下は、簡単な Transformer モデル(あるいは vLLM 等)で、標準モードとバッチ不変モードを切り替えて推論を行い、応答が一貫するかを比較する例です。
注意点・補足実装
この切り替えを実用レベルで使うには、以下の点を押さえておく必要があります。
Attention / FlashAttention に関する扱い
-
FlashAttention や類似バックエンドでは、Attention の計算中にチャンク分割 (chunking) や Split‑KV, カーネル最適化などが入っていることが多い。これらの最適化戦略がバッチサイズやシーケンス長、KV キャッシュ状態等に応じて動的に変化する場合、非決定性の原因となる。
-
決定モードにおいては、チャンク/分割サイズを固定する、KV キャッシュの内部レイアウトを一貫させるなどの設計が必要。
例えば:
他の演算子(RMSNorm, MatMul, mean/reduction etc.)
-
batch_invariant_ops
ライブラリでは、torch.mm()
,torch.addmm()
,torch.log_softmax()
,torch.mean()
など、標準的な行列演算や削減 (reduction) 演算をバッチ不変なカーネルに置き換える仕組みが用意されている。 GitHub -
例:
torch.mean()
を使うとき、通常はバッチ軸または特徴軸での reduce の順序がバッチサイズ等に依存することがあるので、決定モードではその順序を固定するか、reduce を分割しない/一定の分割サイズでのみ行うようにする。
テスト・検証
決定性モードを導入したあと、次のようなテストを行うと良い:
-
繰り返し推論テスト:同じ入力を多回(例 10~100 回)推論し、それぞれの出力ロジットがビット単位で一致するかをチェック。
-
バッチサイズ変更テスト:入力のバッチサイズを変えても、個々の要素の出力が一致するかどうか(例、バッチサイズ = 1 vs バッチサイズ = N)を比較。
-
シーケンス長・KV キャッシュ状態のテスト:アテンションのプリフィル/デコード/キャッシュ未使用・使用時で、出力が変わらないか確認。
-
異なる GPU / 同じモデルでも異なるカードでのテスト:異なるハードウェア構成で同じコード・ライブラリを使ったときの再現性を確認。
-
性能測定:標準モードと決定性モードの速度・メモリ消費・レイテンシを比較し、「どの程度のトレードオフがあるか」を把握。
トレードオフと実用上の判断基準
-
決定性モードを有効にすると、特に小バッチや短シーケンス入力で GPU のコア利用効率が下がることがあり、レイテンシが増える可能性が高い。
-
通常のモデル提供時には、応答の多様性や速度が重視されるケースもあるので、用途によって標準モード/決定モードを切り替えるオプションを持たせるのが望ましい。
-
モデルが大きく・入力が長くなるほど、非決定性が蓄積されやすいため、決定モードの効果を実感しやすいが、そのぶんオーバーヘッドも出やすい。