Pass Model Path to TensorProtoToMLValue from Constant Folding for External Inputs (#5000)

* Don't constant fold external inputs.

* pass model_path to TensorProtoToMLValue

Co-authored-by: Vincent Wang <weicwang@microsoft.com>
This commit is contained in:
Vincent Wang 2020-09-02 21:54:40 +08:00 committed by GitHub
parent 5651c23271
commit a6e219deff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 7 deletions

View file

@ -104,8 +104,7 @@ Status ConstantFolding::ApplyImpl(Graph& graph, bool& modified, int graph_level,
}
// Create execution frame for executing constant nodes.
// Create execution frame for executing constant nodes.
OptimizerExecutionFrame::Info info({node}, constant_inputs, execution_provider_);
OptimizerExecutionFrame::Info info({node}, constant_inputs, graph.ModelPath(), execution_provider_);
std::vector<int> fetch_mlvalue_idxs;
for (const auto* node_out : node->OutputDefs()) {

View file

@ -19,6 +19,7 @@ namespace onnxruntime {
OptimizerExecutionFrame::Info::Info(const std::vector<const Node*>& nodes,
const InitializedTensorSet& initialized_tensor_set,
const Path& model_path,
const IExecutionProvider& execution_provider)
: execution_provider_(execution_provider) {
allocator_ptr_ = execution_provider_.GetAllocator(device_id_, mem_type_);
@ -27,7 +28,7 @@ OptimizerExecutionFrame::Info::Info(const std::vector<const Node*>& nodes,
data_transfer_mgr_.RegisterDataTransfer(onnxruntime::make_unique<CPUDataTransfer>());
// Create MLValues related maps
auto initialize_maps = [this, &initialized_tensor_set](const NodeArg& arg, size_t /*index*/) -> Status {
auto initialize_maps = [this, &initialized_tensor_set, &model_path](const NodeArg& arg, size_t /*index*/) -> Status {
int idx = ort_value_name_idx_map_.Add(arg.Name());
ort_value_idx_nodearg_map_[idx] = &arg;
@ -41,9 +42,12 @@ OptimizerExecutionFrame::Info::Info(const std::vector<const Node*>& nodes,
std::unique_ptr<char[]> data(new char[cpu_tensor_length]);
std::unique_ptr<Tensor> p_tensor;
OrtCallback d;
ORT_RETURN_IF_ERROR(utils::TensorProtoToMLValue(Env::Default(), nullptr, tensor_proto,
ORT_RETURN_IF_ERROR(utils::TensorProtoToMLValue(Env::Default(),
model_path.IsEmpty() ? nullptr : model_path.ToPathString().c_str(),
tensor_proto,
MemBuffer(data.get(), cpu_tensor_length, allocator_ptr_->Info()),
ort_value, d));
ort_value,
d));
initializers_[idx] = ort_value;
buffer_for_initialized_tensors_[idx] = std::move(data);

View file

@ -20,7 +20,9 @@ class OptimizerExecutionFrame final : public IExecutionFrame {
public:
class Info {
public:
Info(const std::vector<const Node*>& nodes, const InitializedTensorSet& initialized_tensor_set,
Info(const std::vector<const Node*>& nodes,
const InitializedTensorSet& initialized_tensor_set,
const Path& model_path,
const IExecutionProvider& execution_provider);
~Info() {
for (auto& kvp : deleter_for_initialized_tensors_) {

View file

@ -66,7 +66,7 @@ TEST(OptimizerTest, Basic) {
std::unique_ptr<CPUExecutionProvider> cpu_execution_provider =
onnxruntime::make_unique<CPUExecutionProvider>(CPUExecutionProviderInfo());
OptimizerExecutionFrame::Info info(nodes, initialized_tensor_set, *cpu_execution_provider.get());
OptimizerExecutionFrame::Info info(nodes, initialized_tensor_set, graph.ModelPath(), *cpu_execution_provider.get());
std::vector<int> fetch_mlvalue_idxs{info.GetMLValueIndex("out")};
OptimizerExecutionFrame frame(info, fetch_mlvalue_idxs);
const logging::Logger& logger = DefaultLoggingManager().DefaultLogger();