ONNX-MLIR의 Linalg Dialect 도입: 컴파일 흐름과 최적화 이점

1 minute read

Published:

1. 현재 ONNX-MLIR의 컴파일 흐름의 문제

\[\text{ONNX} \xrightarrow{Lowering} \text{Krnl} \xrightarrow{Lowering} \text{Affine}\xrightarrow{Lowering} \text{LLVM IR}\]

행렬 연산에 특화된 정교한 최적화(Tiling, Fusion)를 적용하기 위해서는, Krnl 레벨에서 복잡한 수동 패스를 작성해야 합니다.


2. Linalg Dialect

Linalg Dialect는 다음과 같은 Transformations를 쉽게 적용할 수 있도록 고안되었습니다.

  • Parametric Tiling: 메모리 계층 구조(캐시)를 고려하여 대형 연산을 작은 블록(타일)으로 나누어 처리합니다.
  • Tiled Fusion: 타일 경계 내에서 생산자-소비자 연산을 융합하여 중간 데이터를 캐시에 유지함으로써 메모리 오버헤드를 줄입니다.
  • Promotion to Temporary Buffer: 데이터를 느린 메모리에서 빠른 임시 버퍼(스크래치패드 메모리)로 이동시켜 데이터 접근 속도를 최적화합니다.
  • Vectorization: Linalg 연산을 vector Dialect로 변환하여 SIMD 명령어(AVX, NEON) 활용을 용이하게 합니다.

Krnl Dialect 대신, Linalg Dialect로 대체하면 Linalg의 이점을 취할 수 있습니다.

\[\text{ONNX} \xrightarrow{Lowering} \text{Linalg} \xrightarrow{\text{Tiling/Bufferization/Vectorization}} \text{...}\]

3. Linalg Dialect 기반 컴파일 파이프라인

최종적으로 목표하고자 하는 파이프라인은 다음과 같습니다.

graph TD
    ONNX["ONNX Dialect<br/>(High-level Operations)"]
    LinalgTensor["Linalg Dialect<br/>(Tensor-level)"]
    
    subgraph "Optimization Phase"
        Tiling["Tiling Passes"]
        Fusion["Fusion Passes"]
        Vectorization["Vectorization Passes"]
    end
    
    Bufferization["Bufferization Pass<br/>(LinalgBufferize)"]
    LinalgMemRef["Linalg Dialect<br/>(MemRef-level)"]
    
    subgraph "Lowering Phase"
        Affine["Affine Dialect<br/>(Explicit Loops)"]
        Vector["Vector Dialect<br/>(SIMD Operations)"]
    end
    
    LLVM["LLVM Dialect<br/>(Target IR)"]
    LLVMIR["LLVM IR<br/>(Final Code)"]
    
    ONNX -->|"ONNXToLinalg Conversion"| LinalgTensor
    LinalgTensor --> Tiling
    LinalgTensor --> Fusion
    LinalgTensor --> Vectorization
    Tiling --> Bufferization
    Fusion --> Bufferization
    Vectorization --> Bufferization
    Bufferization -->|"Tensor → MemRef"| LinalgMemRef
    LinalgMemRef --> Affine
    LinalgMemRef --> Vector
    Affine --> LLVM
    Vector --> LLVM
    LLVM --> LLVMIR

시리즈 포스트

Language: English