From 09490130fa92d0df01856e7fdfbe1b8d991bdaa3 Mon Sep 17 00:00:00 2001 From: SaeHie Park Date: Wed, 16 Apr 2025 10:28:28 +0900 Subject: [PATCH] [circle-mlir] Apply ONNX-MLIR upgrade This will add changes for ONNX-MLIR and llvm-project upgrade. Most of the changes are from llvm-project changes. ONE-DCO-1.0-Signed-off-by: SaeHie Park --- .../circle-mlir/dialect/CircleDialect.h | 2 + .../circle-mlir/lib/dialect/mlir/CircleOps.td | 1 - .../circle-mlir/lib/dialect/src/NameUtils.cpp | 2 +- .../lib/import/src/CircleImport.cpp | 12 +++--- .../lib/pass/src/RewriteCirclePass.cpp | 2 +- .../lib/pass/src/opt/ConvertMirrorPadPad32.h | 2 +- .../lib/pass/src/opt/ConvertReshapeShape32.h | 2 +- .../pass/src/opt/ConvertResizeNearestSize32.h | 2 +- .../lib/tools/converter-gen/converter_gen.cc | 39 ++++++++++--------- .../tools/onnx2circle/src/onnx2circle.cpp | 4 +- circle-mlir/externals/CMakeLists.txt | 18 +++++---- circle-mlir/infra/overlay/prepare-venv | 10 ++--- 12 files changed, 49 insertions(+), 47 deletions(-) diff --git a/circle-mlir/circle-mlir/lib/dialect/include/circle-mlir/dialect/CircleDialect.h b/circle-mlir/circle-mlir/lib/dialect/include/circle-mlir/dialect/CircleDialect.h index 42db1b10653..1319d313110 100644 --- a/circle-mlir/circle-mlir/lib/dialect/include/circle-mlir/dialect/CircleDialect.h +++ b/circle-mlir/circle-mlir/lib/dialect/include/circle-mlir/dialect/CircleDialect.h @@ -20,6 +20,7 @@ #ifndef __CIRCLE_MLIR_DIALECT_CIRCLE_DIALECT_H__ #define __CIRCLE_MLIR_DIALECT_CIRCLE_DIALECT_H__ +#include // from @llvm-project #include // from @llvm-project #include // from @llvm-project #include // from @llvm-project @@ -46,6 +47,7 @@ class ControlType : public Type::TypeBase { public: using Base::Base; + static constexpr StringLiteral name = "cir.control"; }; #include "mlir/CircleOpInterface.h.inc" diff --git a/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td b/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td index 2c5cd4e3392..aee865529aa 100644 --- a/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td +++ b/circle-mlir/circle-mlir/lib/dialect/mlir/CircleOps.td @@ -20,7 +20,6 @@ #ifndef CIRCLE_OPS #define CIRCLE_OPS -include "mlir/IR/FunctionInterfaces.td" include "mlir/IR/OpBase.td" include "mlir/Interfaces/InferTypeOpInterface.td" include "mlir/Interfaces/SideEffectInterfaces.td" diff --git a/circle-mlir/circle-mlir/lib/dialect/src/NameUtils.cpp b/circle-mlir/circle-mlir/lib/dialect/src/NameUtils.cpp index f6150ae1b06..f4071e8c095 100644 --- a/circle-mlir/circle-mlir/lib/dialect/src/NameUtils.cpp +++ b/circle-mlir/circle-mlir/lib/dialect/src/NameUtils.cpp @@ -46,7 +46,7 @@ std::string GetNameFromLoc(Location loc) // in functions where the op's name is first. auto name = name_loc.getName().strref().split('@').first; // Skip if the name is for op type. - if (!name.endswith(":")) + if (!name.ends_with(":")) { loc_names.push_back(name); if (!name.empty()) diff --git a/circle-mlir/circle-mlir/lib/import/src/CircleImport.cpp b/circle-mlir/circle-mlir/lib/import/src/CircleImport.cpp index 9e6de149733..97df0e06cb3 100644 --- a/circle-mlir/circle-mlir/lib/import/src/CircleImport.cpp +++ b/circle-mlir/circle-mlir/lib/import/src/CircleImport.cpp @@ -39,8 +39,7 @@ inline constexpr unsigned int flatbuffer_size_max = 2147483648; #include #include // m_Constant #include -#include -#include +#include #include @@ -226,8 +225,8 @@ template llvm::SmallVector ReadAsHostEndian(llvm::Arra const char *data_ptr = reinterpret_cast(bytes.data()); for (size_t i = 0; i < elem_count; i++) { - T val = llvm::support::endian::readNext(data_ptr); + T val = llvm::support::endian::readNext( + data_ptr); ret.push_back(mlir::APInt(sizeof(T) * 8, val)); } return ret; @@ -254,9 +253,8 @@ std::optional ConvertFloatBuffer(mlir::RankedTensorType shap for (int i = 0; i < elem_count; i++) { - uint32_t bit_repr = - llvm::support::endian::readNext(data); + uint32_t bit_repr = llvm::support::endian::readNext(data); values.push_back(absl::bit_cast(bit_repr)); } auto num = shaped_type.getNumElements(); diff --git a/circle-mlir/circle-mlir/lib/pass/src/RewriteCirclePass.cpp b/circle-mlir/circle-mlir/lib/pass/src/RewriteCirclePass.cpp index e094215661d..02e20384e7f 100644 --- a/circle-mlir/circle-mlir/lib/pass/src/RewriteCirclePass.cpp +++ b/circle-mlir/circle-mlir/lib/pass/src/RewriteCirclePass.cpp @@ -112,7 +112,7 @@ void RewriteCirclePass::applyActivationFusion() // TODO add more patterns - (void)applyPatternsAndFoldGreedily(func, std::move(patterns)); + (void)applyPatternsGreedily(func, std::move(patterns)); } std::unique_ptr createRewriteCirclePass(void) diff --git a/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertMirrorPadPad32.h b/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertMirrorPadPad32.h index d91727c8580..c5ad4e530e2 100644 --- a/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertMirrorPadPad32.h +++ b/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertMirrorPadPad32.h @@ -57,7 +57,7 @@ struct ConvertMirrorPadPad32 : public OpRewritePattern auto intattr = DenseIntElementsAttr::get(si32stype, values); mlir::Value shape32 = rewriter.create(opLoc, intattr); - auto pad_mutable = mirrorpad_op.getPadMutable(); + auto &pad_mutable = mirrorpad_op.getPadMutable(); pad_mutable.assign(shape32); return mlir::success(); diff --git a/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertReshapeShape32.h b/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertReshapeShape32.h index 52fd5165443..225e999e87c 100644 --- a/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertReshapeShape32.h +++ b/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertReshapeShape32.h @@ -59,7 +59,7 @@ struct ConvertReshapeShape32 : public OpRewritePattern mlir::Value shape32 = rewriter.create(opLoc, DenseIntElementsAttr::get(si32stype, values)); - auto shape_mutable = reshape_op.getShapeMutable(); + auto &shape_mutable = reshape_op.getShapeMutable(); shape_mutable.assign(shape32); return mlir::success(); diff --git a/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertResizeNearestSize32.h b/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertResizeNearestSize32.h index 1ee40cff644..b909c118f56 100644 --- a/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertResizeNearestSize32.h +++ b/circle-mlir/circle-mlir/lib/pass/src/opt/ConvertResizeNearestSize32.h @@ -74,7 +74,7 @@ struct ConvertResizeNearestSize32 : public OpRewritePattern(opLoc, DenseIntElementsAttr::get(si32stype, values)); - auto resize_mutable = resize_op.getSizeMutable(); + auto &resize_mutable = resize_op.getSizeMutable(); resize_mutable.assign(size32); return mlir::success(); diff --git a/circle-mlir/circle-mlir/lib/tools/converter-gen/converter_gen.cc b/circle-mlir/circle-mlir/lib/tools/converter-gen/converter_gen.cc index 173aca94636..3bcc0b66f64 100644 --- a/circle-mlir/circle-mlir/lib/tools/converter-gen/converter_gen.cc +++ b/circle-mlir/circle-mlir/lib/tools/converter-gen/converter_gen.cc @@ -64,8 +64,8 @@ llvm::cl::opt action( // Returns the associated option name for the given op definition. static inline std::string GetOperatorOptionName(const Record &def) { - assert(def.getName().startswith("CIR_") && "unexpected op prefix"); - assert(def.getName().endswith("Op") && "unexpected op suffix"); + assert(def.getName().starts_with("CIR_") && "unexpected op prefix"); + assert(def.getName().ends_with("Op") && "unexpected op suffix"); auto *custom_option = dyn_cast(def.getValueInit("customOption")); std::ostringstream oss; @@ -78,8 +78,8 @@ static inline std::string GetOperatorOptionName(const Record &def) { // Returns the builder function name for the given op definition. static inline std::string GetOperatorBuilderName(StringRef op_name) { - assert(op_name.startswith("CIR_") && "unexpected op prefix"); - assert(op_name.endswith("Op") && "unexpected op suffix"); + assert(op_name.starts_with("CIR_") && "unexpected op prefix"); + assert(op_name.ends_with("Op") && "unexpected op suffix"); // E.g., AddOp -> CreateAddOperator std::ostringstream oss; @@ -92,7 +92,7 @@ static inline bool IsLstmOp(const StringRef op_name) { } static void EmitOptionBuilders(const RecordKeeper &record_keeper, - const std::vector &defs, + const std::vector &defs, raw_ostream *ostream) { raw_ostream &os = *ostream; @@ -117,7 +117,7 @@ static void EmitOptionBuilders(const RecordKeeper &record_keeper, mlir::tblgen::Operator op(*def); for (unsigned i = 0, e = arg_values->getNumArgs(); i != e; ++i) { auto arg = arg_values->getArg(i); - DefInit *arg_def = dyn_cast(arg); + const auto *arg_def = dyn_cast(arg); if (!arg_def) continue; if (arg_def->getDef()->isSubClassOf(attr_type)) { // This binds the name of the attribute in the TD file with the name @@ -175,7 +175,7 @@ static void EmitOptionBuilders(const RecordKeeper &record_keeper, // arguments that depend on op definitions should be auto-generated and then // operator should be built by the caller because it does not require // auto-generation. -static void EmitOperatorBuilders(const std::vector &defs, +static void EmitOperatorBuilders(const std::vector &defs, raw_ostream *ostream) { raw_ostream &os = *ostream; @@ -240,7 +240,7 @@ static inline std::string GetOperatorName(const Record &def) { // // TODO(hinsu): Consider converting this to a static constant associative // container instead of a series of if conditions, if required. -static void EmitGetBuiltinOpCode(const std::vector &defs, +static void EmitGetBuiltinOpCode(const std::vector &defs, raw_ostream *ostream) { raw_ostream &os = *ostream; @@ -279,7 +279,7 @@ static void EmitGetBuiltinOpCode(const std::vector &defs, // return {0, 0}; // } static void EmitOperandNumbers(const RecordKeeper &record_keeper, - const std::vector &defs, + const std::vector &defs, raw_ostream *ostream) { raw_ostream &os = *ostream; const auto attr_type = record_keeper.getClass("Attr"); @@ -324,7 +324,7 @@ static void EmitOperandNumbers(const RecordKeeper &record_keeper, // const std::vector& results, // const std::vector& intermediates, // flatbuffers::FlatBufferBuilder *fbb); -static void EmitBuildOperator(const std::vector &defs, +static void EmitBuildOperator(const std::vector &defs, raw_ostream *ostream) { raw_ostream &os = *ostream; @@ -360,7 +360,7 @@ static void EmitBuildOperator(const std::vector &defs, // mlir::Builder builder, // llvm::SmallVectorImpl &attributes); static void EmitBuiltinOptionsToAttributes(const RecordKeeper &record_keeper, - const std::vector &defs, + const std::vector &defs, raw_ostream *ostream) { raw_ostream &os = *ostream; @@ -385,7 +385,7 @@ static void EmitBuiltinOptionsToAttributes(const RecordKeeper &record_keeper, auto *arg_values = def->getValueAsDag("arguments"); for (unsigned i = 0, e = arg_values->getNumArgs(); i != e; ++i) { auto arg = arg_values->getArg(i); - DefInit *arg_def = dyn_cast(arg); + const auto *arg_def = dyn_cast(arg); if (!arg_def) continue; if (arg_def->getDef()->isSubClassOf(attr_type)) { StringRef arg_name = arg_values->getArgNameStr(i); @@ -411,11 +411,11 @@ static void EmitBuiltinOptionsToAttributes(const RecordKeeper &record_keeper, // The function below has a non-constant reference as that is required by LLVM's // TableGenMain. // NOLINTNEXTLINE -static bool OperatorWritersMain(raw_ostream &os, RecordKeeper &records) { +static bool OperatorWritersMain(raw_ostream &os, const RecordKeeper &records) { emitSourceFileHeader("MLIR Circle FlatBuffer Builders", os); // Retrieve all the definitions derived from CIR_Op and sort by record name. - std::vector defs = records.getAllDerivedDefinitions("CIR_Op"); + std::vector defs = records.getAllDerivedDefinitions("CIR_Op"); llvm::sort(defs, LessRecord()); for (const auto *def : defs) { @@ -424,10 +424,10 @@ static bool OperatorWritersMain(raw_ostream &os, RecordKeeper &records) { // The generated Circle op C++ class should be circle::Op. // The generated operator's options should be circle::Options. // The option builder should be CreateOptions. - if (!def->getName().startswith("CIR_")) + if (!def->getName().starts_with("CIR_")) PrintFatalError(def->getLoc(), "unexpected op name format: 'CIR_' prefix missing"); - if (!def->getName().endswith("Op")) + if (!def->getName().ends_with("Op")) PrintFatalError(def->getLoc(), "unexpected op name format: 'Op' suffix missing"); } @@ -448,7 +448,7 @@ static bool OperatorWritersMain(raw_ostream &os, RecordKeeper &records) { } static void GenOperandResultVerifier(raw_ostream &os, - llvm::ArrayRef values, + llvm::ArrayRef values, StringRef valueKind) { mlir::tblgen::FmtContext fctx; @@ -496,11 +496,12 @@ static void GenOperandResultVerifier(raw_ostream &os, } // NOLINTNEXTLINE -static bool RuntimeVerifierWriterMain(raw_ostream &os, RecordKeeper &records) { +static bool RuntimeVerifierWriterMain(raw_ostream &os, + const RecordKeeper &records) { emitSourceFileHeader("MLIR Circle Runtime Verifiers", os); // Retrieve all the definitions derived from CIR_Op and sort by record name. - std::vector defs = records.getAllDerivedDefinitions("Op"); + std::vector defs = records.getAllDerivedDefinitions("Op"); llvm::sort(defs, LessRecord()); // Iterate through all the ops defined. diff --git a/circle-mlir/circle-mlir/tools/onnx2circle/src/onnx2circle.cpp b/circle-mlir/circle-mlir/tools/onnx2circle/src/onnx2circle.cpp index a2cb0ee8382..73e5597aef3 100644 --- a/circle-mlir/circle-mlir/tools/onnx2circle/src/onnx2circle.cpp +++ b/circle-mlir/circle-mlir/tools/onnx2circle/src/onnx2circle.cpp @@ -73,7 +73,7 @@ int loadONNX(const std::string &onnx_path, mlir::MLIRContext &context, { llvm::StringRef inputFilename(onnx_path); std::string errorMessage; - if (inputFilename.endswith(".mlir")) + if (inputFilename.ends_with(".mlir")) { auto input = mlir::openInputFile(inputFilename, &errorMessage); if (!input) @@ -95,7 +95,7 @@ int loadONNX(const std::string &onnx_path, mlir::MLIRContext &context, return -1; } } - else if (inputFilename.endswith(".onnx")) + else if (inputFilename.ends_with(".onnx")) { onnx_mlir::ImportOptions options; options.useOnnxModelTypes = onnx_mlir::useOnnxModelTypes; diff --git a/circle-mlir/externals/CMakeLists.txt b/circle-mlir/externals/CMakeLists.txt index 604d1ccff71..0365f2f05d6 100644 --- a/circle-mlir/externals/CMakeLists.txt +++ b/circle-mlir/externals/CMakeLists.txt @@ -1,5 +1,5 @@ # Match the minimum required version of LLVM and MLIR -cmake_minimum_required(VERSION 3.13.4) +cmake_minimum_required(VERSION 3.20.0) project(circle-mlir-externals) @@ -105,7 +105,7 @@ ExternalProject_Add(externals-abseil-cpp # from https://github.com/onnx/onnx-mlir/blob/main/docs/BuildOnLinuxOSX.md ExternalProject_Add(externals-llvm-project GIT_REPOSITORY "https://github.com/llvm/llvm-project.git" - GIT_TAG "91088978d712cd7b33610c59f69d87d5a39e3113" + GIT_TAG "b270525f730be6e7196667925f5a9bfa153262e9" SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/llvm-project" SOURCE_SUBDIR "llvm" BINARY_DIR "${LP_BUILD_DIR}" @@ -145,11 +145,12 @@ list(APPEND CMAKE_PREFIX_PATH ${PB_INSTALL_DIR}) # build ONNX-MLIR ExternalProject_Add(externals-onnx-mlir GIT_REPOSITORY "https://github.com/onnx/onnx-mlir.git" - GIT_TAG "40615b362fe474d6cce4fd9c31a7ec51acd8f88a" # v0.4.1.2 + GIT_TAG "660bd8efa664bd2d05801a7a793fe29925313b4b" # v0.5.0.0 + GIT_SUBMODULES_RECURSE True SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/onnx-mlir" BINARY_DIR "${OM_BUILD_DIR}" INSTALL_DIR "${OM_INSTALL_DIR}" - PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/onnx_quantdequant_i16.diff -N || true + PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/onnx_mlir_0_5_0_0.diff -N || true CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH='${CMAKE_PREFIX_PATH}' -DCMAKE_INSTALL_PREFIX='${OM_INSTALL_DIR}' @@ -157,10 +158,11 @@ ExternalProject_Add(externals-onnx-mlir -DMLIR_DIR='${LP_BUILD_DIR}/lib/cmake/mlir' -DPython3_ROOT_DIR='$ENV{Python3_ROOT_DIR}' -DONNX_MLIR_BUILD_TESTS=OFF - -DONNX_MLIR_ENABLE_MHLO=OFF - -DONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE=OFF + -DONNX_MLIR_ENABLE_STABLEHLO=OFF + -DONNX_MLIR_ENABLE_JAVA=OFF -DLLVM_ENABLE_ASSERTIONS=ON DEPENDS externals-llvm-project externals-protobuf ) -# NOTE onnx_quantdequant_i16.diff is to provide I16 type in -# DequantizeLinear/QuantizeLinear Ops +# NOTE onnx_mlir_0_5_0_0.diff is to provide I16 type in DequantizeLinear/QuantizeLinear Ops +# and disable decompose for InstanceNormalization and ConvTranspose +# and not necessary test build. diff --git a/circle-mlir/infra/overlay/prepare-venv b/circle-mlir/infra/overlay/prepare-venv index d620192292c..a6e79472e17 100644 --- a/circle-mlir/infra/overlay/prepare-venv +++ b/circle-mlir/infra/overlay/prepare-venv @@ -35,9 +35,9 @@ fi # NOTE version # - https://github.com/onnx/onnx/blob/master/docs/Versioning.md -VER_TORCH=2.1.0 -VER_ONNX=1.16.0 -VER_ONNXRUNTIME=1.18.0 +VER_TORCH=2.6.0 +VER_ONNX=1.17.0 +VER_ONNXRUNTIME=1.21.0 PIP_TRUSTED_HOST="--trusted-host pypi.org " PIP_TRUSTED_HOST+="--trusted-host pypi.python.org " @@ -61,5 +61,5 @@ ${VENV_PYTHON} -m pip ${PIP_OPTIONS} install torch==${VER_TORCH} ${VENV_PYTHON} -m pip ${PIP_OPTIONS} install onnx==${VER_ONNX} ${VENV_PYTHON} -m pip ${PIP_OPTIONS} install onnxruntime==${VER_ONNXRUNTIME} -${VENV_PYTHON} -m pip ${PIP_OPTIONS} install h5py einops -${VENV_PYTHON} -m pip ${PIP_OPTIONS} install numpy==1.24.4 +${VENV_PYTHON} -m pip ${PIP_OPTIONS} install h5py==3.8.0 einops +${VENV_PYTHON} -m pip ${PIP_OPTIONS} install numpy==1.24.3