onnxruntime/onnxruntime/core/optimizer/constant_sharing.h
Jeff Bloomfield 54fdb640fe
Address performance regression with duplicate initializers across DML partitions (#16087)
This addresses a DML performance regression introduced by the constant
sharing pass.

The constant sharing pass identifies small initializer tensors which
contain identical values and merges them. This could have the effect of
causing DML to treat those tensors as non-constant and skip certain
optimization.

To prevent this, there is now an element count threshold below which the
DML EP will enable this optimization, even though it results in
duplicate work uploading and pre-processing the common tensor at
multiple operators.
2023-05-26 13:37:34 -07:00

40 lines
1.4 KiB
Objective-C

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#pragma once
#include <string>
#include "core/optimizer/graph_transformer.h"
#include "core/optimizer/initializer.h"
namespace onnxruntime {
/**
@class ConstantSharing
Transformer that traverses the graph top-down and performs constant sharing, i.e.,
constant initializers having same dtype, value and shape, will be replaced by one single (newly created) initializer.
Currently, only scalar valued initializers are handled.
*/
class ConstantSharing : public GraphTransformer {
public:
/**
* @param compatible_execution_providers comptatible execution provider list for considered nodes.
* @param excluded_initializers explicitly excluded initializer names that should not changed.
*/
ConstantSharing(const InlinedHashSet<std::string_view>& compatible_execution_providers = {},
const InlinedHashSet<std::string>& excluded_initializers = {}) noexcept
: GraphTransformer("ConstantSharing", compatible_execution_providers),
excluded_initializers_(excluded_initializers) {
}
static constexpr int64_t TENSOR_ELEM_COUNT_THRESHOLD = 8;
private:
Status ApplyImpl(Graph& graph, bool& modified, int graph_level, const logging::Logger& logger) const override;
const InlinedHashSet<std::string> excluded_initializers_;
};
} // namespace onnxruntime