35
35
#include " remote_tensors_filling.hpp"
36
36
#include " statistics_report.hpp"
37
37
#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
+
38
48
// clang-format on
39
49
40
50
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
+
41
103
bool parse_and_check_command_line (int argc, char * argv[]) {
42
104
// ---------------------------Parsing and validating input
43
105
// arguments--------------------------------------
@@ -566,10 +628,18 @@ int main(int argc, char* argv[]) {
566
628
slog::info << " Skipping the step for loading model from file" << slog::endl;
567
629
next_step ();
568
630
slog::info << " Skipping the step for loading model from file" << slog::endl;
631
+ auto compile_model_mem_start = get_peak_memory_usage ();
569
632
auto startTime = Time::now ();
570
633
compiledModel = core.compile_model (FLAGS_m, device_name, device_config);
571
634
auto duration_ms = get_duration_ms_till_now (startTime);
635
+ auto compile_model_mem_end = get_peak_memory_usage ();
572
636
slog::info << " Compile model took " << double_to_string (duration_ms) << " ms" << slog::endl;
637
+
638
+ slog::info << " Start of compilation memory usage: Peak " << compile_model_mem_start << " KB" << slog::endl;
639
+ slog::info << " End of compilation memory usage: Peak " << compile_model_mem_end << " KB" << slog::endl;
640
+ slog::info << " Compile model ram used " << compile_model_mem_end - compile_model_mem_start << " KB"
641
+ << slog::endl;
642
+
573
643
slog::info << " Original model I/O parameters:" << slog::endl;
574
644
printInputAndOutputsInfoShort (compiledModel);
575
645
@@ -738,10 +808,18 @@ int main(int argc, char* argv[]) {
738
808
// ----------------- 7. Loading the model to the device
739
809
// --------------------------------------------------------
740
810
next_step ();
811
+ auto compile_model_mem_start = get_peak_memory_usage ();
741
812
startTime = Time::now ();
742
813
compiledModel = core.compile_model (model, device_name, device_config);
743
814
duration_ms = get_duration_ms_till_now (startTime);
815
+ auto compile_model_mem_end = get_peak_memory_usage ();
744
816
slog::info << " Compile model took " << double_to_string (duration_ms) << " ms" << slog::endl;
817
+
818
+ slog::info << " Start of compilation memory usage: Peak " << compile_model_mem_start << " KB" << slog::endl;
819
+ slog::info << " End of compilation memory usage: Peak " << compile_model_mem_end << " KB" << slog::endl;
820
+ slog::info << " Compile model ram used " << compile_model_mem_end - compile_model_mem_start << " KB"
821
+ << slog::endl;
822
+
745
823
if (statistics)
746
824
statistics->add_parameters (
747
825
StatisticsReport::Category::EXECUTION_RESULTS,
@@ -760,17 +838,26 @@ int main(int argc, char* argv[]) {
760
838
// ----------------- 7. Loading the model to the device
761
839
// --------------------------------------------------------
762
840
next_step ();
841
+ auto import_model_mem_start = get_peak_memory_usage ();
763
842
auto startTime = Time::now ();
764
843
765
844
std::ifstream modelStream (FLAGS_m, std::ios_base::binary | std::ios_base::in);
766
845
if (!modelStream.is_open ()) {
767
846
throw std::runtime_error (" Cannot open model file " + FLAGS_m);
768
847
}
848
+
769
849
compiledModel = core.import_model (modelStream, device_name, device_config);
770
850
modelStream.close ();
771
851
772
852
auto duration_ms = get_duration_ms_till_now (startTime);
853
+ auto import_model_mem_end = get_peak_memory_usage ();
773
854
slog::info << " Import model took " << double_to_string (duration_ms) << " ms" << slog::endl;
855
+
856
+ slog::info << " Start of import memory usage: Peak " << import_model_mem_start << " KB" << slog::endl;
857
+ slog::info << " End of import memory usage: Peak " << import_model_mem_end << " KB" << slog::endl;
858
+ slog::info << " Import model ram used " << import_model_mem_end - import_model_mem_start << " KB"
859
+ << slog::endl;
860
+
774
861
slog::info << " Original model I/O paramteters:" << slog::endl;
775
862
printInputAndOutputsInfoShort (compiledModel);
776
863
0 commit comments