From b5ca64637aaf88d87f53062f073e88a92abca07e Mon Sep 17 00:00:00 2001 From: chaitany Date: Fri, 31 Jan 2025 04:18:34 -0700 Subject: [PATCH 1/5] Adding disable-convtranspose-decompose option --- CMakeLists.txt | 7 ------- src/Compiler/CompilerOptions.cpp | 7 +++++++ src/Compiler/CompilerOptions.hpp | 1 + src/Dialect/ONNX/Transforms/Decompose.cpp | 11 ++++++----- test/mlir/lit.site.cfg.py.in | 1 - 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8ec85d868..cbeac44cfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,6 @@ project(onnx-mlir) option(ONNX_MLIR_BUILD_TESTS "Build ONNX-MLIR test executables. If OFF, just generate build targets." ON) option(ONNX_MLIR_CCACHE_BUILD "Set to ON for a ccache enabled build." OFF) option(ONNX_MLIR_ENABLE_STABLEHLO "Enable StableHLO support." ON) -option(ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE "Enable ONNXConvTransposeOp decomposition." ON) option(ONNX_MLIR_ENABLE_WERROR "Enable warnings as errors." OFF) option(ONNX_MLIR_SUPPRESS_THIRD_PARTY_WARNINGS "Suppress warning in third_party code." ON) option(ONNX_MLIR_ENABLE_JAVA "Set to ON for building the Java runtime, tools, and tests" ON) @@ -223,12 +222,6 @@ if (ONNX_MLIR_ENABLE_STABLEHLO) add_compile_definitions(ONNX_MLIR_ENABLE_STABLEHLO) endif() -if (ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE) - add_compile_definitions(ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE) - set(ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE_ENABLED 1) -else() - set(ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE_ENABLED 0) -endif() add_subdirectory(utils) add_subdirectory(include) diff --git a/src/Compiler/CompilerOptions.cpp b/src/Compiler/CompilerOptions.cpp index 9628a59598..2c9ffdfb53 100644 --- a/src/Compiler/CompilerOptions.cpp +++ b/src/Compiler/CompilerOptions.cpp @@ -77,6 +77,7 @@ bool enableParallel; // onnx-mlir only bool disableSimdOption; // onnx-mlir only bool enableFastMathOption; // onnx-mlir only bool disableRecomposeOption; // onnx-mlir only +bool disableConvTransposeDecomposeOption; // onnx-mlir only bool enableSimdDataLayout; // onnx-mlir only bool verifyInputTensors; // onnx-mlir only bool allowSorting; // onnx-mlir only @@ -247,6 +248,12 @@ static llvm::cl::opt disableRecomposeOptionOpt("disable-recompose", llvm::cl::location(disableRecomposeOption), llvm::cl::init(false), llvm::cl::cat(OnnxMlirOptions)); +static llvm::cl::opt disableConvTranposeDecomposeOptionOpt( + "disable-convtranspose-decompose", + llvm::cl::desc("Disable decomposition of ONNX ConvTranspose operator."), + llvm::cl::location(disableConvTransposeDecomposeOption), + llvm::cl::init(false), llvm::cl::cat(OnnxMlirOptions)); + // Options for onnx-mlir only static llvm::cl::opt emissionTargetOpt( llvm::cl::desc("Choose target to emit:"), diff --git a/src/Compiler/CompilerOptions.hpp b/src/Compiler/CompilerOptions.hpp index 7ebe8ac739..94e3345d2e 100644 --- a/src/Compiler/CompilerOptions.hpp +++ b/src/Compiler/CompilerOptions.hpp @@ -122,6 +122,7 @@ extern bool enableParallel; // onnx-mlir only extern bool disableSimdOption; // onnx-mlir only extern bool enableFastMathOption; // onnx-mlir only extern bool disableRecomposeOption; // onnx-mlir only +extern bool disableConvTransposeDecomposeOption; // onnx-mlir only extern bool enableSimdDataLayout; // onnx-mlir only extern bool verifyInputTensors; // onnx-mlir only extern bool allowSorting; // onnx-mlir only diff --git a/src/Dialect/ONNX/Transforms/Decompose.cpp b/src/Dialect/ONNX/Transforms/Decompose.cpp index 22a5b7a179..0fcd9223a6 100644 --- a/src/Dialect/ONNX/Transforms/Decompose.cpp +++ b/src/Dialect/ONNX/Transforms/Decompose.cpp @@ -30,6 +30,7 @@ #include "mlir/Support/LogicalResult.h" #include "mlir/Transforms/GreedyPatternRewriteDriver.h" +#include "src/Compiler/CompilerOptions.hpp" #include "src/Dialect/ONNX/DialectBuilder.hpp" #include "src/Dialect/ONNX/ElementsAttr/ElementsAttrHelper.hpp" #include "src/Dialect/ONNX/ONNXOps.hpp" @@ -451,15 +452,15 @@ Value replaceSequenceAt( } bool shouldDecomposeConvTransposeOp(Value convTransposeResult) { -#ifdef ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE + if (onnx_mlir::disableConvTransposeDecomposeOption) { + // Disable the ONNXConvTransposeOp decomposition patterns. + return false; + } + } ONNXConvTransposeOp op = mlir::cast(convTransposeResult.getDefiningOp()); return hasShapeAndRank(convTransposeResult) && hasStaticSpatialDims(op.getX()) && hasStaticSpatialDims(op.getW()); -#else - // Disable the ONNXConvTransposeOp decomposition patterns. - return false; -#endif } // Split on the specified axis. The length of each output is one. diff --git a/test/mlir/lit.site.cfg.py.in b/test/mlir/lit.site.cfg.py.in index 243a9e0408..54b4839867 100644 --- a/test/mlir/lit.site.cfg.py.in +++ b/test/mlir/lit.site.cfg.py.in @@ -10,7 +10,6 @@ config.onnx_mlir_obj_root = r"@ONNX_MLIR_BIN_ROOT@" config.enable_stablehlo = @ONNX_MLIR_STABLEHLO_ENABLED@ config.enable_nnpa= 0x0@NNPA_LIT_ENABLED@ -config.decomp_onnx_convtranspose = @ONNX_MLIR_DECOMP_ONNX_CONVTRANSPOSE_ENABLED@ # Support substitution of the tools_dir with user parameters. This is # used when we can't determine the tool dir at configuration time. From 66ccf8556316b33c06ca19f7ff05ba7fc97e658f Mon Sep 17 00:00:00 2001 From: chaitany Date: Fri, 31 Jan 2025 04:36:59 -0700 Subject: [PATCH 2/5] minor change --- src/Dialect/ONNX/Transforms/Decompose.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Dialect/ONNX/Transforms/Decompose.cpp b/src/Dialect/ONNX/Transforms/Decompose.cpp index 0fcd9223a6..59b1b96f58 100644 --- a/src/Dialect/ONNX/Transforms/Decompose.cpp +++ b/src/Dialect/ONNX/Transforms/Decompose.cpp @@ -456,7 +456,6 @@ bool shouldDecomposeConvTransposeOp(Value convTransposeResult) { // Disable the ONNXConvTransposeOp decomposition patterns. return false; } - } ONNXConvTransposeOp op = mlir::cast(convTransposeResult.getDefiningOp()); return hasShapeAndRank(convTransposeResult) && From d5b6f767f2f3b44b15b09d5df1e6e8334d680c9a Mon Sep 17 00:00:00 2001 From: chaitany Date: Sun, 2 Feb 2025 07:23:06 -0700 Subject: [PATCH 3/5] adding the test for disable convtranspose decomposition --- src/Compiler/CompilerOptions.cpp | 2 +- test/mlir/lit.cfg.py | 2 - .../onnx/onnx_decompose_convtranspose.mlir | 1 - .../onnx_decompose_convtranspose_disable.mlir | 104 ++++++++++++++++++ 4 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 test/mlir/onnx/onnx_decompose_convtranspose_disable.mlir diff --git a/src/Compiler/CompilerOptions.cpp b/src/Compiler/CompilerOptions.cpp index 2c9ffdfb53..c34f378ce2 100644 --- a/src/Compiler/CompilerOptions.cpp +++ b/src/Compiler/CompilerOptions.cpp @@ -252,7 +252,7 @@ static llvm::cl::opt disableConvTranposeDecomposeOptionOpt( "disable-convtranspose-decompose", llvm::cl::desc("Disable decomposition of ONNX ConvTranspose operator."), llvm::cl::location(disableConvTransposeDecomposeOption), - llvm::cl::init(false), llvm::cl::cat(OnnxMlirOptions)); + llvm::cl::init(false), llvm::cl::cat(OnnxMlirCommonOptions)); // Options for onnx-mlir only static llvm::cl::opt emissionTargetOpt( diff --git a/test/mlir/lit.cfg.py b/test/mlir/lit.cfg.py index 24d855c09e..2350718680 100644 --- a/test/mlir/lit.cfg.py +++ b/test/mlir/lit.cfg.py @@ -52,5 +52,3 @@ for arch in config.targets_to_build.split(): config.available_features.add(arch.lower()) -if config.decomp_onnx_convtranspose: - config.available_features.add("decomp_onnx_convtranspose") diff --git a/test/mlir/onnx/onnx_decompose_convtranspose.mlir b/test/mlir/onnx/onnx_decompose_convtranspose.mlir index c539f766cc..b88dd4713a 100644 --- a/test/mlir/onnx/onnx_decompose_convtranspose.mlir +++ b/test/mlir/onnx/onnx_decompose_convtranspose.mlir @@ -1,6 +1,5 @@ // RUN: onnx-mlir-opt --shape-inference --decompose-onnx %s -split-input-file | FileCheck %s -// REQUIRES: decomp_onnx_convtranspose // ----- diff --git a/test/mlir/onnx/onnx_decompose_convtranspose_disable.mlir b/test/mlir/onnx/onnx_decompose_convtranspose_disable.mlir new file mode 100644 index 0000000000..b31c6b28a6 --- /dev/null +++ b/test/mlir/onnx/onnx_decompose_convtranspose_disable.mlir @@ -0,0 +1,104 @@ +// RUN: onnx-mlir-opt --shape-inference --decompose-onnx --disable-convtranspose-decompose %s -split-input-file | FileCheck %s + + +// ----- + +// Test unit strides. Only convert weight tensor + + func.func @test_convtrans_unitstrides(%arg0: tensor<1x1x3x3xf32>, %arg1: tensor<1x2x3x3xf32>) -> tensor<1x2x5x5xf32> { + %0 = "onnx.NoValue"() {value} : () -> none + %1 = "onnx.ConvTranspose"(%arg0, %arg1, %0) {auto_pad = "NOTSET", group = 1 : si64} : (tensor<1x1x3x3xf32>, tensor<1x2x3x3xf32>, none) -> tensor<1x2x5x5xf32> + onnx.Return %1 : tensor<1x2x5x5xf32> +// CHECK-LABEL: func.func @test_convtrans_unitstrides( +// CHECK-SAME: %[[VAL_0:.*]]: tensor<1x1x3x3xf32>, +// CHECK-SAME: %[[VAL_1:.*]]: tensor<1x2x3x3xf32>) -> tensor<1x2x5x5xf32> { +// CHECK: %[[VAL_2:.*]] = "onnx.NoValue"() {value} : () -> none +// CHECK: %[[VAL_3:.*]] = "onnx.ConvTranspose"(%[[VAL_0]], %[[VAL_1]], %[[VAL_2]]) {auto_pad = "NOTSET", group = 1 : si64} : (tensor<1x1x3x3xf32>, tensor<1x2x3x3xf32>, none) -> tensor<1x2x5x5xf32> +// CHECK: onnx.Return %[[VAL_3]] : tensor<1x2x5x5xf32> +// CHECK: } + } + +// ----- + +// Test 1d input + + func.func @test_convtrans1d_unitstrides(%arg0: tensor<1x1x3xf32>, %arg1: tensor<1x2x3xf32>) -> tensor<1x2x5xf32> { + %0 = "onnx.NoValue"() {value} : () -> none + %1 = "onnx.ConvTranspose"(%arg0, %arg1, %0) {auto_pad = "NOTSET", group = 1 : si64} : (tensor<1x1x3xf32>, tensor<1x2x3xf32>, none) -> tensor<1x2x5xf32> + onnx.Return %1 : tensor<1x2x5xf32> +// CHECK-LABEL: func.func @test_convtrans1d_unitstrides( +// CHECK-SAME: %[[VAL_0:.*]]: tensor<1x1x3xf32>, +// CHECK-SAME: %[[VAL_1:.*]]: tensor<1x2x3xf32>) -> tensor<1x2x5xf32> { +// CHECK: %[[VAL_2:.*]] = "onnx.NoValue"() {value} : () -> none +// CHECK: %[[VAL_3:.*]] = "onnx.ConvTranspose"(%[[VAL_0]], %[[VAL_1]], %[[VAL_2]]) {auto_pad = "NOTSET", group = 1 : si64} : (tensor<1x1x3xf32>, tensor<1x2x3xf32>, none) -> tensor<1x2x5xf32> +// CHECK: onnx.Return %[[VAL_3]] : tensor<1x2x5xf32> +// CHECK: } + } + +// ----- + +// Test 3d input + + func.func @test_convtrans3d_unitstrides(%arg0: tensor<1x1x3x4x5xf32>, %arg1: tensor<1x2x3x3x3xf32>) -> tensor<1x2x5x6x7xf32> { + %0 = "onnx.NoValue"() {value} : () -> none + %1 = "onnx.ConvTranspose"(%arg0, %arg1, %0) {auto_pad = "NOTSET", group = 1 : si64} : (tensor<1x1x3x4x5xf32>, tensor<1x2x3x3x3xf32>, none) -> tensor<1x2x5x6x7xf32> + onnx.Return %1 : tensor<1x2x5x6x7xf32> +// CHECK-LABEL: func.func @test_convtrans3d_unitstrides( +// CHECK-SAME: %[[VAL_0:.*]]: tensor<1x1x3x4x5xf32>, +// CHECK-SAME: %[[VAL_1:.*]]: tensor<1x2x3x3x3xf32>) -> tensor<1x2x5x6x7xf32> { +// CHECK: %[[VAL_2:.*]] = "onnx.NoValue"() {value} : () -> none +// CHECK: %[[VAL_3:.*]] = "onnx.ConvTranspose"(%[[VAL_0]], %[[VAL_1]], %[[VAL_2]]) {auto_pad = "NOTSET", group = 1 : si64} : (tensor<1x1x3x4x5xf32>, tensor<1x2x3x3x3xf32>, none) -> tensor<1x2x5x6x7xf32> +// CHECK: onnx.Return %[[VAL_3]] : tensor<1x2x5x6x7xf32> +// CHECK: } + } + +// ----- + +// Test non unit strides. Added pads between elements in input data. + + func.func @test_convtrans_strides(%arg0: tensor<1x1x3x3xf32>, %arg1: tensor<1x2x3x3xf32>) -> tensor<1x2x7x3xf32> { + %0 = "onnx.NoValue"() {value} : () -> none + %1 = "onnx.ConvTranspose"(%arg0, %arg1, %0) {auto_pad = "NOTSET", group = 1 : si64, pads = [1, 2, 1, 2], strides = [3, 2]} : (tensor<1x1x3x3xf32>, tensor<1x2x3x3xf32>, none) -> tensor<1x2x7x3xf32> + onnx.Return %1 : tensor<1x2x7x3xf32> +// CHECK-LABEL: func.func @test_convtrans_strides( +// CHECK-SAME: %[[VAL_0:.*]]: tensor<1x1x3x3xf32>, +// CHECK-SAME: %[[VAL_1:.*]]: tensor<1x2x3x3xf32>) -> tensor<1x2x7x3xf32> { +// CHECK: %[[VAL_2:.*]] = "onnx.NoValue"() {value} : () -> none +// CHECK: %[[VAL_3:.*]] = "onnx.ConvTranspose"(%[[VAL_0]], %[[VAL_1]], %[[VAL_2]]) {auto_pad = "NOTSET", group = 1 : si64, pads = [1, 2, 1, 2], strides = [3, 2]} : (tensor<1x1x3x3xf32>, tensor<1x2x3x3xf32>, none) -> tensor<1x2x7x3xf32> +// CHECK: onnx.Return %[[VAL_3]] : tensor<1x2x7x3xf32> +// CHECK: } + } + +// ----- + +// Test output_padding. Additional pads are inserted after Conv op + + func.func @test_convtrans_outputpadding(%arg0: tensor<1x1x3x3xf32>, %arg1: tensor<1x2x3x3xf32>) -> tensor<1x2x10x8xf32> { + %0 = "onnx.NoValue"() {value} : () -> none + %1 = "onnx.ConvTranspose"(%arg0, %arg1, %0) {auto_pad = "NOTSET", group = 1 : si64, output_shape = [10, 8], strides = [3, 2]} : (tensor<1x1x3x3xf32>, tensor<1x2x3x3xf32>, none) -> tensor<1x2x10x8xf32> + onnx.Return %1 : tensor<1x2x10x8xf32> +// CHECK-LABEL: func.func @test_convtrans_outputpadding( +// CHECK-SAME: %[[VAL_0:.*]]: tensor<1x1x3x3xf32>, +// CHECK-SAME: %[[VAL_1:.*]]: tensor<1x2x3x3xf32>) -> tensor<1x2x10x8xf32> { +// CHECK: %[[VAL_2:.*]] = "onnx.NoValue"() {value} : () -> none +// CHECK: %[[VAL_3:.*]] = "onnx.ConvTranspose"(%[[VAL_0]], %[[VAL_1]], %[[VAL_2]]) {auto_pad = "NOTSET", group = 1 : si64, output_shape = [10, 8], strides = [3, 2]} : (tensor<1x1x3x3xf32>, tensor<1x2x3x3xf32>, none) -> tensor<1x2x10x8xf32> +// CHECK: onnx.Return %[[VAL_3]] : tensor<1x2x10x8xf32> +// CHECK: } + } + +// ----- + +// Test for unknown dimension in spatial dimensions + + func.func @test_convtranspose_unknown_spatial_dim(%arg0: tensor, %arg1: tensor) -> tensor { + %0 = "onnx.NoValue"() {value} : () -> none + %1 = "onnx.ConvTranspose"(%arg0, %arg1, %0) {auto_pad = "NOTSET", group = 1 : si64, kernel_shape = [3, 3], onnx_node_name = "test", output_padding = [1, 1], output_shape = [10, 8], strides = [3, 2]} : (tensor, tensor, none) -> tensor + onnx.Return %1 : tensor +// CHECK-LABEL: func.func @test_convtranspose_unknown_spatial_dim( +// CHECK-SAME: %[[VAL_0:.*]]: tensor, +// CHECK-SAME: %[[VAL_1:.*]]: tensor) -> tensor { +// CHECK: %[[VAL_2:.*]] = "onnx.NoValue"() {value} : () -> none +// CHECK: %[[VAL_3:.*]] = "onnx.ConvTranspose"(%[[VAL_0]], %[[VAL_1]], %[[VAL_2]]) {auto_pad = "NOTSET", group = 1 : si64, kernel_shape = [3, 3], onnx_node_name = "test", output_padding = [1, 1], output_shape = [10, 8], strides = [3, 2]} : (tensor, tensor, none) -> tensor +// CHECK: onnx.Return %[[VAL_3]] : tensor +// CHECK: } + } From 18dbc1937d02ae201d8bce49682800ad8e6df155 Mon Sep 17 00:00:00 2001 From: chaitany Date: Sun, 2 Feb 2025 07:28:52 -0700 Subject: [PATCH 4/5] formatting --- test/mlir/lit.cfg.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/mlir/lit.cfg.py b/test/mlir/lit.cfg.py index 2350718680..461e78de00 100644 --- a/test/mlir/lit.cfg.py +++ b/test/mlir/lit.cfg.py @@ -50,5 +50,4 @@ # the supported targets for llvm & friends are - this allow us to filter test # execution based on the available targets for arch in config.targets_to_build.split(): - config.available_features.add(arch.lower()) - + config.available_features.add(arch.lower()) \ No newline at end of file From 6dd1b3212be862b317d94b569e42afc68580bc85 Mon Sep 17 00:00:00 2001 From: chaitany Date: Sun, 2 Feb 2025 07:39:58 -0700 Subject: [PATCH 5/5] formatting --- test/mlir/lit.cfg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mlir/lit.cfg.py b/test/mlir/lit.cfg.py index 461e78de00..bf1706a95f 100644 --- a/test/mlir/lit.cfg.py +++ b/test/mlir/lit.cfg.py @@ -50,4 +50,4 @@ # the supported targets for llvm & friends are - this allow us to filter test # execution based on the available targets for arch in config.targets_to_build.split(): - config.available_features.add(arch.lower()) \ No newline at end of file + config.available_features.add(arch.lower())