AI・信頼性・評価
BeamのスライディングウィンドウアテンションとKVキャッシュの計算方法
- Beam
- LLM
- コンテキスト長
- KV キャッシュ
- スライディングウィンドウアテンション
- グローバルアテンション
- config.json
- Gemma 3
- vLLM
- SGLang
- RoPE
- SSMax
- perplexity
- RULER
- ATLAS
- BF16
- NVFP4
- B200
- Reflection
目次
自分の GPU(Graphics Processing Unit)で、数十万から百万トークンのコンテキストを扱うオープンウェイトモデルを動かしたい技術者を考える。モデルの重みは、コンテキストの長さによらず一定のメモリを占める。一方、長さとともに増えるメモリがある。モデルは文章を、トークンと呼ぶ単位で一つずつ生成する。新しいトークンを一つ作るたびに、各層のアテンションは、過去のすべてのトークンを参照して、どのトークンの情報をどれだけ取り込むかを決める。参照に使うのは、各トークンから計算した二つのベクトルである。一つは、新しいトークンから計算したクエリと照らして関連の強さを測るための key、もう一つは、取り込まれる中身である value である。過去のトークンの key と value は、一度計算すれば後で変わらない。そこで、一度計算した key と value を保存しておき、次のトークンを作るときに計算し直さずに読み出す。毎回計算し直すと、トークンを一つ作るたびに過去の全トークンの分の計算が繰り返されるからである。この保存領域を KV キャッシュと呼ぶ。全ての層が全履歴を参照する一般的な構成では、トークンが一つ増えるたびに、全ての層で KV キャッシュが一つ分ずつ増える。そのためコンテキストが長いと、KV キャッシュは重みとは別にメモリを大きく占める。
技術者は、あるコンテキスト長で何 GiB のメモリが要るかを、モデルの設定ファイルから見積もりたい。ところが、公開時の説明に載る KV キャッシュの数字は、全層が全履歴を持つと仮定した素朴な見積もりより小さい。その差がどこから来るのかを知らないと、GPU に収まるかどうかも、GPU の台数も決められない。
本稿は Beam を取り上げる。Beam は、米国の新しい研究所 Reflection の最初のモデルで、2026年10月16日に Apache 2.0 のライセンスで Hugging Face に重みが公開された1。総パラメータは 501B で、1 トークンの計算に使うのは 23B である。重みと一緒に設定ファイルの config.json が公開されたので、層の構成を数えて公開時の説明を検算できる2。比較には、同じ種類の構成を技術報告で説明した Google DeepMind の Gemma 3 と、Beam に対応したオープンソースの推論サーバー vLLM と SGLang の説明を使う。
Beam の KV キャッシュは、コンテキストが長くなるとどのように増え、その設計は 1M トークンで品質を保つのか。
Beam の KV キャッシュは、全履歴を持つ 9 層の分だけトークン数に比例して増え、1M トークンでも 1 本の入力あたり約 36 GiB に収まる。Beam が 1M で品質を保つかは、第三者の測定が無く分からない。
残りの 43 層は直近 512 トークンの key と value だけを持ち、それ以上は増えない。全層が全履歴を持つ場合の 1 トークンあたり 208 KiB に対し、Beam は 36 KiB である(各値を 2 バイトで保存する BF16 の場合)。1M での独立した評価は、本稿が調べた範囲では、2026年10月23日の時点で見つかっていない。
窓の幅 4 で「合言葉」が窓から出るとき、二種類の層のキャッシュはどう変わるか
※ この節の例は、説明のために作った架空のものです。
窓の層の KV キャッシュは窓の幅で止まり、トークン数とともに増え続けるのはグローバルアテンションの層だけである。トークンが一つ窓から出る場面で、この違いを見る。
グローバルアテンションは、各トークンが過去の全てのトークンを参照する方式である。スライディングウィンドウアテンションは、各トークンが直近の一定幅のトークンだけを参照する方式で、その幅を窓の幅と呼ぶ。ここでは窓の幅を 4 とし、「合言葉」「は」「青」「。」の 4 個を処理し終えたところへ、5 個目の「確認」が来るとする。
4 個目までは、どちらの層も 4 個の key と value を持っている。「確認」を処理するとき、窓の層が参照するのは「は」「青」「。」「確認」の 4 個で、「合言葉」は窓の外に出る。窓の層は窓の外のトークンを二度と参照しないので、「合言葉」の key と value を捨て、持つ量は 4 個のままである。グローバルアテンションの層は「合言葉」も残し、5 個を持つ。この後トークンが 100 個まで来ても、窓の層が持つのは 4 個、グローバルアテンションの層が持つのは 100 個になる。
この例から言えること
- 窓が埋まった後に KV キャッシュが増える速さは、グローバルアテンションの層の数だけで決まる。Beam では窓の幅が 512 トークンで、52 層のうちグローバルアテンションの層は 9 層なので、512 トークンを超えた後に増えるのはこの 9 層の分だけである2。
- 窓の層が持つ量は窓の幅で決まり、コンテキスト長によらない。
- 窓の層が「合言葉」を捨てても、グローバルアテンションの層が「合言葉」を参照して作った結果は次の層の同じ位置へ渡るので、遠いトークンの情報が届く経路は残る。ただし、届いた情報をモデルが正しく使えるかは層の数からは分からず、測定でしか確かめられない。
4 枚の B200 に 1M トークンの入力が何本入るか
この増え方は config.json の値だけから計算できる。Reflection が Inferact・NVIDIA と共著した vLLM のブログも、全履歴の KV を持つのは 9 層だけで、1 トークンあたり BF16(bfloat16)で 36 KiB、FP8(8-bit floating point)で 18 KiB だと書く3。1M トークンでは FP8 で約 18 GiB(GPU 間の分割前)になる3。
この量から、GPU の台数の上限が計算できる。重みは NVFP4 で約 280 GB、BF16 で約 1 TB である。B200 は 1 枚 180 GB なので、2 枚(360 GB)でも NVFP4 の重みは収まるが、残りは約 80 GB になる。Hugging Face のブログは、B200 を 4 枚(720 GB)で計画するよう勧める1。本稿の計算では、720 GB から重みの約 280 GB だけを引くと約 440 GB が残る。36 GiB を GB に換算すると約 38.7 GB なので、1M トークンの入力は上限で 11 本入る。全層が全履歴を持つ場合の 208 GiB(約 223 GB)なら 1 本しか入らない。この上限は重み以外の全てを KV キャッシュに使うと仮定した値で、実際の本数は活性化の分とサーバーの設定によってこれより少なくなる。
この見積もりは、推論サーバーが窓の層の古い key と value を捨てて扱うことを前提にしている。SGLang のブログは、Beam によって推論の仕組みが二つの KV の寿命を扱う必要が生じたと書く。一つはグローバルアテンションの完全な履歴、もう一つは窓の層の直近の窓である4。同じ入力の冒頭を再利用して続きを計算するときも、SGLang は両方の状態を揃えて復元する4。vLLM も、Beam に初日から対応した実装のブログを同じ日に出した3。
収まることと品質が保たれることは別で、1M の品質は独立した測定がまだ無い
1M トークンの KV キャッシュが GPU に収まることは config.json と Hugging Face のブログの値から確かめられるが、1M で品質が保たれることは確かめられない。グローバルアテンションの層を通って遠いトークンの情報が届く経路があることは、その情報を正しく使えることを保証しない。Beam の品質を示す資料は、公開時の設計の説明と作り手の測定に限られる。
Hugging Face と vLLM のブログは、遠い位置でもアテンションが働くための設計を二つ説明する。一つ目は位置の与え方である。窓の層は、クエリと key の組に位置の差を回転として埋め込む RoPE(Rotary Position Embedding)を使う。Hugging Face のブログは、窓の中では相対的な位置が最も重要なので窓の層に RoPE を使うと説明する1。グローバルアテンションの層は位置の符号化を持たず、config.json でも RoPE の設定は窓の層だけにあり、グローバルアテンションの層は null である2。
二つ目は、グローバルアテンションの層のクエリに掛ける SSMax(Scalable-Softmax)と呼ばれる倍率である。位置の符号化が無いと、key の数が増えるにつれてアテンションの重みが平坦になる、と vLLM のブログは書く3。これを防ぐために、グローバルアテンションの層は、処理中のトークンの位置を として、クエリに を掛ける。この倍率は位置が後ろほど大きい。クエリを大きくすると、アテンションの重みは内積の大きい key に集まる。Hugging Face のブログは、この倍率が温度として働き、コンテキストが伸びても重みが平坦にならないと説明する1。どちらも設計の理由であり、1M での測定ではない。
作り手の測定も、独立した再現ではない。Hugging Face のブログは、Reflection が提供した長いコンテキストのベンチマークとして、BF16 で LongBench v2 が 67.5%、AA-LCR が 78.2% と載せる1。Beam の 1M トークンでの検索や推論の品質を第三者が測った評価は、本稿が調べた範囲では、2026年10月23日の時点で見つかっていない。
近い構成の Gemma 3 の技術報告は、perplexity を 512K まで測り、128K までは保たれるが、それより延ばすと急速に悪くなると書く5。Google DeepMind が 2025 年に出したこの報告は、長いコンテキストでは推論中の KV キャッシュのメモリが爆発的に増えるという課題を挙げ、その対策として局所層を全体層の間に挟み、局所層の幅を 1024 トークンにした5。局所層と全体層の比は、Gemma 3 が 5 対 1、Beam が 43 対 9 で、近い。ただし Gemma 3 の全体層は位置の符号化に RoPE を使い、128K まで延ばすときにその周期を伸ばしている5。位置の符号化を持たない Beam の全体層とは長さを延ばす仕組みが違うので、この劣化がそのまま Beam に当てはまるとは言えない。
報告は、局所層と全体層の比を 7 対 1 まで変えても影響は最小だと書くが、その影響は 2B と 9B のモデルの検証セットの perplexity で測られている5。perplexity は、モデルが次のトークンを予測する難しさを表す指標で、小さいほど予測が当たる。遠い位置の事実を取り出す力を直接測る指標ではない。遠い位置の事実を取り出す力を測る RULER では、Gemma 3 27B の指示チューニング版が 32K で 91.1、128K で 66.0 に下がる5。RULER は、長い入力に埋めた情報をモデルが取り出せるかを測るベンチマークである。報告はこの低下の原因を切り分けておらず、局所層の影響とは言えない。
グローバルアテンションの層の数が同じでも、置く位置で品質が変わるという実験がある。つまり、品質はグローバルアテンションの層の数だけからは予測できない。Databricks Mosaic AI の Rajput らは、窓の層と層をまたぐ KV の共有を組み合わせた構成を比べた。グローバルアテンションの KV キャッシュを最初の層にだけ持つ構成は 32,000 トークンの RULER で成績が悪く、深い層にも持つ構成は成績が良かった6。著者らは、少数のグローバルアテンションの層を持つことが長いコンテキストを扱う能力に欠かせないと書く6。Beam はグローバルアテンションの層を 6 層ごとと最終層に置くので、深い層にも全履歴を持つ。ただし、この実験は 1 トークンあたり 1.64B のパラメータを使う 24 層のモデルを 32,000 トークンで測ったもので、Beam の 1M での品質を保証しない。
短い長さでの成績から 1M での成績は推せない。26 個のモデルを 8K から 1M で測った ATLAS は、8K から 128K で見た順位と 8K から 1M で見た順位が入れ替わり、7 個のモデルで順位が 2 つ以上変わったことを報告する7。窓が 1M に届かないモデルは入力の中央を切り詰めて測られているので、入れ替わりには窓の長さの差も混ざる7。ATLAS は査読前の論文で、Beam は対象に入っていない。したがって、Beam の 1M についても、その長さでの独立した測定が要る。
ほかのモデルの KV キャッシュも、同じ数え方で見積もれる。config.json からグローバルアテンションの層の数 、KV ヘッド数 、ヘッドの次元 を読み、1 値のバイト数を とする。窓が埋まった後の 1 トークンあたりの増加は である。ただし、層によって KV ヘッド数や次元が違うモデルでは、層ごとに数えて足す。品質のほうは、公称の長さでの第三者の測定があるかを別に確かめる。
出典7件
-
Hugging Face「Beam by Reflection」Hugging Face Blog, 2026. https://huggingface.co/blog/reflection-beam — 構成の説明、RoPE と温度の理由、36 KiB の計算、ハードウェアの目安を取った。ベンチマークは作り手の値。 ↩ ↩2 ↩3 ↩4 ↩5
-
Reflection「Beam-1.0-501B-A23B config.json」Hugging Face, 2026. https://huggingface.co/reflection/Beam-1.0-501B-A23B/blob/main/config.json — 窓幅、層数、グローバルアテンションの 9 層、KV ヘッドとヘッド次元を数える根拠にした。 ↩ ↩2 ↩3
-
vLLM(Inferact・Reflection・NVIDIA)「Serving Reflection Beam on vLLM from Day 0」vLLM Blog, 2026. https://vllm.ai/blog/2026-10-16-reflection-beam — SSMax の理由と、BF16 と FP8 での 1 トークンあたりの KV 量を取った。 ↩ ↩2 ↩3 ↩4
-
LMSYS「SGLang Powers Beam in Production」LMSYS Blog, 2026. https://lmsys.org/blog/2026-10-16-beam/ — 二つの KV の寿命と、接頭辞の再利用での扱いを取った。 ↩ ↩2
-
Gemma Team「Gemma 3 Technical Report」arXiv:2503.19786, 2025. https://arxiv.org/abs/2503.19786 — 交互配置の理由、2B・32k の測定(全体層だけでメモリの追加分 60%、局所層 3 対全体層 1・窓 1024 で 15% 未満)、層の比と長さごとの perplexity、RULER の値を取った。 ↩ ↩2 ↩3 ↩4 ↩5
-
Rajput ほか「Inference-Friendly Models With MixAttention」arXiv:2409.15012, 2024. https://arxiv.org/abs/2409.15012 — グローバルアテンションの KV を深い層に持たない構成が RULER で劣るという比較を取った。 ↩ ↩2
-
Huang ほか「ATLAS: All-round Testing of Long-context Abilities across Scales」arXiv:2605.28079, 2026. https://arxiv.org/abs/2605.28079 — 長さごとに順位が入れ替わるという所見と、窓が足りないモデルの入力を中央で切り詰める評価条件を取った。Beam は対象外。 ↩ ↩2
この記事はAIを使用して執筆されました。内容には誤りが含まれる可能性があります。事実や数字の出典は脚注から確かめられます。