광고
~ / posts / developer
💻 개발자

FlashAttention 버전 고르기, GPU별 FA2·FA3·FA4와 학습 비용

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 SDPACUDA 전반, CPU·기타 장치fp32 포함PyTorch 내장입력을 보고 커널을 자동 선택
FlashAttention-2 (flash-attn 2.8.3)Ampere·Ada·Hopperfp16·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 의 지원 목록과 맞추면 판단이 끝나요.

compute capability 7.5 Turing 은 SDPA, 8.x Ampere·Ada 는 SDPA 나 FA2, 9.0 Hopper 는 FA3·FA4, 10.0 데이터센터 Blackwell 은 FA4 베타나 SDPA 를 쓰는 것을 보여 주는 표 그림
GPU 세대가 정하면 남는 선택지는 한두 개예요

학습할 때 어텐션 메모리, 길이별 계산

추론에서는 점수표가 한 층 처리 동안만 잠깐 생겼다 사라져요. 학습은 달라요. 역전파가 순전파의 중간값을 다시 쓰기 때문에, 자동미분은 층마다 확률표를 역전파가 끝날 때까지 붙잡아 둬요.

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,04827GiB0.75GiB9MiB
4,096108GiB3GiB18MiB
8,192432GiB12GiB36MiB
16,3841,728GiB48GiB72MiB
Qwen3-4B 학습 시 역전파용 어텐션 확률표 메모리 (배치 1)
eager 36층 합계eager + 층 단위 체크포인팅
01002003004005002K · eager 36층 합계 27GiB2K · eager + 층 단위 체크포인팅 0.75GiB2K4K · eager 36층 합계 108GiB4K · eager + 층 단위 체크포인팅 3GiB4K8K · eager 36층 합계 432GiB8K · eager + 층 단위 체크포인팅 12GiB8K

FlashAttention 은 같은 조건에서 9~36MiB 라 막대로 보이지 않아요.

단위: GiB · 자료: Qwen3-4B config.json(쿼리 헤드 32·층 36)으로 직접 계산, 칸당 fp32 4바이트 + bf16 2바이트
표로 보기
구분eager 36층 합계eager + 층 단위 체크포인팅
2K270.75
4K1083
8K43212

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)와 비교할 때는 데이터 용량 변환기로 단위를 맞추세요.

어텐션 연산량과 학습 비용 비교

메모리 문제가 풀리면 다음은 속도와 비용이에요. 학습 한 토큰의 연산은 가중치 행렬곱과 어텐션으로 나뉘어요.

이 식으로 어텐션 비중을 내면 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$
Qwen3-4B 학습 10억 토큰당 어텐션 계산 비용 (순전파+역전파)
A100 + FA2H100 + FA2H100 + FA3
0204060801001202K4K8K16K32K2K · A100 + FA2 5.1달러4K · A100 + FA2 10.3달러8K · A100 + FA2 20.5달러16K · A100 + FA2 41달러32K · A100 + FA2 82.1달러82.12K · H100 + FA2 7.3달러4K · H100 + FA2 14.5달러8K · H100 + FA2 29.1달러16K · H100 + FA2 58.2달러32K · H100 + FA2 116달러1162K · H100 + FA3 3.4달러4K · H100 + FA3 6.8달러8K · H100 + FA3 13.6달러16K · H100 + FA3 27.2달러32K · H100 + FA3 54.5달러54.5

커널이 최고 효율로 돈다고 본 하한이에요. 가중치 행렬곱 비용은 빠져 있어요.

단위: 달러 · 자료: 논문 초록의 처리량(FA2 A100 73%·H100 35%, FA3 740 TFLOPs/s) × Lambda 1장 단가(2026-10-29 확인)로 직접 계산
표로 보기
구분A100 + FA2H100 + FA2H100 + FA3
2K5.17.33.4
4K10.314.56.8
8K20.529.113.6
16K4158.227.2
32K82.111654.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 설치 시간과 빌드 비용

버전을 정했어도 설치에서 하루를 버리는 경우가 많아요. 원인은 대부분 "미리 빌드된 휠이 없어서 소스 컴파일로 넘어간 것" 이에요.

pip install flash-attn 이 PyPI 소스 묶음을 받은 뒤 깃허브 릴리스에 CUDA·torch·파이썬·ABI 조합의 휠이 있으면 내려받고, 없으면 소스 컴파일로 넘어가 ninja 유무에 따라 3~5분 또는 약 2시간이 걸리는 흐름도
휠 이름이 맞는지가 설치 시간을 정해요

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 로 작업 수를 줄이라고 안내해요.

설치 시간을 줄이는 순서는 이래요.

  1. ninja --version 다음 echo $? 가 0 인지 확인해요. 아니면 README 대로 ninja 를 지웠다가 다시 깔아요.
  2. 이미지를 고를 때 PyTorch·CUDA·파이썬 조합을 깃허브 릴리스의 휠 이름에 맞춰요.
  3. 그래도 빌드해야 하면 GPU 인스턴스가 아니라 CPU 코어 많은 빌드 기계나 CI 에서 휠을 한 번 만들어 사내 저장소에 올려요.
  4. FA3 는 hopper 폴더에서 python setup.py install 로 직접 빌드하니, 이 휠도 따로 만들어 두세요.

FA4 는 CuTeDSL 로 작성된 파이썬 휠이라 설치 단계의 CUDA 컴파일이 없어요. 대신 아직 4.0.0 베타(b37)라서 API 와 지원 범위가 바뀔 수 있어요. 버전을 고정해서 쓰세요.

광고
광고

상황별 FlashAttention 버전 추천

상황추천이유
T4·V100 등 Ampere 이전 GPUSDPAFA2 지원 목록 밖이에요
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% 안팎이라 빌드 부담이 더 커요
B200FA4 (베타) 를 고정 버전으로, 안 되면 SDPAFA4 README 의 Blackwell 대상이에요
RTX 5090 등 소비자 BlackwellSDPAFA2·FA4 README 에 이름이 없어요
fp32 학습이 꼭 필요함SDPAFlashAttention 계열은 fp16·bf16 이에요
결정론적 결과가 필요한 검증FA2 deterministic=True 또는 SDPA C++ 구현README 기준 역전파가 조금 느려지고 메모리를 더 써요

학습 길이를 RoPE 스케일링으로 늘리는 중이라면 LLM 컨텍스트 길이 늘리기, YaRN·rope_scaling 설정별 비용의 계산과 함께 보세요. 늘린 길이에 정비례해서 위 비용 차트의 어텐션 비용이 올라가요.

FlashAttention 도입 체크리스트

광고
광고

자주 묻는 질문

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 같은 엔진이 자체 백엔드를 고르니 엔진 문서의 지원표를 먼저 보세요.

정리

더 깊이 읽기

이 글은 실무에서 판단할 때 필요한 것 위주로 정리했어요. 같은 주제의 내부 동작 원리는 devboi 기술 블로그의 FlashAttention 원리 — 타일링·온라인 소프트맥스에서 도식과 코드로 단계별로 풀었어요.

참고한 자료

#FlashAttention 버전 비교#FlashAttention-3 H100#flash-attn 설치 오래 걸림#FlashAttention-4 Blackwell#어텐션 학습 메모리#LLM 학습 GPU 비용#compute capability 확인#PyTorch SDPA 백엔드
← 이전 글Testcontainers 수명 고르는 법, CI 시간과 커넥션 한도 계산다음 글 →몽고DB 인덱스 잘못 탈 때 대처법, hint·쿼리 설정·플랜 캐시 판단표
광고

더 둘러보기

💻 개발자 다른 도구

🔥 많이 찾는 도구

🔮 재미로 한 번 더

📝 읽어 볼 만한 글

글 전체 보기 →