JA EN
体系Transformerの仕組み
·★ 会員·論文·13分で読めます

FlashAttentionを1から — 計算を増やして速くする逆説

FlashAttentionは逆伝播でわざと同じ計算をやり直します。演算回数は増えるのに速い——GPUでは掛け算よりデータの運搬のほうが高いからです。HBMとSRAMの往復を数えるところから、タイリングを阻むsoftmaxの壁、それを壊すオンラインsoftmaxの漸化式、そして現場でバックエンドが静かにフォールバックする落とし穴までを前提知識ゼロから追います。

対象textタスクinference

FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness


最適化なのに、計算が増える

高速化と聞けば、ふつうは無駄な計算を削る話を想像します。FlashAttentionは逆です。逆伝播(誤差を戻す計算)で、順伝播とほぼ同じ計算をもう一度やり直します。演算回数は明確に増える。それでも素朴な実装より速い。

種明かしは一行で済みます。いまのGPUでは、掛け算をするより、数をメモリから運んでくるほうが高い。 だから「運ぶ回数が減るなら、計算はやり直したほうが安い」という交換レートが成立します。しかもFlashAttentionは近似ではありません。間引きも疎化もせず、素朴な実装と数学的に同じ答えを出します。変えたのは答えではなく、答えにたどり着く経路です。

比喩: 採点表を紙に書かない

資料が地下の倉庫にあり、はとても狭い図書館を想像してください。倉庫との往復は遅く、机の上の作業は一瞬で終わります。

仕事は「1000人の応募者を1000項目で採点し、点数の割合に応じて意見を混ぜる」こと。素朴なやり方では、まず100万マスの採点表を作り、机に載らないので倉庫にしまい、行ごとの合計を出すために出し直し、割合に直してまたしまい、意見を混ぜるのに三度目を出してきます。

FlashAttentionは採点表を紙に書きません。応募者を50人ずつの束に分け、束ごとに机の上で採点し、答えの途中経過だけを机に置いたまま更新し続ける。最後の束を終えたとき、机には完成した答えが残っています。

倉庫がGPUのHBM(大容量・低速な外部メモリ)、机がSRAM(小容量・高速なオンチップメモリ)です。落差が実際に何桁あるかはGPUのメモリ階層で扱っています。

おさらい: 途中だけ N×N に膨らむ

Attention機構を1から理解するで見たとおり、自己注意は3行で書けます。系列長(トークン数)を NN、ヘッド次元を dd とします。

S=QKd,P=softmax(S),O=PVS = \frac{QK^\top}{\sqrt{d}}, \qquad P = \mathrm{softmax}(S), \qquad O = PV
(1)

Q,K,VQ, K, V はどれも N×dN \times d の行列で、各行が1トークンの「質問」「名札」「発言内容」です。SS は全員と全員を突き合わせた N×NN \times N の点数表、PP はそれを行ごとに合計1の割合へ直したもの、OO が出力(N×dN \times d)。つまり入力も出力も N×dN \times d なのに、途中だけ N×NN \times N に膨らむ。ここがすべての元凶です。

FIG 1円卓の上を注意の重みが飛ぶ。FlashAttentionが計算するのは、この図とまったく同じ重みと出力です。変わるのは「重みの表を紙に書き出すかどうか」だけ

遅いのは計算ではなく、往復である

数字にすると効きます。N=4096N = 4096d=128d = 128 なら、QQ は約52万要素なのに SS は約1678万要素——32倍です。系列長を4倍にすれば QQ は4倍にしかならないのに SS は16倍になり、比は128倍へ開きます。

素朴な実装は、この巨大な表をHBMに何度も往復させます。SS を書き出す、softmaxのために読み直す、PP を書き出す、VV との積でまた読む。運ぶバイト数は N2N^2 に比例し、演算量は N2dN^2 d に比例するので、1バイトあたりの演算回数は dd 程度。完全に帯域律速の領域です。

しかも SSPP も、最後には捨てられる中間結果です。最終出力より大きな中間結果を、わざわざ倉庫に往復させている。ここに手を入れられる、というのが出発点でした。

タイリングを阻む、softmaxという壁

「大きな行列を小さなブロックに切り、速いメモリに載る分だけ処理する」——タイリングは行列積では昔からの定石です。ではなぜattentionでやっていなかったのか。

softmaxが邪魔をするからです。

softmax(s)j=esjmkeskm,m=maxksk\mathrm{softmax}(s)_j = \frac{e^{s_j - m}}{\sum_{k} e^{s_k - m}}, \qquad m = \max_k s_k

sjs_j は点数表の1マス、mm はその行の最大値です。最大値を引いてから指数を取るのは exe^x が桁あふれしないための定番の安定化で、分子と分母に同じ定数がかかるだけなので答えは変わりません。

問題は mm と分母の合計です。どちらも行を最後まで見ないと確定しません。ブロックを1つ処理した時点では、後からもっと大きな点数が現れるかもしれない。だから「表を出し切ってから正規化する」実装になり、N×NN \times N を持たざるを得なかった——長らくそう思われていました。

この壁を壊すのがオンラインsoftmaxです。発想は単純で、「最大値が更新されたら、それまでに足した分をまとめて縮める」。

この先にあるもの

§

ここから先は会員限定です

解説記事371本・教科書26章・学生モード48単元・論文精読6本が、月額¥490ですべて読み放題になります。新しい解説は毎日3本ずつ増えます。いつでも解約でき、解約後も期間の終わりまで読めます。

会員の方はログインすると続きが表示されます

参考文献

  1. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv:2205.14135論文ページ·PDF
  2. FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning. arXiv:2307.08691論文ページ·PDF
  3. FlashAttention-3: Fast and Accurate Attention with Asynchrony and Low-precision. arXiv:2407.08608論文ページ·PDF
  4. Online normalizer calculation for softmax. arXiv:1805.02867論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です