ONNX 模型在 MLIR 编译器基础设施中的表示和参考下推
此项目由 onnx 维护
托管于 GitHub Pages — 主题来自 orderedlist
此处提供 ONNX-MLIR 在 Linux 和 OSX 上的安装说明。在 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 f8cb7987c64dcffb72414a40560055cb717dbf74 && 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 构建或安装目录(例如,llvm-project/build/lib/cmake/mlir)中的 mlir cmake 模块。
本项目使用 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 起,由于默认编译器发生变化,请将 -DCMAKE_CXX_COMPILER=/usr/bin/c++ 选项添加到上述 cmake .. 命令中。
环境变量 $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 行。克隆正确版本后,您应该应用从上面的链接下载的 补丁。然后,您应该按照 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 总是安全的。
请查看此 页面 以获取有用的提示。