onnx-mlir

Logo

ONNX 模型在 MLIR 编译器基础设施中的表示和参考下推

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

操作指南

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

参考资料

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

开发

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

工具

工具

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 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(本项目)

构建

在构建 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/binRelease/bin 目录中。

启用 CPU 优化

为了让编译器运行更快(对生成的代码没有任何影响),您可以将 -DCMAKE_CXX_FLAGS=-march=native 传递给上述 cmake -G Ninja .. 构建配置步骤,以生成利用本地 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-mlirInternalMetadata::~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_partyonnx-mlir 之间的依赖关系可能会导致问题,因此删除 third_party 目录,使用 git submodule update --init --recursive 重新安装,重新安装 onnx,删除 onnx-mlir/build 并从头开始重新构建 onnx-mlir 总是安全的。

疑难解答构建问题

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