onnx-mlir

Logo

在 MLIR 编译器基础设施中表示和参考 ONNX 模型及降低

在 GitHub 上查看项目 onnx/onnx-mlir

操作指南

使用 Python 推理
使用 C/C++ 推理
使用 Java 推理

参考资料

ONNX 方言 (Dialect)
OMTensor C99 运行时 API
OMTensorList C99 运行时 API
OMTensor Java 运行时 API
OMTensorList Java 运行时 API
生成 ONNX 方言
关于文档

开发

添加操作
测试指南
错误处理
命令行选项
插桩 (Instrumentation)
常量传播
添加加速器

工具

工具

RunONNXModel.py
DocCheck

本项目由 onnx 维护

托管于 GitHub Pages — 主题由 orderedlist 提供

在 Linux / OSX 上安装 ONNX-MLIR

我们在此提供在 Linux 和 OSX 上安装 ONNX-MLIR 的说明。在 Mac 上,有几个命令有所不同。这些差异将在下面的解释中适时列出。原生支持在 Apple silicon 上安装 ONNX-MLIR,建议使用 brew 来管理先决条件。

MLIR

首先,安装 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(本项目)

构建

在构建 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/binRelease/bin 目录中应该会出现一个名为 onnx-mlir 的可执行文件。

启用 CPU 优化

要使编译器运行更快(不影响生成的代码),您可以在上述 cmake -G Ninja .. 构建配置步骤中传递 -DCMAKE_CXX_FLAGS=-march=native,以生成利用本地 CPU 所有功能的代码,但会牺牲可移植性。或者,您可以启用特定的 CPU 功能,例如 -DCMAKE_CXX_FLAGS=-mf16c 以启用 F16C 功能,从而启用 float16 和 (32 位) float 之间的原生转换。它在 src/Support/SmallFP.hpp 中使用。

已知 MacOS 问题

jsoniter 问题

构建 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"

Protobuf 问题 (Mac M1,特定于当前必需的 protobuf 4.21.12)

在 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_partyonnx-mlir 之间的依赖关系可能会引起问题,因此始终安全的操作是删除 third_party 目录,使用 git submodule update --init --recursive 重新安装,重新安装 onnx,删除 onnx-mlir/build 并从头开始重新构建 onnx-mlir

构建问题故障排除

查看此 页面 以获取有用的提示。