mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-24 19:43:35 +00:00
### Description <!-- Describe your changes. --> - Treat Resize as layout sensitive by default - whilst the ONNX spec does not specify a layout, EPs tend to implement only one - add second usage in L2 of TransposeOptimizer to plugin the ability to push a Transpose through a Resize assigned to the CPU EP - Allow EP specific logic for changes the ops considered to be layout sensitive to be plugged in - expected usage is for #17200 ### Motivation and Context <!-- - Why is this change required? What problem does it solve? - If it fixes an open issue, please link to the issue here. --> Finish simplifying/clarifying transpose optimization and layout transformation that was proposed in #15552. This PR along with #17618 should complete the changes. --------- Co-authored-by: Edward Chen <18449977+edgchen1@users.noreply.github.com>
38 lines
1.3 KiB
C++
38 lines
1.3 KiB
C++
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
#pragma once
|
|
|
|
#include "core/framework/execution_provider.h"
|
|
#include "core/optimizer/graph_transformer.h"
|
|
|
|
namespace onnxruntime {
|
|
|
|
/**
|
|
@Class TransposeOptimizer
|
|
Push transposes through ops and eliminate them.
|
|
*/
|
|
class TransposeOptimizer : public GraphTransformer {
|
|
private:
|
|
AllocatorPtr cpu_allocator_;
|
|
const std::string ep_;
|
|
|
|
public:
|
|
explicit TransposeOptimizer(AllocatorPtr cpu_allocator,
|
|
const std::string& ep = {}) noexcept
|
|
: GraphTransformer(ep.empty() ? "TransposeOptimizer" : "TransposeOptimizer_" + ep),
|
|
cpu_allocator_(std::move(cpu_allocator)),
|
|
ep_{ep} {}
|
|
|
|
Status ApplyImpl(Graph& graph, bool& modified, int graph_level, const logging::Logger& logger) const override;
|
|
|
|
// One run should be sufficient.
|
|
// The second phase of optimization may swap a DequantizeLinear -> Transpose back, so multiple runs would
|
|
// keep swapping the order of the nodes in the first and second phases, leading to always returning true for
|
|
// modified.
|
|
// See onnxruntime/core/optimizer/transpose_optimization/onnx_transpose_optimization.cc:OptimizeImpl for details
|
|
// on the second pass.
|
|
bool ShouldOnlyApplyOnce() const override { return true; }
|
|
};
|
|
|
|
} // namespace onnxruntime
|