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 硅芯片上安装 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 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(此项目)

构建

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

构建问题故障排除

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