이전 포스팅에서 우리는 메모리 대역폭(Bandwidth)이 성능의 주요 병목이 될 수 있음을 확인했습니다. 하드웨어 관점에서 더욱 중요한 사실은, 데이터를 연산기까지 가져오는 비용(에너지)이 실제 연산을 수행하는 비용보다 훨씬 크다는 점입니다.
연구 결과에 따르면, DRAM에서 데이터를 가져오는 데 소모되는 에너지는 레지스터 파일(RF)에서 가져오는 것보다 약 200배 더 큽니다. 따라서 고성능 NPU 설계의 핵심은 단순히 연산기(MAC unit)를 늘리는 것이 아니라, 데이터를 온칩(On-chip) 메모리나 레지스터에 얼마나 오래 머물게 하여 재사용(Reuse)하느냐에 달려 있습니다.
이러한 데이터의 시공간적 매핑(Spatio-temporal Mapping) 전략을 데이터플로우(Dataflow)라고 하며, 무엇을 고정(Stationary)시키느냐에 따라 NPU 아키텍처의 성격이 완전히 달라집니다. 이번 글에서는 대표적인 세 가지 Dataflow인 Weight Stationary (WS), Output Stationary (OS), Row Stationary (RS)를 비교 분석합니다.
1. Dataflow Weight Stationary (WS): 가중치를 고정
개념 및 메커니즘
Weight Stationary는 딥러닝 연산의 핵심 요소인 가중치(Weight, Filter)를 PE(Processing Element) 내부의 레지스터에 고정시키고, 입력(Input Activation)과 부분합(Partial Sum)을 이동시키는 방식입니다.
- 가중치를 PE 레지스터에 로드(Pre-load)하여 고정합니다.
- 입력 데이터(Input Feature Map)가 어레이를 통해 브로드캐스트(Broadcast) 되거나 이동(Flow)합니다.
- 계산된 결과(Partial Sum)는 인접한 PE로 이동하며 누적됩니다.
대표 아키텍처
- Google TPU (Tensor Processing Unit) v1: 시스톨릭 어레이(Systolic Array) 구조를 사용하여 WS 방식을 구현했습니다.
Pros
- CNN/LLM 효율성: CNN의 필터나 LLM의 가중치 행렬은 한 번 로드되면 여러 입력 데이터에 대해 반복적으로 사용(Reuse)되는 특성이 있어, WS 방식에서 메모리 접근 비용을 극대화하여 절감할 수 있습니다.
- 제어 단순화: 가중치 로드 후에는 입력 데이터만 흘려보내면 되므로 제어 로직이 비교적 단순합니다.
Cons
- Partial Sum 이동 비용: 누적합(Partial Sum)이 완성될 때까지 PE 사이를 계속 이동해야 하므로, 이에 따른 인터커넥트 대역폭 소모가 발생합니다.
2. Dataflow Output Stationary (OS): 결과값을 고정
개념 및 메커니즘
Output Stationary는 최종 결과값(Output Activation)을 만들기 위한 부분합(Partial Sum)을 PE 내부 레지스터에 고정시키는 방식입니다.
- PE는 하나의 출력 픽셀(Output Pixel)을 전담합니다.
- 이 출력을 완성하기 위해 필요한 입력(Input)과 가중치(Weight)가 PE로 스트리밍됩니다.
- PE 내부에서 누적 연산(Accumulation)이 완료될 때까지 부분합은 밖으로 나가지 않습니다.
- 연산이 끝나면 최종 결과값만 메모리로 내보냅니다.
대표 아키텍처
- ShiDianNao: 이미지 처리 등 특정 윈도우 내에서의 연산 밀도가 높은 작업에 최적화된 초기 NPU 아키텍처.
Pros
- Partial Sum 메모리 접근 최소화: 부분합을 읽고 쓰는 과정(Read/Write)이 레지스터 내부에서만 일어나므로, 부분합 관련 글로벌 버퍼 트래픽을 획기적으로 줄일 수 있습니다. (부분합 데이터는 정밀도를 위해 비트 수가 큰 경우가 많아 이 효과가 큽니다.)
Cons
- Input/Weight 대역폭: 입력 데이터와 가중치를 매 사이클마다 브로드캐스트 하거나 유니캐스트 해야 하므로, 이 데이터를 공급하기 위한 글로벌 대역폭 요구량이 증가할 수 있습니다.
3. Dataflow Row Stationary (RS): 2차원 재사용의 극대화
개념 및 메커니즘
Row Stationary는 MIT에서 제안한 Eyeriss 아키텍처의 핵심 기술로, 위의 WS나 OS처럼 하나의 데이터만 고정하는 것이 아니라 Input, Weight, Partial Sum을 모두 최대한 재사용하기 위해 고안된 복합적인 방식입니다.
- Convolution 연산의 특성상 1차원 데이터가 아닌 2차원 평면 데이터가 슬라이딩 윈도우 방식으로 처리됩니다.
- RS는 1차원 행(Row) 단위로 데이터를 PE에 매핑합니다.
- PE 내부의 RF(Register File) 용량을 좀 더 키워, Weight의 행(Row)을 고정하고, Input의 행(Row)을 흘려보내며, 생성된 Partial Sum의 행(Row)도 내부에서 제어합니다.
대표 아키텍처
- MIT Eyeriss: 에너지 효율성을 극한으로 추구한 엣지용 NPU.
Pros
- 전체적인 에너지 효율 최적화: 특정 데이터 타입에 치우치지 않고 Input, Weight, Output 모든 측면에서 균형 잡힌 재사용성(Reuse)을 달성하여 전체 시스템 에너지를 최소화합니다.
Cons
- 복잡한 제어 로직: 데이터 매핑 방식이 매우 복잡하여 컴파일러와 하드웨어 제어 로직(Controller)의 설계 난이도가 높습니다.
- PE 면적 증가: 복잡한 데이터를 담아두기 위해 PE당 더 큰 용량의 로컬 메모리(SRAM/RF)가 필요합니다.
4. 비교 분석 및 결론
|
특징 1352_df1c85-a8> |
Weight Stationary (WS) 1352_9e8b61-f1> |
Output Stationary (OS) 1352_74ec69-52> |
Row Stationary (RS) 1352_c72ba8-5d> |
|---|---|---|---|
|
고정 데이터 1352_a29ed2-94> |
Weights (Filters) 1352_02cc3a-ac> |
Partial Sums (Outputs) 1352_1c0b34-37> |
Row of Weights & Inputs 1352_6d4956-08> |
|
이동 데이터 1352_612155-c9> |
Inputs, Partial Sums 1352_7c05ac-eb> |
Inputs, Weights 1352_faad8d-7a> |
Inputs (Diagonal), Psums 1352_643514-d3> |
|
최적화 목표 1352_546f7c-ef> |
가중치 읽기 최소화 1352_82d79b-a6> |
부분합 R/W 최소화 1352_9ec72c-f3> |
전체 데이터 이동 최소화 1352_5c7ddc-1b> |
|
적합한 모델 1352_cac23f-f7> |
대규모 CNN, LLM (Batch↑) 1352_6bbf8c-17> |
Depthwise Conv, MLP 1352_487e62-a0> |
General CNN (Mobile/Edge) 1352_c14ba5-5f> |
|
대표 사례 1352_bde87f-79> |
Google TPU, NVDLA 1352_88688b-93> |
ShiDianNao 1352_f7cbd6-0b> |
MIT Eyeriss 1352_b6f620-75> |
결론적으로, 어떤 Dataflow가 우월한지는 ‘워크로드(Workload)의 특성’에 따라 결정됩니다.
- 배치 사이즈(Batch Size)가 크고 필터 재사용이 많은 서버급 추론에는 WS가 유리할 수 있습니다.
- 이미지 사이즈가 크고 채널이 적은 경우나 부분합 데이터가 큰 경우에는 OS가 유리할 수 있습니다.
- 전력 제한이 극심한 모바일/엣지 환경에서는 설계가 복잡하더라도 에너지 효율이 가장 높은 RS가 선호됩니다.
최근의 고성능 NPU(예: NVIDIA Tensor Core, Google TPU v4 등)들은 단일 Dataflow에 고정되지 않고, 레이어의 특성(Conv vs FC, Kernel Size 등)에 따라 유연하게 Dataflow를 변경(Reconfigurable)하거나 혼합하여 사용하는 방식으로 진화하고 있습니다.
참고: Efficient Processing of Deep Neural Networks: A Tutorial and Survey