35
35
#include " remote_tensors_filling.hpp"
36
36
#include " statistics_report.hpp"
37
37
#include " utils.hpp"
38
- // clang-format on
39
38
40
39
#if defined _WIN32
41
-
42
40
#include < windows.h>
43
-
44
41
#include < psapi.h>
45
-
46
- int64_t getPeakMemoryUsage () {
47
- PROCESS_MEMORY_COUNTERS memCounters;
48
- GetProcessMemoryInfo (GetCurrentProcess (), &memCounters, sizeof (memCounters));
49
- return memCounters.PeakWorkingSetSize / 1000 ;
50
- }
51
-
52
42
#else
53
-
54
43
#include < fstream>
55
44
#include < regex>
56
45
#include < sstream>
46
+ #endif
47
+
48
+ // clang-format on
49
+
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
57
75
58
- int64_t getPeakMemoryUsage () {
59
- size_t peakMemUsageKB = 0 ;
76
+ int64_t get_peak_memory_usage () {
77
+ size_t peak_mem_usage_kB = 0 ;
60
78
61
- std::ifstream statusFile (" /proc/self/status" );
79
+ std::ifstream status_file (" /proc/self/status" );
62
80
std::string line;
63
- std::regex vmPeakRegex (" VmPeak:" );
64
- std::smatch vmMatch;
65
- while (std::getline (statusFile, line)) {
66
- if (std::regex_search (line, vmMatch, vmPeakRegex)) {
67
- std::istringstream iss (vmMatch.suffix ());
68
- iss >> peakMemUsageKB;
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 ;
69
89
}
70
90
}
71
- return static_cast <int64_t >(peakMemUsageKB);
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);
72
99
}
73
100
74
101
#endif
75
102
76
- namespace {
77
103
bool parse_and_check_command_line (int argc, char * argv[]) {
78
104
// ---------------------------Parsing and validating input
79
105
// arguments--------------------------------------
@@ -599,10 +625,18 @@ int main(int argc, char* argv[]) {
599
625
slog::info << " Skipping the step for loading model from file" << slog::endl;
600
626
next_step ();
601
627
slog::info << " Skipping the step for loading model from file" << slog::endl;
628
+ auto compile_model_mem_start = get_peak_memory_usage ();
602
629
auto startTime = Time::now ();
603
630
compiledModel = core.compile_model (FLAGS_m, device_name, device_config);
604
631
auto duration_ms = get_duration_ms_till_now (startTime);
632
+ auto compile_model_mem_end = get_peak_memory_usage ();
605
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
+
606
640
slog::info << " Original model I/O parameters:" << slog::endl;
607
641
printInputAndOutputsInfoShort (compiledModel);
608
642
@@ -773,10 +807,18 @@ int main(int argc, char* argv[]) {
773
807
// ----------------- 7. Loading the model to the device
774
808
// --------------------------------------------------------
775
809
next_step ();
810
+ auto compile_model_mem_start = get_peak_memory_usage ();
776
811
startTime = Time::now ();
777
812
compiledModel = core.compile_model (model, device_name, device_config);
778
813
duration_ms = get_duration_ms_till_now (startTime);
814
+ auto compile_model_mem_end = get_peak_memory_usage ();
779
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
+
780
822
if (statistics)
781
823
statistics->add_parameters (
782
824
StatisticsReport::Category::EXECUTION_RESULTS,
@@ -795,26 +837,26 @@ int main(int argc, char* argv[]) {
795
837
// ----------------- 7. Loading the model to the device
796
838
// --------------------------------------------------------
797
839
next_step ();
840
+ auto import_model_mem_start = get_peak_memory_usage ();
798
841
auto startTime = Time::now ();
799
842
800
843
std::ifstream modelStream (FLAGS_m, std::ios_base::binary | std::ios_base::in);
801
- auto importModelMemStart = getPeakMemoryUsage ();
802
844
if (!modelStream.is_open ()) {
803
845
throw std::runtime_error (" Cannot open model file " + FLAGS_m);
804
846
}
805
-
847
+
806
848
compiledModel = core.import_model (modelStream, device_name, device_config);
807
849
modelStream.close ();
808
850
809
851
auto duration_ms = get_duration_ms_till_now (startTime);
852
+ auto import_model_mem_end = get_peak_memory_usage ();
810
853
slog::info << " Import model took " << double_to_string (duration_ms) << " ms" << slog::endl;
811
-
812
- auto importModelMemEnd = getPeakMemoryUsage ();
813
-
814
- slog::info << " Start of compilation memory usage: Peak " << importModelMemStart << " KB" << slog::endl;
815
- slog::info << " End of compilation memory usage: Peak " << importModelMemEnd << " KB" << slog::endl;
816
- slog::info << " Peak diff " << importModelMemEnd - importModelMemStart << " KB" << slog::endl;
817
-
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
+
818
860
slog::info << " Original model I/O paramteters:" << slog::endl;
819
861
printInputAndOutputsInfoShort (compiledModel);
820
862
0 commit comments