在 MLIR 编译器基础设施中表示和参考 ONNX 模型及降低
本项目由 onnx 维护
托管于 GitHub Pages — 主题由 orderedlist 提供
我们在此提供在 Linux 和 OSX 上安装 ONNX-MLIR 的说明。在 Mac 上,有几个命令有所不同。这些差异将在下面的解释中适时列出。原生支持在 Apple silicon 上安装 ONNX-MLIR,建议使用 brew 来管理先决条件。
首先,安装 MLIR(作为 LLVM-Project 的一部分)
git clone -n 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 b270525f730be6e7196667925f5a9bfa153262e9 && cd ..
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="mlir;clang;openmp" \
-DLLVM_TARGETS_TO_BUILD="host" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_RTTI=ON \
-DENABLE_LIBOMPTARGET=OFF \
-DLLVM_ENABLE_LIBEDIT=OFF
cmake --build . -- ${MAKEFLAGS}
cmake --build . --target check-mlir
要启用 onnx-mlir 的并行化,llvm-project 应配置为
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 \
-DLLVM_ENABLE_LIBEDIT=OFF
在构建 onnx-mlir 之前,必须设置 MLIR_DIR
cmake 变量。它应该指向 llvm-project 构建目录或安装目录中的 mlir cmake 模块(例如,llvm-project/build/lib/cmake/mlir)。
本项目使用 lit (LLVM 集成测试器) 进行单元测试。运行 cmake 时,我们还可以使用 LLVM_EXTERNAL_LIT
变量指定来自 LLVM 的 lit 工具的路径,但只要 MLIR_DIR 指向 llvm-project 的构建目录,则不是必需的。如果 MLIR_DIR
指向 llvm-project 的安装目录,则需要 LLVM_EXTERNAL_LIT
。
要构建 ONNX-MLIR,使用以下命令(可能带有下方描述的附加 -DCMAKE_CXX_FLAGS
参数)
与文件相同: <> ({“ref”: “utils/install-onnx-mlir.sh”, “skip-doc”: 2})
git clone --recursive https://github.com/onnx/onnx-mlir.git
# MLIR_DIR must be set with cmake option now
MLIR_DIR=$(pwd)/llvm-project/build/lib/cmake/mlir
mkdir onnx-mlir/build && cd onnx-mlir/build
if [[ -z "$pythonLocation" ]]; then
cmake -G Ninja \
-DCMAKE_CXX_COMPILER=/usr/bin/c++ \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DMLIR_DIR=${MLIR_DIR} \
..
else
cmake -G Ninja \
-DCMAKE_CXX_COMPILER=/usr/bin/c++ \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DPython3_ROOT_DIR=$pythonLocation \
-DMLIR_DIR=${MLIR_DIR} \
..
fi
cmake --build .
# Run lit tests:
export LIT_OPTS=-v
cmake --build . --target check-onnx-lit
自 OSX Big Sur 起,由于默认编译器的更改,请在上述 cmake ..
命令中添加 -DCMAKE_CXX_COMPILER=/usr/bin/c++
选项。
环境变量 $pythonLocation
可用于指定 Python 编译器的基本目录。
上述命令成功后,在 Debug/bin
或 Release/bin
目录中应该会出现一个名为 onnx-mlir
的可执行文件。
要使编译器运行更快(不影响生成的代码),您可以在上述 cmake -G Ninja ..
构建配置步骤中传递 -DCMAKE_CXX_FLAGS=-march=native
,以生成利用本地 CPU 所有功能的代码,但会牺牲可移植性。或者,您可以启用特定的 CPU 功能,例如 -DCMAKE_CXX_FLAGS=-mf16c
以启用 F16C 功能,从而启用 float16 和 (32 位) float 之间的原生转换。它在 src/Support/SmallFP.hpp
中使用。
构建 onnx-mlir 时存在一个已知问题。如果您看到如下错误
Cloning into '/home/user/onnx-mlir/build/src/Runtime/jni/jsoniter'...
[...]
make[2]: *** [src/Runtime/jni/CMakeFiles/jsoniter.dir/build.make:74: src/Runtime/jni/jsoniter/target/jsoniter-0.9.23.jar] Error 127
make[1]: *** [CMakeFiles/Makefile2:3349: src/Runtime/jni/CMakeFiles/jsoniter.dir/all] Error 2
make: *** [Makefile:146: all] Error 2.
在 jsoniter 修复之前,建议的解决方法如下:安装 maven(例如 brew install maven
)并在您的 shell 中运行 alias nproc="sysctl -n hw.logicalcpu"
。
在 Mac M1 上,构建 protobuf 时可能会遇到一些问题。特别是,您可能无法安装 onnx(通过 pip install -e third_party/onnx
)或无法编译 onnx-mlir
(缺少 InternalMetadata::~InternalMetadata
的 arm64 符号)。
第一个失败很可能是由于安装了多个版本的 protobuf。通过 brew
安装一个版本没有帮助(版本 4.21.12,因为一个已知错误,可以通过下面的补丁纠正)。卸载 brew 版本,并确保使用 pip 安装正确的版本:pip install protobuf==4.21.12
。
第二个失败可以通过下载 protobuf 源代码、应用补丁并在本地机器上安装来解决。请参阅 Dockerfile.llvm-project 的第 66 行获取克隆说明。克隆正确版本后,您应该应用一个补丁,从上面的链接下载并应用。然后,您应该遵循 Dockerfile.llvm-project 文件中的步骤(跳过 ldconfig
步骤,没有影响)。您可能需要 brew 安装一些工具,请参阅上述 Dockerfile.llvm-project
文件中的 yum install
。之后您应该能够成功安装 protobuf 并编译 onnx-mlir
。由于 third_party
和 onnx-mlir
之间的依赖关系可能会引起问题,因此始终安全的操作是删除 third_party
目录,使用 git submodule update --init --recursive
重新安装,重新安装 onnx
,删除 onnx-mlir/build
并从头开始重新构建 onnx-mlir
。
查看此 页面 以获取有用的提示。