文脈13万トークンで、素朴な表は頭32個ぶんで1テラバイトを超えました。
分割して持つ方式なら32MBです。32,768倍の差があります。
記憶の節約分は文脈の長さに比例します。裏を返すと、素朴な持ち方は長さの2乗で膨らみます。
FlashAttentionは、記憶を節約します。公式は記憶の節約分は文脈の長さに比例すると述べています。
節約の裏にある素朴な持ち方は、どれだけ重いのか。実際に計算して比べました。
頭の数 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乗の差が、そのまま開きになります。
長い文脈を扱う設計判断は長文脈の記事でも扱いました。
文脈が伸びるほど、素朴な持ち方との差が開く。
Memory savings are proportional to sequence length原文FlashAttention 公式リポジトリ README この内容の有効期限2027-02-18
実装は分割の大きさを選べます。小さすぎれば往復が増え、大きすぎれば速い置き場に収まりません。
FlashAttentionは、公開された実装として提供されています。公式はこのリポジトリはFlashAttentionとFlashAttention-2の公式な実装を提供すると述べています。
実装の中では分割の大きさが効きます。実際に計算して比べました。
文脈 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の記事で扱いました。
This repository provides the official implementation of FlashAttention and FlashAttention-2原文FlashAttention 公式リポジトリ README この内容の有効期限2027-02-18
正確な計算だと名乗っています。分割方式で計算し直しても、結果はほぼ完全に一致します。
FlashAttentionは、正確さを保つと述べています。公式はFlashAttention:入出力を意識した、速くて記憶に効率的な正確な注意という名前で説明しています。
分割して計算しても、本当に同じ結果になるのか。実際に両方を計算して比べました。
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: Fast and Memory-Efficient Exact Attention with IO-Awareness原文FlashAttention 公式リポジトリ README この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る