ONNX-MLIR Flow


서론

이 장은 ONNX-MLIR의 소스코드를 분석하여 해당 코드의 역할을 파악한다.

목차

  1. Conversion
  2. ONNXToKrnl Pattern
  3. ONNXToMhlo Pattern
  4. ONNXToTosa Pattern
  5. Pass
  6. Transform
  7. Compiler
  8. Function Call
    1. API 등록 및 정의
    2. Match and Rewrite (API write)
    3. API CALL

Conversion

ONNX dialect가 Krnl 로 lowering되고 Krnl이 Affine과 LLVM으로 lowering된다.

Conversion에 Pattern을 정의/ 구현/ 등록하고 Pass만들어준다.

Pass를 진행하기 위해서는 Conversion Pattern을 상속해 해당 Conversions with Pattern 구현이 필요하다.

ONNXToKrnl Pattern

  • ONNXToKrnl Pattern 정의
https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToKrnl/ONNXToKrnlCommon.cpp
https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToKrnl/ONNXToKrnlCommon.cpp
  • ONNXToKrnl Pattern 구현
https://github.com/onnx/onnx-mlir/blob/main/src/Conversion/ONNXToKrnl/NN/Conv.cpp
https://github.com/onnx/onnx-mlir/blob/main/src/Conversion/ONNXToKrnl/NN/Conv.cpp
  • ONNXToKrnl Pattern 등록
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToKrnl/ConvertONNXToKrnl.cpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToKrnl/ConvertONNXToKrnl.cpp

ONNXToMhlo Pattern

  • ONNXToMhlo Pattern 정의
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToMhlo/ONNXToMhloCommon.hpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToMhlo/ONNXToMhloCommon.hpp
  • ONNXToMhlo Pattern 구현
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToMhlo/NN/Conv.cpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToMhlo/NN/Conv.cpp
  • ONNXToMhlo Pattern 등록
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToMhlo/ConvertONNXToMhlo.cpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToMhlo/ConvertONNXToMhlo.cpp

ONNXToTosa Pattern

  • ONNXToTosa Pattern 정의
  • ONNXToTosa Pattern 구현
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToTOSA/Math/Conv2D.cpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToTOSA/Math/Conv2D.cpp
  • ONNXToTosa Pattern 등록
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToTOSA/ConvertONNXToTOSA.cpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Conversion/ONNXToTOSA/ConvertONNXToTOSA.cpp

Pass

  • Pass 정의
  • Pass 등록

Transform

  • Convolution연산의 최적화 구현
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
  • 해당 최적화 Operator 대한 Conversion Pattern을 구현
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
  • Optimization Pass구현
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
  • Pass 등록
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
    https://github.com/onnx/onnx-mlir/blob/6278fd386b58b2e7046e17766a4803f28f2b7251/src/Transform/ONNX/ConvOpt.cpp
  • Pass 정의
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Pass/Passes.hpp
    https://github.com/onnx/onnx-mlir/blob/04059864ce69fac909b4e9faa401655768964712/src/Pass/Passes.hpp

Compiler

Compiler passes.cpp

ConvOp를 Nested Pass를 태움(Conv를 풀어헤침)


Function Call

API 등록 및 정의

Match and Rewrite (API write)

API CALL