신경망 추론의 메모리 트래픽 — 학습서

· 한 레이어의 트래픽 세기

목차

메모리 트래픽이 무엇인지는 00장에서 정의했다. 이제 그것을 실제로 세어 본다. 신경망 전체는 레이어가 줄지어 있는 구조이니, 한 레이어를 정확히 셀 수 있으면 전체는 더하기만 하면 된다. 그래서 이 장은 레이어 하나에 집중한다.

1.1 세 항을 더한다

한 합성곱 레이어가 추론 한 번에 메모리와 주고받는 바이트는 세 덩어리였다. 가중치를 읽고, 입력 활성값을 읽고, 출력 활성값을 쓴다. 이 세 항을 각각 "원소 수 × 자료형 byte"로 세어 더하면 그 레이어의 트래픽이다.

Byte_layer = 가중치_읽기 + 입력_활성값_읽기 + 출력_활성값_쓰기
           = (파라미터 수      × dtype_byte)
           + (C_in  × H_in  × W_in  × dtype_byte)
           + (C_out × H_out × W_out × dtype_byte)

여기서 C는 채널 수, HW는 feature map의 높이와 너비다. 첨자 in은 입력, out은 출력이다. 가중치는 그 레이어의 파라미터 개수만큼 한 번 읽는다. 입력 활성값은 들어오는 텐서를 한 번 읽고, 출력 활성값은 나가는 텐서를 한 번 쓴다.

이 책은 활성값을 "한 번 쓰고 한 번 읽음"으로 센다. 이것이 가장 단순하고, 동시에 가장 큰 상한이다. 칩이 중간 텐서를 온칩에 잠시 담아 두면 이보다 줄어들 수 있지만, 그 절약은 05장에서 따로 다룬다. 지금은 모든 텐서가 메모리를 한 번 왕복한다고 본다.

bias와 배치 정규화(batch normalization) 파라미터는 트래픽에서 뺀다. 전체의 1%도 안 되기 때문이다. 합성곱 가중치만 센다.

광고 · Advertisements

1.2 작은 예제 — 1×1 합성곱 하나

숫자를 넣어 보자. 입력이 채널 24개에 해상도 56×56인 feature map이고, 1×1 합성곱으로 채널을 144개로 늘린다고 하자. 자료형은 FP32라 원소 하나가 4 byte다. 이것은 02장에서 분해할 MobileNet-v2 블록의 첫 단계와 같은 모양이다.

먼저 가중치부터 센다. 1×1 합성곱의 파라미터 수는 (입력 채널 × 출력 채널)이다. 1×1이라 커널의 공간 크기는 1×1=1이다.

파라미터 수 = 24 × 144 = 3,456 개
가중치 읽기 = 3,456 × 4 byte = 13,824 byte ≈ 13.5 KB

다음은 입력 활성값이다. 채널 24개, 해상도 56×56을 통째로 한 번 읽는다.

입력 원소 수 = 24 × 56 × 56 = 75,264 개
입력 읽기 = 75,264 × 4 byte = 301,056 byte ≈ 294.0 KB

마지막으로 출력 활성값이다. 채널이 144개로 늘었고, 1×1이라 해상도는 그대로 56×56이다. 이 텐서를 한 번 쓴다.

출력 원소 수 = 144 × 56 × 56 = 451,584 개
출력 쓰기 = 451,584 × 4 byte = 1,806,336 byte ≈ 1,764 KB

이제 셋을 더한다.

Byte_layer = 13.5 KB + 294.0 KB + 1,764 KB ≈ 2,072 KB

(KB는 1,024 byte로 셈한다.)

이 작은 예제 하나에서 벌써 책의 핵심이 보인다. 가중치는 13.5 KB로 전체의 1%도 안 되고, 활성값 두 항이 2,058 KB로 트래픽을 거의 다 차지한다. 파라미터가 3,456개뿐인 레이어인데도 그렇다. 트래픽을 정하는 것은 파라미터 수가 아니라 활성값 텐서의 크기이며, 그 크기는 채널 수와 해상도가 정한다. 이 레이어는 채널을 6배로 늘렸고 해상도가 56×56으로 컸기 때문에 출력 텐서가 1.7 MB나 됐다.

1.3 같은 레이어의 연산강도

같은 레이어의 연산강도도 세어 보자. 00장에서 연산강도는 일(MAC)을 트래픽으로 나눈 값이라고 했다.

1×1 합성곱의 MAC 수는 (출력 채널 × 출력 높이 × 출력 너비 × 입력 채널)이다. 출력 원소 하나마다 입력 채널 수만큼 곱셈-누산을 하기 때문이다.

MAC = 144 × 56 × 56 × 24 = 10,838,016 ≈ 10.84 M
AI  = MAC ÷ Byte = 10,838,016 ÷ 2,121,216 byte ≈ 5.1 MAC/byte

연산강도가 5.1 MAC/byte다. 바이트 하나를 옮길 때 곱셈-누산을 다섯 번 남짓 한다는 뜻이다. 05장에서 쓸 예시 칩의 ridge가 85 MAC/byte였으니, 이 레이어는 ridge보다 한참 아래다. 곧 memory-bound다. 1×1 합성곱조차 그렇다면, 재사용이 더 적은 depthwise는 더 낮을 것이다. 실제로 그렇다는 것을 다음 장에서 본다.

1.4 정리

레이어 하나의 트래픽은 세 항의 합이고, 각 항은 "원소 수 × 자료형 byte"다. 가중치는 파라미터 수로, 활성값은 채널 수와 해상도로 정해진다. 한 레이어에서 활성값이 가중치를 압도하는 모습을 이미 봤다. 이제 이 셈을 MobileNet-v2의 모든 레이어에 적용해, 전체 트래픽이 어떻게 쌓이는지 본다.

광고 · Advertisements
이 시리즈 전체 챕터

학습경로 의존맵 보기 →