Flash Attention
๐ ๊ด๋ จ ๋ ผ๋ฌธ: [NeurIPS 2022] FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness
๐ ๊ด๋ จ ๋ ผ๋ฌธ: [ICLR 2024] FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning
ํ๋์จ์ด ๊ฐ๋
- ํ๋๋์คํฌ: ํ๋ก๊ทธ๋จ ์คํ ์ ์ด๋ ์ ์์ด ๊บผ์ก์ ๋ ํ์ผ ํํ๋ก ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋๋ ๋นํ๋ฐ์ฑ ์ ์ฅ ์ฅ์น์ด๋ค.
- CPU RAM: ๋ณ์๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ํ์ผ์ ๋ก๋ํ ๋ ๋ฐ์ดํฐ๊ฐ ์์๋ก ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค. ์ ์์ด ๊บผ์ง๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ์ด๋ฉฐ, CPU๊ฐ ์ง์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ํ๋ ๋์คํฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ PyTorch์
torch.load()์ ๊ฐ์ ์ฝ๋๋ฅผ ํตํด CPU RAM์ผ๋ก ๋ณต์ฌํ ์ ์๋ค. - GPU RAM: CPU ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ท๋ชจ ๋ณ๋ ฌ ์ฐ์ฐ์ ์ํด ๋ณต์ฌํด ๋๋ ๊ณต๊ฐ์ด๋ค. CPU RAM์ ์๋ ๋ฐ์ดํฐ๋ฅผ PyTorch์
.to('cuda')์ ๊ฐ์ ์ฝ๋๋ฅผ ํตํด GPU RAM์ผ๋ก ๋ณต์ฌํ ์ ์๋ค.
GPU ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต
Flash Attention์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด, GPU ๋ฉ๋ชจ๋ฆฌ์ ์ข ๋ฅ๋ฅผ ํฌ๊ฒ HBM๊ณผ SRAM์ผ๋ก ๋๋ ์ ์ดํด๋ณด๊ฒ ๋ค.
HBM (High Bandwidth Memory)
HBM์ ์ฌ๋ฌ ๊ฐ์ DRAM (Dynamic RAM) ์นฉ์ ์์ง์ผ๋ก ์์ ์ฌ๋ฆฐ ํํ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก VRAM์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ณต๊ฐ์ผ๋ก, ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๊ฐ์ค์น์ ๋๊ท๋ชจ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์์ฃผํ๋ GPU์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ์ญํ ์ ํ๋ค.
์ ์ฅ ์ฉ๋์ด ๋น๊ต์ ํฌ๊ณ ํ ๋ฒ์ ์ ์กํ ์ ์๋ ๋์ญํญ์ด ๋์ง๋ง, ์ฐ์ฐ์ ์ํํ๋ GPU Core ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ Latency๊ฐ ๊ธธ๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ก ์ธํด GPU Core๊ฐ HBM์์ ๋ฐ์ดํฐ๊ฐ ์ค๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์ฌ๊ฒ ๋๋ Memory Bottleneck ํ์์ด ๋ฐ์ํ๊ฒ ๋๋ค.
SRAM (Static Random Access Memory)
SRAM์ ์ฐ์ฐ์ ์ํํ๋ GPU Core ๋ฐ๋ก ์์ ์์นํ ๊ณ ์ Cache ๋ฉ๋ชจ๋ฆฌ์ด๋ค.
HBM์ ๋นํด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ์๋๊ฐ ์๋์ ์ผ๋ก ๋น ๋ฅด์ง๋ง, ์นฉ ๋ด๋ถ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ํ ๋น๋์ด ์์ด ์ฉ๋์ด ๋งค์ฐ ์ ํ์ ์ด๋ค. (๋ณดํต ์๋ฐฑ KB ์์ค)
๋ฐ๋ผ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ SRAM์ ์ฌ๋ ค๋ ์๋ ์์ผ๋ฉฐ, ๋น์ฅ ์ฐ์ฐ์ ํ์ํ ํต์ฌ ๋ฐ์ดํฐ๋ง ์์ฃผ ์งง์ ์๊ฐ ๋์ ๋จธ๋ฌผ๊ฒ ๋๋ค.
Standard Attention
Standard Attention์ GPU ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ์ด๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- HBM์์ $Q$์ $K$ ํ๋ ฌ์ ์ผ๋ถ๋ฅผ SRAM์ผ๋ก ๊ฐ์ ธ์จ๋ค. (Read)
- ๊ฐ์ ธ์จ $Q$์ $K$ ์กฐ๊ฐ์ผ๋ก, $S=QK^\top$ ์ฐ์ฐ์ ์ํํ๋ค.
- ์ฐ์ฐ์ด ์๋ฃ๋ $S$ ์กฐ๊ฐ์ HBM์ผ๋ก ๋ด๋ณด๋ธ๋ค. (Write)
$N\times N$ ํฌ๊ธฐ์ $S$ ํ๋ ฌ์ด ๋ชจ๋ ์์ฑ๋ ๋๊น์ง 1~3 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- HBM์์ $S$์ ์ผ๋ถ ํ์ SRAM์ผ๋ก ๊ฐ์ ธ์จ๋ค. (Read)
- ๊ฐ์ ธ์จ $S$ ์กฐ๊ฐ์ผ๋ก, $P=\text{softmax}(S)$ ์ฐ์ฐ์ ์ํํ๋ค.
- Softmax๊ฐ ์ ์ฉ๋ $P$ ์กฐ๊ฐ์ HBM์ผ๋ก ๋ด๋ณด๋ธ๋ค. (Write)
$P$ ํ๋ ฌ์ด ๋ชจ๋ ์์ฑ๋ ๋๊น์ง 5~7 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๋ง์ง๋ง์ผ๋ก HBM์์ $V$์ $P$ ํ๋ ฌ์ ์ผ๋ถ๋ฅผ SRAM์ผ๋ก ๊ฐ์ ธ์จ๋ค. (Read)
- ๊ฐ์ ธ์จ $V$์ $P$ ์กฐ๊ฐ์ผ๋ก, $O=PV$ ์ฐ์ฐ์ ์ํํ๋ค.
- ์ฐ์ฐ์ด ์๋ฃ๋ $O$ ์กฐ๊ฐ์ HBM์ผ๋ก ๋ด๋ณด๋ธ๋ค. (Write)
$N\times D$ ํฌ๊ธฐ์ $O$ ํ๋ ฌ์ด ๋ชจ๋ ์์ฑ๋ ๋๊น์ง 7~8 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
SRAM์ ๋ฌผ๋ฆฌ์ ์ธ ์ฉ๋์ด ์๊ธฐ ๋๋ฌธ์, ํ๋์จ์ด ์ฐ์ฐ๊ธฐ ์์ค์์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋์ด ์ฒ๋ฆฌํ๋ Tiling ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
ํ์ง๋ง Standard Attention ์ ์น๋ช
์ ์ธ ๋ฌธ์ ๋ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฌผ์ธ $S$์ $P$์ ํฌ๊ธฐ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ํ์ค ๊ธธ์ด $N$์ด Head ์ฐจ์ $d_h$๋ณด๋ค ์๋์ ์ผ๋ก ํฌ๊ธฐ ๋๋ฌธ์, ์ค๊ฐ์ ์์ฑ๋๋ $S$์ $P$ ํ๋ ฌ์ $N \times N$์ด๋ผ๋ ๋ง๋ํ ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋๋ค.
๋ฌธ์ ๋ ์ด๋ ๊ฒ ๊ฑฐ๋ํ ํ๋ ฌ์ด ๋๋ฆฐ HBM๊ณผ SRAM ์ฌ์ด๋ฅผ ๋ฐ๋ณตํด์ ์ค๊ฐ๋ค๋ ์ ์ด๋ค. (5~7๋ฒ ๊ณผ์ )
๋น๋ก Tiling์ ํตํด ํ ๋ฒ์ ์ฌ๋ฆฌ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ค์๋๋ผ๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์, ๊ฒฐ๊ตญ ์ ์ฒด HBM ์ ๊ทผ๋ ์์ฒด๋ $O(N^2)$์ ๋ฌํ๊ฒ ๋๋ค.
Flash Attention
Flash Attention์์๋ Tiling Softmax (Online Softmax)๋ฅผ ๊ตฌํํ์ฌ, ๊ธฐ์กด Softmax ํจ์์ I/O ๋ณ๋ชฉ์ ์ค์๋ค.
Flash Attention์ GPU ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ์ด๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
HBM์์ $Q,K,V,O$ ํ๋ ฌ์ ์ผ๋ถ์ Softmax ํต๊ณ๋์ SRAM์ผ๋ก ๊ฐ์ ธ์จ๋ค. (Read)
(์ฒซ ๋ฒ์งธ ๋ฃจํ์ฌ์ $O$์ Softmax ํต๊ณ๋์ด ์๋ค๋ฉด, ์ด๊ธฐํ๋ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ ธ์จ๋ค.)
- ๊ฐ์ ธ์จ $Q$์ $K$ ์กฐ๊ฐ์ผ๋ก, $S=QK^\top$ ์ฐ์ฐ์ ์ํํ๋ค.
- ๊ฐ์ ธ์จ Softmax ํต๊ณ๋์ ์ด์ฉํด, SRAM์์ ๋ฐ๋ก $P$ ์กฐ๊ฐ์ ๊ณ์ฐํ๋ค.
- ๊ณ์ฐ๋ $P$ ์กฐ๊ฐ๊ณผ ๊ฐ์ ธ์จ $V$ ์กฐ๊ฐ์ผ๋ก, SRAM์์ ๋ฐ๋ก $O=PV$ ์ฐ์ฐ์ ์ํํ๋ค.
- 2~3 ๊ณผ์ ์์ ์์ฑ๋ $S$์ $P$ ์กฐ๊ฐ์ HBM์ ๋ด๋ณด๋ด์ง ์๊ณ , ์ฐ์ฐ์ด ๋๋๋ ์ฆ์ ๋ฐ๋ก ํ๊ธฐํ๋ค.
- ์ต์ข ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ $O$ ์กฐ๊ฐ๊ณผ ํต๊ณ๋๋ง HBM์ผ๋ก ๋ด๋ณด๋ธ๋ค. (Write)
- $N\times D$ ํฌ๊ธฐ์ $O$ ํ๋ ฌ์ด ๋ชจ๋ ์์ฑ๋ ๋๊น์ง 1~6 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๊ธฐ์กด Softmax์ ํ๊ณ์
์ ๋ ฅ ๋ฐ์ดํฐ $x_i$์ ๋ํด, Softmax ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
\[\text{Softmax}(x_i) = \frac{e^{x_i - m}}{l} ,\quad\text{where }x_i\in\vx \tag{1}\]์ฌ๊ธฐ์ $m$์ ์ ์ฒด ์์์ ์ต๋๊ฐ $\max(\vx)$์ด๊ณ , $l$์ ์ง์ ํจ์์ ์ ์ฒด ํฉ $\sum_j e^{x_j - m}$์ ์๋ฏธํ๋ค.
Stadard Attention์์ ๋ฌด๊ฑฐ์ด $S$ ํ๋ ฌ์ HBM์์ ๊ณ์ ์ฝ๊ณ ์ฐ๋ ์ด์ ๋, Softmax ์ฐ์ฐ์ ํน์ฑ์ $m$๊ณผ $l$์ ๊ตฌํ๊ธฐ ์ํด ํ ๋จ์์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
Online Softmax
Online Softmax๋ ๊ฐ ํ๋ง๋ค Softmax ํต๊ณ๋ $m$๊ณผ $l$์ ๋ณ๋๋ก ์ ์ฅํ๋ฉฐ, ์๋ก์ด ๋ธ๋ก์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ด ํต๊ณ๋์ ์ ๋ฐ์ดํธํ๋ค.
์ต๋๊ฐ ์ ๋ฐ์ดํธ
์ด์ ๋ธ๋ก๊น์ง ๊ตฌํ ์์ ์ต๋๊ฐ์ $m_{\text{old}}$๋ก, ํ์ฌ ์๋ก ๊ฐ์ ธ์จ ๋ธ๋ก ๋ฐ์ดํฐ์ ์ต๋๊ฐ์ $m_{\text{now}}$๋ผ๊ณ ํ์.
๊ณผ๊ฑฐ์ ์ต๋๊ฐ๊ณผ ํ์ฌ ๋ธ๋ก์ ์ต๋๊ฐ์ ๋น๊ตํ์ฌ, ์ ์ฒด ์ต๋๊ฐ์ ์ ๋ฐ์ดํธํ๋ค.
\[m_{\text{new}}=\max(m_{\text{old}},m_{\text{now}}) \tag{2}\]์ง์ํฉ ์ ๋ฐ์ดํธ
์ด์ ๋ธ๋ก๊น์ง ๊ตฌํ ์์ ์ง์ํฉ์ $l_{\text{old}}$๋ผ๊ณ ํ์.
์์ ์ ์ฒด ์ต๋๊ฐ์ด $m_{\text{new}}$๋ก ์ ๋ฐ์ดํธ๋์๊ธฐ ๋๋ฌธ์, ๊ณผ๊ฑฐ์ ๊ตฌํด๋ ๋ถ๋ชจ์ ์ง์ํฉ $l_{old}$๋ ์๋ก์ด ๊ธฐ์ค์ ๋ง์ถฐ ์ ๋ฐ์ดํธํ๋ค.
\[l_{\text{new}} = l_{\text{old}} \cdot e^{m_{\text{old}} - m_{\text{new}}} + \sum e^{x_{\text{new}} - m_{\text{new}}} \tag{3}\]์ (3)์ด ์ฑ๋ฆฝํ๋ ์ด์
์ด์ ์ง์ํฉ $l_{\text{old}}$๋ $\sum e^{x_{\text{old}} - m_{\text{old}}}$ ๋ก ๊ณ์ฐ๋ ์ํ์ด๋ค.
์ฌ๊ธฐ์ ๋ณด์ ๊ฐ์ธ $e^{m_{\text{old}} - m_{\text{new}}}$๋ฅผ ๊ณฑํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์์ ์ ๊ฐํ ์ ์๋ค.
\[\left( \sum e^{x_{\text{old}} - m_{\text{old}}} \right) \cdot e^{m_{\text{old}} - m_{\text{new}}} = \sum e^{(x_{\text{old}} - m_{\text{old}}) + (m_{\text{old}} - m_{\text{new}})} = \sum e^{x_{\text{old}} - m_{\text{new}}}\]์ฆ, ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ถ๋ฌ์ค์ง ์๋๋ผ๋, ์ฒ์๋ถํฐ ์ ์ฒด ์ต๋๊ฐ $m_{\text{new}}$๋ฅผ ์๊ณ ๊ณ์ฐํ๋ ๊ฒ๊ณผ ์ํ์ ์ผ๋ก ์๋ฒฝํ ๋์ผํ ๊ฒฐ๊ด๊ฐ์ด ๋์ถ๋๋ค.
์ต์ข ์ถ๋ ฅ ํ๋ ฌ $O$ ์ ๋ฐ์ดํธ
๊ธฐ์กด์ ์ถ๋ ฅ ํ๋ ฌ $O_{\text{old}}$ ์ญ์ ๊ณผ๊ฑฐ์ ์ง์ํฉ $l_{\text{old}}$์ ๊ณผ๊ฑฐ์ ์ต๋๊ฐ $m_{\text{old}}$ ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ง ์์ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค.
๋ฐ๋ผ์ ์๋ก์ด ๋ธ๋ก์ ๊ฐ์ ธ์ฌ ๋๋ง๋ค, ์ค์ผ์ผ๋ง์ ํตํด ์ด์ ์ถ๋ ฅ๊ณผ ํ์ฌ ์ถ๋ ฅ $O_{\text{now}}$ ๋ฅผ ๋ณํฉํ์ฌ ์ ๋ฐ์ดํธํ๋ค.
\[O_{\text{new}} = \frac{O_{\text{old}} \cdot l_{\text{old}} \cdot e^{m_{\text{old}} - m_{\text{new}}} + O_{\text{now}} \cdot l_{\text{now}} \cdot e^{m_{\text{now}} - m_{\text{new}}}}{l_{\text{new}}} \tag{4}\]




