동향

딥러닝 컴파일러에 대한 최근 연구 동향

딥러닝 컴파일러에 대한 최근 연구 동향

 

 

                                                                                                            이제민, leejaymin@etri.re.kr

한국전자통신연구원

 

 

Key words

Deep Learning, Intermediate Representation, Compiler

딥러닝, 중간표현, 컴파일러

 

1. 딥러닝 컴파일러의 필요성

최근 인공지능의 발달은 딥러닝이 이끌고 있으며 자연어에서부터 영상과 게임에서까지 다양한 영역에서 활용되고 있다. 하지만 딥러닝 알고리즘은 실행을 위해서 기존 인공지능 알고리즘들과 다르게 많은 연산 부하를 가져 온다 [1].

딥러닝 모델의 복잡도와 사용되는 데이터 양의 증가로 딥러닝 연산 효율성에 대한 사람들의관심은 증가하고 있다. 이러한 효율성에 대한 요구는 연산 워크로드를 가속화하기 위한 다양한 이기종 하드웨어를 등장 시켰다. 이와 동시에 프로그래밍 모델에 있어서 생산성 높은 방식에 대한 필요성도 증가하고 있다. 전통적으로 생산성과 성능 사이에서 개발자에게 연결 고리를 제공하는 일은 컴파일러가 담당해 왔다. 결국 딥러닝 분야에서도 컴파일러 기술을 이용해서 기계학습 워크로드를 최적화하는 알고리즘을 개발하는 연구들이 활발히 진행 되고 있다.

컴파일러 기술을 이용하면 현재의 프레임워크들이 하드웨어 제조사가 제공하는 연산 라이브러리에 의존하고 있는 문제들도 해결 할 수 있다. NVIDIA의 cuDNN과 ARM Compute Library가 대표적인 수작업 연산 라이브러리이다. 만약 딥러닝 모델의 실행을 새로운 타겟 하드웨어에서 실행 해야한다면 수작업 연산 라이브러리를 다시 제작해야 하기 때문에 상당히 많은 노력을 필요로 한다. 또한 지속해서 새로운 모델에 맞추어서 연산 라이브러리를 업데이트 하는 것도 어려운 일이다. 따라서 컴파일러를 이용한 딥러닝 모델의 타겟 실행 코드 생성에 관한 관심은 계속 증가하고 있다.

 

2. 딥러닝 컴파일러 연구 동향

딥러닝 컴파일러의 연구들로는 워싱턴 대학에서 연구하고 아마존에서 실제 사용하고 있는Tensor Virtual Machine (TVM)와 페이스북에서 사용중인 Graph Lowering (Glow), 엔비디아의 TensorRT, 구글의 Multi-Level Intermediate Representation (MLIR)이 있다. 본 장에서는 대표적인 딥러닝 컴파일러 네 개에 대해서 설명한다.

 

2.1. TVM

워싱턴 대학과 아마존 회사가 같이 개발한 컴파일러이며, Tensor Virtual Machine (TVM)의 약어이다. 딥러닝 모델의 가속을 위해서 다양한 하드웨어들이 출현하고 있지만 여전히 현재 딥러닝 프레임워크들은 제조사에서 제공하는 연산자 라이브러리에 의존하고 있다. 또한 이러한 라이브러리는 서버급 GPU를 대상으로 하고 있다. 딥러닝 모델 워크로드를 스마트폰, 임베디드 장치, 가속기 등과 같은 새로운 플랫폼에 적용할 때 이러한 방식은 상당히 많은 수작업 노력을 필요로 한다.

 



그림 1. Tensor Virtual Machine (TVM) 구조도

 

그림1은 TVM의 전체적인 구조도 모습이다. TVM은 새로운 하드웨어에 맞는 최적의 연산 라이브러리 지원을 효율적으로 하기 위한 컴파일러로 그래프 수준과 연산자 수준의 최적화를 다양한 하드웨어 백앤드에서 가능하도록 한다. 우선 그림1과 같이 최상위 수준에서는 텐서플로우, 카페, 파이토치 등과 같은 다양한 딥러닝 프레임워크들에서 만들어진 모델을 모두 입력으로 받을 수 있도록 허용한다. 그 다음 해당 모델을 상위 수준의 중간 표현으로 변환 한다. 해당 중간 표현을 이용해서 그래프 수준의 연산자 결합, 동치 연산자들의 제거 등과 같은 하드웨어에 비의존적인 최적화 작업을 수행한다. 그 다음은 텐서 중간 표현으로 메모리 지연 숨김 등과 같은 최적화 들을 수행한다. 마지막으로 타겟 하드웨어에 맞춰서 백앤드 컴파일러로 기계어를 생성한다. 이와 같은 최적화 작업을 비용기반 머신러닝 모델을 만들어서 수행하며 이것을 AutoTVM이라 부른다. TVM이 지원하는 타겟 하드웨어는 모바일 CPU, 서버 CPU/GPU, 가속기 모두를 지원한다. 실제자동으로 생성한 연산 라이브러리의 성능에 있어서도 엔비디아가 개발한 cuDNN과 ARM이 개발한 ARM-CL의 이상의 연산 속도를 보였다.

 

2.2. Glow

Facebook에서 개발한 딥러닝을 위한 컴파일러이며, Graph-Lowering의 약어이다. Glow 딥러닝 작업을 이기종 하드웨어에서 실행하기 위한 컴파일러를 제공하기 위한 프로젝트이다. 최근에는 다양한 하드웨어 가속기들이 출시되고 있으며 이러한 가속기에 맞춰서 컴파일러를 만들어야 하는 일이 생긴다. 이러한 상황에서 하드웨어 제조사들이 컴파일러 백앤드 개발 작업에 있어서 몇 개의 선형대수 기초 연산자들만 개발하고 나머지 컴파일러 기술 요소들은 모두 재사용할 수 있는 소프트웨어 개발 스택을 만드는 것이 Glow 컴파일러의 목표이다.

 



그림 2. Graph Lowering (Glow) 구조도

 

그림2는 Glow 컴파일러의 전체적인 구조도 모습이다. 우선 최적화 된 코드를 여러 하드웨어 타겟에서 생성하기위해서 몇가지 전략을 취한다. 딥러닝 모델을 두 가지 형태를 가지는 중간 표현으로 변환한다. 첫 번째는 고수준 중간 표현으로 그림2에서 그래프 IR에 해당한다. 이 단계에서는 도메인에 맞는 최적화를 수행한다. 저수준 중간 표현은 메모리 주소 표현을 위한 IR이다. 따라서 메모리 관련 최적화인 명령어 스케줄링, 정적 메모리 할당, 불필요한 복사 제거 등을 수행한다. 마지막으로 최하위 수준에서는 타겟 하드웨어의 이점을 최대한 포함하는 기계어 코드를 생성하게 된다. 이렇게 각 단계별로 로어링 단계를 만듦으로써 다양한 하드웨어 타겟에 맞춰서 코드를 생성해야 할 때 구현해야 할 연산자들의 수를 줄일 수 있게 된다. 그림3은 순서대로 그래프 IR, 저수준 IR, 그리고 CPU로 백앤드 하드웨어가 설정될 경우 출력되는 기계어 수준의 IR을 나타낸다.

 



그림 3. Glow에서 발생하는 각 단계별 중간 표현 형태

2.3. TensorRT

엔비디아에서 제작한 딥러닝 모델의 추론을 GPU에서 효율적으로 수행하기 위해서 개발된 라이브러리들이다. 학습을 지원하는 프레임워크인 텐서플로우, 카페, 파이토치, 엠엑스넷들과 상호 보완적으로 동작하는 방식이다. TensorRT는 이미 학습이 끝난 모델을 빠르고 효율적으로 실행하는 것에 초점이 맞추어져 있다. TensorRT는 기존의 텐서플로우 프레임워크와는 이미 통합되어진 상태이다.

TensorRT에서 수행하는 최적화 방법은 크게 다섯 가지이다. 우선 학습된 네트워크를 여러 형태의 데이터 형식으로 입력 받는다. ONNX, 카페, 텐서플로우 포멧 형태로 입력 받는다. 입력된 모델을 기반으로 아래의 최적화들을 수행하게 된다. i) Precision Calibration: 모델을 FP32에서 FP16이나 INT8로 양자화 하면서도 정확도는 보존한 상태에서 처리율을 최대화 한다. ii) Layer & Tensor 병합: 커널 내부의 노드들을 병합하여 GPU 메모리 대역폭 사용을 최소화 한다. iii) Dynamic Tensor Memory: 텐서의 효율성 증가를 위해서 텐서들의 재사용을 통해서 메모리 사용량을 최소화 한다. iv) Kernel-Auto-Tuning: 타겟 GPU에 맞춰서 최적의 데이터 레이아웃과 알고리즘을 선택 한다. v) Multi-Stream Execution: 다중 시트림 입력들에 대해서 병렬로 처리할 수 있는 확장 가능한 설계를 지원한다.

 

2.3. MLIR

데이터 센터에서부터 모바일 장치에 이르기 까지 다양한 가속기들이 등장하고 있다. 따라서 컴파일러와 프로그램 표현은 다양한 장치들에 대해서 병렬화 그래프 연산의 분산화에 이르는 수준의 지원을 할 필요성이 생겼다. 이러한 필요성은 구체적으로 타겟 맞춤형 최적화, 도메인 맞춤형 언어의 지원, 레거시와 새로운 인프라를 연결하는 인터페이스들에 대한 요구사항으로 이어졌다. 따라서 그래프 표현, 머신러닝 연산자, 최적화 들을 모두 통합하는 새로운 인프라가 필요하다.

 



그림 4. 현재 딥러닝 컴파일러들이 생성하는 중간표현들의 종류

 

기존 텐서플로우는 다양한 하드웨어들을 지원하며 이것들은 그림4와 같이 다양한 방법으로 표현된다. XLA High-Level Optimizer representation (XLA HLO)는 LLVM 컴파일러를 활용해서 CPU와 GPU 코드를 생성하고 TPU IR을 생성해서 TPU용 코드를 생성한다. 다른 컴파일러를 이용하기 위해서 텐서플로우 그래프는 TensorRT또는 nGraph 포멧으로 변경된다. 또한 그래프는 텐서플로우 라이트에서 실행 가능하도록 Android Neural Networks API (NNAPI)를 통해서 실행 가능한 형태로도 변경 된다. 다양한 백앤드와 프레임워크를 지원하기 위해서 중간에 생성되는 코드들이 많으며 각각의 IR들은 서로 공유되거나 재사용되어지지 않는다. 이러한 문제를 해결하기 위해서 MLIR을 개발 되었으며, 이러한 컴파일러 인프라를 통해서 새로운 하드웨어 백앤드 지원을 쉽게 가능하도록 한다.

 

3. 결론

딥러닝은 여러 분야에서 다양한 혁신을 달성해 왔다. 하지만 중요한 문제점은 리소스 사용량이 높다는 것이다. 이를 해결하기 위해서 하드웨어 가속기들이 제안되고 있다. 본 보고서에서는 기존 딥러닝 모델의 연산 부하를 효과적으로 처리 위해 만들어진 하드웨어가속기를 제대로 활용하기 컴파일러에 대해서 알아보았다. 전 세계적으로 딥러닝 관심이 뜨거운 만큼 우리나라도 기반시설 측면에서의 컴파일러 연구도 활발히 진행 되어야 할 것이다.

 

References

1. Vivienne S. et al. Efficient Processing of Deep Neural Networks: A Tutorial And Survey. Proceedings of the IEEE, 105(12), 2295-2329, 2017.

2. Tianqi C. et al. TVM: An Automated End-to-End Optimizing Compiler for Deep Learning. USENIX Symposium on Operating Systems Design and Implementation (OSDI’18), 578-594, 2018.

3. Nadav R. Glow: Graph Lowering Compiler Techniques for Neural Networks. arXiv preprint arXiv:1805.00907, 2018.

4. NVIDIA TensorRT. https://developer.nvidia.com/tensorrt Viewed 2019-11-25.

5. TensorFlow MLIR. https://www.tensorflow.org/mlir Viewed 2019-11-25.