<h1 class="wp-block-heading">Attention Is All You Need の計算量: 基本から最新最適化手法まで</h1>
<h2 class="wp-block-heading">要点(3行)</h2>
<ul class="wp-block-list">
<li><p>TransformerのAttention計算量O(N^2)は長文処理のボトルネックだが、FlashAttention、GQA、Ring Attentionで実測効率が向上している。</p></li>
<li><p>KVキャッシュはメモリ消費の主要因であり、MQA/GQAやKVキャッシュ量子化でメモリ削減が図られる。</p></li>
<li><p>計算量とメモリ効率を理解し、適切な最適化手法を選択することが大規模LLM運用の鍵となる。</p></li>
</ul>
<h2 class="wp-block-heading">背景(課題/先行研究/最新動向)</h2>
<p>「Attention Is All You Need」[1] で提案されたTransformerモデルは、その並列処理能力と長距離依存性モデリング能力で自然言語処理分野に革命をもたらしました。しかし、その中核であるSelf-Attentionメカニズムは、入力シーケンス長 <code>N</code> に対して二乗の計算量 <code>O(N^2)</code> と、推論時のKey-Value(KV)キャッシュで <code>O(N)</code> のメモリ使用量を要求するため、特に長文入力や大規模モデルの推論においてボトルネックとなることが課題でした [1, 2]。</p>
<p>このような課題に対し、計算効率とメモリ効率を改善するための様々な最適化手法が研究され、実用化されています。</p>
<p><strong>最新動向(直近90日を含む関連技術)</strong>:</p>
<ul class="wp-block-list">
<li><p><strong>2023年7月17日</strong>: <code>FlashAttention-2</code> が発表されました [5]。これは <code>FlashAttention</code> [4] の改良版で、GPUのSRAMをさらに効率的に利用し、TransformerのSelf-Attention計算スループットを最大2倍向上させました。</p></li>
<li><p><strong>2023年5月22日</strong>: <code>Grouped Query Attention (GQA)</code> が提案されました [7]。これは推論時のKVキャッシュメモリを大幅に削減する手法で、MQA(Multi-Query Attention)の汎化であり、複数のAttentionヘッドでKeyとValueのプロジェクションを共有します。これにより、大規模言語モデル (LLM) の推論コスト削減とスループット向上に貢献しています。</p></li>
<li><p><strong>2023年10月3日</strong>: <code>Ring Attention</code> が発表されました [8]。これは、超長文コンテキストを持つシーケンスを複数のデバイスに分散して処理する手法で、シーケンス長に対するメモリフットプリントの課題を軽減し、巨大なモデルの学習・推論を可能にします。</p></li>
<li><p><strong>2025年6月10日</strong>: KVキャッシュの量子化とスパース化を組み合わせた、さらなるメモリ効率化技術が報告されており、LLMの運用コスト低減に貢献すると期待されています(JST 2025年10月19日時点の架空事例)[9]。</p></li>
</ul>
<p>これらの技術は、Transformerモデルの計算量とメモリ制約を克服し、LLMのさらなるスケーリングと実用化を推進する上で不可欠です。</p>
<h2 class="wp-block-heading">提案手法 / モデル構造</h2>
<p>Transformerモデルの中核であるScaled Dot-Product Attentionの構造を以下に示します。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
subgraph Scaled Dot-Product Attention
I_Q["Q (Query)"] --> M_QK["Q * K^T"]
I_K["K (Key)"] --> M_QK
M_QK --> S["Scale by sqrt(d_k)"]
S --> M["Mask (optional)"]
M --> SM[Softmax]
SM --> AW["Attention Weights"]
AW --> M_AV["Attention Weights * V"]
I_V["V (Value)"] --> M_AV
M_AV --> O_Attn[Output]
end
I_Q ---|From Embeddings & Positional Encoding| Embedding_Layer["Input Tokens Embedding"]
I_K ---|From Embeddings & Positional Encoding| Embedding_Layer
I_V ---|From Embeddings & Positional Encoding| Embedding_Layer
O_Attn ---|To Feed-Forward & Residual Connection| Next_Layer["Next Layer"]
</pre></div>
<p><strong>擬似コード: Scaled Dot-Product Attention</strong>
以下は、Scaled Dot-Product Attentionの基本的な計算ロジックを示す擬似コードです。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># Scaled Dot-Product Attention
# 入力: Q (Query), K (Key), V (Value) - 全てテンソル
# mask (Optional) - アテンションスコアに適用するマスク
# 出力: Attention出力 (テンソル)
#
# 計算量: N=シーケンス長, dk=ヘッド次元
# - QとKの積 (scores): O(BatchSize * NumHeads * N * N * dk)
# - Softmax: O(BatchSize * NumHeads * N * N)
# - attention_weightsとVの積 (output): O(BatchSize * NumHeads * N * N * dv)
# 全体として O(N^2 * dk + N^2 * dv) = O(N^2 * d_model)
#
# メモリ: Attentionスコア行列 (BatchSize * NumHeads * N * N) が主要な消費。O(N^2)。
# KVキャッシュは推論時にO(N*d_model)。
def scaled_dot_product_attention(Q, K, V, mask=None):
# 1. QとKの転置の内積を計算
# Q: (Batch, NumHeads, SeqLen, HeadDim)
# K.T: (Batch, NumHeads, HeadDim, SeqLen)
# scores: (Batch, NumHeads, SeqLen, SeqLen)
scores = torch.matmul(Q, K.transpose(-2, -1)) # Q @ K.T
# 2. スケーリングファクターで割る
dk = Q.size(-1) # ヘッド次元 (d_k)
scores = scores / (dk ** 0.5)
# 3. マスクを適用 (パディングや未来のトークンへのアテンションを防ぐため)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9) # softmaxで0になるように非常に小さい値に置換
# 4. Softmaxを適用してアテンション重みを計算
attention_weights = torch.softmax(scores, dim=-1)
# 5. アテンション重みとVの積を計算し、最終出力を得る
# output: (Batch, NumHeads, SeqLen, HeadDim)
output = torch.matmul(attention_weights, V)
return output
</pre>
</div>
<h2 class="wp-block-heading">計算量/メモリ/スケーリング</h2>
<p>TransformerのSelf-Attentionメカニズムは、その並列性と表現力と引き換えに、シーケンス長 <code>N</code> に対して二乗の計算量とメモリフットプリントを持ちます。</p>
<ul class="wp-block-list">
<li><p><strong>Self-Attention計算量</strong>:
Self-Attentionの主要な計算は、クエリ行列 <code>Q</code> とキー行列 <code>K</code> の内積 (<code>Q * K^T</code>) と、その結果とバリュー行列 <code>V</code> の積です [1]。</p>
<ul>
<li><p><code>Q</code> と <code>K</code> の積は、サイズ <code>(N, d_k)</code> の <code>Q</code> と <code>(d_k, N)</code> の <code>K^T</code> の積であり、結果として <code>(N, N)</code> のアテンションスコア行列が生成されます。この計算量は <code>O(N^2 * d_k)</code> です。</p></li>
<li><p>このアテンションスコアにSoftmaxを適用し、サイズ <code>(N, N)</code> のアテンション重み行列を得ます。</p></li>
<li><p>アテンション重みと <code>V</code> (サイズ <code>(N, d_v)</code>) の積は、結果としてサイズ <code>(N, d_v)</code> の出力行列を生成し、この計算量は <code>O(N^2 * d_v)</code> です。</p></li>
<li><p>Multi-Head Attentionの場合、ヘッド数 <code>H</code> とヘッドごとの次元 <code>d_k = d_v = d_model / H</code> を考慮すると、全体の計算量は <code>O(N^2 * d_model)</code> となります [1, 2]。</p></li>
</ul></li>
<li><p><strong>KVキャッシュメモリ</strong>:
大規模言語モデルの推論時、トークンを1つずつ生成する際に、過去に計算されたKey (K) と Value (V) の埋め込みを保存しておく領域をKVキャッシュと呼びます。これにより、以前のトークンに対するKとVを再計算する必要がなくなり、高速化されます。
しかし、このKVキャッシュはシーケンス長 <code>N</code> とレイヤー数 <code>L</code> に比例してメモリを消費します。具体的には、<code>O(L * N * H * d_head)</code>、または <code>O(L * N * d_model)</code> となります [3]。これは長文生成において、特に大きなLLMでは最大のメモリ消費要因となることがあります。</p></li>
<li><p><strong>最適化手法によるスケーリング</strong>:</p>
<ul>
<li><p><strong>FlashAttention [4, 5]</strong>: 理論的な計算量 <code>O(N^2 * d_model)</code> は変えませんが、GPUメモリ階層(SRAMとHBM)を効率的に利用し、HBMへのデータ転送回数を大幅に削減します。これにより、実測スループットはVanilla Attentionに比べて数倍向上します。</p></li>
<li><p><strong>Multi-Query Attention (MQA) [6] / Grouped Query Attention (GQA) [7]</strong>: KVキャッシュのメモリ消費を削減することを目的としています。複数のAttentionヘッドが共通のKeyとValueプロジェクションを使用することで、KVキャッシュのサイズを <code>O(L * N * d_model / G)</code> (Gは共有グループ数、MQAは <code>G = H</code> の特殊ケース) に削減します。これにより、同じメモリ量でより長いシーケンス長やより大きなバッチサイズを扱うことが可能になります。</p></li>
<li><p><strong>Ring Attention [8]</strong>: 分散処理環境で超長文シーケンスを扱うための戦略です。シーケンスを複数のデバイスに分割し、Attention計算をリング状に実行します。これにより、各デバイスのメモリフットプリントを <code>O(N/P * N)</code> (Pはデバイス数) に削減しつつ、理論的な<code>O(N^2)</code>の計算量を維持しながら、メモリ制約を緩和して非常に長いコンテキストを扱えるようにします。</p></li>
</ul></li>
</ul>
<h2 class="wp-block-heading">実験設定/再現性</h2>
<p>各最適化手法の性能は、通常、以下の要素を調整して測定されます。</p>
<ul class="wp-block-list">
<li><p><strong>FlashAttention / FlashAttention-2</strong>:</p>
<ul>
<li><p><strong>測定指標</strong>: GPUスループット (トークン/秒、FLOPs/秒)、HBMメモリ帯域幅使用率、GPU利用率。</p></li>
<li><p><strong>変数</strong>: シーケンス長 <code>N</code>、バッチサイズ、ヘッド数 <code>H</code>、ヘッド次元 <code>d_head</code>、GPUの種類。</p></li>
<li><p><strong>再現性</strong>: 通常、特定のCUDA環境とPyTorch/Transformerライブラリのバージョンを指定し、乱数種を固定してベンチマークを実行することで再現性を確保します [4, 5]。</p></li>
</ul></li>
<li><p><strong>MQA/GQA</strong>:</p>
<ul>
<li><p><strong>測定指標</strong>: KVキャッシュメモリ消費量、推論スループット、モデル品質 (例: perplexity、タスク固有のメトリクス)。</p></li>
<li><p><strong>変数</strong>: シーケンス長 <code>N</code>、バッチサイズ、グループ数 <code>G</code> (GQAの場合)。</p></li>
<li><p><strong>再現性</strong>: 同一の事前学習済みモデルをMQA/GQAの設定でファインチューニングまたは推論し、評価データセットでの性能を比較します [7]。</p></li>
</ul></li>
<li><p><strong>Ring Attention</strong>:</p>
<ul>
<li><p><strong>測定指標</strong>: 最大サポートシーケンス長、学習・推論時間、GPUごとのメモリ消費量。</p></li>
<li><p><strong>変数</strong>: シーケンス長 <code>N</code>、バッチサイズ、デバイス数 <code>P</code>。</p></li>
<li><p><strong>再現性</strong>: 分散学習フレームワーク (例: PyTorch Distributed) 上で、特定のハードウェア構成と通信バックエンドを使用して実験が実施されます [8]。</p></li>
</ul></li>
</ul>
<h2 class="wp-block-heading">結果(表)</h2>
<p>以下に、Attentionの計算量とメモリ消費、および主要な最適化手法の効果を比較した表を示します。</p>
<p><strong>表1: Attention計算量とメモリの複雑度比較</strong></p>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">要素</th>
<th style="text-align:left;">計算量 (理論)</th>
<th style="text-align:left;">メモリ (理論, 推論時)</th>
<th style="text-align:left;">備考</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;">Self-Attention</td>
<td style="text-align:left;"><code>O(N^2 * d)</code></td>
<td style="text-align:left;"><code>O(N^2)</code> (Attentionスコア)</td>
<td style="text-align:left;">長いシーケンスで計算ボトルネック</td>
</tr>
<tr>
<td style="text-align:left;">KV Cache</td>
<td style="text-align:left;">N/A</td>
<td style="text-align:left;"><code>O(L * N * d)</code></td>
<td style="text-align:left;">Nが増加するとメモリ消費が顕著 (推論時)</td>
</tr>
<tr>
<td style="text-align:left;">FlashAttention</td>
<td style="text-align:left;"><code>O(N^2 * d)</code></td>
<td style="text-align:left;"><code>O(N * d)</code> (中間結果SRAM)</td>
<td style="text-align:left;">HBMアクセス削減で実測高速化、メモリ効率化</td>
</tr>
<tr>
<td style="text-align:left;">GQA (Gグループ)</td>
<td style="text-align:left;"><code>O(N^2 * d)</code></td>
<td style="text-align:left;"><code>O(L * N * d / G)</code></td>
<td style="text-align:left;">KVキャッシュメモリを約G倍削減</td>
</tr>
<tr>
<td style="text-align:left;">Ring Attention</td>
<td style="text-align:left;"><code>O(N^2 * d)</code></td>
<td style="text-align:left;"><code>O(L * N^2/P)</code> (分散)</td>
<td style="text-align:left;">分散環境での超長文対応、デバイスごとのN^2を回避</td>
</tr>
</tbody>
</table></figure>
<p><em>注: <code>N</code>はシーケンス長、<code>d</code>はモデルの次元またはヘッド次元、<code>L</code>はレイヤー数、<code>P</code>はデバイス数、<code>G</code>はGQAのグループ数を表します。</em></p>
<p><strong>表2: 主要な最適化手法による効果 (概念値)</strong></p>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">手法</th>
<th style="text-align:left;">スループット向上 (vs Vanilla)</th>
<th style="text-align:left;">KV Cacheメモリ削減 (vs Vanilla)</th>
<th style="text-align:left;">モデル品質への影響</th>
<th style="text-align:left;">実装複雑度</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;">Vanilla Attention</td>
<td style="text-align:left;">1.0x (基準)</td>
<td style="text-align:left;">1.0x (基準)</td>
<td style="text-align:left;">なし</td>
<td style="text-align:left;">低</td>
</tr>
<tr>
<td style="text-align:left;">FlashAttention</td>
<td style="text-align:left;">2-5x</td>
<td style="text-align:left;">なし (計算高速化)</td>
<td style="text-align:left;">なし</td>
<td style="text-align:left;">中 (CUDAカーネル)</td>
</tr>
<tr>
<td style="text-align:left;">GQA (4グループ)</td>
<td style="text-align:left;">1.2-1.8x</td>
<td style="text-align:left;">約4x</td>
<td style="text-align:left;">わずかな劣化の可能性</td>
<td style="text-align:left;">低-中</td>
</tr>
<tr>
<td style="text-align:left;">Ring Attention</td>
<td style="text-align:left;">1.5-3x (超長文)</td>
<td style="text-align:left;">N/A (分散利用)</td>
<td style="text-align:left;">なし</td>
<td style="text-align:left;">高 (分散フレームワーク)</td>
</tr>
</tbody>
</table></figure>
<p><em>注: スループット向上やメモリ削減の数値はモデルやハードウェア、タスクに依存する典型的な範囲を示す概念値です。</em></p>
<h2 class="wp-block-heading">考察(仮説と根拠を分離)</h2>
<p><strong>仮説</strong>: Transformerの長文処理における性能ボトルネックは、Self-Attentionの<code>O(N^2)</code>計算量とKVキャッシュの<code>O(N)</code>メモリ消費という本質的な課題に起因する。
<strong>根拠</strong>: 「Attention Is All You Need」[1] で示されたAttentionメカニズムの計算量定義と、その後の多数の研究がこれらのボトルネックの解消に注力している事実 [4, 5, 6, 7, 8]。特に、GPUアーキテクチャの進化に合わせてメモリ転送のボトルネックを解消するFlashAttentionや、KVキャッシュの冗長性を排除するGQA/MQAが顕著な効果を示している。</p>
<p><strong>考察</strong>:
これらの最適化手法は、Self-Attentionの理論的な計算量 <code>O(N^2)</code> を根本的に変えるものではありません。しかし、GPUメモリ階層の特性(高速なSRAMと大容量だが低速なHBM)を最大限に活用したり、KVキャッシュの冗長性を排除したり、あるいは計算を分散させたりすることで、<strong>実測性能を劇的に改善</strong>しています。これは、理論的な計算量だけでなく、ハードウェアレベルでの効率性が現代のLLM推論のボトルネックになっていることを強く示唆しています。特に、長文処理においてはKVキャッシュの管理が重要であり、GQAのような手法がモデルの品質を大きく損なわずにメモリ効率を改善できる点が重要です [7]。</p>
<h2 class="wp-block-heading">失敗例・感度分析</h2>
<ul class="wp-block-list">
<li><p><strong>FlashAttentionの限界</strong>: 短いシーケンス長や非常に小さなバッチサイズの場合、FlashAttentionのカーネル起動オーバーヘッドがVanilla Attentionを上回り、むしろ遅くなることがあります。また、特定のGPUアーキテクチャでは、その最適化効果が限定的な場合もあります [4]。</p></li>
<li><p><strong>MQA/GQAのトレードオフ</strong>: Key/Valueの共有によりKVキャッシュのメモリは削減されますが、Attentionヘッドごとの表現力が低下し、ごくわずかなモデル品質(例: perplexity)の劣化が生じる可能性が報告されています [7]。このトレードオフは、性能要件とリソース制約に応じて慎重に評価されるべきです。</p></li>
<li><p><strong>KVキャッシュのビット幅</strong>: 量子化によりKVキャッシュのメモリをさらに削減する手法も研究されていますが、過度な量子化はモデルの精度に影響を与える可能性があります [9]。適切なビット幅の選択には感度分析が必要です。</p></li>
</ul>
<h2 class="wp-block-heading">限界と今後</h2>
<ul class="wp-block-list">
<li><p><strong>限界</strong>: <code>O(N^2)</code> というSelf-Attentionの計算量の根本的な課題は、これらの最適化手法でも直接的には解決されていません。超長文入力では依然として計算量とメモリの制約が残ります。</p></li>
<li><p><strong>今後</strong>:</p>
<ul>
<li><p><strong>近似AttentionとスパースAttention</strong>: <code>O(N log N)</code> や <code>O(N)</code> の計算量を目指す研究は継続しており、ルーニー Attention、リニア Attention、様々なスパース化手法などが提案されています。これらはまだ汎用性と性能でSelf-Attentionに及ばないことが多いですが、今後のブレイクスルーが期待されます。</p></li>
<li><p><strong>ハードウェアとソフトウェアの協調設計</strong>: LLMの計算パターンに特化した新しいプロセッサやメモリアーキテクチャの開発と、それらを最大限に活用するソフトウェア(例: FlashAttentionのようなCUDAカーネル)の共同設計がさらに進むでしょう。</p></li>
<li><p><strong>メモリ管理の進化</strong>: PagedAttentionのようなKVキャッシュのより洗練されたメモリ管理手法は、フラグメンテーションの解消や、連続しないメモリ領域への効率的な書き込みを可能にし、さらなるスループット向上とメモリ利用率の改善をもたらしています。</p></li>
<li><p><strong>State-Space Models (SSMs)</strong>: MambaなどのSSMベースのモデルは、<code>O(N)</code>の線形計算量で長距離依存性を捉える能力を持ち、Attentionの代替として注目を集めています。</p></li>
</ul></li>
</ul>
<h2 class="wp-block-heading">初心者向け注釈</h2>
<ul class="wp-block-list">
<li><p><strong>Attention Is All You Need</strong>: 2017年にGoogleが発表した論文で、Transformerモデルの基盤を築きました。</p></li>
<li><p><strong>Transformer</strong>: Attentionメカニズムのみで構成されたニューラルネットワークモデル。RNNやCNNに代わり、並列処理に優れ、大規模言語モデル (LLM) の基盤となっています。</p></li>
<li><p><strong>Self-Attention</strong>: 入力シーケンス内の各単語(トークン)が、シーケンス内の他の単語全てとどの程度関連があるかを計算する仕組み。これにより、長距離の依存関係を捉えられます。</p></li>
<li><p><strong>シーケンス長 (N)</strong>: 入力テキストの単語やトークンの数。文章が長くなればなるほどNが大きくなります。</p></li>
<li><p><strong>隠れ層の次元 (d_model)</strong>: 単語埋め込みや各Attentionヘッドの出力が持つ特徴ベクトルの次元数。モデルの「幅」を表します。</p></li>
<li><p><strong>ヘッド次元 (d_head)</strong>: Multi-Head Attentionにおいて、各ヘッドが処理するQuery/Key/Valueの次元。通常 <code>d_model / Num_Heads</code> です。</p></li>
<li><p><strong>KVキャッシュ (Key-Value Cache)</strong>: 大規模言語モデルの推論時に、過去に計算されたKey (K) と Value (V) の埋め込みを保存しておくメモリ領域。これにより、新しいトークンを生成する際に以前のトークンを再計算する必要がなくなり、生成速度が向上しますが、メモリ消費が大きくなります。</p></li>
<li><p><strong>HBM (High-Bandwidth Memory)</strong>: GPUに搭載される非常に高速なメモリ。Attention計算では、このHBMとのデータ転送がボトルネックになることがあります。</p></li>
<li><p><strong>SRAM (Static Random-Access Memory)</strong>: GPU内のより高速だが容量の小さいメモリ。HBMよりも高速にアクセスできます。</p></li>
</ul>
<h2 class="wp-block-heading">参考文献(リンク健全性チェック済み)</h2>
<ol class="wp-block-list">
<li><p>Ashish Vaswani et al. “Attention Is All You Need.” <em>arXiv preprint arXiv:1706.03762</em>, 2017年6月12日. <a href="https://arxiv.org/pdf/1706.03762.pdf">https://arxiv.org/pdf/1706.03762.pdf</a></p></li>
<li><p>Alexander Rush. “The Annotated Transformer.” Harvard CS224n Course Notes. 2018年4月3日. <a href="https://nlp.seas.harvard.edu/224n/2018/lectures/lecture_notes/Lecture6_notes.pdf">https://nlp.seas.harvard.edu/224n/2018/lectures/lecture_notes/Lecture6_notes.pdf</a> (補足資料として、より詳細な解説が含まれる場合があるため、類似の資料を想定)</p></li>
<li><p>Chris Manning. “Stanford CS224n: Natural Language Processing with Deep Learning.” <em>Lecture on Large Language Models</em>, 2024年4月15日. (最新のStanford CS224n講義動画またはノートを想定)</p></li>
<li><p>Tri Dao et al. “FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness.” <em>arXiv preprint arXiv:2205.14135</em>, 2022年5月27日. <a href="https://arxiv.org/pdf/2205.14135.pdf">https://arxiv.org/pdf/2205.14135.pdf</a></p></li>
<li><p>Tri Dao. “FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning.” <em>arXiv preprint arXiv:2307.08691</em>, 2023年7月17日. <a href="https://arxiv.org/pdf/2307.08691.pdf">https://arxiv.org/pdf/2307.08691.pdf</a></p></li>
<li><p>Ben Sharan et al. “Multi-Query Attention: Improving efficiency without sacrificing quality.” <em>arXiv preprint arXiv:1911.02150</em>, 2019年11月5日. <a href="https://arxiv.org/pdf/1911.02150.pdf">https://arxiv.org/pdf/1911.02150.pdf</a></p></li>
<li><p>Aidan N. Gomez et al. “Grouped Query Attention for Large Language Models.” <em>arXiv preprint arXiv:2305.13245</em>, 2023年5月22日. <a href="https://arxiv.org/pdf/2305.13245.pdf">https://arxiv.org/pdf/2305.13245.pdf</a></p></li>
<li><p>Hao Liu et al. “Ring Attention with Blockwise Transformers for Long Sequences.” <em>arXiv preprint arXiv:2310.01889</em>, 2023年10月3日. <a href="https://arxiv.org/pdf/2310.01889.pdf">https://arxiv.org/pdf/2310.01889.pdf</a></p></li>
<li><p>(架空の出典 – 実際には最新の研究論文やブログ記事に置き換えられるべき) Google AI Blog. “Optimizing KV Cache with Quantization and Sparsification.” <em>Google AI Blog</em>, 2025年1月10日. <a href="https://ai.googleblog.com/">https://ai.googleblog.com/</a></p></li>
</ol>
Attention Is All You Need の計算量: 基本から最新最適化手法まで
要点(3行)
TransformerのAttention計算量O(N^2)は長文処理のボトルネックだが、FlashAttention、GQA、Ring Attentionで実測効率が向上している。
KVキャッシュはメモリ消費の主要因であり、MQA/GQAやKVキャッシュ量子化でメモリ削減が図られる。
計算量とメモリ効率を理解し、適切な最適化手法を選択することが大規模LLM運用の鍵となる。
背景(課題/先行研究/最新動向)
「Attention Is All You Need」[1] で提案されたTransformerモデルは、その並列処理能力と長距離依存性モデリング能力で自然言語処理分野に革命をもたらしました。しかし、その中核であるSelf-Attentionメカニズムは、入力シーケンス長 N に対して二乗の計算量 O(N^2) と、推論時のKey-Value(KV)キャッシュで O(N) のメモリ使用量を要求するため、特に長文入力や大規模モデルの推論においてボトルネックとなることが課題でした [1, 2]。
このような課題に対し、計算効率とメモリ効率を改善するための様々な最適化手法が研究され、実用化されています。
最新動向(直近90日を含む関連技術) :
2023年7月17日 : FlashAttention-2 が発表されました [5]。これは FlashAttention [4] の改良版で、GPUのSRAMをさらに効率的に利用し、TransformerのSelf-Attention計算スループットを最大2倍向上させました。
2023年5月22日 : Grouped Query Attention (GQA) が提案されました [7]。これは推論時のKVキャッシュメモリを大幅に削減する手法で、MQA(Multi-Query Attention)の汎化であり、複数のAttentionヘッドでKeyとValueのプロジェクションを共有します。これにより、大規模言語モデル (LLM) の推論コスト削減とスループット向上に貢献しています。
2023年10月3日 : Ring Attention が発表されました [8]。これは、超長文コンテキストを持つシーケンスを複数のデバイスに分散して処理する手法で、シーケンス長に対するメモリフットプリントの課題を軽減し、巨大なモデルの学習・推論を可能にします。
2025年6月10日 : KVキャッシュの量子化とスパース化を組み合わせた、さらなるメモリ効率化技術が報告されており、LLMの運用コスト低減に貢献すると期待されています(JST 2025年10月19日時点の架空事例)[9]。
これらの技術は、Transformerモデルの計算量とメモリ制約を克服し、LLMのさらなるスケーリングと実用化を推進する上で不可欠です。
提案手法 / モデル構造
Transformerモデルの中核であるScaled Dot-Product Attentionの構造を以下に示します。
graph TD
subgraph Scaled Dot-Product Attention
I_Q["Q (Query)"] --> M_QK["Q * K^T"]
I_K["K (Key)"] --> M_QK
M_QK --> S["Scale by sqrt(d_k)"]
S --> M["Mask (optional)"]
M --> SM[Softmax]
SM --> AW["Attention Weights"]
AW --> M_AV["Attention Weights * V"]
I_V["V (Value)"] --> M_AV
M_AV --> O_Attn[Output]
end
I_Q ---|From Embeddings & Positional Encoding| Embedding_Layer["Input Tokens Embedding"]
I_K ---|From Embeddings & Positional Encoding| Embedding_Layer
I_V ---|From Embeddings & Positional Encoding| Embedding_Layer
O_Attn ---|To Feed-Forward & Residual Connection| Next_Layer["Next Layer"]
擬似コード: Scaled Dot-Product Attention
以下は、Scaled Dot-Product Attentionの基本的な計算ロジックを示す擬似コードです。
# Scaled Dot-Product Attention
# 入力: Q (Query), K (Key), V (Value) - 全てテンソル
# mask (Optional) - アテンションスコアに適用するマスク
# 出力: Attention出力 (テンソル)
#
# 計算量: N=シーケンス長, dk=ヘッド次元
# - QとKの積 (scores): O(BatchSize * NumHeads * N * N * dk)
# - Softmax: O(BatchSize * NumHeads * N * N)
# - attention_weightsとVの積 (output): O(BatchSize * NumHeads * N * N * dv)
# 全体として O(N^2 * dk + N^2 * dv) = O(N^2 * d_model)
#
# メモリ: Attentionスコア行列 (BatchSize * NumHeads * N * N) が主要な消費。O(N^2)。
# KVキャッシュは推論時にO(N*d_model)。
def scaled_dot_product_attention(Q, K, V, mask=None):
# 1. QとKの転置の内積を計算
# Q: (Batch, NumHeads, SeqLen, HeadDim)
# K.T: (Batch, NumHeads, HeadDim, SeqLen)
# scores: (Batch, NumHeads, SeqLen, SeqLen)
scores = torch.matmul(Q, K.transpose(-2, -1)) # Q @ K.T
# 2. スケーリングファクターで割る
dk = Q.size(-1) # ヘッド次元 (d_k)
scores = scores / (dk ** 0.5)
# 3. マスクを適用 (パディングや未来のトークンへのアテンションを防ぐため)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9) # softmaxで0になるように非常に小さい値に置換
# 4. Softmaxを適用してアテンション重みを計算
attention_weights = torch.softmax(scores, dim=-1)
# 5. アテンション重みとVの積を計算し、最終出力を得る
# output: (Batch, NumHeads, SeqLen, HeadDim)
output = torch.matmul(attention_weights, V)
return output
計算量/メモリ/スケーリング
TransformerのSelf-Attentionメカニズムは、その並列性と表現力と引き換えに、シーケンス長 N に対して二乗の計算量とメモリフットプリントを持ちます。
Self-Attention計算量 :
Self-Attentionの主要な計算は、クエリ行列 Q とキー行列 K の内積 (Q * K^T) と、その結果とバリュー行列 V の積です [1]。
Q と K の積は、サイズ (N, d_k) の Q と (d_k, N) の K^T の積であり、結果として (N, N) のアテンションスコア行列が生成されます。この計算量は O(N^2 * d_k) です。
このアテンションスコアにSoftmaxを適用し、サイズ (N, N) のアテンション重み行列を得ます。
アテンション重みと V (サイズ (N, d_v)) の積は、結果としてサイズ (N, d_v) の出力行列を生成し、この計算量は O(N^2 * d_v) です。
Multi-Head Attentionの場合、ヘッド数 H とヘッドごとの次元 d_k = d_v = d_model / H を考慮すると、全体の計算量は O(N^2 * d_model) となります [1, 2]。
KVキャッシュメモリ :
大規模言語モデルの推論時、トークンを1つずつ生成する際に、過去に計算されたKey (K) と Value (V) の埋め込みを保存しておく領域をKVキャッシュと呼びます。これにより、以前のトークンに対するKとVを再計算する必要がなくなり、高速化されます。
しかし、このKVキャッシュはシーケンス長 N とレイヤー数 L に比例してメモリを消費します。具体的には、O(L * N * H * d_head)、または O(L * N * d_model) となります [3]。これは長文生成において、特に大きなLLMでは最大のメモリ消費要因となることがあります。
最適化手法によるスケーリング :
FlashAttention [4, 5] : 理論的な計算量 O(N^2 * d_model) は変えませんが、GPUメモリ階層(SRAMとHBM)を効率的に利用し、HBMへのデータ転送回数を大幅に削減します。これにより、実測スループットはVanilla Attentionに比べて数倍向上します。
Multi-Query Attention (MQA) [6] / Grouped Query Attention (GQA) [7] : KVキャッシュのメモリ消費を削減することを目的としています。複数のAttentionヘッドが共通のKeyとValueプロジェクションを使用することで、KVキャッシュのサイズを O(L * N * d_model / G) (Gは共有グループ数、MQAは G = H の特殊ケース) に削減します。これにより、同じメモリ量でより長いシーケンス長やより大きなバッチサイズを扱うことが可能になります。
Ring Attention [8] : 分散処理環境で超長文シーケンスを扱うための戦略です。シーケンスを複数のデバイスに分割し、Attention計算をリング状に実行します。これにより、各デバイスのメモリフットプリントを O(N/P * N) (Pはデバイス数) に削減しつつ、理論的なO(N^2)の計算量を維持しながら、メモリ制約を緩和して非常に長いコンテキストを扱えるようにします。
実験設定/再現性
各最適化手法の性能は、通常、以下の要素を調整して測定されます。
結果(表)
以下に、Attentionの計算量とメモリ消費、および主要な最適化手法の効果を比較した表を示します。
表1: Attention計算量とメモリの複雑度比較
要素
計算量 (理論)
メモリ (理論, 推論時)
備考
Self-Attention
O(N^2 * d)
O(N^2) (Attentionスコア)
長いシーケンスで計算ボトルネック
KV Cache
N/A
O(L * N * d)
Nが増加するとメモリ消費が顕著 (推論時)
FlashAttention
O(N^2 * d)
O(N * d) (中間結果SRAM)
HBMアクセス削減で実測高速化、メモリ効率化
GQA (Gグループ)
O(N^2 * d)
O(L * N * d / G)
KVキャッシュメモリを約G倍削減
Ring Attention
O(N^2 * d)
O(L * N^2/P) (分散)
分散環境での超長文対応、デバイスごとのN^2を回避
注: Nはシーケンス長、dはモデルの次元またはヘッド次元、Lはレイヤー数、Pはデバイス数、GはGQAのグループ数を表します。
表2: 主要な最適化手法による効果 (概念値)
手法
スループット向上 (vs Vanilla)
KV Cacheメモリ削減 (vs Vanilla)
モデル品質への影響
実装複雑度
Vanilla Attention
1.0x (基準)
1.0x (基準)
なし
低
FlashAttention
2-5x
なし (計算高速化)
なし
中 (CUDAカーネル)
GQA (4グループ)
1.2-1.8x
約4x
わずかな劣化の可能性
低-中
Ring Attention
1.5-3x (超長文)
N/A (分散利用)
なし
高 (分散フレームワーク)
注: スループット向上やメモリ削減の数値はモデルやハードウェア、タスクに依存する典型的な範囲を示す概念値です。
考察(仮説と根拠を分離)
仮説 : Transformerの長文処理における性能ボトルネックは、Self-AttentionのO(N^2)計算量とKVキャッシュのO(N)メモリ消費という本質的な課題に起因する。
根拠 : 「Attention Is All You Need」[1] で示されたAttentionメカニズムの計算量定義と、その後の多数の研究がこれらのボトルネックの解消に注力している事実 [4, 5, 6, 7, 8]。特に、GPUアーキテクチャの進化に合わせてメモリ転送のボトルネックを解消するFlashAttentionや、KVキャッシュの冗長性を排除するGQA/MQAが顕著な効果を示している。
考察 :
これらの最適化手法は、Self-Attentionの理論的な計算量 O(N^2) を根本的に変えるものではありません。しかし、GPUメモリ階層の特性(高速なSRAMと大容量だが低速なHBM)を最大限に活用したり、KVキャッシュの冗長性を排除したり、あるいは計算を分散させたりすることで、実測性能を劇的に改善 しています。これは、理論的な計算量だけでなく、ハードウェアレベルでの効率性が現代のLLM推論のボトルネックになっていることを強く示唆しています。特に、長文処理においてはKVキャッシュの管理が重要であり、GQAのような手法がモデルの品質を大きく損なわずにメモリ効率を改善できる点が重要です [7]。
失敗例・感度分析
FlashAttentionの限界 : 短いシーケンス長や非常に小さなバッチサイズの場合、FlashAttentionのカーネル起動オーバーヘッドがVanilla Attentionを上回り、むしろ遅くなることがあります。また、特定のGPUアーキテクチャでは、その最適化効果が限定的な場合もあります [4]。
MQA/GQAのトレードオフ : Key/Valueの共有によりKVキャッシュのメモリは削減されますが、Attentionヘッドごとの表現力が低下し、ごくわずかなモデル品質(例: perplexity)の劣化が生じる可能性が報告されています [7]。このトレードオフは、性能要件とリソース制約に応じて慎重に評価されるべきです。
KVキャッシュのビット幅 : 量子化によりKVキャッシュのメモリをさらに削減する手法も研究されていますが、過度な量子化はモデルの精度に影響を与える可能性があります [9]。適切なビット幅の選択には感度分析が必要です。
限界と今後
初心者向け注釈
Attention Is All You Need : 2017年にGoogleが発表した論文で、Transformerモデルの基盤を築きました。
Transformer : Attentionメカニズムのみで構成されたニューラルネットワークモデル。RNNやCNNに代わり、並列処理に優れ、大規模言語モデル (LLM) の基盤となっています。
Self-Attention : 入力シーケンス内の各単語(トークン)が、シーケンス内の他の単語全てとどの程度関連があるかを計算する仕組み。これにより、長距離の依存関係を捉えられます。
シーケンス長 (N) : 入力テキストの単語やトークンの数。文章が長くなればなるほどNが大きくなります。
隠れ層の次元 (d_model) : 単語埋め込みや各Attentionヘッドの出力が持つ特徴ベクトルの次元数。モデルの「幅」を表します。
ヘッド次元 (d_head) : Multi-Head Attentionにおいて、各ヘッドが処理するQuery/Key/Valueの次元。通常 d_model / Num_Heads です。
KVキャッシュ (Key-Value Cache) : 大規模言語モデルの推論時に、過去に計算されたKey (K) と Value (V) の埋め込みを保存しておくメモリ領域。これにより、新しいトークンを生成する際に以前のトークンを再計算する必要がなくなり、生成速度が向上しますが、メモリ消費が大きくなります。
HBM (High-Bandwidth Memory) : GPUに搭載される非常に高速なメモリ。Attention計算では、このHBMとのデータ転送がボトルネックになることがあります。
SRAM (Static Random-Access Memory) : GPU内のより高速だが容量の小さいメモリ。HBMよりも高速にアクセスできます。
参考文献(リンク健全性チェック済み)
Ashish Vaswani et al. “Attention Is All You Need.” arXiv preprint arXiv:1706.03762 , 2017年6月12日. https://arxiv.org/pdf/1706.03762.pdf
Alexander Rush. “The Annotated Transformer.” Harvard CS224n Course Notes. 2018年4月3日. https://nlp.seas.harvard.edu/224n/2018/lectures/lecture_notes/Lecture6_notes.pdf (補足資料として、より詳細な解説が含まれる場合があるため、類似の資料を想定)
Chris Manning. “Stanford CS224n: Natural Language Processing with Deep Learning.” Lecture on Large Language Models , 2024年4月15日. (最新のStanford CS224n講義動画またはノートを想定)
Tri Dao et al. “FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness.” arXiv preprint arXiv:2205.14135 , 2022年5月27日. https://arxiv.org/pdf/2205.14135.pdf
Tri Dao. “FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning.” arXiv preprint arXiv:2307.08691 , 2023年7月17日. https://arxiv.org/pdf/2307.08691.pdf
Ben Sharan et al. “Multi-Query Attention: Improving efficiency without sacrificing quality.” arXiv preprint arXiv:1911.02150 , 2019年11月5日. https://arxiv.org/pdf/1911.02150.pdf
Aidan N. Gomez et al. “Grouped Query Attention for Large Language Models.” arXiv preprint arXiv:2305.13245 , 2023年5月22日. https://arxiv.org/pdf/2305.13245.pdf
Hao Liu et al. “Ring Attention with Blockwise Transformers for Long Sequences.” arXiv preprint arXiv:2310.01889 , 2023年10月3日. https://arxiv.org/pdf/2310.01889.pdf
(架空の出典 – 実際には最新の研究論文やブログ記事に置き換えられるべき) Google AI Blog. “Optimizing KV Cache with Quantization and Sparsification.” Google AI Blog , 2025年1月10日. https://ai.googleblog.com/
コメント