diff --git a/.circleci/config.yml b/.circleci/config.yml index d1d8dde..b161d39 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,15 +2,59 @@ version: 2 jobs: build: docker: - - image: debian:stretch + - image: circleci/python steps: - checkout - - run: - name: Greeting - command: echo Hello, world. + name: "Pull Submodules" + command: | + git submodule update --init --recursive + - run: + name: Check current directory + command: pwd + - run: + name: Check current directory content + command: ls + - run: + name: Installing GCC + command: 'sudo apt-get update && sudo apt-get install -y gcc g++' + - run: + name: Install CMAKE + command: 'sudo apt-get update && sudo apt-get install -y cmake ninja-build' + - run: + name: Install Protobuf + command: 'sudo apt-get update && sudo apt-get install -y protobuf-compiler' + - run: + name: Check gcc version + command: gcc --version + - restore_cache: + key: ONNF-MLIR-{{ arch }} + - run: + name: Install MLIR + command: | + if [ ! -f llvm-project/build/bin/mlir-opt ]; then + git clone https://github.com/llvm/llvm-project.git + cd llvm-project && git checkout 9b6ad8466bb8b97082b705270603ad7f4559e931 && cd .. + git clone https://github.com/tensorflow/mlir llvm-project/llvm/projects/mlir + cd llvm-project/llvm/projects/mlir && git checkout 0710266d0f56cf6ab0f437badbd7416b6cecdf5f && cd ../../../.. + mkdir llvm-project/build + cd llvm-project/build + cmake -G Ninja ../llvm -DLLVM_ENABLE_RTTI=ON -DLLVM_BUILD_EXAMPLES=OFF -DLLVM_TARGETS_TO_BUILD="host" -DCMAKE_BUILD_TYPE=Release + CMAKE_EXE_LINKER_FLAGS="-Wl,--reduce-memory-overheads -Wl,--hash-size=512" cmake --build . --target check-mlir -- -j 4 + fi + - save_cache: + key: ONNF-MLIR-{{ arch }} + paths: + - llvm-project + - run: + name: Install ONNF + command: | + mkdir build && cd build + LLVM_SRC=$(pwd)/../llvm-project/llvm LLVM_BUILD=$(pwd)/../llvm-project/build cmake .. + make all + LIT_OPTS=-v make check-mlir-lit - run: name: Print the Current Time command: date diff --git a/README.md b/README.md index fd5b869..89340f9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,66 @@ # ONNF -Open Neural Network Frontend +Open Neural Network Frontend : an ONNX frontend for MLIR. + +[![CircleCI](https://circleci.com/gh/clang-ykt/ONNF.svg?style=svg)](https://circleci.com/gh/clang-ykt/ONNF) + +## Installation + +We assume an existing installation of MLIR. The LLVM-Project repo commit hash we used to test against is 9b6ad8466bb8b97082b705270603ad7f4559e931 and the MLIR repo commit hash we used is 0710266d0f56cf6ab0f437badbd7416b6cecdf5f. + +Two environment variables need to be set: +- LLVM_SRC should point to the llvm src directory (e.g., llvm-project/llvm). +- LLVM_BUILD should point to the llvm build directory (e.g., llvm-project/build). + +To build ONNF, use the following command: +``` +git clone --recursive git@github.com:clang-ykt/ONNF.git +mkdir build +cd build +cmake .. +cmake --build . --target all +``` + +After the above commands succeed, an `onnf` executable should appear in the `bin` directory. + +## Using ONNF + +The usage of `onnf` is as such: +``` +OVERVIEW: ONNF MLIR modular optimizer driver + +USAGE: onnf [options] + +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 + +ONNF 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: +``` +./onnf --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> + } +} +``` + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ef21d2a..b537820 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,11 +7,9 @@ add_library(compiler dialect/onnx/onnx_ops.hpp dialect/krnl/krnl_helper.cpp dialect/krnl/krnl_helper.hpp - pass/shape_inference_pass.cpp pass/shape_inference_interface.hpp dialect/onnx/onnxop.inc pass/onnx_combine.cpp - pass/lower_frontend_to_krnl.cpp pass/passes.hpp) # Include root src directory. @@ -70,7 +68,7 @@ add_subdirectory(runtime) add_executable(onnf main.cpp) -target_link_libraries(onnf builder ${MLIRLibs} onnf_transform) +target_link_libraries(onnf builder ${MLIRLibs} onnf_transform onnf_shape_inference onnf_lower_frontend) set_target_properties(onnf PROPERTIES LINK_FLAGS "-lz") whole_archive_link_mlir(onnf ${MLIRWholeArchiveLibs}) diff --git a/src/pass/lower_frontend_to_krnl.cpp b/src/pass/lower_frontend_to_krnl.cpp index 90954c7..1a88b01 100644 --- a/src/pass/lower_frontend_to_krnl.cpp +++ b/src/pass/lower_frontend_to_krnl.cpp @@ -331,9 +331,9 @@ Value *mapToLowerScalarOp(Operation *op, auto neg = rewriter.create(loc, zero, operand); auto exp = rewriter.create(loc, operand); auto negExp = rewriter.create(loc, neg); - auto result = - rewriter.create(loc, rewriter.create(loc, exp, negExp), - rewriter.create(loc, exp, negExp)); + auto diff = rewriter.create(loc, exp, negExp); + auto sum = rewriter.create(loc, exp, negExp); + auto result = rewriter.create(loc, diff, sum); return result; } diff --git a/src/tool/onnf_opt/CMakeLists.txt b/src/tool/onnf_opt/CMakeLists.txt index 7cde1f2..0d0b302 100644 --- a/src/tool/onnf_opt/CMakeLists.txt +++ b/src/tool/onnf_opt/CMakeLists.txt @@ -4,9 +4,6 @@ add_dependencies(onnf-opt gen_krnl_ops) target_include_directories(onnf-opt PRIVATE ${ONNF_SRC_ROOT}) target_include_directories(onnf-opt PRIVATE ${ONNF_BIN_ROOT}) -target_link_libraries(onnf-opt compiler ${MLIRLibs}) +target_link_libraries(onnf-opt ${MLIRLibs} curses) whole_archive_link_mlir(onnf-opt ${MLIRWholeArchiveLibs}) -whole_archive_link_onnf(onnf-opt onnf_transform onnf_lower_frontend onnf_shape_inference) - -# TODO: need to investigate how to whole-archive link compiler pass to onnf-opt. -target_link_libraries(onnf-opt compiler) +whole_archive_link_onnf(onnf-opt compiler onnf_transform onnf_lower_frontend onnf_shape_inference) \ No newline at end of file