Files
openvino/samples/cpp/benchmark/sync_benchmark/main.cpp
T
Zlobin Vladimir 67d25d7099 Add benchmark samples (#13388)
* Add sync_bnehcmark

* Fix Unix comilation

* niter->time

* Explain main loop

* samples: factor out common

* Code style

* clang-format -i

* return 0; -> return EXIT_SUCCESS;, +x

* Update throughput_benchmark

* Add READMEs

* Fix READMEs refs

* Add sync_benchmark.py

* Add niter, infer_new_request, -pc

* from datetime import timedelta

* Fix niter and seconds_to_run

* Add disclaimer about benchmark_app performance

* Update samples/cpp/benchmark/sync_benchmark/README.md

* Add dynamic_shape_bert_benhcmark

* Add dynamic_shape_detection_benchmark

* Adopt for detr-resnet50

* Remove sync_benchmark2, throughput_benchmark2, perf counters

* clang-format -i

* Fix flake8

* Add README.md

* Add links to sample_dynamic_shape_bert_benchmark

* Add softmax

* nameless LatencyMetrics

* parent.parent -> parents[2]

* Add bert_benhcmark sample

* Code style

* Add bert_benhcmark/README.md

* rm -r samples/python/benchmark/dynamic_shape_bert_benhcmark/

* rm -r samples/cpp/benchmark/dynamic_shape_detection_benchmark/

* bert_benhcmark/README.md: remove dynamic shape

* Remove add_subdirectory(dynamic_shape_detection_benchmark)

* flake8

* samples: Add a note about CUMULATIVE_THROUGHPUT, don’t expect get_property() to throw, don’t introduce json dependency for samples/cpp/common

* / namespace

* Add article

* namespace -> static

* Update README, seconds_ro_run 10, niter 10, no inter alinment

* percentile->median

* benchmark samples: use generate(), align logs, update READMEs

* benchmakr samples: remove percentile()

* samples/python/benchmark/bert_benhcmark/bert_benhcmark.py: report average sequence length and processing time

* Python samples: move requirements.txt to every sample

* Remove numpy from requirements.txt

* Remove Building section from Python samples, install only required extras from openvino-dev, set up environment for bert_benhcmark, report duration for bert_benhcmark

* Install openvino-dev for Hello Reshape SSD C++ Sample
2022-12-05 15:12:53 +04:00

73 lines
2.9 KiB
C++

// Copyright (C) 2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include <string>
#include <vector>
// clang-format off
#include "openvino/openvino.hpp"
#include "samples/args_helper.hpp"
#include "samples/common.hpp"
#include "samples/latency_metrics.hpp"
#include "samples/slog.hpp"
// clang-format on
using Ms = std::chrono::duration<double, std::ratio<1, 1000>>;
int main(int argc, char* argv[]) {
try {
slog::info << "OpenVINO:" << slog::endl;
slog::info << ov::get_openvino_version();
if (argc != 2) {
slog::info << "Usage : " << argv[0] << " <path_to_model>" << slog::endl;
return EXIT_FAILURE;
}
// Optimize for latency. Most of the devices are configured for latency by default,
// but there are exceptions like MYRIAD
ov::AnyMap latency{{ov::hint::performance_mode.name(), ov::hint::PerformanceMode::LATENCY}};
// Create ov::Core and use it to compile a model.
// Pick a device by replacing CPU, for example AUTO:GPU,CPU.
// Using MULTI device is pointless in sync scenario
// because only one instance of ov::InferRequest is used
ov::Core core;
ov::CompiledModel compiled_model = core.compile_model(argv[1], "CPU", latency);
ov::InferRequest ireq = compiled_model.create_infer_request();
// Fill input data for the ireq
for (const ov::Output<const ov::Node>& model_input : compiled_model.inputs()) {
fill_tensor_random(ireq.get_tensor(model_input));
}
// Warm up
ireq.infer();
// Benchmark for seconds_to_run seconds and at least niter iterations
std::chrono::seconds seconds_to_run{10};
size_t niter = 10;
std::vector<double> latencies;
latencies.reserve(niter);
auto start = std::chrono::steady_clock::now();
auto time_point = start;
auto time_point_to_finish = start + seconds_to_run;
while (time_point < time_point_to_finish || latencies.size() < niter) {
ireq.infer();
auto iter_end = std::chrono::steady_clock::now();
latencies.push_back(std::chrono::duration_cast<Ms>(iter_end - time_point).count());
time_point = iter_end;
}
auto end = time_point;
double duration = std::chrono::duration_cast<Ms>(end - start).count();
// Report results
slog::info << "Count: " << latencies.size() << " iterations" << slog::endl
<< "Duration: " << duration << " ms" << slog::endl
<< "Latency:" << slog::endl;
size_t percent = 50;
LatencyMetrics{latencies, "", percent}.write_to_slog();
slog::info << "Throughput: " << double_to_string(latencies.size() * 1000 / duration) << " FPS" << slog::endl;
} catch (const std::exception& ex) {
slog::err << ex.what() << slog::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}