107 lines
3.2 KiB
Markdown
107 lines
3.2 KiB
Markdown
# ONNX MLIR
|
|
The Open Neural Network Exchange implementation in MLIR.
|
|
|
|
[![CircleCI](https://circleci.com/gh/onnx/onnx-mlir/tree/master.svg?style=svg)](https://circleci.com/gh/onnx/onnx-mlir/tree/master)
|
|
|
|
## Prerequisites
|
|
|
|
```
|
|
gcc >= 6.4
|
|
libprotoc >= 3.11.0
|
|
cmake >= 3.15.4
|
|
```
|
|
|
|
## Installation
|
|
|
|
Firstly, install MLIR (as a part of LLVM-Project):
|
|
|
|
[same-as-file]: <> (utils/install-mlir.sh)
|
|
``` bash
|
|
git clone 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 07e462526d0cbae40b320e1a4307ce11e197fb0a && cd ..
|
|
mkdir llvm-project/build
|
|
cd llvm-project/build
|
|
cmake -G Ninja ../llvm \
|
|
-DLLVM_ENABLE_PROJECTS=mlir \
|
|
-DLLVM_BUILD_EXAMPLES=ON \
|
|
-DLLVM_TARGETS_TO_BUILD="host" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DLLVM_ENABLE_ASSERTIONS=ON \
|
|
-DLLVM_ENABLE_RTTI=ON
|
|
|
|
cmake --build . --target -- ${MAKEFLAGS}
|
|
cmake --build . --target check-mlir
|
|
```
|
|
|
|
Two environment variables need to be set:
|
|
- LLVM_PROJ_SRC should point to the llvm-project src directory (e.g., llvm-project/).
|
|
- LLVM_PROJ_BUILD should point to the llvm-project build directory (e.g., llvm-project/build).
|
|
|
|
To build ONNX-MLIR, use the following command:
|
|
|
|
[same-as-file]: <> ({"ref": "utils/install-onnx-mlir.sh", "skip-doc": 2})
|
|
```
|
|
git clone --recursive https://github.com/onnx/onnx-mlir.git
|
|
|
|
# Export environment variables pointing to LLVM-Projects.
|
|
export LLVM_PROJ_SRC=$(pwd)/llvm-project/
|
|
export LLVM_PROJ_BUILD=$(pwd)/llvm-project/build
|
|
|
|
mkdir onnx-mlir/build && cd onnx-mlir/build
|
|
cmake ..
|
|
cmake --build . --target onnx-mlir
|
|
|
|
# Run FileCheck tests:
|
|
export LIT_OPTS=-v
|
|
cmake --build . --target check-onnx-lit
|
|
```
|
|
|
|
After the above commands succeed, an `onnx-mlir` executable should appear in the `bin` directory.
|
|
|
|
## Using ONNX MLIR
|
|
|
|
The usage of `onnx-mlir` is as such:
|
|
```
|
|
OVERVIEW: ONNX MLIR modular optimizer driver
|
|
|
|
USAGE: onnx-mlir [options] <input file>
|
|
|
|
OPTIONS:
|
|
|
|
Generic Options:
|
|
|
|
--help - Display available options (--help-hidden for more)
|
|
--help-list - Display list of available options (--help-list-hidden for more)
|
|
--version - Display the version of this program
|
|
|
|
ONNX MLIR Options:
|
|
These are frontend options.
|
|
|
|
Choose target to emit:
|
|
--EmitONNXIR - Ingest ONNX and emit corresponding ONNX dialect.
|
|
--EmitMLIR - Lower model to MLIR built-in transformation dialect.
|
|
--EmitLLVMIR - Lower model to LLVM IR (LLVM dialect).
|
|
--EmitLLVMBC - Lower model to LLVM IR and emit (to file) LLVM bitcode for model.
|
|
```
|
|
|
|
## Example
|
|
|
|
For example, to lower an ONNX model (e.g., add.onnx) to ONNX dialect, use the following command:
|
|
```
|
|
./onnx-mlir --EmitONNXIR add.onnx
|
|
```
|
|
The output should look like:
|
|
```
|
|
module {
|
|
func @main_graph(%arg0: tensor<10x10x10xf32>, %arg1: tensor<10x10x10xf32>) -> tensor<10x10x10xf32> {
|
|
%0 = "onnx.Add"(%arg0, %arg1) : (tensor<10x10x10xf32>, tensor<10x10x10xf32>) -> tensor<10x10x10xf32>
|
|
return %0 : tensor<10x10x10xf32>
|
|
}
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
If the latest LLVM project fails to work due to the latest changes to the MLIR subproject please consider using a slightly older version of LLVM. One such version, which we use, can be found [here](https://github.com/clang-ykt/llvm-project).
|