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

此处提供 ONNX-MLIR 在 Linux 和 OSX 上的安装说明。在 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 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(本项目)

构建

在构建 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/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 行。克隆正确版本后,您应该应用从上面的链接下载的 补丁。然后,您应该按照 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 总是安全的。

故障排除构建问题

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