ONNX 模型在 MLIR 编译器基础设施中的表示和参考降低
此项目由 onnx 维护
托管在 GitHub Pages 上 — 主题由 orderedlist 提供
我们在这里提供在 Linux 和 OSX 上安装 ONNX-MLIR 的说明。在 Mac 上,有几个命令有所不同。这些差异将在下面的解释中列出,在相关时。在 Apple 硅芯片上安装 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 00128a20eec27246719d73ba427bf821883b00b4 && 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
参数,如下文所述)
same-as-file: <> ({“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 编译器的基目录。
上述命令成功后,onnx-mlir
可执行文件应出现在 Debug/bin
或 Release/bin
目录中。
为了使编译器运行得更快(不会影响生成的代码),您可以将 -DCMAKE_CXX_FLAGS=-march=native
传递给上述 cmake -G Ninja ..
构建配置步骤,以生成利用您本地 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 行。克隆正确的版本后,您应该应用补丁 patch(从上面的链接下载并应用)。然后,您应该按照 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
。
请查看此 页面 以获取有用的提示。