ONNX 模型在 MLIR 编译器基础设施中的表示和参考下推
此项目由 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 42a8ff877d47131ecb1280a1cc7e5e3c3bca6952 && cd ..
same-as-file: <> ({“ref”: “utils/build-mlir.sh”, “skip-ref”: 2})
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="mlir;clang" \
-DLLVM_ENABLE_RUNTIMES="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
在配备 M 芯片的 MacOS 上,或者如果出现缺少 ___kmpc_atomic... 函数的链接错误,构建额外的 compiler-rt 运行时应该可以解决问题。具体来说,将上面 cmake 命令替换为下面的行。
-DLLVM_ENABLE_RUNTIMES="compiler-rt;openmp" \
在构建 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 总是安全的。
请查看此页面以获取有用的提示。