LLM 을 직접 학습하거나 파인튜닝하려는데 flash-attn 을 깔아야 할지, 깐다면 2·3·4 중 무엇을 깔아야 할지 정하지 못하고 계신가요? 결론부터 말하면 버전은 성능 욕심이 아니라 GPU 세대가 정해요. Ampere·Ada(A100·RTX 4090)는 PyTorch SDPA 나 FlashAttention-2, Hopper(H100)는 FlashAttention-3, 데이터센터 Blackwell(B200)은 FlashAttention-4 가 각자의 대상이에요. 그리고 H100 을 빌렸는데 FlashAttention-2 에 머물면, 어텐션 계산만 놓고 보면 A100 보다 돈이 더 들 수 있어요.
이 글은 FlashAttention 이 타일링으로 메모리 왕복을 줄인다는 원리는 안다고 보고, 실제로 고를 때 필요한 숫자만 다뤄요. Qwen3-4B 의 공개 설정값으로 학습 중 어텐션이 붙잡는 메모리와 연산량을 직접 계산하고, 논문이 보고한 처리량과 공식 가격표 단가로 10억 토큰당 비용을 낸 뒤, 설치에서 시간을 버리는 지점과 도입 체크리스트를 정리해요.
FlashAttention 버전별 지원 GPU와 차이 한눈에 보기
FlashAttention 은 버전마다 같은 알고리즘을 다른 GPU 세대에 맞춰 다시 짠 결과예요. 그래서 "최신 버전이 제일 좋다" 가 아니라 "내 GPU 를 대상으로 한 버전이 무엇이냐" 로 골라야 해요. FlashAttention 공식 저장소 README(2026-10-29 확인)와 각 논문 초록을 기준으로 정리하면 아래와 같아요.
| 버전 | 공식 대상 GPU | 자료형 | 설치 형태 | 논문·README 가 밝힌 성능 |
|---|---|---|---|---|
| PyTorch SDPA | CUDA 전반, CPU·기타 장치 | fp32 포함 | PyTorch 내장 | 입력을 보고 커널을 자동 선택 |
FlashAttention-2 (flash-attn 2.8.3) | Ampere·Ada·Hopper | fp16·bf16 | 미리 빌드된 휠 또는 소스 컴파일 | A100 이론 최대의 50~73% |
| FlashAttention-3 (베타) | H100·H800, CUDA 12.3 이상 | fp16·bf16, FP8 은 순전파만 | hopper 폴더에서 직접 빌드 | H100 에서 FA2 대비 1.5~2.0배, fp16 최대 740 TFLOPs/s |
FlashAttention-4 (flash-attn-4 4.0.0b37) | Hopper·Blackwell (H100·B200) | README 예시는 fp16·bf16 | 파이썬 휠 (CuTeDSL) | README 에 수치 없음 |
FlashAttention-2 의 수치는 FlashAttention-2 논문(arXiv 2307.08691) 초록에서, FlashAttention-3 수치는 FlashAttention-3 논문(arXiv 2407.08608) 초록에서 가져왔어요. 같은 초록은 FlashAttention-2 가 H100 에서는 활용률 35% 에 그친다고 적어요. 이 35% 가 뒤에서 비용을 가르는 숫자예요.
버전 번호는 PyPI 의 flash-attn-4 페이지와 flash-attn 페이지에서 확인했어요. flash-attn 은 PyPI 에 소스 묶음(tar.gz)만 올라가 있고, flash-attn-4 는 플랫폼 무관 파이썬 휠이에요. 이 차이가 설치 시간을 크게 바꿔요.
Transformers 에서 attn_implementation 을 고르는 법과 추론 메모리는 어텐션 구현 고르기, SDPA·FlashAttention 메모리와 GPU 비용에서 다뤘어요. 이 글은 그 다음 단계, 학습할 때 어떤 GPU 에 어떤 버전을 붙일지에 집중해요.
내 GPU 에 맞는 FlashAttention 버전 확인하는 법
가장 먼저 할 일은 GPU 의 compute capability 를 보는 거예요. 파이썬 한 줄이면 돼요.
import torch
print(torch.cuda.get_device_name(), torch.cuda.get_device_capability())
# 예: NVIDIA A100-SXM4-40GB (8, 0)
NVIDIA CUDA GPU 목록(2026-10-29 확인)에서 값별 대표 GPU 를 찾아 FlashAttention README 의 지원 목록과 맞추면 판단이 끝나요.
- 7.5 (T4·RTX 2080·Quadro RTX 6000): FlashAttention-2 README 는 Turing 을 별도 저장소로 안내하고 일부 기능만 지원한다고 적어요. 코랩·저가 클라우드의 T4 에서 설치가 실패하거나 import 오류가 나는 대표적인 이유예요. SDPA 에 맡기세요.
- 8.0·8.6·8.9 (A100·A10·RTX 3090·L4·RTX 4090): SDPA 가 이미 FlashAttention-2 기반 커널을 고를 수 있어요. 헤드 차원·마스크 조건이 SDPA 커널과 안 맞을 때
flash-attn을 따로 깔아요. - 9.0 (H100·H800·H200·GH200): FA3 README 는 요구 사항을 H100·H800 으로 적어요. H200·GH200 은 같은 9.0 이지만 README 에 이름이 없으니 직접 테스트를 돌려 보고 쓰세요.
- 10.0 (B200·GB200): FA4 README 가 Blackwell 예시로 B200 을 들어요. FA2 지원 목록에는 Blackwell 이 없어요.
- 12.0 (RTX 5090 같은 소비자 Blackwell): FA2·FA4 README 어디에도 이름이 없어요. SDPA 로 시작하세요.
학습할 때 어텐션 메모리, 길이별 계산
추론에서는 점수표가 한 층 처리 동안만 잠깐 생겼다 사라져요. 학습은 달라요. 역전파가 순전파의 중간값을 다시 쓰기 때문에, 자동미분은 층마다 확률표를 역전파가 끝날 때까지 붙잡아 둬요.
Transformers 의 Qwen3 eager 구현은 점수에 softmax(..., dtype=torch.float32) 를 건 뒤 원래 자료형으로 바꾸고, 그 결과에 V 를 곱해요. 소프트맥스의 역전파는 소프트맥스 출력(fp32, 칸당 4바이트)이 필요하고, 행렬곱의 역전파는 곱한 확률표(bf16, 칸당 2바이트)가 필요해요. 그래서 층마다 칸당 6바이트가 남는다고 추정할 수 있어요.
Qwen3-4B 의 config.json은 쿼리 헤드 32개, KV 헤드 8개, 헤드 차원 128, 층 36개, attention_dropout 0.0 이에요. 배치 1로 직접 계산하면 이래요.
| 학습 길이 | eager 36층 합계 | eager + 층 단위 체크포인팅 (1층분) | FlashAttention (행별 통계) |
|---|---|---|---|
| 2,048 | 27GiB | 0.75GiB | 9MiB |
| 4,096 | 108GiB | 3GiB | 18MiB |
| 8,192 | 432GiB | 12GiB | 36MiB |
| 16,384 | 1,728GiB | 48GiB | 72MiB |
FlashAttention 은 확률표 대신 행마다 logsumexp 값 하나(fp32)만 남기고, 역전파 때 확률표 조각을 다시 계산해요. 32헤드 × 8,192행 × 4바이트 × 36층 = 36MiB 예요.
이 표에서 읽을 점이 두 가지 있어요. 첫째, eager 로는 2K 길이에서도 A100 40GB 가 거의 차요. 4B 모델 bf16 가중치 약 7.5GiB 에 어텐션 확률표 27GiB 만 더해도 34.5GiB 인데, 40GB 는 37.25GiB 이고 그레이디언트·옵티마이저 상태는 아직 넣지도 않았어요. 둘째, 그레이디언트 체크포인팅은 이 문제를 줄여 주지만 없애지는 못해요. 16K 에서는 한 층분 재계산에만 48GiB 가 필요해요. 긴 문맥 학습에서 FlashAttention 계열이 사실상 필수인 이유가 이 숫자예요. GiB 와 GB 는 7% 넘게 차이 나니 GPU 사양표(GB)와 비교할 때는 데이터 용량 변환기로 단위를 맞추세요.
어텐션 연산량과 학습 비용 비교
메모리 문제가 풀리면 다음은 속도와 비용이에요. 학습 한 토큰의 연산은 가중치 행렬곱과 어텐션으로 나뉘어요.
- 가중치 행렬곱: 순전파 2 × 파라미터, 역전파 4 × 파라미터로 토큰당 약 6 × 파라미터예요. Qwen3-4B 의 임베딩 제외 파라미터는 config.json 으로 계산하면 약 36.3억 개예요.
- 어텐션: 인과 마스크 순전파는 토큰당 층마다 2 × 길이 × 헤드 수 × 헤드 차원이에요. FlashAttention-2 논문은 역전파 연산을 순전파의 2.5배로 셈해요(확률표 재계산 포함). 그래서 학습 한 토큰은 7 × 길이 × 헤드 수 × 헤드 차원 × 층 수예요.
이 식으로 어텐션 비중을 내면 2K 에서 8.8%, 8K 에서 27.9%, 32K 에서 60.8% 예요. 길이가 길수록 어텐션 커널 선택이 전체 학습비에 크게 드러나요.
처리량은 논문이 보고한 값을 그대로 썼어요. A100 의 bf16 텐서 코어 최대치는 NVIDIA A100 사양 기준 312 TFLOPS, H100 SXM 은 NVIDIA H100 사양의 희소성 표기 1,979 TFLOPS 의 절반인 약 990 TFLOPS 예요. 여기에 FA2 의 A100 활용률 상한 73%, H100 활용률 35%, FA3 의 fp16 740 TFLOPs/s 를 곱했어요. 단가는 Lambda GPU 클라우드 가격표의 1장 인스턴스(2026-10-29 확인, 세금 별도) A100 SXM 40GB 시간당 1.99달러, H100 SXM 4.29달러예요.
# Qwen3-4B config.json: 쿼리 헤드 32, 헤드 차원 128, 층 36
HEADS, HEAD_DIM, LAYERS = 32, 128, 36
def attn_train_flops_per_token(seq_len):
# 인과 마스크 순전파 = 층마다 2·N·h·d (토큰당), 역전파는 순전파의 2.5배
return 3.5 * 2 * seq_len * HEADS * HEAD_DIM * LAYERS
def usd_per_billion_tokens(seq_len, tflops, usd_per_hour):
seconds = 1e9 * attn_train_flops_per_token(seq_len) / (tflops * 1e12)
return seconds / 3600 * usd_per_hour
setups = { # (논문 보고 처리량 TFLOPs/s, 1장 시간당 달러)
"A100 + FA2": (312 * 0.73, 1.99),
"H100 + FA2": (989.5 * 0.35, 4.29),
"H100 + FA3": (740, 4.29),
}
for name, (tf, usd) in setups.items():
costs = [usd_per_billion_tokens(n, tf, usd) for n in (2048, 8192, 32768)]
print(f"{name}: {tf:5.0f} TFLOPs/s, 달러당 {tf/usd:5.1f}",
" / ".join(f"{c:5.1f}$" for c in costs))
맥의 파이썬으로 돌린 출력이에요.
A100 + FA2: 228 TFLOPs/s, 달러당 114.5 5.1$ / 20.5$ / 82.1$
H100 + FA2: 346 TFLOPs/s, 달러당 80.7 7.3$ / 29.1$ / 116.4$
H100 + FA3: 740 TFLOPs/s, 달러당 172.5 3.4$ / 13.6$ / 54.5$
커널이 최고 효율로 돈다고 본 하한이에요. 가중치 행렬곱 비용은 빠져 있어요.
표로 보기
| 구분 | A100 + FA2 | H100 + FA2 | H100 + FA3 |
|---|---|---|---|
| 2K | 5.1 | 7.3 | 3.4 |
| 4K | 10.3 | 14.5 | 6.8 |
| 8K | 20.5 | 29.1 | 13.6 |
| 16K | 41 | 58.2 | 27.2 |
| 32K | 82.1 | 116 | 54.5 |
결과에서 두 가지가 눈에 띄어요. H100 에 FA2 를 붙이면 어텐션 계산은 A100 보다 42% 비싸요. 시간당 단가가 2.16배인데 처리량은 1.52배만 늘기 때문이에요. 반대로 FA3 로 바꾸면 같은 H100 에서 어텐션 비용이 53% 줄고, A100+FA2 보다도 34% 싸져요. H100 을 빌렸다면 FA3 를 붙이는 게 비용 면에서 핵심이라는 뜻이에요.
다만 전체 학습비는 어텐션 비중만큼만 줄어요. H100 에서 FA2→FA3 로 어텐션이 2.14배 빨라진다고 보고 연산량 비중으로 어림하면, 전체 연산 시간은 2K 에서 4.7%, 8K 에서 14.8%, 32K 에서 32.3% 줄어요. 짧은 길이 위주의 파인튜닝이라면 FA3 빌드에 들일 시간보다 배치 크기나 시퀀스 패킹을 먼저 손보는 편이 나을 수 있어요. LoRA 처럼 가중치 쪽을 줄이는 방법과 함께 쓴다면 LoRA 파인튜닝 메모리와 비용 계산의 숫자와 합쳐서 보세요.
flash-attn 설치 시간과 빌드 비용
버전을 정했어도 설치에서 하루를 버리는 경우가 많아요. 원인은 대부분 "미리 빌드된 휠이 없어서 소스 컴파일로 넘어간 것" 이에요.
flash-attention 의 setup.py를 보면 설치 과정에서 PyTorch 버전, PyTorch 가 빌드된 CUDA 메이저 버전, 파이썬 버전, C++11 ABI 여부, 플랫폼으로 휠 파일 이름을 만들고 깃허브 릴리스에서 내려받기를 시도해요. 찾지 못하면 "Precompiled wheel not found" 를 출력하고 소스 빌드로 넘어가요. 새로 나온 PyTorch 버전을 쓰거나 파이썬 버전이 아주 새것이면 휠이 아직 없어서 컴파일로 빠지기 쉬워요.
README 가 밝힌 컴파일 시간은 ninja 가 정상일 때 64코어 기계에서 3~5분, ninja 가 없거나 고장 나 단일 코어로 돌면 약 2시간이에요. H100 1장 인스턴스(시간당 4.29달러)에서 2시간을 기다리면 학습을 시작하기도 전에 8.58달러가 나가요. 같은 README 는 RAM 이 96GB 보다 적고 코어가 많은 기계에서는 병렬 컴파일이 메모리를 다 쓸 수 있으니 MAX_JOBS 로 작업 수를 줄이라고 안내해요.
설치 시간을 줄이는 순서는 이래요.
ninja --version다음echo $?가 0 인지 확인해요. 아니면 README 대로 ninja 를 지웠다가 다시 깔아요.- 이미지를 고를 때 PyTorch·CUDA·파이썬 조합을 깃허브 릴리스의 휠 이름에 맞춰요.
- 그래도 빌드해야 하면 GPU 인스턴스가 아니라 CPU 코어 많은 빌드 기계나 CI 에서 휠을 한 번 만들어 사내 저장소에 올려요.
- FA3 는
hopper폴더에서python setup.py install로 직접 빌드하니, 이 휠도 따로 만들어 두세요.
FA4 는 CuTeDSL 로 작성된 파이썬 휠이라 설치 단계의 CUDA 컴파일이 없어요. 대신 아직 4.0.0 베타(b37)라서 API 와 지원 범위가 바뀔 수 있어요. 버전을 고정해서 쓰세요.
상황별 FlashAttention 버전 추천
| 상황 | 추천 | 이유 |
|---|---|---|
| T4·V100 등 Ampere 이전 GPU | SDPA | FA2 지원 목록 밖이에요 |
| A100·RTX 4090, 2K 이하 파인튜닝 | SDPA 그대로 | 어텐션 비중이 10% 안팎이고 SDPA 가 FA2 계열 커널을 골라요 |
| A100·RTX 4090, 8K 이상 학습 | SDPA 에서 flash 커널 확인 → 안 잡히면 flash-attn | 확률표 메모리·연산 비중이 커져요 |
| H100·H800, 긴 문맥 학습 | FA3 빌드 | 위 계산에서 어텐션 비용이 FA2 대비 53% 줄어요 |
| H100, 짧은 문맥·빠른 실험 | SDPA 또는 FA2 | 전체 시간 이득이 5% 안팎이라 빌드 부담이 더 커요 |
| B200 | FA4 (베타) 를 고정 버전으로, 안 되면 SDPA | FA4 README 의 Blackwell 대상이에요 |
| RTX 5090 등 소비자 Blackwell | SDPA | FA2·FA4 README 에 이름이 없어요 |
| fp32 학습이 꼭 필요함 | SDPA | FlashAttention 계열은 fp16·bf16 이에요 |
| 결정론적 결과가 필요한 검증 | FA2 deterministic=True 또는 SDPA C++ 구현 | README 기준 역전파가 조금 느려지고 메모리를 더 써요 |
학습 길이를 RoPE 스케일링으로 늘리는 중이라면 LLM 컨텍스트 길이 늘리기, YaRN·rope_scaling 설정별 비용의 계산과 함께 보세요. 늘린 길이에 정비례해서 위 비용 차트의 어텐션 비용이 올라가요.
FlashAttention 도입 체크리스트
- compute capability 확인:
torch.cuda.get_device_capability()결과가 위 그림의 어느 줄인지 먼저 봐요. - 실제 커널 확인: PyTorch SDPA 문서대로
sdpa_kernel([SDPBackend.FLASH_ATTENTION])으로 감싸면 C++ 구현이 꺼지고, flash 커널을 못 쓰는 이유가 경고로 나와요. 프로파일러에서 커널 이름도 봐요. - 자료형: 모델과 입력을 bf16(또는 fp16)으로 맞췄는지 확인해요. fp32 가 섞이면 fused 커널이 빠져요.
- 헤드 차원: FA2 는 256 이하예요. README 기준 consumer GPU 의 헤드 차원 256 역전파는 2.5.5 부터 드롭아웃이 없을 때 돼요.
- 마스크 형태: 인과 마스크는 텐서로 만들지 말고
is_causal=True(SDPA) 나causal=True(flash-attn) 로 넘겨요. - GQA: K·V 헤드를 복제하지 말고 SDPA 의
enable_gqa=True나 flash-attn 의 KV 헤드 수 인자로 넘겨요. - 설치 경로 고정: ninja 동작 여부, 휠 이름과 맞는 PyTorch·CUDA·파이썬 조합, 사내 휠 캐시를 이미지에 넣어 둬요.
- 결과 검증: 버전을 바꾼 뒤엔 같은 배치로 손실값을 허용 오차를 두고 비교해요. 커널마다 합산 순서가 달라 마지막 자리 차이는 정상이에요.
- 비용 재계산: GPU 를 바꿀 때 위 파이썬 함수에 실제로 잰 TFLOPs/s 와 단가를 넣어 다시 계산해요.
자주 묻는 질문
PyTorch SDPA 가 있는데 flash-attn 을 따로 깔아야 하나요?
A100·RTX 4090 같은 Ampere·Ada GPU 에서 흔한 설정이라면 대부분 필요 없어요. SDPA 가 FlashAttention-2 기반 커널을 이미 고를 수 있기 때문이에요. 슬라이딩 창이나 ALiBi 처럼 SDPA 커널 조건과 안 맞는 기능이 필요하거나, sdpa_kernel 로 확인했는데 flash 커널이 안 잡힐 때 설치하세요.
H100 을 쓰는데 FA2 로도 충분히 빠르지 않나요?
A100 보다는 빠르지만 H100 성능을 다 쓰지 못해요. FlashAttention-3 논문은 FA2 의 H100 활용률을 35% 로 보고해요. 위 계산처럼 처리량이 단가만큼 늘지 않아서, 어텐션 계산만 보면 A100+FA2 보다 10억 토큰당 비용이 오히려 높아요. 긴 문맥 학습이라면 FA3 를 빌드할 가치가 있어요.
FA3 와 FA4 는 결과가 FA2 와 같나요?
세 버전 모두 근사 없이 같은 어텐션 식을 계산해요. 블록 순서와 합산 순서가 달라서 bf16 에서는 마지막 자리 정도 차이가 날 수 있어요. 다만 FA3 의 FP8 순전파는 저정밀 계산이라 bf16 결과와 같은 값을 기대하면 안 돼요. 논문은 FP8 기준 어텐션 대비 오차가 2.6배 낮다고 밝히지만, bf16 과 같다는 뜻은 아니에요.
설치가 2시간째 끝나지 않아요. 정상인가요?
미리 빌드된 휠을 못 찾고 ninja 없이 컴파일 중이면 README 기준 약 2시간 걸리는 게 정상이에요. 중단한 뒤 ninja --version 과 echo $? 로 ninja 가 동작하는지 확인하고, RAM 이 96GB 보다 적으면 MAX_JOBS=4 같은 값으로 다시 시도하세요. 설치 로그에 "Precompiled wheel not found" 가 보이면 PyTorch·CUDA·파이썬 조합이 릴리스 휠과 안 맞는 거예요.
추론 서빙에도 이 비용 계산을 쓸 수 있나요?
위 계산은 순전파와 역전파를 합친 학습 기준이에요. 추론의 프리필은 순전파만 하니 연산량이 3.5분의 1 수준이고, 디코드는 연산보다 KV 캐시 읽기에 묶여서 이 식으로 비용이 나오지 않아요. 서빙 쪽은 vLLM 같은 엔진이 자체 백엔드를 고르니 엔진 문서의 지원표를 먼저 보세요.
정리
- FlashAttention 버전은 GPU 세대가 정해요. 7.5 는 SDPA, 8.x 는 SDPA·FA2, 9.0 은 FA3, 10.0 은 FA4(베타)예요.
- eager 학습은 Qwen3-4B 8K 에서 역전파용 확률표만 432GiB 를 붙잡아요. FlashAttention 은 36MiB 예요.
- 8K 학습의 어텐션 비용은 10억 토큰당 A100+FA2 20.5달러, H100+FA2 29.1달러, H100+FA3 13.6달러예요. H100 에서는 FA3 가 비용을 가르는 선택이에요.
- 전체 학습비는 어텐션 비중만큼만 줄어요. 2K 파인튜닝이면 5% 안팎, 32K 면 30% 넘게 줄어요.
- 설치는 휠 이름 맞추기와 ninja 확인이 먼저예요. 단위 계산은 데이터 용량 변환기로 GiB·GB 를 맞추세요.
더 깊이 읽기
이 글은 실무에서 판단할 때 필요한 것 위주로 정리했어요. 같은 주제의 내부 동작 원리는 devboi 기술 블로그의 FlashAttention 원리 — 타일링·온라인 소프트맥스에서 도식과 코드로 단계별로 풀었어요.