Arithmetic Intensity
Arithmetic intensity(산술 강도)는 데이터 1 byte를 움직일 때 얼마나 많은 연산을 하는지 나타내는 비율이다.
단위는 보통 FLOP/byte다.
시간 비교에서 나오기
compute-memory-time에서 계산 시간과 메모리 시간을 이렇게 썼다.
여기서:
F = FLOPs
M = bytes moved
C = peak FLOP/s
BW = memory bandwidth
compute-bound가 되려면 계산 시간이 메모리 시간보다 길어야 한다.
대입하면:
정리하면:
왼쪽이 연산의 산술 강도다.
오른쪽은 하드웨어의 임계 산술 강도다.
판단 규칙
AI < critical AI -> memory-bound
AI > critical AI -> compute-bound
즉 산술 강도는 “이 연산이 하드웨어의 연산 유닛을 충분히 먹여 살릴 만큼 데이터를 재사용하는가?”를 보는 숫자다.
행렬곱 예시
행렬곱의 algorithmic 산술 강도는 이상적인 메모리 이동량을 쓰면:
여기서 s는 원소 하나의 bytes다.
실제 구현에서는 block-matrix-multiplication처럼 타일링을 얼마나 잘하느냐에 따라 bytes moved가 달라진다. 같은 FLOPs라도 bytes moved가 줄어들면 산술 강도는 커진다.
토큰 수가 왜 중요해지나
딥러닝에서 자주 나오는 형태를 보자.
B는 한 번에 처리하는 토큰 수나 batch 크기로 볼 수 있다.
FLOPs는:
BF16에서 weight W[D,F] 읽기가 지배적이고 D,F가 충분히 크다고 단순화하면 bytes는 대략:
그래서:
즉 같은 weight를 더 많은 토큰에 재사용할수록 산술 강도가 올라간다. 이 때문에 batch나 token 수가 너무 작으면 GPU/TPU의 연산 능력을 충분히 쓰지 못하고 memory-bound가 되기 쉽다.
이 관계를 그래프로 보면 성능이 처음에는 B에 비례해 올라가다가, critical B 이후에는 peak compute에서 평평해진다.
확인
- 산술 강도의 단위는 무엇인가?
F/C >= M/BW를 정리하면 왜F/M >= C/BW가 되는가?- 산술 강도가 커진다는 것은 어떤 재사용이 좋아졌다는 뜻인가?