From edac90c7c75b93ba149823257caf69ac9391c10b Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 31 Jul 2017 16:41:46 -0700 Subject: [PATCH] Add support to generate pprof results to tf.profiler A fun thing is, it can not only profile time,memory but also parameters, etc. PiperOrigin-RevId: 163767517 --- tensorflow/core/profiler/README.md | 23 +- tensorflow/core/profiler/g3doc/pprof.jpg | Bin 0 -> 267669 bytes .../core/profiler/internal/tfprof_code.cc | 393 +++++++++++++++--- .../core/profiler/internal/tfprof_code.h | 29 +- .../core/profiler/internal/tfprof_graph.cc | 5 + .../core/profiler/internal/tfprof_node.h | 45 +- .../profiler/internal/tfprof_node_show.cc | 44 +- .../core/profiler/internal/tfprof_node_show.h | 22 +- .../core/profiler/internal/tfprof_op.cc | 7 +- .../core/profiler/internal/tfprof_options.cc | 7 + .../core/profiler/internal/tfprof_options.h | 11 +- .../core/profiler/internal/tfprof_scope.cc | 7 +- .../core/profiler/internal/tfprof_show.cc | 34 +- .../profiler/internal/tfprof_show_multi.cc | 34 +- tensorflow/core/profiler/profile.proto | 71 ++++ tensorflow/core/profiler/tfprof_log.proto | 1 + .../python/profiler/model_analyzer_test.py | 60 ++- tensorflow/python/profiler/option_builder.py | 14 + tensorflow/python/profiler/tfprof_logger.py | 3 +- ...low.profiler.-profile-option-builder.pbtxt | 4 + 20 files changed, 667 insertions(+), 147 deletions(-) create mode 100644 tensorflow/core/profiler/g3doc/pprof.jpg create mode 100644 tensorflow/core/profiler/profile.proto diff --git a/tensorflow/core/profiler/README.md b/tensorflow/core/profiler/README.md index d55824e6f26..e748daba7ad 100644 --- a/tensorflow/core/profiler/README.md +++ b/tensorflow/core/profiler/README.md @@ -181,6 +181,7 @@ seq2seq_attention_model.py:363:build_graph:self._add_train_o..., cpu: 1.28sec, a ### Visualize time and memory. ``` +# The following example generates a timeline. tfprof> graph -step 0 -max_depth 100000 -output timeline:outfile= generating trace file. @@ -191,9 +192,29 @@ Open a Chrome browser, enter URL chrome://tracing and load the timeline file. ****************************************************** ``` -[CodeTimeline](g3doc/graph_timeline.png) +[Timeline](g3doc/graph_timeline.png) +``` +# The following example generates a pprof graph (only supported by code view). +# Since TensorFlow runs the graph instead of Python code, the pprof graph +# doesn't profile the statistics of Python, but the TensorFlow graph +# nodes created by the Python call stack. +# Nevertheless, it pops critical Python code path for us. +# +# `-trim_name_regexes` trims the python call stack, which are always the same +# for the leaves. +# `-select accelerator_micros` pick accelerator time for pprof graph. User +# can also generate memory profile using `-select bytes` +tfprof> code -max_depth 100 -trim_name_regexes '^ops.py.*' -select accelerator_micros -output pprof:outfile= + +# Use pprof to visualize the generated file. +pprof -png --nodecount=20 --sample_index=1 +``` + + +[PprofGraph](g3doc/pprof.jpg) + ### Feature Request and Bug Report diff --git a/tensorflow/core/profiler/g3doc/pprof.jpg b/tensorflow/core/profiler/g3doc/pprof.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf28967d685d9431f81fd1859ddfac2e4f8323bc GIT binary patch literal 267669 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∈(d{vIIIFtR9PqAPxT_*?D?FCZcw&YB`d5i|s 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 I^mOun0a?7^#{d8T literal 0 HcmV?d00001 diff --git a/tensorflow/core/profiler/internal/tfprof_code.cc b/tensorflow/core/profiler/internal/tfprof_code.cc index 1746076f793..86505415504 100644 --- a/tensorflow/core/profiler/internal/tfprof_code.cc +++ b/tensorflow/core/profiler/internal/tfprof_code.cc @@ -21,6 +21,8 @@ limitations under the License. #include "tensorflow/c/c_api.h" #include "tensorflow/core/framework/tensor.h" #include "tensorflow/core/lib/io/path.h" +#include "tensorflow/core/lib/io/zlib_compression_options.h" +#include "tensorflow/core/lib/io/zlib_outputbuffer.h" #include "tensorflow/core/lib/strings/str_util.h" #include "tensorflow/core/lib/strings/strcat.h" #include "tensorflow/core/lib/strings/stringprintf.h" @@ -46,66 +48,335 @@ string GetTraceString(const CodeDef::Trace& trace) { } return ntrace; } + +// StringTable maps each string to an id. +class StringTable { + public: + StringTable() { + // Pprof requires first entry in string_table to be ''. + string_id_[""] = 0; + all_strings_.push_back(""); + } + + // Returns the index of a string. If not found, inserts the string and + // return the inserted index. + uint64 GetIndex(const string& str) { + auto idx = string_id_.find(str); + if (idx != string_id_.end()) { + return idx->second; + } + all_strings_.push_back(str); + return string_id_.insert(std::pair(str, string_id_.size())) + .first->second; + } + + const std::vector& strings() const { return all_strings_; } + + private: + std::map string_id_; + std::vector all_strings_; +}; + +// FunctionTable maps each function to an id. +class FunctionTable { + public: + explicit FunctionTable(StringTable* string_table) + : string_table_(string_table) {} + + // Returns the index of a function. If not found, adds a function proto + // and returns the function index. + uint64 GetIndex(const string& file_path, const string& func_name, + uint64 func_start_line) { + auto key = std::tuple(file_path, func_name, + func_start_line); + auto idx = function_table_.find(key); + if (idx != function_table_.end()) { + return idx->second.id(); + } + pprof::Function* func_pb = &function_table_[key]; + // function index should start from 1. + func_pb->set_id(function_table_.size()); + func_pb->set_name(string_table_->GetIndex(func_name)); + func_pb->set_filename(string_table_->GetIndex(file_path)); + func_pb->set_start_line(func_start_line); + return func_pb->id(); + } + + const std::map, pprof::Function>& + functions() const { + return function_table_; + } + + private: + StringTable* string_table_; + std::map, pprof::Function> function_table_; +}; + +// LocationTable maps each function call to an id. +class LocationTable { + public: + explicit LocationTable(FunctionTable* function_table) + : function_table_(function_table) {} + + // Returns the index of a function call localtion. If not found, adds a + // location proto and returns the location index. + uint64 GetIndex(const string& file_path, uint64 line_number, + const string& called_function_name, + const string& called_file_path, + uint64 called_func_start_line) { + auto key = std::tuple( + file_path, called_function_name, line_number); + auto idx = location_table_.find(key); + if (idx != location_table_.end()) { + return idx->second.id(); + } + pprof::Location* location_pb = &location_table_[key]; + location_pb->set_id(location_table_.size()); + pprof::Line* line_pb = location_pb->add_line(); + line_pb->set_function_id(function_table_->GetIndex( + called_file_path, called_function_name, called_func_start_line)); + line_pb->set_line(line_number); + return location_pb->id(); + } + + const std::map, pprof::Location>& + locations() const { + return location_table_; + } + + private: + FunctionTable* function_table_; + std::map, pprof::Location> location_table_; +}; + +// Samples stores samples of all calls. A sample is a single call trace, +// that is, the call path from top caller to the leaf callee. +class Samples { + public: + explicit Samples(StringTable* string_table, const Options* opts) + : string_table_(string_table), opts_(opts) {} + + // 'node' is the leaf of the displayed trace. It includes all graph nodes + // created by it. 'location_ids' contains + // the call stack, from callee to caller. + // This method adds the statistics of graph nodes created by the python + // call. + void Add(const CodeNode* node, const std::vector& location_ids) { + // displayed leaf might not be true leaf. Retrive the true leaves for + // stats. + std::vector all_leaf = FetchAllLeaf(node); + CHECK(!all_leaf.empty()) << node->name(); + + for (const CodeNode* cn : all_leaf) { + for (auto gn_it : cn->node->graph_nodes()) { + const TFGraphNode* gn = gn_it.second; + pprof::Sample* sample_pb = &sample_table_[gn->name()]; + for (uint64 id : location_ids) { + sample_pb->mutable_location_id()->Add(id); + } + pprof::Label* label_pb = sample_pb->mutable_label()->Add(); + label_pb->set_key(string_table_->GetIndex("node_name")); + label_pb->set_str(string_table_->GetIndex(gn->name())); + + sample_pb->mutable_value()->Add(1); + string type = *opts_->select.begin(); + if (type == kShown[1]) { + sample_pb->mutable_value()->Add(gn->exec_micros(node->node->step())); + } else if (type == kShown[9]) { + sample_pb->mutable_value()->Add( + gn->accelerator_exec_micros(node->node->step())); + } else if (type == kShown[10]) { + sample_pb->mutable_value()->Add( + gn->cpu_exec_micros(node->node->step())); + } else if (type == kShown[0]) { + sample_pb->mutable_value()->Add( + gn->requested_bytes(node->node->step())); + } else if (type == kShown[2]) { + sample_pb->mutable_value()->Add(gn->parameters()); + } else if (type == kShown[3]) { + sample_pb->mutable_value()->Add(gn->float_ops(node->node->step())); + } else { + fprintf(stderr, "pprof doesn't support -select=%s\n", type.c_str()); + } + } + } + } + + const std::map& samples() const { + return sample_table_; + } + + private: + std::vector FetchAllLeaf(const CodeNode* root) { + if (root->children.empty()) { + return {root}; + } + std::vector ret; + for (auto& n : root->children) { + std::vector nodes = FetchAllLeaf(n); + ret.insert(ret.end(), nodes.begin(), nodes.end()); + } + return ret; + } + + StringTable* string_table_; + const Options* opts_; + std::map sample_table_; +}; + +class PprofProfileImpl : public PprofProfile { + public: + explicit PprofProfileImpl(const Options* opts) + : opts_(opts), + func_table_(new FunctionTable(&string_table_)), + loc_table_(new LocationTable(func_table_.get())), + samples_(new Samples(&string_table_, opts)) {} + + uint64 AddLocation(const CodeNode* callee, const CodeNode* caller) override { + const string& file_path = caller->trace->file(); + uint64 lineno = caller->trace->lineno(); + const string& callee_file_path = callee->trace->file(); + const string& callee_function = callee->trace->function(); + uint64 callee_func_start_line = callee->trace->func_start_line(); + + return loc_table_->GetIndex(file_path, lineno, callee_function, + callee_file_path, callee_func_start_line); + } + + void AddSample(const CodeNode* leaf, std::vector* call_ids) override { + std::vector reversed_call_ids; + std::reverse_copy(call_ids->begin(), call_ids->end(), + std::back_inserter(reversed_call_ids)); + samples_->Add(leaf, reversed_call_ids); + } + + Status WritePprofProfile(const string& filename) override { + pprof::Profile profile_pb; + Build(&profile_pb); + + std::unique_ptr file; + Status s = Env::Default()->NewWritableFile(filename, &file); + if (!s.ok()) return s; + + int32 buf_size = 1024 * 1024; + io::ZlibOutputBuffer* zlib_output_buffer = new io::ZlibOutputBuffer( + file.get(), buf_size, buf_size, io::ZlibCompressionOptions::GZIP()); + s = zlib_output_buffer->Init(); + if (!s.ok()) return s; + s = zlib_output_buffer->Append(profile_pb.SerializeAsString()); + if (!s.ok()) return s; + s = zlib_output_buffer->Close(); + if (!s.ok()) return s; + fprintf(stdout, "\nRun pprof -png --nodecount=20 --sample_index=1 <%s>\n", + filename.c_str()); + return s; + } + + private: + void Build(pprof::Profile* profile_pb) { + string sample_type_description = "count"; + auto sample_type = profile_pb->mutable_sample_type()->Add(); + sample_type->set_type(string_table_.GetIndex(sample_type_description)); + sample_type->set_unit(string_table_.GetIndex("count")); + + string type = *opts_->select.begin(); + sample_type_description = type; + sample_type = profile_pb->mutable_sample_type()->Add(); + sample_type->set_type(string_table_.GetIndex(sample_type_description)); + if (type == kShown[1] || type == kShown[9] || type == kShown[10]) { + sample_type->set_unit(string_table_.GetIndex("microseconds")); + if (type == kShown[1]) { + profile_pb->mutable_comment()->Add(string_table_.GetIndex( + "Sum of accelerator execution time and cpu execution time.")); + } else if (type == kShown[9]) { + profile_pb->mutable_comment()->Add( + string_table_.GetIndex("Accelerator execution time.")); + } else if (type == kShown[10]) { + profile_pb->mutable_comment()->Add( + string_table_.GetIndex("CPU execution time.")); + } + } else if (type == kShown[0]) { + sample_type->set_unit(string_table_.GetIndex("bytes")); + profile_pb->mutable_comment()->Add( + string_table_.GetIndex("Sum of operation output memory.")); + } else if (type == kShown[2]) { + sample_type->set_unit(string_table_.GetIndex("count")); + profile_pb->mutable_comment()->Add( + string_table_.GetIndex("Model parameters.")); + } else if (type == kShown[3]) { + sample_type->set_unit(string_table_.GetIndex("count")); + profile_pb->mutable_comment()->Add(string_table_.GetIndex( + "Model float operations (Only available if defined).")); + } else { + fprintf(stderr, "pprof doesn't support selecting: %s\n", type.c_str()); + } + + for (const string& str : string_table_.strings()) { + *profile_pb->mutable_string_table()->Add() = str; + } + for (const auto& sample_it : samples_->samples()) { + // TODO(xpan): Consider swap. + profile_pb->mutable_sample()->Add()->MergeFrom(sample_it.second); + } + for (const auto& function_it : func_table_->functions()) { + profile_pb->mutable_function()->Add()->MergeFrom(function_it.second); + } + for (const auto& location_it : loc_table_->locations()) { + profile_pb->mutable_location()->Add()->MergeFrom(location_it.second); + } + } + + const Options* opts_; + StringTable string_table_; + std::unique_ptr func_table_; + std::unique_ptr loc_table_; + std::unique_ptr samples_; +}; } // namespace void TFCode::AddNode(TFGraphNode* node) { if (node->code().traces_size() == 0) { return; } - TFMultiGraphNode* pre_trace_node = nullptr; + if (!root_) { + graph_root_.reset(new TFMultiGraphNode(kTFProfRoot)); + root_.reset(new CodeNode(graph_root_.get(), nullptr)); + } + + CodeNode* pre_code_node = root_.get(); // TODO(xpan): Consider to release CodeDef after TFCode is built. It // takes a lot of memory. for (int i = 0; i < node->code().traces_size(); ++i) { // Unlike op name, which is globally unique, trace name is only unique // w.r.t. it's parent. const string& trace = GetTraceString(node->code().traces(i)); - if (i == 0) { - if (!trace_root_) { - trace_root_.reset(new TFMultiGraphNode(trace)); - } - CHECK(trace_root_->name() == trace) << "Different trace root"; - pre_trace_node = trace_root_.get(); - continue; - } - pre_trace_node->AddChildren(trace); - TFMultiGraphNode* trace_node = pre_trace_node->children().at(trace).get(); - + pre_code_node = pre_code_node->AddChildren(trace, &node->code().traces(i)); if (i == node->code().traces_size() - 1) { - trace_node->AddGraphNode(node); + pre_code_node->node->AddGraphNode(node); } - pre_trace_node = trace_node; } } void TFCode::Build() { - if (root_) { - return; - } - tfprof_trace_root_.reset(new TFMultiGraphNode(kTFProfRoot)); - root_.reset(new CodeNode(tfprof_trace_root_.get())); - - if (trace_root_) { - code_root_ = BuildCodeNodes(trace_root_.get()); - root_->children.push_back(code_root_); - } -} - -CodeNode* TFCode::BuildCodeNodes(TFMultiGraphNode* root) { - auto code_root = std::unique_ptr(new CodeNode(root)); - CodeNode* code_root_ptr = code_root.get(); - code_nodes_.insert(std::move(code_root)); - - for (auto it = root->children().cbegin(); it != root->children().cend(); - ++it) { - code_root_ptr->children.push_back(BuildCodeNodes(it->second.get())); - } - return code_root_ptr; } const ShowMultiNode* TFCode::ShowInternal(const Options& opts, Timeline* timeline) { - std::vector roots = Account(root_->children, opts); root_->ResetTotalStats(); + if (opts.output_type == kOutput[3]) { + if (opts.select.size() != 1) { + fprintf(stderr, "Can only select 1 attribute for pprof output.\n"); + return root_.get(); + } + string select = *opts.select.begin(); + if (select != kShown[0] && select != kShown[1] && select != kShown[2] && + select != kShown[3] && select != kShown[9] && select != kShown[10]) { + fprintf(stderr, "pprof doesn't support -select=%s\n", select.c_str()); + return root_.get(); + } + } + + std::vector roots = Account(root_->children, opts); root_->show_children.clear(); for (CodeNode* n : roots) { root_->AggregateTotalStats(n); @@ -121,21 +392,46 @@ const ShowMultiNode* TFCode::ShowInternal(const Options& opts, CodeNode* root = PrintScope({root_.get()}, opts, 1, 0)[0]; root->formatted_str = FormatLegend(opts) + root->formatted_str; - Format(root->show_children, &root->formatted_str, root->mutable_proto()); - if (timeline) { - timeline->GenerateCodeTimeline(root); + if (opts.output_type == kOutput[3]) { + std::vector call_ids; + pprof_profile_.reset(new PprofProfileImpl(&opts)); + Format(root, root->show_children, opts, &root->formatted_str, + root->mutable_proto(), &call_ids); + Status s = pprof_profile_->WritePprofProfile( + opts.output_options.at(kPprofOpts[0])); + if (!s.ok()) { + fprintf(stderr, "%s\n", s.ToString().c_str()); + } + } else { + Format(root, root->show_children, opts, &root->formatted_str, + root->mutable_proto(), nullptr); + if (timeline) { + timeline->GenerateCodeTimeline(root); + } } return root; } -void TFCode::Format(const std::vector roots, string* display_str, - MultiGraphNodeProto* proto) { - for (CodeNode* node : roots) { +void TFCode::Format(const CodeNode* root, const std::vector& nodes, + const Options& opts, string* display_str, + MultiGraphNodeProto* proto, std::vector* call_ids) { + if (nodes.empty() && root->trace && opts.output_type == kOutput[3]) { + pprof_profile_->AddSample(root, call_ids); + } + + for (CodeNode* node : nodes) { + if (root->trace && opts.output_type == kOutput[3]) { + uint64 loc_id = pprof_profile_->AddLocation(node, root); + call_ids->push_back(loc_id); + } display_str->append(node->formatted_str); MultiGraphNodeProto* child = proto->add_children(); child->MergeFrom(node->proto()); - Format(node->show_children, display_str, child); + Format(node, node->show_children, opts, display_str, child, call_ids); + if (root->trace && opts.output_type == kOutput[3]) { + call_ids->pop_back(); + } } } @@ -170,14 +466,15 @@ std::vector TFCode::PrintScope(const std::vector roots, std::vector show_nodes; for (CodeNode* node : roots) { + if (ShouldTrim(node, opts.trim_name_regexes) || depth > opts.max_depth) { + continue; + } int ident = last_ident; bool show = ShouldShow(node, opts, depth); if (show) ident += 2; - std::vector show_cnodes; - if (!ShouldTrim(node, opts.trim_name_regexes) && depth <= opts.max_depth) { - show_cnodes = PrintScope(node->show_children, opts, depth + 1, ident); - } + std::vector show_cnodes = + PrintScope(node->show_children, opts, depth + 1, ident); if (show) { node->show_children.clear(); if (opts.account_displayed_op_only) { diff --git a/tensorflow/core/profiler/internal/tfprof_code.h b/tensorflow/core/profiler/internal/tfprof_code.h index 73382972219..7583a43a26f 100644 --- a/tensorflow/core/profiler/internal/tfprof_code.h +++ b/tensorflow/core/profiler/internal/tfprof_code.h @@ -32,15 +32,29 @@ limitations under the License. #include "tensorflow/core/profiler/internal/tfprof_show_multi.h" #include "tensorflow/core/profiler/internal/tfprof_timeline.h" #include "tensorflow/core/profiler/internal/tfprof_utils.h" +#include "tensorflow/core/profiler/profile.pb.h" #include "tensorflow/core/profiler/tfprof_log.pb.h" #include "tensorflow/core/profiler/tfprof_output.pb.h" namespace tensorflow { namespace tfprof { +class PprofProfile { + public: + virtual ~PprofProfile() {} + + virtual uint64 AddLocation(const CodeNode* callee, + const CodeNode* caller) = 0; + + virtual void AddSample(const CodeNode* leaf, + std::vector* call_ids) = 0; + + virtual Status WritePprofProfile(const string& filename) = 0; +}; + class TFCode : public TFMultiShow { public: - explicit TFCode() : code_root_(nullptr), trace_root_(nullptr) {} + TFCode() {} ~TFCode() override {} void AddNode(TFGraphNode* node) override; @@ -48,8 +62,6 @@ class TFCode : public TFMultiShow { void Build() override; private: - CodeNode* BuildCodeNodes(TFMultiGraphNode* root); - const ShowMultiNode* ShowInternal(const Options& opts, Timeline* timeline) override; @@ -63,16 +75,15 @@ class TFCode : public TFMultiShow { std::vector Account(const std::vector& roots, const Options& opts); - void Format(const std::vector roots, string* display_str, - MultiGraphNodeProto* proto); + void Format(const CodeNode* root, const std::vector& nodes, + const Options& opts, string* display_str, + MultiGraphNodeProto* proto, std::vector* call_ids); string FormatNode(CodeNode* node, const Options& opts, int64 indent); std::unique_ptr root_; - CodeNode* code_root_; - std::unique_ptr trace_root_; - std::unique_ptr tfprof_trace_root_; - std::set> code_nodes_; + std::unique_ptr graph_root_; + std::unique_ptr pprof_profile_; }; } // namespace tfprof } // namespace tensorflow diff --git a/tensorflow/core/profiler/internal/tfprof_graph.cc b/tensorflow/core/profiler/internal/tfprof_graph.cc index 8d7c44b219e..e58924a6146 100644 --- a/tensorflow/core/profiler/internal/tfprof_graph.cc +++ b/tensorflow/core/profiler/internal/tfprof_graph.cc @@ -72,6 +72,11 @@ void TFGraph::Build() { const ShowNode* TFGraph::ShowInternal(const Options& opts, Timeline* timeline) { root_->ResetTotalStats(); root_->show_children.clear(); + + if (opts.output_type == kOutput[3]) { + fprintf(stderr, "Only 'code' view supports pprof output now.\n"); + return root_; + } if (timeline && timeline->step() < 0) { // TODO(xpan): Maybe pick a default step for users. fprintf(stderr, diff --git a/tensorflow/core/profiler/internal/tfprof_node.h b/tensorflow/core/profiler/internal/tfprof_node.h index 9142ad51c55..929ee3f50c1 100644 --- a/tensorflow/core/profiler/internal/tfprof_node.h +++ b/tensorflow/core/profiler/internal/tfprof_node.h @@ -340,6 +340,27 @@ class TFGraphNode { return exec->second.allocator_bytes_in_use(); } + int64 parameters() const { + if (!shape().empty()) { + int64 params = 1; + bool complete_shape = true; + for (int64 d : shape()) { + // Sometimes parameters could be <0 when a dim is unknown. + if (d < 0) { + complete_shape = false; + break; + } + params *= d; + } + if (complete_shape) { + return params; + } else { + fprintf(stderr, "Incomplete shape.\n"); + } + } + return 0; + } + int64 float_ops(int64 step) const { // If not run, return static analysis. if (execs_.empty()) { @@ -400,12 +421,14 @@ class TFMultiGraphNode { public: TFMultiGraphNode(const string& name) : name_(name), + step_(-1), run_count_(0), exec_micros_(0), accelerator_exec_micros_(0), cpu_exec_micros_(0), requested_bytes_(0), - float_ops_(0) {} + float_ops_(0), + parameters_(0) {} bool SnapshotNodes(int64 step, const std::vector& type_regexes) { run_count_ = 0; @@ -415,11 +438,13 @@ class TFMultiGraphNode { requested_bytes_ = 0; float_ops_ = 0; + parameters_ = 0; op_types_.clear(); shapes_.clear(); devices_.clear(); snapshot_nodes_.clear(); + step_ = step; std::vector nodes = pick_nodes(type_regexes); if (nodes.empty()) { @@ -436,6 +461,7 @@ class TFMultiGraphNode { requested_bytes_ += node->requested_bytes(step); float_ops_ += node->float_ops(step); + parameters_ += node->parameters(); if (node->shape().size() > 0) { shapes_.push_back(node->shape()); } @@ -445,6 +471,8 @@ class TFMultiGraphNode { return true; } + int64 step() const { return step_; } + void AddGraphNode(const TFGraphNode* node) { if (nodes_.find(node->name()) != nodes_.end()) { return; @@ -456,16 +484,6 @@ class TFMultiGraphNode { return snapshot_nodes_; } - void AddChildren(const string& name) { - if (children_.find(name) != children_.end()) { - return; - } - children_[name].reset(new TFMultiGraphNode(name)); - } - const std::map>& children() const { - return children_; - } - const string& name() const { return name_; } int64 run_count() const { return run_count_; } @@ -477,6 +495,8 @@ class TFMultiGraphNode { int64 float_ops() const { return float_ops_; } + int64 parameters() const { return parameters_; } + const std::set& devices() const { return devices_; } const std::set& op_types() const { return op_types_; } @@ -511,6 +531,7 @@ class TFMultiGraphNode { } const string name_; + int64 step_; // Snapshot based on type_regexes std::set op_types_; int64 run_count_; @@ -520,13 +541,13 @@ class TFMultiGraphNode { int64 requested_bytes_; int64 float_ops_; + int64 parameters_; std::set devices_; std::vector> shapes_; std::map snapshot_nodes_; // Overall data held by the TFMultiGraphNode. std::map nodes_; - std::map> children_; }; bool IsPlacedOnAccelerator(const string& device); diff --git a/tensorflow/core/profiler/internal/tfprof_node_show.cc b/tensorflow/core/profiler/internal/tfprof_node_show.cc index 5ca57412e52..16b94fdfa1e 100644 --- a/tensorflow/core/profiler/internal/tfprof_node_show.cc +++ b/tensorflow/core/profiler/internal/tfprof_node_show.cc @@ -45,25 +45,7 @@ void ShowNode::ReInit(int64 step) { (*mutable_proto()->mutable_input_shapes())[inp.first].MergeFrom( VecToShapeProto(inp.second)); } - - proto_.clear_parameters(); - if (!node->shape().empty()) { - int64 params = 1; - bool complete_shape = true; - for (int64 d : node->shape()) { - // Sometimes parameters could be <0 when a dim is unknown. - if (d < 0) { - complete_shape = false; - break; - } - params *= d; - } - if (complete_shape) { - mutable_proto()->set_parameters(proto_.parameters() + params); - } else { - fprintf(stderr, "Incomplete shape."); - } - } + proto_.set_parameters(node->parameters()); } GraphNodeProto* ShowNode::mutable_proto() { return &proto_; } @@ -114,6 +96,8 @@ void ShowNode::AddSelfToTotalStats() { } void ShowNode::ResetTotalStats() { + formatted_str.clear(); + mutable_proto()->set_total_definition_count(0); mutable_proto()->set_total_run_count(0); mutable_proto()->set_total_exec_micros(0); @@ -153,26 +137,7 @@ bool ShowMultiNode::ReInit(int64 step, mutable_proto()->set_requested_bytes(node->requested_bytes()); mutable_proto()->set_float_ops(node->float_ops()); - mutable_proto()->clear_parameters(); - if (!node->shapes().empty()) { - for (const std::vector& shape : node->shapes()) { - int64 params = 1; - bool complete_shape = true; - for (int64 d : shape) { - // Sometimes parameters could be <0 when a dim is unknown. - if (d < 0) { - complete_shape = false; - break; - } - params *= d; - } - if (complete_shape) { - mutable_proto()->set_parameters(proto().parameters() + params); - } else { - fprintf(stderr, "Incomplete shape."); - } - } - } + mutable_proto()->set_parameters(node->parameters()); return has_matched_type; } @@ -216,6 +181,7 @@ void ShowMultiNode::AddSelfToTotalStats() { } void ShowMultiNode::ResetTotalStats() { + formatted_str.clear(); mutable_proto()->set_total_exec_micros(0); mutable_proto()->set_total_accelerator_exec_micros(0); mutable_proto()->set_total_cpu_exec_micros(0); diff --git a/tensorflow/core/profiler/internal/tfprof_node_show.h b/tensorflow/core/profiler/internal/tfprof_node_show.h index fea19bdca3a..cdcb3f499bb 100644 --- a/tensorflow/core/profiler/internal/tfprof_node_show.h +++ b/tensorflow/core/profiler/internal/tfprof_node_show.h @@ -111,11 +111,31 @@ class ShowMultiNode { class CodeNode : public ShowMultiNode { public: - explicit CodeNode(TFMultiGraphNode* node) : ShowMultiNode(node) {} + explicit CodeNode(TFMultiGraphNode* node, const CodeDef::Trace* trace) + : ShowMultiNode(node), trace(trace) {} ~CodeNode() override {} + CodeNode* AddChildren(const string& name, const CodeDef::Trace* trace) { + auto it = children_.find(name); + if (it != children_.end()) { + return it->second.get(); + } + + graph_children_.push_back( + std::unique_ptr(new TFMultiGraphNode(name))); + auto child = &children_[name]; + child->reset(new CodeNode(graph_children_.back().get(), trace)); + children.push_back(child->get()); + return child->get(); + } + + const CodeDef::Trace* trace; std::vector children; std::vector show_children; + + private: + std::vector> graph_children_; + std::map> children_; }; class OpNode : public ShowMultiNode { diff --git a/tensorflow/core/profiler/internal/tfprof_op.cc b/tensorflow/core/profiler/internal/tfprof_op.cc index 46a81da80fd..ab013506ece 100644 --- a/tensorflow/core/profiler/internal/tfprof_op.cc +++ b/tensorflow/core/profiler/internal/tfprof_op.cc @@ -103,8 +103,13 @@ void TFOp::Build() { } const ShowMultiNode* TFOp::ShowInternal(const Options& opts, - Timeline* timeline) { + Timeline* timeline) { root_->ResetTotalStats(); + if (opts.output_type == kOutput[3]) { + fprintf(stderr, "Only 'code' view supports pprof output now.\n"); + return root_.get(); + } + if (opts.output_type == kOutput[1] || opts.output_type == kOutput[2]) { root_->formatted_str = FormatNode(root_.get(), root_.get(), opts); } diff --git a/tensorflow/core/profiler/internal/tfprof_options.cc b/tensorflow/core/profiler/internal/tfprof_options.cc index 53e401dd600..2b5e340cecb 100644 --- a/tensorflow/core/profiler/internal/tfprof_options.cc +++ b/tensorflow/core/profiler/internal/tfprof_options.cc @@ -84,6 +84,13 @@ tensorflow::Status ParseOutput(const string& output_opt, string* output_type, required_options.insert(kFileRequiredOpts, kFileRequiredOpts + sizeof(kFileRequiredOpts) / sizeof(*kFileRequiredOpts)); + } else if (*output_type == kOutput[3]) { + valid_options.insert(kPprofOpts, + kPprofOpts + sizeof(kPprofOpts) / sizeof(*kPprofOpts)); + required_options.insert( + kPprofRequiredOpts, + kPprofRequiredOpts + + sizeof(kPprofRequiredOpts) / sizeof(*kPprofRequiredOpts)); } for (const string& kv_str : kv_split) { diff --git a/tensorflow/core/profiler/internal/tfprof_options.h b/tensorflow/core/profiler/internal/tfprof_options.h index 6d0c213b3d8..8e78ee74639 100644 --- a/tensorflow/core/profiler/internal/tfprof_options.h +++ b/tensorflow/core/profiler/internal/tfprof_options.h @@ -62,7 +62,8 @@ static const char* const kCmds[] = { "scope", "graph", "code", "op", "advise", "set", "help", }; -static const char* const kOutput[] = {"timeline", "stdout", "file", "none"}; +static const char* const kOutput[] = {"timeline", "stdout", "file", "pprof", + "none"}; static const char* const kTimelineOpts[] = { "outfile", @@ -78,6 +79,14 @@ static const char* const kFileRequiredOpts[] = { "outfile", }; +static const char* const kPprofOpts[] = { + "outfile", +}; + +static const char* const kPprofRequiredOpts[] = { + "outfile", +}; + struct Options { public: static tensorflow::Status FromProtoStr(const string& opts_proto_str, diff --git a/tensorflow/core/profiler/internal/tfprof_scope.cc b/tensorflow/core/profiler/internal/tfprof_scope.cc index 0f7e079098f..d7293c5e52a 100644 --- a/tensorflow/core/profiler/internal/tfprof_scope.cc +++ b/tensorflow/core/profiler/internal/tfprof_scope.cc @@ -78,8 +78,13 @@ void TFScope::Build() { } const ShowNode* TFScope::ShowInternal(const Options& opts, Timeline* timeline) { - std::vector roots = Account(root_->children, opts); root_->ResetTotalStats(); + if (opts.output_type == kOutput[3]) { + fprintf(stderr, "Only 'code' view supports pprof output now.\n"); + return root_; + } + + std::vector roots = Account(root_->children, opts); root_->show_children.clear(); for (ScopeNode* n : roots) { root_->AggregateTotalStats(n); diff --git a/tensorflow/core/profiler/internal/tfprof_show.cc b/tensorflow/core/profiler/internal/tfprof_show.cc index 2828217d3db..630eba4ff2e 100644 --- a/tensorflow/core/profiler/internal/tfprof_show.cc +++ b/tensorflow/core/profiler/internal/tfprof_show.cc @@ -26,25 +26,27 @@ namespace tensorflow { namespace tfprof { const GraphNodeProto& TFShow::Show(const Options& opts) { - if (opts.output_type == kOutput[3]) { - return ShowInternal(opts, nullptr)->proto(); - } else if (opts.output_type == kOutput[0]) { + if (opts.output_type == kOutput[0]) { Timeline timeline(opts.step, opts.output_options.at(kTimelineOpts[0])); return ShowInternal(opts, &timeline)->proto(); - } else if (opts.output_type == kOutput[2]) { - const ShowNode* root = ShowInternal(opts, nullptr); - Status s = - WriteStringToFile(Env::Default(), opts.output_options.at(kFileOpts[0]), - root->formatted_str); - if (!s.ok()) { - fprintf(stderr, "%s\n", s.ToString().c_str()); - } - return root->proto(); } else { - const ShowNode* root = ShowInternal(opts, nullptr); - printf("%s", root->formatted_str.c_str()); - fflush(stdout); - return root->proto(); + const ShowNode* ret = ShowInternal(opts, nullptr); + if (opts.output_type == kOutput[1]) { + printf("%s", ret->formatted_str.c_str()); + fflush(stdout); + } else if (opts.output_type == kOutput[2]) { + Status s = WriteStringToFile(Env::Default(), + opts.output_options.at(kFileOpts[0]), + ret->formatted_str); + if (!s.ok()) { + fprintf(stderr, "%s\n", s.ToString().c_str()); + } + } else if (opts.output_type == kOutput[3] || + opts.output_type == kOutput[4]) { + } else { + fprintf(stderr, "Unknown output type: %s\n", opts.output_type.c_str()); + } + return ret->proto(); } } diff --git a/tensorflow/core/profiler/internal/tfprof_show_multi.cc b/tensorflow/core/profiler/internal/tfprof_show_multi.cc index 199aef76859..34b3e9e3f07 100644 --- a/tensorflow/core/profiler/internal/tfprof_show_multi.cc +++ b/tensorflow/core/profiler/internal/tfprof_show_multi.cc @@ -28,25 +28,27 @@ namespace tensorflow { namespace tfprof { const MultiGraphNodeProto& TFMultiShow::Show(const Options& opts) { - if (opts.output_type == kOutput[3]) { - return ShowInternal(opts, nullptr)->proto(); - } else if (opts.output_type == kOutput[0]) { + if (opts.output_type == kOutput[0]) { Timeline timeline(opts.step, opts.output_options.at(kTimelineOpts[0])); return ShowInternal(opts, &timeline)->proto(); - } else if (opts.output_type == kOutput[2]) { - const ShowMultiNode* root = ShowInternal(opts, nullptr); - Status s = - WriteStringToFile(Env::Default(), opts.output_options.at(kFileOpts[0]), - root->formatted_str); - if (!s.ok()) { - fprintf(stderr, "%s\n", s.ToString().c_str()); - } - return root->proto(); } else { - const ShowMultiNode* root = ShowInternal(opts, nullptr); - printf("%s", root->formatted_str.c_str()); - fflush(stdout); - return root->proto(); + const ShowMultiNode* ret = ShowInternal(opts, nullptr); + if (opts.output_type == kOutput[1]) { + printf("%s", ret->formatted_str.c_str()); + fflush(stdout); + } else if (opts.output_type == kOutput[2]) { + Status s = WriteStringToFile(Env::Default(), + opts.output_options.at(kFileOpts[0]), + ret->formatted_str); + if (!s.ok()) { + fprintf(stderr, "%s\n", s.ToString().c_str()); + } + } else if (opts.output_type == kOutput[3] || + opts.output_type == kOutput[4]) { + } else { + fprintf(stderr, "Unknown output type: %s\n", opts.output_type.c_str()); + } + return ret->proto(); } } diff --git a/tensorflow/core/profiler/profile.proto b/tensorflow/core/profiler/profile.proto new file mode 100644 index 00000000000..27aa904c4a5 --- /dev/null +++ b/tensorflow/core/profiler/profile.proto @@ -0,0 +1,71 @@ +// This proto intends to match format expected by pprof tool. +syntax = "proto3"; + +package tensorflow.tfprof.pprof; + +message Profile { + repeated ValueType sample_type = 1; + repeated Sample sample = 2; + repeated Mapping mapping = 3; + repeated Location location = 4; + repeated Function function = 5; + repeated string string_table = 6; + int64 drop_frames = 7; + int64 keep_frames = 8; + int64 time_nanos = 9; + int64 duration_nanos = 10; + ValueType period_type = 11; + int64 period = 12; + repeated int64 comment = 13; + int64 default_sample_type = 14; +} + +message ValueType { + int64 type = 1; + int64 unit = 2; +} + +message Sample { + repeated uint64 location_id = 1; + repeated int64 value = 2; + repeated Label label = 3; +} + +message Label { + int64 key = 1; + int64 str = 2; + int64 num = 3; +} + +message Mapping { + uint64 id = 1; + uint64 memory_start = 2; + uint64 memory_limit = 3; + uint64 file_offset = 4; + int64 filename = 5; + int64 build_id = 6; + bool has_functions = 7; + bool has_filenames = 8; + bool has_line_numbers = 9; + bool has_inline_frames = 10; +} + +message Location { + uint64 id = 1; + uint64 mapping_id = 2; + uint64 address = 3; + repeated Line line = 4; +} + +message Line { + uint64 function_id = 1; + int64 line = 2; +} + +message Function { + uint64 id = 1; + int64 name = 2; + int64 system_name = 3; + int64 filename = 4; + int64 start_line = 5; +} diff --git a/tensorflow/core/profiler/tfprof_log.proto b/tensorflow/core/profiler/tfprof_log.proto index 048449b4371..006ee2b7a5b 100644 --- a/tensorflow/core/profiler/tfprof_log.proto +++ b/tensorflow/core/profiler/tfprof_log.proto @@ -10,6 +10,7 @@ message CodeDef { int32 lineno = 2; string function = 3; string line = 4; + int32 func_start_line = 5; } } diff --git a/tensorflow/python/profiler/model_analyzer_test.py b/tensorflow/python/profiler/model_analyzer_test.py index 43da587b2c7..7c55f9eaf32 100644 --- a/tensorflow/python/profiler/model_analyzer_test.py +++ b/tensorflow/python/profiler/model_analyzer_test.py @@ -17,7 +17,11 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import gzip +import io import os + +from tensorflow.core.profiler import profile_pb2 from tensorflow.core.protobuf import config_pb2 from tensorflow.core.protobuf import rewriter_config_pb2 from tensorflow.python.client import session @@ -200,7 +204,6 @@ class PrintModelAnalysisTest(test.TestCase): def testTimeline(self): ops.reset_default_graph() - opts = builder.trainable_variables_parameter() outfile = os.path.join(test.get_temp_dir(), 'timeline') opts = (builder(builder.trainable_variables_parameter()) .with_max_depth(100000) @@ -312,6 +315,61 @@ class PrintModelAnalysisTest(test.TestCase): checker = advice_pb.checkers['ExpensiveOperationChecker'] self.assertGreater(len(checker.reports), 0) + def pprof_test_helper(self, attribute, should_fail=False): + ops.reset_default_graph() + outfile = os.path.join(test.get_temp_dir(), attribute + '_pprof.pb.gz') + opts = (builder(builder.time_and_memory()) + .select([attribute]) + .with_max_depth(100000) + .with_node_names(trim_name_regexes=['ops.py.*']) + .with_pprof_output(outfile).build()) + + with session.Session() as sess: + x = lib.BuildFullModel() + + sess.run(variables.global_variables_initializer()) + run_meta = config_pb2.RunMetadata() + _ = sess.run( + x, + options=config_pb2.RunOptions( + trace_level=config_pb2.RunOptions.FULL_TRACE), + run_metadata=run_meta) + + _ = model_analyzer.profile( + sess.graph, run_meta, cmd='code', options=opts) + + if should_fail: + self.assertFalse(gfile.Exists(outfile)) + return + + profile_pb = profile_pb2.Profile() + with gfile.Open(outfile, 'rb') as f: + with gzip.GzipFile(fileobj=io.BytesIO(f.read())) as gzipf: + profile_pb.ParseFromString(gzipf.read()) + + self.assertGreater(len(profile_pb.sample), 10) + self.assertGreater(len(profile_pb.location), 10) + self.assertGreater(len(profile_pb.function), 10) + self.assertGreater(len(profile_pb.string_table), 30) + + has_rnn = False + has_loop = False + for s in profile_pb.string_table: + if s.find('rnn') > 0: + has_rnn = True + if s.find('while') > 0: + has_loop = True + self.assertFalse(s.startswith('ops.py')) + self.assertTrue(has_rnn) + self.assertTrue(has_loop) + + def testPprof(self): + for attr in ['micros', 'bytes', 'accelerator_micros', 'cpu_micros', + 'params', 'float_ops']: + self.pprof_test_helper(attr) + for attr in ['op_types', 'device', 'input_shapes']: + self.pprof_test_helper(attr, True) + if __name__ == '__main__': test.main() diff --git a/tensorflow/python/profiler/option_builder.py b/tensorflow/python/profiler/option_builder.py index 87f82709bed..1a91060da8a 100644 --- a/tensorflow/python/profiler/option_builder.py +++ b/tensorflow/python/profiler/option_builder.py @@ -353,6 +353,20 @@ class ProfileOptionBuilder(object): self._options['output'] = 'timeline:outfile=%s' % timeline_file return self + def with_pprof_output(self, pprof_file): + """Generate a pprof profile gzip file. + + To use the pprof file: + pprof -png --nodecount=20 --sample_index=1 + + Args: + pprof_file: filename for output, usually suffixed with .pb.gz. + Returns: + self. + """ + self._options['output'] = 'pprof:outfile=%s' % pprof_file + return self + def order_by(self, attribute): # pylint: disable=line-too-long """Order the displayed profiler nodes based on a attribute. diff --git a/tensorflow/python/profiler/tfprof_logger.py b/tensorflow/python/profiler/tfprof_logger.py index e50c52884aa..675eb98f8e8 100644 --- a/tensorflow/python/profiler/tfprof_logger.py +++ b/tensorflow/python/profiler/tfprof_logger.py @@ -98,12 +98,13 @@ def _get_logged_ops(graph, run_meta=None, add_trace=True, add_entry = True if add_trace: - for tb in op.traceback: + for tb in op.traceback_with_start_lines: trace = entry.code_def.traces.add() trace.file = tb[0] if tb[0] else 'none' trace.lineno = tb[1] if tb[1] else -1 trace.function = tb[2] if tb[2] else 'none' trace.line = tb[3] if tb[3] else 'none' + trace.func_start_line = tb[4] if tb[4] else -1 add_entry = True if add_entry: diff --git a/tensorflow/tools/api/golden/tensorflow.profiler.-profile-option-builder.pbtxt b/tensorflow/tools/api/golden/tensorflow.profiler.-profile-option-builder.pbtxt index 347187a8902..862b2aa7cc0 100644 --- a/tensorflow/tools/api/golden/tensorflow.profiler.-profile-option-builder.pbtxt +++ b/tensorflow/tools/api/golden/tensorflow.profiler.-profile-option-builder.pbtxt @@ -74,6 +74,10 @@ tf_class { name: "with_node_names" argspec: "args=[\'self\', \'start_name_regexes\', \'show_name_regexes\', \'hide_name_regexes\', \'trim_name_regexes\'], varargs=None, keywords=None, defaults=[\'None\', \'None\', \'None\', \'None\'], " } + member_method { + name: "with_pprof_output" + argspec: "args=[\'self\', \'pprof_file\'], varargs=None, keywords=None, defaults=None" + } member_method { name: "with_stdout_output" argspec: "args=[\'self\'], varargs=None, keywords=None, defaults=None"