동향

딥러닝 하드웨어 가속기에 대한 최근 기술 동향

딥러닝 하드웨어 가속기에 대한 최근 기술 동향

 

 

                                                                                                            이제민, leejaymin@etri.re.kr

한국전자통신연구원

 

 

Key words

Accelerator, Deep Learning, Neural Processing Unit

가속기, 딥러닝, 신경망 처리기

 

1. 딥러닝 하드웨어 가속기의 필요성

딥러닝은 언어와 영상에 이르기까지 다양한 분야에 적용되어 혁신적인 결과물들을 보이고 있다. 딥러닝의 발달은 크게 세가지 요인으로 분석되며 그것들은 알고리즘, 빅데이터, GPU로 알려져 있다. 이 중 GPU를 이용한 딥러닝 처리 방식 에너지를 많이 소모하는 문제점을 가지고 있다. 이에 구글에서는 2017년에 딥러닝 가속 하드웨어인 Tensor Processing Unit (TPU)을 공개했다. 구글과 같이 큰 규모의 데이터 센터를 에너지 효율적으로 운영하기 위해서 특별한 하드웨어 가속기를 개발 했다. 따라서 페이스북, 아마존 등과 같은 데이터 센터를 운영하는 다른 글로벌 테크 기업들에서도 딥러닝을 위한 전용 가속 하드웨어를 개발하고 있으며 이에 대한 관심은 계속 증가하고 있다.

 

2. 딥러닝 하드웨어 가속기 연구 동향

딥러닝 하드웨어 가속기 연구들로는 엔비디에서 오픈소스로 제공하는 Nvidia Deep Learning Accelerator (NVDLA)와 워싱턴 대학에서 공개한 Versatile Tensor Accelerator (VTA), 구글의 Tensor Processing Unit (TPU), MIT에서 연구한 Eyeriss가 있다. 본 장에서는 대표적인 딥러닝 하드웨어 가속기 네 가지에 대해서 설명한다.

 

2.1. NVDLA

엔비디아에서 개발한 오픈소스 딥러닝 추론 가속기이다. 엔비디아는 Verilog 소스코드와 해당하드웨어를 지원하는 컴파일러와 커널 코드들을 모두 공개했다. NVDLA 하드웨어는 설정을 통해서 성능과 전력 소모를 조절 할 수 있다. NVDLA의 주 타겟은 IoT 장치와 같은 임베디드 시스템에서의 추론을 대상으로 한다. 아래 그림 1은 NVDLA의 상위 수준의 구조도를 나타낸다. 그림 1과 같이 NVDLA는 세 개의 주요 블록으로 구성된다. 컨볼루션 코어는 컨볼루션과 완전 연결 레이어들에 있는 행렬 곱샘을 연산하기 위한 곱샘 덧샘기 (MAC)을 지원하는 내용으로 구성된다. 엑티비티 입력 값과 필터 가중치 값들은 모두 컨볼루셔널 버퍼에 저장되고 이것은 컨볼루셔널 코어에 입력으로 들어간다. 포스트 프로세싱 유닛의 경우 풀링, 비선형 엑티베이션 함수 등과 같은 다양한 연산을 수행하기 위해서 존재한다. 이 세개의 블럭은 Configuration and Control Block에 의해서 프로그래밍 되어지고 제어된다. 호스트 프로세서는 Configuration and Space Bus (CSB) 인터페이스를 통해서 이러한 제어 블럭에 접근 할 수 있다. 모든 연산 유닛들은 메모리 인터페이스 블럭에 연결된다. 그리고 이러한 메모리 인터페이스 블럭은 메인 메모리에 접근할 수 있도록 돕는다.

 



그림 1. NVDLA의 상위 수준 구조도

2.2. VTA

워싱턴 대학에서 개발한 딥러닝 가속기이며 TVM 소프트웨어와 함께 연동되어서 동작한다. 따라서 소프트웨어 지원 스택이 존재하기 때문에 하드웨어 관리와 명령어 실행 동기화 같은 어려운 부분은 모두 소프트웨어 스택으로 이전 시켰다. 이렇게 함으로써 하드웨어는 최대한 간단한 형태로 디자인 할 수 있다.



그림 2. VTA 내부 실행 흐름

 

그림 2는 VTA의 전체 구조도를 나타낸다. tALU는 레지스터 파일로부터 데이터를 읽어와서 연산을 수행 한다. 그리고 명령어들의 순서 제어는 마이크로 연산자(u-op)를 통해서 이뤄진다. 큰 밀집도 높은 행렬 연산의 경우 GEMM core를 통해서 이뤄진다. 그리고 이러한 결과는 레지스터 파일에 업데이트 되어 진다. 레지스터 파일은 32비트 데이터 표현 범위를 가진다. 데이터를 읽어 오는 것은 A 버퍼에서는 엑티베이션 값을 읽어오고 W 버퍼에서는 커널 가중치 값을 읽어 온다.

DMA LD의 경우 DRAM에서부터 엑티베이션과 웨이트를 읽어서 A 버퍼와 W 버퍼에 채우는 일을 담당한다. DMA LD/ST의 경우 레지스터에 누적된 결과값을 꺼내고 저장하는 역할을 담당한다. 이 모든 일련의 작업들을 관리하기 위해서 Task Dispatcher가 존재한다. 관리는 멀티 사이클 테스크를 4개의 서로 다른 기능 유닛에 보내는 것으로 수행된다. 4개의 테스크 레벨 명령어는 GEMM, ALU, LOAD, STORE이다. GEMM에서는 서로 다른 형태의 컨볼루션 처리를 담당한다. Stride, group, padding 등 다양한 옵션으로 컨볼루션의 형태가 달라질 수 있다.  ALU의 경우 ReLU, batch norm등과 같은 연산을 수행한다. LOAD, STORE의 경우 DRAM과 SRAM 사이의 데이터 이동을 담당 한다. 그리고 이러한 구성들 합쳐서 Store, Compute, Load의 3개의 모듈로 구성 했고 이것이 파이프라인이 된다. 그리고 각각의 모듈은 단 방향 메모리 통신 채널을 가지며, 각각의 모듈이 최대한 병렬성을 가지기위해서 동기화를 위한 WAR, RAW 의존성 코드들이 삽입된다.

 

2.3. TPU

구글도 2017년 초에 Tensor Processing Unit (TPU)이름으로 딥러닝 가속 하드웨어를 발표 했다. 구글 데이터센터로 요청되는 막대한 워크로드를 감당하기 위해서 자체적으로 고안한 하드웨어이다. 기존의 GPU보다 에너지 효율이 월등히 좋은 성능을 보였다.

TPU의 내부 구조는 우선 기존의 현대 프로세서 아키텍처들이 Reduced Instruction Set Computer (RISC)를 채택하는 것과 다르게 Complex Instruction Set Computer (CISC)를 사용한다. CISC 구조를 이용해서 상위 수준 명령어를 설계하여 곱셈 덧셈을 여러 번 수행하는 작업을 쉽게 달성하게 한다. 연산 가능 유닛을 상세히 설명하면 Matrix Multiplier Unit (MXU)는 65,536개 8-bit 곱셈과 덧셈이 가능하도록 지원한다. 통합 버퍼 (Unified Buffer)의 경우 24MB의 SRAM을 내장하며 엑티베이션 유닛 (Activation Unit)으로 하드웨어 선으로 연결된 함수를 내장하고 있다. MXU, UB, AU를 제어하기 위해서 총 12개의 명령어가 존재한다. 핵심적인 명령어는 6개로 i) TPU 명령어, ii) Read_Host_Memory, iii) Read_weights, iv) MatrixMultipy/Convolve, v) Activate, vi) Write_Host_Memory가있다.

 



그림 3. Systolic Array에 의해서 입력 벡터와 가중치 벡터를 병렬로 연산하기 위한 초기 배치

 

행렬 곱셈을 CPU에서 수행할 경우 스칼라 프로세서 이기 때문에 아무리 동작 클럭이 수 GHz라도 큰 행렬 두개를 곱하는 것은 오래 시간이 걸린다. 병렬로 여러 개의 데이터를 하나의 동일한 연산에 대해서 처리하는 방식이 GPU가 연산하는 것이다. TPU는 이것에서 더 나아가 행렬 연산을 동시에 수행하고 중간 결과물들을 즉시 재사용하는 구조를 채택했다. 그림 3은 이러한 연산 구조인 Systolic Array에서의 입력 값과 가중치 값의 연산을 위한 배치 구조를 나타낸다. 입력 값은 위에서 아래로 내려오면서 미리 저장된 가중치 값들과 순차적으로 연산 된다. 그리고 그림 4와 같이 중간 연산 값들은 왼쪽에서 오른쪽으로 이동하면서 부분합으로서 값이 누적된다. 이러한 구조로 연산을 수행할 경우 레지스터에서 데이터를 한 번만 읽어오면 그 값을 최대한 재사용하여 행렬 연산과 관련된 부분 합들을 전부 구할 수 있게 된다. CPU나 GPU와 다르게 레지스터에서 데이터를 읽어 오거나 중간 결과로 생성된 부분합들을 다시 저장하는 것에 사이클과 에너지 소모를 하지 않도록 하기 위해서 이러한 Systolic Array구조를 채택해서 사용한다.

 



그림 4. Systolic Array에 의해서 입력 벡터와 가중치 벡터의 병렬 연산 중간 과정

 

TPU는 256x256 크기의 systolic array 구조를 가지므로 65,536개의 ALU 연산 유닛을 가진다. 그리고 TPU의 동작 클럭은 700Mhz이므로 최종적인 행렬 연산에 따른 이론상 성능은 92TOPS가 된다. 이러한 성능을 보이면서 중간에 생성된 결과들을 따로 저장하기 위한 메모리 접근이 없기 때문에 CPU나 GPU에 비해서 전력 효율이 수십 배 좋은 결과를 나타낸다.

 

2.4. Eyeriss

Eyeriss는 MIT에서 개발한 에너지 효율적인 딥 컨볼루션 인공 신경망 가속기이다. 해당 가속기는 최신 CNN 모델을 지원하기 위해 다양한 레이어와, 몇 백 만개의 필터 가중치, 다양한 모양의 필터 사이즈와 채널들을 지원한다. 테스트 칩에서는 168개의 연산 유닛을 지원 했으며 데이터 이동을 최소화 하여 데이터 재사용을 극대화 시켰다. 데이터 사용 연결과 압축을 사용하여 에너지 소모 또한 줄였다. 해당 하드웨어 가속기는 카페 프레임워크를 완벽히 지원한다.

 



그림 5. Eyeriss 구조도

 

그림 5는 Eyeriss의 전체적인 구조와 메모리 연결 상태를 보여준다. 동작 클럭은 두 개로 나눠지는데 첫 번째는 연산을 위한 코어 클럭이고 두 번째는 DRAM과 양방향 64비트 데이터버스로 통신하기 위해서 사용되는 링크 클럭이다. 공간 배열로 Processing Element (PE)는 168개 존재하며 12 X 14의 직사각형 구조를 가진다. 그리고 인접한 PE들 간에는 적은 사이클로 통신 할 수 있도록 설계 되어있다. 메모리 계층 구조의 경우 DRAM, GLB, PE간 내부 메모리 통신으로 구성된다.

최종적으로 실제 시연 결과 Eyeriss는 Alexnet을 35 프레임으로 동작하면서도 278mW 수준의 전력만을 소매 했다. 이것은 모바일 GPU보다 10배 에너지 효율 측면에 좋은 결과이다.

 

3. 결론

전통적인 하드웨어 연산 유닛으로는 연산의 한계가 분명하다. 따라서 가속기에 대한 개발을전세계적으로 수행하고 있다. 본 보고서에서는 기존 딥러닝 모델의 연산 부하를 효과적으로 처리 위해 만들어진 하드웨어 가속기들에 대해서 알아 보았다. 이러한 지능형 반도체는 삼성전자에서도 대규모로 투자에 나섰고 국가적으로 1조 이상의 예산을 투자할 예정이다. 비메모리 반도체 분야에서도 우리나라가 경쟁력을 가지기 위해서 연구가 활발히 진행 되어야 할 것이다.

 

References

1. NVIDIA Deep Learning Accelerator. http://nvdla.org/ primer.html Viewed 2019-11-26.

2. Moreau, T. et al. A Hardware-Software Blueprint for Flexible Deep Learning Specialization. IEEE Micro, 39(5), 8-16, 2019.

3. Jouppi, N. P. et al. In-datacenter performance analysis of a tensor processing unit. ACM/IEEE 44th Annual International Symposium on Computer Architecture (ISCA), 1-12. 2017

4. Chen, Y. H. et al. Eyeriss: An energy-efficient reconfigurable accelerator for deep convolutional neural networks. IEEE Journal of Solid-State Circuits, 52(1), 127-138. 2016