Output a summary of all runs of different performance options.
PiperOrigin-RevId: 260844911
This commit is contained in:
parent
e075d8095f
commit
0505299448
@ -130,6 +130,7 @@ cc_library(
|
|||||||
":benchmark_model_lib",
|
":benchmark_model_lib",
|
||||||
":benchmark_utils",
|
":benchmark_utils",
|
||||||
":logging",
|
":logging",
|
||||||
|
"//tensorflow/core:stats_calculator_portable",
|
||||||
"//tensorflow/lite/profiling:time",
|
"//tensorflow/lite/profiling:time",
|
||||||
"//tensorflow/lite/tools:command_line_flags",
|
"//tensorflow/lite/tools:command_line_flags",
|
||||||
],
|
],
|
||||||
|
@ -16,7 +16,12 @@ limitations under the License.
|
|||||||
#include "tensorflow/lite/tools/benchmark/benchmark_performance_options.h"
|
#include "tensorflow/lite/tools/benchmark/benchmark_performance_options.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <memory>
|
||||||
|
#include <sstream>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "tensorflow/core/util/stats_calculator.h"
|
||||||
#include "tensorflow/lite/profiling/time.h"
|
#include "tensorflow/lite/profiling/time.h"
|
||||||
#include "tensorflow/lite/tools/benchmark/benchmark_utils.h"
|
#include "tensorflow/lite/tools/benchmark/benchmark_utils.h"
|
||||||
#include "tensorflow/lite/tools/benchmark/logging.h"
|
#include "tensorflow/lite/tools/benchmark/logging.h"
|
||||||
@ -25,6 +30,62 @@ limitations under the License.
|
|||||||
namespace tflite {
|
namespace tflite {
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
|
|
||||||
|
void MultiRunStatsRecorder::OnBenchmarkStart(const BenchmarkParams& params) {
|
||||||
|
current_run_name_.clear();
|
||||||
|
|
||||||
|
if (params.Get<bool>("use_nnapi")) {
|
||||||
|
current_run_name_ = "nnapi";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.Get<bool>("use_gpu")) {
|
||||||
|
current_run_name_ = "gpu";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle cases run on CPU
|
||||||
|
// Note: could use std::to_string to convert an integer to string but it
|
||||||
|
// requires C++11.
|
||||||
|
std::stringstream sstm;
|
||||||
|
sstm << "cpu w/ " << params.Get<int32_t>("num_threads") << " threads";
|
||||||
|
current_run_name_ = sstm.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiRunStatsRecorder::OnBenchmarkEnd(const BenchmarkResults& results) {
|
||||||
|
each_run_stats_.emplace_back(std::make_pair(current_run_name_, results));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiRunStatsRecorder::OutputStats() {
|
||||||
|
// Make a 80-character-long header.
|
||||||
|
TFLITE_LOG(INFO) << "\n==============Summary of All Runs w/ Different "
|
||||||
|
"Performance Options==============";
|
||||||
|
std::sort(each_run_stats_.begin(), each_run_stats_.end(),
|
||||||
|
EachRunStatsEntryComparator());
|
||||||
|
|
||||||
|
for (const auto& run_stats : each_run_stats_) {
|
||||||
|
std::stringstream stream;
|
||||||
|
// Output the name of this run first.
|
||||||
|
stream << std::setw(26) << run_stats.first << ": ";
|
||||||
|
run_stats.second.inference_time_us().OutputToStream(&stream);
|
||||||
|
TFLITE_LOG(INFO) << stream.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BenchmarkPerformanceOptions::BenchmarkPerformanceOptions(
|
||||||
|
BenchmarkModel* single_option_run)
|
||||||
|
: BenchmarkPerformanceOptions(DefaultParams(), single_option_run,
|
||||||
|
DefaultRunStatsRecorder()) {}
|
||||||
|
|
||||||
|
BenchmarkPerformanceOptions::BenchmarkPerformanceOptions(
|
||||||
|
BenchmarkParams params, BenchmarkModel* single_option_run,
|
||||||
|
std::unique_ptr<MultiRunStatsRecorder> all_run_stats)
|
||||||
|
: params_(std::move(params)),
|
||||||
|
single_option_run_(single_option_run),
|
||||||
|
single_option_run_params_(single_option_run->mutable_params()),
|
||||||
|
all_run_stats_(std::move(all_run_stats)) {
|
||||||
|
single_option_run_->AddListener(all_run_stats_.get());
|
||||||
|
}
|
||||||
|
|
||||||
BenchmarkParams BenchmarkPerformanceOptions::DefaultParams() {
|
BenchmarkParams BenchmarkPerformanceOptions::DefaultParams() {
|
||||||
BenchmarkParams params;
|
BenchmarkParams params;
|
||||||
params.AddParam("perf_options_list",
|
params.AddParam("perf_options_list",
|
||||||
@ -34,6 +95,11 @@ BenchmarkParams BenchmarkPerformanceOptions::DefaultParams() {
|
|||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<MultiRunStatsRecorder>
|
||||||
|
BenchmarkPerformanceOptions::DefaultRunStatsRecorder() {
|
||||||
|
return std::unique_ptr<MultiRunStatsRecorder>(new MultiRunStatsRecorder());
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Flag> BenchmarkPerformanceOptions::GetFlags() {
|
std::vector<Flag> BenchmarkPerformanceOptions::GetFlags() {
|
||||||
return {
|
return {
|
||||||
CreateFlag<std::string>(
|
CreateFlag<std::string>(
|
||||||
@ -154,6 +220,12 @@ void BenchmarkPerformanceOptions::Run(int argc, char** argv) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Run();
|
||||||
|
|
||||||
|
all_run_stats_->OutputStats();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BenchmarkPerformanceOptions::Run() {
|
||||||
TFLITE_LOG(INFO) << "The list of TFLite runtime options to be benchmarked: ["
|
TFLITE_LOG(INFO) << "The list of TFLite runtime options to be benchmarked: ["
|
||||||
<< params_.Get<std::string>("perf_options_list") << "]";
|
<< params_.Get<std::string>("perf_options_list") << "]";
|
||||||
|
|
||||||
|
@ -16,31 +16,55 @@ limitations under the License.
|
|||||||
#ifndef TENSORFLOW_LITE_TOOLS_BENCHMARK_BENCHMARK_PERFORMANCE_OPTIONS_H_
|
#ifndef TENSORFLOW_LITE_TOOLS_BENCHMARK_BENCHMARK_PERFORMANCE_OPTIONS_H_
|
||||||
#define TENSORFLOW_LITE_TOOLS_BENCHMARK_BENCHMARK_PERFORMANCE_OPTIONS_H_
|
#define TENSORFLOW_LITE_TOOLS_BENCHMARK_BENCHMARK_PERFORMANCE_OPTIONS_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "tensorflow/lite/tools/benchmark/benchmark_model.h"
|
#include "tensorflow/lite/tools/benchmark/benchmark_model.h"
|
||||||
|
|
||||||
namespace tflite {
|
namespace tflite {
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
|
|
||||||
|
class MultiRunStatsRecorder : public BenchmarkListener {
|
||||||
|
public:
|
||||||
|
void OnBenchmarkStart(const BenchmarkParams& params) override;
|
||||||
|
void OnBenchmarkEnd(const BenchmarkResults& results) override;
|
||||||
|
|
||||||
|
virtual void OutputStats();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
using EachRunStatsEntry = std::pair<std::string, BenchmarkResults>;
|
||||||
|
|
||||||
|
// Use this to order the runs by the average inference time in increasing
|
||||||
|
// order (i.e. the fastest run ranks first.)
|
||||||
|
struct EachRunStatsEntryComparator {
|
||||||
|
bool operator()(const EachRunStatsEntry& i, const EachRunStatsEntry& j) {
|
||||||
|
return (i.second.inference_time_us().avg() <
|
||||||
|
j.second.inference_time_us().avg());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string current_run_name_;
|
||||||
|
std::vector<EachRunStatsEntry> each_run_stats_;
|
||||||
|
};
|
||||||
|
|
||||||
// Benchmarks all performance options on a model by repeatedly invoking the
|
// Benchmarks all performance options on a model by repeatedly invoking the
|
||||||
// single-performance-option run on a passed-in 'BenchmarkModel' object.
|
// single-performance-option run on a passed-in 'BenchmarkModel' object.
|
||||||
class BenchmarkPerformanceOptions {
|
class BenchmarkPerformanceOptions {
|
||||||
public:
|
public:
|
||||||
// Doesn't own the memory of 'single_option_run'.
|
// Doesn't own the memory of 'single_option_run'.
|
||||||
explicit BenchmarkPerformanceOptions(BenchmarkModel* single_option_run)
|
explicit BenchmarkPerformanceOptions(BenchmarkModel* single_option_run);
|
||||||
: BenchmarkPerformanceOptions(DefaultParams(), single_option_run) {}
|
|
||||||
|
|
||||||
BenchmarkPerformanceOptions(BenchmarkParams params,
|
|
||||||
BenchmarkModel* single_option_run)
|
|
||||||
: params_(std::move(params)),
|
|
||||||
single_option_run_(single_option_run),
|
|
||||||
single_option_run_params_(single_option_run->mutable_params()) {}
|
|
||||||
|
|
||||||
virtual ~BenchmarkPerformanceOptions() {}
|
virtual ~BenchmarkPerformanceOptions() {}
|
||||||
|
|
||||||
virtual void Run(int argc, char** argv);
|
void Run(int argc, char** argv);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static BenchmarkParams DefaultParams();
|
static BenchmarkParams DefaultParams();
|
||||||
|
static std::unique_ptr<MultiRunStatsRecorder> DefaultRunStatsRecorder();
|
||||||
|
|
||||||
|
BenchmarkPerformanceOptions(
|
||||||
|
BenchmarkParams params, BenchmarkModel* single_option_run,
|
||||||
|
std::unique_ptr<MultiRunStatsRecorder> all_run_stats);
|
||||||
|
|
||||||
// Unparsable flags will remain in 'argv' in the original order and 'argc'
|
// Unparsable flags will remain in 'argv' in the original order and 'argc'
|
||||||
// will be updated accordingly.
|
// will be updated accordingly.
|
||||||
@ -50,8 +74,9 @@ class BenchmarkPerformanceOptions {
|
|||||||
bool ParsePerfOptions();
|
bool ParsePerfOptions();
|
||||||
virtual std::vector<std::string> GetValidPerfOptions() const;
|
virtual std::vector<std::string> GetValidPerfOptions() const;
|
||||||
bool HasOption(const std::string& option) const;
|
bool HasOption(const std::string& option) const;
|
||||||
virtual void ResetPerformanceOptions();
|
|
||||||
|
|
||||||
|
virtual void Run();
|
||||||
|
virtual void ResetPerformanceOptions();
|
||||||
virtual void BenchmarkCPUOptions();
|
virtual void BenchmarkCPUOptions();
|
||||||
virtual void BenchmarkGPUOptions();
|
virtual void BenchmarkGPUOptions();
|
||||||
virtual void BenchmarkNnapiOptions();
|
virtual void BenchmarkNnapiOptions();
|
||||||
@ -62,6 +87,8 @@ class BenchmarkPerformanceOptions {
|
|||||||
// The object that drives a single-performance-option run.
|
// The object that drives a single-performance-option run.
|
||||||
BenchmarkModel* const single_option_run_; // Doesn't own the memory.
|
BenchmarkModel* const single_option_run_; // Doesn't own the memory.
|
||||||
BenchmarkParams* const single_option_run_params_; // Doesn't own the memory.
|
BenchmarkParams* const single_option_run_params_; // Doesn't own the memory.
|
||||||
|
|
||||||
|
std::unique_ptr<MultiRunStatsRecorder> all_run_stats_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace benchmark
|
} // namespace benchmark
|
||||||
|
Loading…
Reference in New Issue
Block a user