Deep_Learning

Deep Learning Compiler

MoonLight314 2023. 12. 2. 08:44
728x90

안녕하세요, MoonLight입니다.

오늘은 Deep Learning Model을 목적에 맞게 변화시킬 수 있는 Deep Learning Compiler에 대해서 알아보도록 하겠습니다.

자, 가시죠~!

0. Introduction


우리는 다양한 Deep Learning Framework으로 Model을 만듭니다.

우리가 만든 Model이 실제로 실행되는 환경들은 매우 다양합니다.

PC일수도 있고, Edge Device일수도 있고, Mobile Device, Cloud 환경 등등 매우 다양한 Target Device가 존재합니다.

이런 Target Device의 다양화에 어느 정도 대응할 수 있도록 해주는 것이 ONNX입니다.

ONNX(Open Neural Network Exchange, Link)는 Deep Learning Framework간의 Model Conversion이 주된 목적입니다.

이를 잘 활용하여 우리의 Deep Learning Model을 Target Device에서 작동할 수 있도록 할 수 있습니다.

여기에 추가로 이 Post에서 설명하려고 하는 Deep Learning Compiler는 특정 Deep Learning Framework Model을

Target Device에서 동작하도록 Conversion해 줄 뿐만 아니라, 다양한 최적화 기법을 적용하여 Inference 속도도 향상시켜주는 역할을 합니다.

1. Architecture


Deep Learning Compiler는 어떤 방식으로 동작하는지 알아보도록 하겠습니다.

Deep Learning Compiler는 일반적인 Compiler와 어느 정도 비슷하며, 일반적인 Compiler와 마찬가지로 Frontend와 Backend로 구성되어 있습니다.

Frontend는 Software적인 최적화에 중점을 두고 있고, Backend는 Target Device에 맞게 Hardware 최적화에 중점을 두고 있습니다.

Frontend와 Backend 둘 다 IR(Intermediate Representation)이 있습니다.

Frontend 쪽의 IR은 High Level IR 혹은 Graph IR 이라고 말하고, Backend 쪽의 IR은 Low Level IR 혹은 Operator IR 이라고 말합니다.

1.0. Frontend

    • Deep Learning Compiler의 Frontend는 크게 2가지 동작을 한다고 볼 수 있습니다.

1.0.0. Conversion

    • Conversion Part는 우리가 다양한 Deep Learning Framework으로 Train 시킨 Model을 입력으로 받아서 High-Level IR로 변환합니다..
    • High-Level IR에는 Model이 계산을 어떻게 하며 Flow Control을 어떻게 하는가에 대한 정보가 들어가 있습니다.
    • High-Level IR은 Model의 구조를 파악하는 단계이기 때문에 아직은 Hardware에 독립적이며 Data와 Operator간의 관계를 확립하는 목표입니다.

1.0.1. Optimization

    • Conversion 단계에서 파악한 Model의 구조를 기반으로 최적화를 수행할 수 있는 여지를 찾아서 적용함으로써 성능 향상을 시킵니다.

1.1. Backend

Backend는 다음과 같은 기능을 합니다.

1.1.0. Conversion

    • Frontend에서 생성된 High-Level IR을 입력으로 받아서, Low-Level IR로 변환합니다.
    • Backend의 주된 역할은 Hardware에 독립적이었던 High-Level IR을 Target Device의 Hardware 특성을 반영하여 변환하는 것입니다.

1.1.1. Optimization

    • 이 단계에서는 Hardware 최적화가 적용됩니다.합니다.
    • 특히 이 단계에서는 다양한 최적화 기법, 예를 들면, intrinsic mapping, memory allocation and fetching, memory latency hiding, parallelization, loop oriented optimizations 등과 같은 기법이 적용됩니다.
    • 최종적으로 최적화된 Low-Level IR은 Just-In-Time compiler 혹은 Ahead-Of-Time compiler 같은 Compiler를 사용해 Hardware-Specific Code를 생성합니다.

2. Optimizations


앞에서 Frontend와 Backend에서 각각 최적화가 이루어진다고 했는데, 구체적으로 어떤 기법들이 사용되는지 알아보도록 하겠습니다.

2.0. Frontend

Frontend에서 수행되는 최적화는 Software 수준에서 수행되는 computational graph optimization입니다.

NOP 라든지 계산결과가 항상 같은 값이거나, 계산 수행이 다음 계산에 영향을 주지 않는 경우에는 최적화를 할 수 있겠죠.

또한, Block Level에서도 최적화가 이루어집니다.

교환법칙, 결합법칙 및 분배법칙 등의 대수학적인 기법을 이용하여 계산을 단순화하여 최적화를 이루는 방법입니다.

마지막으로, Dataflow Level 최적화를 수행합니다.

    • Dead Code Elimination : 계산 결과에 영향을 주지 않는 부분을 제거
    • Static Memory Planning : 메모리를 효율적 사용할 수 있게 해줌

2.1. Backend

Backend Optimization은 Hardware에 따라 다르게 적용되며, 다음과 같은 기법들이 있습니다.

    • Efficient Memory Allocation and Mapping
    • Better Data Reuse by the Method of Loop Fusion and Sliding Window.
    • Auto-Tuning
    • 일련의 매개변수를 최적으로 선택
    • 병렬화를 통해 성능을 가속화
    • 검색 공간에 유전 알고리즘(genetic algorithms)을 적용함으로써 검색 시간을 줄입니다

728x90

'Deep_Learning' 카테고리의 다른 글

Deep Learning Compiler 종류  (1) 2024.01.02
ONNX(Open Neural Network Exchange)  (1) 2023.12.06
Jupyter Kernel 관리 - ipykernel 사용법  (0) 2023.11.29
Learning Rate in Tensorflow  (1) 2023.10.30
TensorBoard  (1) 2023.10.10