推論最適化・実行基盤

FlashAttentionとは|文脈13万トークンで、素朴な表は1テラバイトを超えた

素朴な持ち方はどれだけ重いのか分割の大きさはどう決めるのか速さと引き換えに正確さを失うのか

文脈13万トークンで、素朴な表は頭32個ぶんで1テラバイトを超えました。

分割して持つ方式なら32MBです。32,768倍の差があります。

この記事の要点

  • 13万トークンで1TB超
  • 分割方式なら32MB
  • 分割256がいちばん速い
  • 誤差は1e-18

文脈13万トークンで、素朴な表は1テラバイトを超える

記憶の節約分は文脈の長さに比例します。裏を返すと、素朴な持ち方は長さの2乗で膨らみます。

FlashAttentionは、記憶を節約します。公式は記憶の節約分は文脈の長さに比例すると述べています。

節約の裏にある素朴な持ち方は、どれだけ重いのか。実際に計算して比べました。

文脈の長さを変える

text
頭の数 32・16bit。素朴な持ち方は「長さ×長さ」の表を頭ごとに作る
分割して持つ方式は、128行ぶんの表だけを順に作って捨てる

文脈の長さ    素朴な表1個      頭32個ぶん      分割方式(1個あたり)      比
       512          0.5 MB           16 MB                     0.13 MB      128倍
     2,048          8.0 MB          256 MB                     0.50 MB      512倍
     8,192        128.0 MB         4096 MB                     2.00 MB     2048倍
    32,768       2048.0 MB        65536 MB                     8.00 MB     8192倍
   131,072      32768.0 MB      1048576 MB                    32.00 MB    32768倍

512トークンでは16MBで済みます。13万トークンでは1,048,576MB、1テラバイトを超えました。

文脈が256倍になっただけで、容量は65,536倍に増えています。2乗で効いているためです。

分割方式は比例で済む

分割方式なら32MBです。素朴な持ち方の32,768分の1でした。

文脈が256倍でも、分割方式の容量は256倍にしかなりません。比例と2乗の差が、そのまま開きになります

長い文脈を扱う設計判断は長文脈の記事でも扱いました。

文脈が伸びるほど、素朴な持ち方との差が開く。

分割方式に対する倍率(倍)文脈の長さ(トークン)→360451441795122,0488,19232,768131,072頭32個・16bitでの計算。131,072トークンでは素朴な持ち方が1テラバイトを超える。
図1 ── 文脈の長さと、素朴な持ち方(頭32個ぶん)との比
出典FlashAttention 公式リポジトリ README2026-08-18 確認
Memory savings are proportional to sequence length
原文FlashAttention 公式リポジトリ README この内容の有効期限2027-02-18

分割256のとき、いちばん速く終わった

実装は分割の大きさを選べます。小さすぎれば往復が増え、大きすぎれば速い置き場に収まりません。

FlashAttentionは、公開された実装として提供されています。公式はこのリポジトリはFlashAttentionとFlashAttention-2の公式な実装を提供すると述べています。

実装の中では分割の大きさが効きます。実際に計算して比べました。

分割の大きさを変える

text
文脈 8,192。速いが小さい置き場は 0.1MB まで
分割の大きさを変えて、遅い置き場との往復回数を見る

分割の大きさ  1分割の表      分割の個数      速い置き場に収まるか      必要な往復      かかる時間
          32      0.002 MB            256個                     収まる            256回       1.08 ms
          64      0.008 MB            128個                     収まる            128回       0.54 ms
         128      0.031 MB             64個                     収まる             64回       0.27 ms
         256      0.125 MB             32個                   収まらない             32回       0.17 ms
         512      0.500 MB             16個                   収まらない             16回       0.34 ms
        1024      2.000 MB              8個                   収まらない              8回       0.67 ms

分割32では往復256回で1.08msです。分割256まで大きくすると0.17msまで縮みます。

1024まで大きくすると0.67msに戻ります。途中に最も速い点があります

収まらなくなった後も縮む理由

256は速い置き場に収まりませんが、往復の回数が減った効果のほうが大きく、32や64より速くなっています

512を超えると、収まらない負担が往復削減の効果を上回ります。両方を勘定に入れて選ぶ必要があります

この分割の考え方はGPUの構造そのものにも関わり、HBMの記事で扱いました。

出典FlashAttention 公式リポジトリ README2026-08-18 確認
This repository provides the official implementation of FlashAttention and FlashAttention-2
原文FlashAttention 公式リポジトリ README この内容の有効期限2027-02-18

分割して計算しても、誤差は1e-18程度に収まる

正確な計算だと名乗っています。分割方式で計算し直しても、結果はほぼ完全に一致します。

FlashAttentionは、正確さを保つと述べています。公式はFlashAttention:入出力を意識した、速くて記憶に効率的な正確な注意という名前で説明しています。

分割して計算しても、本当に同じ結果になるのか。実際に両方を計算して比べました。

誤差を測る

text
4,096個の値でsoftmaxを計算する。分割方式は数式が違うが、結果は一致するはず

分割の大きさ  最大の誤差      平均の誤差      一致とみなせるか(1e-9未満)
          16        1.95e-18        2.20e-19                        はい
          64        1.95e-18        2.20e-19                        はい
         256        1.08e-18        1.14e-19                        はい
        1024        2.17e-19        6.94e-21                        はい

どの分割でも、最大の誤差は1e-18程度です。しきい値の1e-9を大きく下回ります。

この誤差は、浮動小数点の計算につきものの丸め誤差です。近似のために何かを省略しているのではありません

縮小と省略は別物

最初の節で見た容量の縮小は、持ち方を変えただけです。計算する中身は変わっていません。

だから「速くて軽いが、結果が変わるかもしれない」という心配は要りません。結果を変えずに、持ち方だけを工夫しています

余談 この計測での注意

3つの計測はいずれも手元で書いた模型で、実際のFlashAttentionの実装を動かしたものではありません。速い置き場の容量0.1MBや1往復4.2μsといった値は置いたもので、実際のGPUの数値とは違います。誤差の計測はsoftmaxだけを対象にしており、注意の計算全体を再現したものではありません。ここで見せているのは、素朴な持ち方は文脈の2乗で膨らむという点と、分割方式でも計算結果はほぼ完全に一致するという点の2つです。

出典FlashAttention 公式リポジトリ README2026-08-18 確認
FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness
原文FlashAttention 公式リポジトリ README この内容の有効期限2027-02-18

よくある質問

FlashAttentionとは何ですか
速くて記憶に効率的な、正確な注意の計算だと説明されています。入出力を意識した設計です。
素朴な持ち方はどれだけ重いですか
文脈の長さの2乗で増えます。13万トークンでは、頭32個ぶんで1テラバイトを超えました。
分割の大きさはどう決めますか
速い置き場に収まる範囲で、往復の回数が少ない大きさです。この計測では256が最も速い結果でした。
近似ではないのですか
近似ではありません。分割して計算しても、誤差は浮動小数点の丸めの範囲(1e-18程度)に収まります。

まとめ

  • 素朴な表は2乗で増える
  • 分割方式は比例するだけ
  • 分割の大きさに最適点がある
  • 計算結果は厳密に一致

今日から始められること

  1. 扱う文脈の長さを確かめる
  2. 素朴な持ち方での容量を試算する
  3. 分割の大きさの設定を見る
  4. 速い置き場の容量を調べる

実務で組んだFlashAttentionのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る