Deep learning compiler란 무엇인가
1. motivation
모든 network는 기본적으로 graph로 나타낼 수 있다.
C가 작성만 하면 컴퓨터가 이해하는 것이 아니고 compile 과정을 거쳐서 기계어로 최종 번역되어야 이해할 수 있다.
network도 마찬가지로 그냥 GPU에서 돌아가는 것이 아니라 graph lowering 과정을 거쳐야 hardware에서 이해할 수 있다.
이러한 역할을 해주는 것이 deep learning compiler
지금까지 software측면에서 network만 주로 공부했지만 실제로 network가 CPU,GPU 같은 hardware 환경에서 돌아가기까지 생각보다 많은 일이 있다.
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할 수 있는 오픈 소스 라이브러리다.
5. compile 과정
여러가지 framework로 만든 high level의 모델들이 deep learning compiler에 의해
계산 그래프 생성기, IR 생성기, 백엔드 코드 생성기, …. 복잡한 과정을 거쳐 low level의 cuda, LLVM, OpenCL 같은 곳에 맞게 변환
그냥 아무생각없이 모델이 돌아가는구나라고 생각하는 것보다는 복잡한 숨은 과정을 거쳐 low level로 변환되는구나라고 생각하는 것은 조금 다를지도?
6. 다양한 deep learning compiler
deep learning framework를 여러 회사에서 개발했듯이 deep learning compiler들도 여러 회사에서 개발하여 종류가 다양함
XLA, TVM, GLOW, ONNC 등 종류가 다양하듯이 그 성능도 조금씩 다름
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하게 수행
이걸 다 아는 것은 당연히 말이 안되고 아무 생각 없이 돌린 모델들이 이런 복잡한 과정을 거쳐 돌아가고 있다는 것을 안다면 좋을지도?
'딥러닝 > light weight modeling' 카테고리의 다른 글
activation function quantization에 대하여 (0) | 2024.09.05 |
---|---|
mixed precision training 자세히 공부하기 (0) | 2024.09.04 |
hardware-software codesign 개념 (0) | 2024.08.27 |
AutoML의 개념 알아보기 (0) | 2024.08.23 |
tensor decomposition - Tucker decomposition, CP decomposition (0) | 2024.08.19 |