Skip to content

Commit 681bd24

Browse files
committed
Add "Load model ram used (KB)" metric for BAPP
1 parent a84ae96 commit 681bd24

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

samples/cpp/benchmark_app/main.cpp

+87
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,71 @@
3535
#include "remote_tensors_filling.hpp"
3636
#include "statistics_report.hpp"
3737
#include "utils.hpp"
38+
39+
#if defined _WIN32
40+
#include <windows.h>
41+
#include <psapi.h>
42+
#else
43+
#include <fstream>
44+
#include <regex>
45+
#include <sstream>
46+
#endif
47+
3848
// clang-format on
3949

4050
namespace {
51+
52+
#if defined _WIN32
53+
54+
int64_t get_peak_memory_usage() {
55+
PROCESS_MEMORY_COUNTERS mem_counters;
56+
if (!GetProcessMemoryInfo(GetCurrentProcess(), &mem_counters, sizeof(mem_counters))) {
57+
throw std::runtime_error("Can't get system memory values");
58+
}
59+
60+
// Linux tracks memory usage in pages and then converts them to kB.
61+
// Thus, there is always some room for inaccuracy as pages are not guaranteed to be fully used.
62+
// In Windows, the situation is different: the system returns the memory usage in bytes, not in pages.
63+
// To align the output between the two operating systems as closely as possible, we have two options:
64+
// 1. Use rounding to the nearest integer.
65+
// 2. Try to estimate the number of pages used in Windows. However,
66+
// this approach is likely to be inaccurate as well, so option 1 was chosen.
67+
static constexpr double bytes_in_kilobyte = 1024.0;
68+
69+
// please note then we calculate difference
70+
// to get peak memory increment value, so we return int64, not size_t
71+
return static_cast<int64_t>(std::round(mem_counters.PeakWorkingSetSize / bytes_in_kilobyte));
72+
}
73+
74+
#else
75+
76+
int64_t get_peak_memory_usage() {
77+
size_t peak_mem_usage_kB = 0;
78+
79+
std::ifstream status_file("/proc/self/status");
80+
std::string line;
81+
std::regex vm_peak_regex("VmPeak:");
82+
std::smatch vm_match;
83+
bool mem_values_found = false;
84+
while (std::getline(status_file, line)) {
85+
if (std::regex_search(line, vm_match, vm_peak_regex)) {
86+
std::istringstream iss(vm_match.suffix());
87+
iss >> peak_mem_usage_kB;
88+
mem_values_found = true;
89+
}
90+
}
91+
92+
if (!mem_values_found) {
93+
throw std::runtime_error("Can't get system memory values");
94+
}
95+
96+
// please note then we calculate difference
97+
// to get peak memory increment value, so we return int64, not size_t
98+
return static_cast<int64_t>(peak_mem_usage_kB);
99+
}
100+
101+
#endif
102+
41103
bool parse_and_check_command_line(int argc, char* argv[]) {
42104
// ---------------------------Parsing and validating input
43105
// arguments--------------------------------------
@@ -563,10 +625,18 @@ int main(int argc, char* argv[]) {
563625
slog::info << "Skipping the step for loading model from file" << slog::endl;
564626
next_step();
565627
slog::info << "Skipping the step for loading model from file" << slog::endl;
628+
auto compile_model_mem_start = get_peak_memory_usage();
566629
auto startTime = Time::now();
567630
compiledModel = core.compile_model(FLAGS_m, device_name, device_config);
568631
auto duration_ms = get_duration_ms_till_now(startTime);
632+
auto compile_model_mem_end = get_peak_memory_usage();
569633
slog::info << "Compile model took " << double_to_string(duration_ms) << " ms" << slog::endl;
634+
635+
slog::info << "Start of compilation memory usage: Peak " << compile_model_mem_start << " KB" << slog::endl;
636+
slog::info << "End of compilation memory usage: Peak " << compile_model_mem_end << " KB" << slog::endl;
637+
slog::info << "Load model ram used " << compile_model_mem_end - compile_model_mem_start << " KB"
638+
<< slog::endl;
639+
570640
slog::info << "Original model I/O parameters:" << slog::endl;
571641
printInputAndOutputsInfoShort(compiledModel);
572642

@@ -737,10 +807,18 @@ int main(int argc, char* argv[]) {
737807
// ----------------- 7. Loading the model to the device
738808
// --------------------------------------------------------
739809
next_step();
810+
auto compile_model_mem_start = get_peak_memory_usage();
740811
startTime = Time::now();
741812
compiledModel = core.compile_model(model, device_name, device_config);
742813
duration_ms = get_duration_ms_till_now(startTime);
814+
auto compile_model_mem_end = get_peak_memory_usage();
743815
slog::info << "Compile model took " << double_to_string(duration_ms) << " ms" << slog::endl;
816+
817+
slog::info << "Start of compilation memory usage: Peak " << compile_model_mem_start << " KB" << slog::endl;
818+
slog::info << "End of compilation memory usage: Peak " << compile_model_mem_end << " KB" << slog::endl;
819+
slog::info << "Load model ram used " << compile_model_mem_end - compile_model_mem_start << " KB"
820+
<< slog::endl;
821+
744822
if (statistics)
745823
statistics->add_parameters(
746824
StatisticsReport::Category::EXECUTION_RESULTS,
@@ -759,17 +837,26 @@ int main(int argc, char* argv[]) {
759837
// ----------------- 7. Loading the model to the device
760838
// --------------------------------------------------------
761839
next_step();
840+
auto import_model_mem_start = get_peak_memory_usage();
762841
auto startTime = Time::now();
763842

764843
std::ifstream modelStream(FLAGS_m, std::ios_base::binary | std::ios_base::in);
765844
if (!modelStream.is_open()) {
766845
throw std::runtime_error("Cannot open model file " + FLAGS_m);
767846
}
847+
768848
compiledModel = core.import_model(modelStream, device_name, device_config);
769849
modelStream.close();
770850

771851
auto duration_ms = get_duration_ms_till_now(startTime);
852+
auto import_model_mem_end = get_peak_memory_usage();
772853
slog::info << "Import model took " << double_to_string(duration_ms) << " ms" << slog::endl;
854+
855+
slog::info << "Start of import memory usage: Peak " << import_model_mem_start << " KB" << slog::endl;
856+
slog::info << "End of import memory usage: Peak " << import_model_mem_end << " KB" << slog::endl;
857+
slog::info << "Load model ram used " << import_model_mem_end - import_model_mem_start << " KB"
858+
<< slog::endl;
859+
773860
slog::info << "Original model I/O paramteters:" << slog::endl;
774861
printInputAndOutputsInfoShort(compiledModel);
775862

0 commit comments

Comments
 (0)