onnx-mlir 是 Onnx 团队推出的一款图编译器,定义了 onnx dialect,将一个 .onnx 模型编译转成一个对应的 IR 表示。 这里主要是介绍 Mac 如何编译 onnx-mlir。
主要步骤还是根据官网的来,但是鉴于不同的版本,环境等,在编译过程中可能会遇到这样那样的小问题。这里记录一下在 M1 Mac 上编译的过程,希望可以帮助到有需要的小伙伴。
依赖安装
前置依赖
# 安装 Ninja
brew install ninja
# 安装 cmake
brew install cmake
# 安装 ptrotobuf
brew install protobuf
LLVM-MLIR 安装
因为 onnx-mlir 是基于 MLIR 做的一款图编译器,所以首先需要安装核心的依赖 MLIR,官网有相关的教程,注意这里一定要根据自己的 onnx-mlir 的版本,选择好对应的 llvm 版本,这个官网都会有说明,以 Onnx-mlir 官方 github 的版本为主,否则可能会遇到各种编译出错。
git clone https://github.com/llvm/llvm-project.git
# Check out a specific branch that is known to work with ONNX MLIR.
cd llvm-project && git checkout 0bf230d4220660af8b2667506f8905df2f716bdf && cd ..
切换好 llvm-project 版本以后,就可以先编译 llvm 了。
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS=mlir \
-DLLVM_TARGETS_TO_BUILD="host" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_RTTI=ON
cmake --build . -- ${MAKEFLAGS}
cmake --build . --target check-mlir
设置环境变量
注意这里编译的 mlir 是没有 example 的,即没有官网的 toy 相关内容,如果需要可以在编译选项里加上: -DLLVM_BUILD_EXAMPLES=ON
。llvm 成功编译以后需要设置一个环境变量 MLIR_DIR
,等待会编译 onnx-mlir 的时候可以找到相关依赖。
export MLIR_DIR=/path/to/llvm-project/build/lib/cmake/mlir
编译 onnx-mlir
这里主要还是以官网的步骤为主:
git clone --recursive https://github.com/onnx/onnx-mlir.git
mkdir onnx-mlir/build && cd onnx-mlir/build
cmake -G Ninja .. -DCMAKE_CXX_COMPILER=/usr/bin/c++
cmake --build .
# Run lit tests:
export LIT_OPTS=-v
cmake --build . --target check-onnx-lit
如果顺利的话,上面的编译命令运行完就编译完成了。
可能遇到的问题1
我 clone onnx-mlir 项目的时候没有加 --recursive
,在编译的时候遇到了下面的问题:
CMake Error at CMakeLists.txt:92 (add_subdirectory):
The source directory
xxxxx
CMake Error at src/Runtime/CMakeLists.txt:56 (pybind11_add_module):
Unknown CMake command "pybind11_add_module".
主要就是 onnx,pybind11,rapidcheck 三个第三方依赖报错。
解决方法:
git submodule init && git submodule update
可能遇到的问题2
刚开始我是在我自己 fork 的老分支上直接 git pull,但是并没有跟 master 对齐,llvm 又是直接参考的 onnx-mlir 最新的 master 导致 onnx-mlir 与 llvm 的版本没对应上,在编译的时候也是遇到了一些头文件找不到,或者在编 ONNXOps.hpp.in 这个文件的时候一些 error,类型不认识,未定义等问题,要确保 onnx-mlir 与 llvm 的版本是根绝官方推荐来的。