SmartShuttle 논문의 동기와 주요 아이디어를 정리하기 위한 글이다. 디테일을 확인하고 싶으면 논문을 확인하자. 또한 이 글의 그림들은 모두 해당 논문에서 가져왔다.

정보

  1. 저자: Jianjun Li (Univ. of Chinese Academy of Sciences)
  2. 학회: DATE 18”
  3. 링크: https://ieeexplore.ieee.org/document/8342033

내용

Intro

기존의 CPU나 GPU에 비해 성능이나 에너지 효율이 좋은 NPU가 많이 제안되고 있다. 많은 연구들이 계산 방법을 최적화 하는 것에 집중하고 있는데, NPU의 에너지 소모는 오프 칩 메모리 접근이 더 큰 부분을 차지하고 있다. 예를 들어, DianNao [1]와 Cambricon-X [2]의 경우는 전체 에너지 소모량의 80%이상을 오프 칩 메모리 (대부분 DRAM) 를 접근하는데 소비한다. 따라서 오프 칩 메모리 접근을 줄이는 것이 에너지 효율을 높이는데 주요한 요소이다.

기존의 연구들은 한 타입의 데이터를 최대한 재사용한다 [3], [4]. 하지만 저자들의 실험에 따르면, 한 타입의 데이터만을 재사용하는 것은 다양한 모양의 convolution 레이어가 있는 딥 러닝 네트워크에서 오프 칩 메모리 접근을 줄이는데 한계가 있다. 즉, convolution 레이어의 인풋, 아웃풋, 커널 크기가 다르기 때문에 각각의 레이어마다 서로 다른 데이터 타입을 재사용해야한다고 주장한다.

따라서 이 논문은 Adaptive layer partitioning과 Scheduling scheme을 제안한다. 이 방법 자체를 SmartShuttle이라고 부른다. 또한 데이터 재사용과 Sparsity가 오프 칩 메모리 접근에 끼치는 영향을 분석하였다 (레이어 별로 서로 다른 데이터를 재사용해야 함을 보이기 위한 분석이다).

Background

이 논문에서는 타일링 (Tiling) 방법을 사용하여 데이터를 재사용하였다. Convolution 연산은 인풋 피처맵 (Feature Map) 데이터, 웨이트 (Weight), 아웃풋 피처맵 데이터 등 큰 데이터가 많다. 이 큰 데이터를 작은 온 칩 메모리에서 모두 저장하고 계산 할 수 없기에, 데이터의 일부를 먼저 온 칩에 올려 해당 데이터에 관련된 연산을 처리하고 다음 데이터를 처리하는 방법이다.

아래 그림을 보자. 바깥 for문 (흰 부분) 은 데이터를 타일 단위로 로드하기 위한 부분이고, 회색 부분의 for 문은 로드한 데이터를 계산하기 위한 부분이다. D는 배치, R/C는 아웃풋의 세로/가로, M/N은 인풋/아웃풋 피처맵을 의미한다. (자세하게 보니 글과 그림이 조금 다른 것 같다. 그림에서는 M이 아웃풋, N이 인풋 인듯…) 2번째 줄부터 4번째 줄까지 for문에서 보이듯이, 아웃풋의 세로, 가로와 인풋, 아웃풋의 채널을 타일 단위로 쪼개서 로드한 후 처리하고, 또 다음 데이터를 로드한 후 처리하는 것을 반복한다. 즉, 큰 데이터를 작은 크기의 데이터로 쪼개서 해당 데이터를 온 칩 메모리에서 오래 머물도록 하는 것 (많은 계산을 한 후 버리는 것) 이다. 아래 그림에서는 회색 부분의 계산량만큼 로드된 데이터가 온 칩 메모리에 머무르게 된다. 이 때, 계산하는 부분에 사용되는 인풋/아웃풋 피처맵과 웨이트는 모두 온 칩 메모리에 저장될 수 있어야 한다. 즉, 온 칩 메모리의 크기에 제약으로 인해 계산 부분의 계산량이 계속 커질 수는 없다.

Convolution 연산에 타일링을 적용한 수도 코드

Convolution 연산에 타일링을 적용한 수도 코드

DRAM 접근 패턴 분석

Layer Partitioning and Scheduling

위 그림에서 회색으로 표시된 계산 부분의 계산량이 커지면, 로드된 데이터를 온 칩에서 더 재사용 할 수 있어 좋다. 따라서 각 타일링 변수들을 탐색하는 것은 로드된 데이터를 얼마나 온 칩 메모리에서 재사용되느냐를 정하기 때문에 중요하다. 이뿐만 아니라, 이 논문에서는 Loop Interchange 기법을 이용하여 로드한 데이터를 더 많이 재사용한다. 아래 그림에서 보이듯이, for문들과 서로 무관한 데이터 로드를 해당 for문들 바깥으로 옮기는 것이다. 바깥으로 옮김으로써 해당 데이터는 더 많은 계산동안 온 칩 메모리에서 재사용 될 수 있다. Loop Interchange 기법은 바깥의 for문이 5개 이므로 총 5! = 120 개의 경우가 있다. 하지만 이 논문에서는 아래 그림과 같이 3가지 경우를 사용하였다.

이 논문에서 사용하는 데이터 재사용 방법들

이 논문에서 사용하는 데이터 재사용 방법들

Data Reusability and Spasity Variance

이 논문에서는 데이터 재사용과 압축률에 대한 변동성을 분석하였다. 아래 그림들과 같이 레이어마다 데이터 재사용성과 압축률이 변동이 크다. 따라서 이 논문에서 제안하는 것과 같이 레이어 별로 서로 다른 데이터 타입을 재사용하여야 한다.

레이어별 데이터 재사용, 데이터 크기, 압축률 분석

레이어별 데이터 재사용, 데이터 크기, 압축률 분석

SmartShuttle

위의 Layer Partitioning과 Scheduling을 탐색하는 방법에 대한 내용이다. 타일링 변수들로 표현된 오프 칩 메모리 접근량을 수식적으로 표현이 가능하므로, 수식을 세운 후 이를 푸는 방법이다. 각 과정에서 어떤 경우를 가지치고 계산하였는지에 대한 섹션이다. 아이디어 자체만을 리뷰하기 위한 글이므로 해당 부분은 생략하겠다.

실험

Manycore 형태의 NPU Eyeriss 를 사용하였으며, VGG16과 AlexNet에 대해 실험하였다.

Reference

  1. T. Chen, Z. Du, N. Sun, J. Wang, C. Wu, Y. Chen, and O. Temam, “Diannao: A small-footprint high-throughput accelerator for ubiquitous machine-learning,” in Proceedings of the 19th ASPLOS.
  2. S. Zhang, Z. Du, L. Zhang, H. Lan, S. Liu, L. Li, Q. Guo, T. Chen, and Y. Chen, “Cambricon-x: An accelerator for sparse neural networks,” in Proc. of MICRO, 2016.
  3. C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao, and J. Cong, “Optimizing fpga-based accelerator design for deep convolutional neural networks,” in Proceedings of the 2015 FPGA, 2015.
  4. M. Alwani, H. Chen, M. Ferdman, and P. Milder, “Fused-layer cnn accelerators,” in Proc. of MICRO, 2016.