From 1c37d5e6ec730da6481436111bde142cf86b263c Mon Sep 17 00:00:00 2001 From: George Wu Date: Tue, 21 Apr 2020 11:55:30 +0800 Subject: [PATCH] debug option for dumping tensorrt subgraphs. (#3604) --- .../tensorrt/tensorrt_execution_provider.cc | 20 +++++++++++++++---- .../tensorrt/tensorrt_execution_provider.h | 4 +++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc index b8a725e08f..b1de06881f 100644 --- a/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc +++ b/onnxruntime/core/providers/tensorrt/tensorrt_execution_provider.cc @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +#include #include "core/graph/onnx_protobuf.h" #include "tensorrt_execution_provider.h" @@ -124,6 +125,11 @@ TensorrtExecutionProvider::TensorrtExecutionProvider(const TensorrtExecutionProv if (!fp16_enable_env.empty()) { fp16_enable_ = (std::stoi(fp16_enable_env) == 0 ? false : true); } + + const std::string dump_subgraphs_env = env_instance.GetEnvironmentVar(tensorrt_env_vars::kDumpSubgraphs); + if (!dump_subgraphs_env.empty()) { + dump_subgraphs_ = (std::stoi(dump_subgraphs_env) == 0 ? false : true); + } } TensorrtExecutionProvider::~TensorrtExecutionProvider() {} @@ -252,7 +258,7 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph // Find inputs and outputs of the subgraph std::unique_ptr sub_graph = onnxruntime::make_unique(); - std::unordered_map fused_inputs, fused_outputs, fused_outputs_to_add, graph_outputs_to_add; + std::unordered_map fused_inputs, fused_outputs, fused_outputs_to_add, graph_outputs_to_add; std::unordered_set erased; int input_order = 0; int output_order = 0; @@ -318,7 +324,7 @@ std::unique_ptr TensorrtExecutionProvider::GetSubGraph(SubGraph fused_outputs.insert(graph_outputs_to_add.begin(), graph_outputs_to_add.end()); // Sort inputs and outputs by the order they were added - std::multimap inputs, outputs; + std::multimap inputs, outputs; for (auto it = fused_inputs.begin(), end = fused_inputs.end(); it != end; ++it) { inputs.insert(std::pair(it->second, it->first)); } @@ -384,7 +390,7 @@ SubGraphCollection_t TensorrtExecutionProvider::GetSupportedList(SubGraphCollect std::vector subgraph_output_names; for (const auto& index : group.first) { const auto& node = graph.GetNode(node_index[index]); - std::vector inputs, outputs; + std::vector inputs, outputs; for (auto input : node->InputDefs()) { auto& n_input = graph_build.GetOrCreateNodeArg(input->Name(), input->TypeAsProto()); inputs.push_back(&n_input); @@ -661,6 +667,12 @@ common::Status TensorrtExecutionProvider::Compile(const std::vectorName() + ".onnx", std::ios::out | std::ios::trunc | std::ios::binary); + model_proto.SerializeToOstream(&dump); + } + // Create TensorRT engine TensorrtLogger& trt_logger = GetTensorrtLogger(); auto trt_builder = unique_pointer(nvinfer1::createInferBuilder(trt_logger)); @@ -1009,4 +1021,4 @@ common::Status TensorrtExecutionProvider::Compile(const std::vector @@ -126,7 +128,7 @@ class TensorrtExecutionProvider : public IExecutionProvider { const onnxruntime::GraphViewer& graph, bool* early_termination) const; void RemoveTensorRTGraphCycles(SubGraphCollection_t& supported_nodes_vector, const onnxruntime::GraphViewer& graph) const; - + AllocatorPtr allocator_; };