Deep learning compiler란 무엇인가

1. motivation

 

모든 network는 기본적으로 graph로 나타낼 수 있다.

 

C가 작성만 하면 컴퓨터가 이해하는 것이 아니고 compile 과정을 거쳐서 기계어로 최종 번역되어야 이해할 수 있다.

 

network도 마찬가지로 그냥 GPU에서 돌아가는 것이 아니라 graph lowering 과정을 거쳐야 hardware에서 이해할 수 있다.

 

이러한 역할을 해주는 것이 deep learning compiler

 

지금까지 software측면에서 network만 주로 공부했지만 실제로 network가 CPU,GPU 같은 hardware 환경에서 돌아가기까지 생각보다 많은 일이 있다.

 

Network가 GPU에서 돌아가려면?

 

 

 

high level단의 pytorch 같은 것으로 만든 모델은 edge device인 edge TPU나 Jetson nano에서 그냥은 돌릴 수 없다

 

해석 자체를 못해 그래서 high level에서 만든 모델을 이러한 edge device들이 해석할 수 있도록 바꾸는 것이 deep learning compiler

 

 

2. compiler란 무엇인가

 

일반적인 high level language인 C++나 Python같은 것을 compiler가 assembly language로 번역함

 

high level language는 hardware independent한데

 

assembly language는 보통 hardware dependent하여 compiler가 hardware에 따라 다르게 번역함

 

이렇게 번역된 언어들에 맞춰서 assembler가 machine language로 번역함

 

일반적인 프로그래밍 언어의 번역단계

 

 

3. deep learning compiler

 

deep learning framework인 tensorflow나 pytorch에 따라 다르게 묘사된 model을 input으로 받는다

 

deep learning compiler가 이러한 model을 해석하여 다양한 deep learning hardware를 위한 code를 생성해준다.

 

그런데 단번에 번역하는 것이 아니고 multi-level intermediate representation이라고 다단계로 번역해준다는 것이 특징이다.

 

 

4. deep learning framework

 

tensorflow, pytorch외에도 여러가지가 있음

 

onnx는 여러가지 deep learning framework들을 exchange할 수 있는 오픈 소스 라이브러리다.

 

여러가지 framework들

 

 

5. compile 과정

 

여러가지 framework로 만든 high level의 모델들이 deep learning compiler에 의해

 

계산 그래프 생성기, IR 생성기, 백엔드 코드 생성기, …. 복잡한 과정을 거쳐 low level의 cuda, LLVM, OpenCL 같은 곳에 맞게 변환

 

그냥 아무생각없이 모델이 돌아가는구나라고 생각하는 것보다는 복잡한 숨은 과정을 거쳐 low level로 변환되는구나라고 생각하는 것은 조금 다를지도?

 

deep learning model의 compile 과정

 

 

6. 다양한 deep learning compiler

 

deep learning framework를 여러 회사에서 개발했듯이 deep learning compiler들도 여러 회사에서 개발하여 종류가 다양함

 

XLA, TVM, GLOW, ONNC 등 종류가 다양하듯이 그 성능도 조금씩 다름

 

TVM과 GLOW의 성능 차이

 

 

7. LLVM

 

이전에는 high level의 언어를 low level의 언어로 번역하기 위해서는 각 언어의 특성에 맞게 그리고 low level의 언어의 특성에도 맞게 번역해야했다

 

 

 

C를 X86, powerpc, arm에 맞게 각각 번역해야했고

 

fortran도 X86, powerpc, arm에 맞게 각각 번역해야했고

 

haskell도 X86, powerpc, arm에 맞게 각각 번역해야했고

 

각 언어 C, fortran, haskell에 맞는 compiler도 달라서 NM개의 compiler가 필요

 

LLVM IR이 등장하여 compiler 번역을 어느 정도 통합시킴

 

frontend인 higelevel N개를 번역하는 LLVM IR과 backend인 lowlevel M개로 번역해주는 LLVM IR이 있어서 총 N+M개의 compiler로 필요한 수를 줄일 수 있었다

 

 

 

그림만 보면 오해할 수 있는데

 

C - LLVM IR, Fortran - LLVM IR, Haskell - LLVM IR로 번역해주는 N개의 compiler는 N개의 다양한 언어를 하나의 LLVM IR로 번역시킴

 

하나의 번역된 LLVM IR을 M개의 compiler가 LLVM IR - X86, LLVM IR - PowerPC로 LLVM IR - ARM으로 각각 번역시켜줌

 

 

8. MLIR

 

Multi-Level intermediate representation

 

LLVM IR의 language compile 통합 역할을 machine learning에서 수행하는 것

 

tensorflow나 pytorch의 graph들이 low level로 변환되기 위해서 다양한 framework에 맞게 다양한 compiler들이 변환을 시키는데

 

MLIR은 이런 compiler들을 통합하여 계산 비용을 상당히 줄여줄 것으로 기대한다.

 

LLVM의 sub project로 아직 개발중임

 

 

 

하나의 tensorflow graph 다양한 framework로 만들어진다?

 

중간의 TensorFlow Lite나 nGraph들이 compiler들임

 

이런 framework들을 MLIR에서 조립을 해서 intermediate representation으로 통합해서 만들겠다

 

 

9. 다양한 deep learning compiler들의 특징

 

서로 다른 회사에서 만든 서로 다른 다양한 deep learning compiler들의 특징을 비교 정리한 표

 

 

 

근데 이런 표의 내용을 무작정 외울 생각을 하는 것이 아니라.. 생각을 조금 바꿔야함

 

이 표는 어떤 compiler들이 어떤 것을 지원하고 어떤 것을 지원하지 않는지 알아보는데 의미가 있음

 

개발자 입장에서는 target customer들이 원하는 기능을 지원하는 deep learning compiler를 선택하는 것이 좋을테니..

 

그러한 전략적인 의사결정을 하는데 의미가 있지

 

표를 외우는 것은 아무런 의미가 없다.. 뇌용량만 낭비랄까...?

 

 

10. overview

 

tensorflow나 pytorch 등 여러 framework로 만들어진 human friendly한 deep learning model graph를 input으로

 

deep learning compiler는 graph lowering을 통하여 여러가지 복잡한 과정을 거쳐 target device GPU, CPU, ASIC 등에 맞게 번역과정을 수행함

 

compiler frontend단은 hardware에 independent하게 수행되어지며 compiler backend단은 hardware dependent하게 수행

 

deep learning model의 compile 과정

 

 

이걸 다 아는 것은 당연히 말이 안되고 아무 생각 없이 돌린 모델들이 이런 복잡한 과정을 거쳐 돌아가고 있다는 것을 안다면 좋을지도?

TAGS.

Comments