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--------------------------------------
@@ -563,10 +625,18 @@ int main(int argc, char* argv[]) {
563
625
slog::info << " Skipping the step for loading model from file" << slog::endl;
564
626
next_step ();
565
627
slog::info << " Skipping the step for loading model from file" << slog::endl;
628
+ auto compile_model_mem_start = get_peak_memory_usage ();
566
629
auto startTime = Time::now ();
567
630
compiledModel = core.compile_model (FLAGS_m, device_name, device_config);
568
631
auto duration_ms = get_duration_ms_till_now (startTime);
632
+ auto compile_model_mem_end = get_peak_memory_usage ();
569
633
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
+
570
640
slog::info << " Original model I/O parameters:" << slog::endl;
571
641
printInputAndOutputsInfoShort (compiledModel);
572
642
@@ -737,10 +807,18 @@ int main(int argc, char* argv[]) {
737
807
// ----------------- 7. Loading the model to the device
738
808
// --------------------------------------------------------
739
809
next_step ();
810
+ auto compile_model_mem_start = get_peak_memory_usage ();
740
811
startTime = Time::now ();
741
812
compiledModel = core.compile_model (model, device_name, device_config);
742
813
duration_ms = get_duration_ms_till_now (startTime);
814
+ auto compile_model_mem_end = get_peak_memory_usage ();
743
815
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
+
744
822
if (statistics)
745
823
statistics->add_parameters (
746
824
StatisticsReport::Category::EXECUTION_RESULTS,
@@ -759,17 +837,26 @@ int main(int argc, char* argv[]) {
759
837
// ----------------- 7. Loading the model to the device
760
838
// --------------------------------------------------------
761
839
next_step ();
840
+ auto import_model_mem_start = get_peak_memory_usage ();
762
841
auto startTime = Time::now ();
763
842
764
843
std::ifstream modelStream (FLAGS_m, std::ios_base::binary | std::ios_base::in);
765
844
if (!modelStream.is_open ()) {
766
845
throw std::runtime_error (" Cannot open model file " + FLAGS_m);
767
846
}
847
+
768
848
compiledModel = core.import_model (modelStream, device_name, device_config);
769
849
modelStream.close ();
770
850
771
851
auto duration_ms = get_duration_ms_till_now (startTime);
852
+ auto import_model_mem_end = get_peak_memory_usage ();
772
853
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
+
773
860
slog::info << " Original model I/O paramteters:" << slog::endl;
774
861
printInputAndOutputsInfoShort (compiledModel);
775
862
0 commit comments