· 결론 — 세 질문의 답
Contents
이 책은 세 질문을 따라왔다. 메모리 트래픽이 무엇이고 무엇이 정하나, inverted residual에서 왜 트래픽이 느나, 파라미터 수와 트래픽은 왜 별개인가. MobileNet-v2를 한 바이트씩 세어 답을 확인했다. 이 장에서 답을 한자리에 모은다.
06.1 메모리 트래픽이란 무엇이고 무엇이 정하나
메모리 트래픽은 추론 한 번에 메모리와 연산기 사이를 오가는 바이트의 총합이다. 한 레이어 기준으로 세 항으로 나뉜다. 가중치 읽기, 입력 활성값 읽기, 출력 활성값 쓰기다.
MobileNet-v2(FP32, batch 1)를 다 세면 전체 66.18 MB다. 그중 가중치가 13.24 MB(20%), 활성값이 52.94 MB(80%)다. 활성값이 가중치의 4배다. 곱셈 300 M번에 파라미터 3.4 M개인 가벼운 모델이 메모리에서는 66 MB를 옮긴다.
무엇이 트래픽을 정하나. 가중치 항은 채널 수와 커널 크기, 곧 모델 구조가 정한다. 활성값 항은 거기에 더해 입력 해상도와 batch가 정한다. 활성값이 트래픽의 대부분이고, 그 활성값은 모델 앞쪽 고해상도 레이어에서 나온다. 초기 두 해상도 밴드(112×112, 56×56)만으로 활성값 30.62 MB가 발생한다. 트래픽을 정하는 것은 파라미터 수가 아니라 해상도·채널·batch, 그리고 재사용 정도다.
06.2 inverted residual에서 왜 트래픽이 느나
inverted residual 블록은 expand·depthwise·project 세 단계다. expand가 채널을 t배(보통 6배)로 부풀린다. depthwise는 채널을 못 줄이므로 그 넓은 텐서를 통째로 읽고 쓴다. 그 결과 활성값 트래픽이 t에 거의 비례해 커진다.
블록 A 모양에서 확장한 경로(t=6)와 안 한 경로(t=1)를 맞대면, depthwise가 다루는 텐서가 정확히 6배(=t)이고 블록 전체 활성값 트래픽이 4.67배다. 블록 전체 비가 6배가 아닌 까닭은 t와 무관한 skip add의 고정 트래픽이 비율을 희석하기 때문이다. 확장이 트래픽 증가의 원인이고, 그 양은 확장계수 t로 조절된다. 확장은 정확도를 위한 설계이고, 트래픽이 그 대가다.
06.3 파라미터 수와 트래픽은 왜 별개인가
파라미터 수는 정적인 모델 크기다. 트래픽은 동적인 추론 비용이다. 파라미터는 트래픽의 가중치 항 하나에만 영향을 주고, 그 항은 보통 작다. 트래픽의 대부분인 활성값은 파라미터와 무관하게 해상도와 batch가 정한다.
그래서 순위가 뒤집힌다. 파라미터 1,296개인 초기 depthwise가, 파라미터 153,600개인 후기 project보다 트래픽이 크다. 분모를 분명히 하면, 활성값끼리 비교 시 약 16배, 레이어 전체 트래픽으로는 약 4배다. 둘 다 파라미터 적은 쪽이 더 크다는 결론은 같다. 또 batch를 1에서 16으로 키우면, 파라미터와 가중치 트래픽은 한 글자도 안 변하는데 활성값은 16배가 된다. "파라미터가 적으니 메모리도 적다"는 모델 저장 크기에서만 맞고, 추론 트래픽에서는 틀리다.
06.4 정리표
지금까지의 핵심 수치를 한 표에 모은다. 모두 FP32, batch 1, MobileNet-v2(width 1.0, 224×224) 기준이다.
| 주제 | 핵심 수치 | 뜻 |
|---|---|---|
| 전체 트래픽 | 66.18 MB = 가중치 13.24 + 활성값 52.94 | 활성값이 80%, 가중치가 20% |
| 활성값 발원지 | 초기 두 밴드(112·56)에서 30.62 MB | 앞쪽 고해상도 레이어가 트래픽의 발원지 |
| 블록 A (앞·24ch@56²) | 활성값 99.6%, 가중치 0.4% | 고해상도는 활성값 지배 |
| 블록 B (뒤·160ch@7²) | 가중치 59%, 활성값 41% | 저해상도·넓은 채널은 가중치 지배 |
| 확장 효과 | 블록 활성값 4.67배, depthwise 입력텐서 6.0배(=t) | expand가 트래픽을 키운다 |
| 파라미터 역전 | 1,296개 레이어 트래픽 > 153,600개 레이어 | 파라미터 ≠ 트래픽 |
| batch 스케일링 | N배는 활성값만, 가중치는 불변 | 트래픽은 동적, 파라미터는 정적 |
| INT8 | 트래픽 ÷4, 연산강도 ×4 (4.3 → 17.3) | 바이트를 줄여 연산강도를 올린다 |
| depthwise 연산강도 | 1.0~1.1 MAC/byte | 재사용 없어 바닥, memory-bound |
06.5 실무 takeaway
이 책에서 가져갈 다섯 가지다.
- 모델이 느린지 빠른지는 곱셈 수만으로 못 정한다. 연산강도를 보고 roofline 위 위치를 봐야 한다. MobileNet-v2는 곱셈이 적어도 memory-bound다.
- 활성값 트래픽이 보통 가중치보다 크다. 특히 앞쪽 고해상도 레이어에서 그렇다. 입력 해상도와 batch가 트래픽을 좌우한다.
- 파라미터 수로 메모리 비용을 추정하지 마라. 저장 크기와 추론 트래픽은 다른 양이다. batch나 해상도를 키우면 파라미터 그대로 트래픽만 는다.
- memory-bound 모델에는 바이트를 줄이는 수가 직접 듣는다. INT8 양자화는 트래픽을 4분의 1로, 연산강도를 4배로 만든다.
- 컴파일러의 fusion·tiling이 외부 트래픽을 줄인다. 다만 가중치는 안 줄고 활성값 지배·depthwise 바닥이라는 구조는 그대로다. 정확한 값은 프로파일러로 재야 한다.
출처
- M. Sandler, A. Howard, M. Zhu, A. Zhmoginov, L.-C. Chen (2018), MobileNetV2: Inverted Residuals and Linear Bottlenecks, CVPR 2018, pp. 4510–4520. arXiv:1801.04381. — inverted residual 블록(Table 1), 단계 스펙(Table 2), 블록 MAdds 공식, 총 ~300 M MAdds·~3.4 M 파라미터.
- A. Howard et al. (2017), MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, arXiv:1704.04861. — depthwise separable 합성곱 비용 공식과 절감비(3×3에서 8~9배).
- S. Williams, A. Waterman, D. Patterson (2009), Roofline: An Insightful Visual Performance Model for Multicore Architectures, Communications of the ACM 52(4):65–76. — 메모리 트래픽 Q, 연산강도
I=W/Q,P=min(π, β·I), 변곡점I=π/β, compute/memory-bound 경계. - Stanford CS231n, Convolutional Neural Networks. — 활성값은 초기 레이어에 집중, 파라미터는 후반 전결합층에 집중.
- J. Lin, W.-M. Chen, Y. Lin, J. Gan, S. Han (2021), MCUNetV2: Memory-Efficient Patch-based Inference for Tiny Deep Learning, NeurIPS 2021. arXiv:2110.15352. — 메모리 병목이 초기 고해상도 단계에 위치.
- V. Sze, Y.-H. Chen, T.-J. Yang, J. Emer (2017), Efficient Processing of Deep Neural Networks: A Tutorial and Survey, Proceedings of the IEEE. — 가중치·활성값 데이터 이동의 에너지 비용, 메모리 접근이 연산보다 비쌈.