diff --git a/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.cpp b/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.cpp index 940f5aae167f088361057fe2a7a389a76f5bb2b4..e32e332eb3674a9e93291ffafb85e98b4426c7c1 100644 --- a/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.cpp +++ b/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.cpp @@ -3,6 +3,8 @@ #include #include "utils.h" +#include "InputParser.h" +#include "log.h" namespace dynolog_npu { namespace ipc_monitor { @@ -21,9 +23,39 @@ bool DynoLogNpuMonitor::Init() return res; } +bool isMonitor(const std::unordered_map& res) +{ + return true; +} + +bool DynoLogNpuMonitor::DealMonitorReq(std::unordered_map& cmd) +{ + std::string enableActivity = cmd["MSPTI_ACTIVITY_KIND"]; + uint32_t reportTimes = 0; + Str2Uint32(reportTimes, cmd["REPORT_INTERVAL_S"]); + bool startSwitch = false; + Str2Bool(startSwitch, cmd["NPU_MONITOR_START"]); + bool endSwitch = false; + Str2Bool(endSwitch, cmd["NPU_MONITOR_START"]); + if (startSwitch) { + PRINT_INFO("Start Mspti Monitor thread to collect, reportTimes: %s, enableActivity: %s", reportTimes, enableActivity); + } + + if (endSwitch) { + PRINT_INFO("End Mpsit Monitor thread"); + } + return true; +} + std::string DynoLogNpuMonitor::Poll() { std::string res = ipcClient_.IpcClientNpuConfig(); + auto cmd = dynolog_npu::profiler::InputParser::GetInstance()->DynoLogGetOpts(res); + // 是个monitor的指令 + if (isMonitor(cmd)) { + DealMonitorReq(cmd); + return ""; + } if (res.empty()) { std::cout << "[INFO] Request for dynolog server is empty !" << std::endl; return ""; @@ -33,4 +65,4 @@ std::string DynoLogNpuMonitor::Poll() } } // namespace ipc_monitor -} // namespace dynolog_npu \ No newline at end of file +} // namespace dynolog_npu diff --git a/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.h b/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.h index 40ee21072710312a86cd75befdcefa67e24efb8f..3a674b7a46c6df9832ae70b3d2971ec91201569e 100644 --- a/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.h +++ b/dynolog_npu/plugin/ipc_monitor/DynoLogNpuMonitor.h @@ -15,6 +15,7 @@ public: DynoLogNpuMonitor() = default; bool Init() override; std::string Poll() override; + bool DealMonitorReq(std::unordered_map& cmd); void SetNpuId(int id) override { npuId_ = id; diff --git a/dynolog_npu/plugin/ipc_monitor/InputParser.cpp b/dynolog_npu/plugin/ipc_monitor/InputParser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1948167c76ea409b312e879102cc6de73554c67c --- /dev/null +++ b/dynolog_npu/plugin/ipc_monitor/InputParser.cpp @@ -0,0 +1,21 @@ +#include "log.h" +#include + +namespace dynolog_npu { +namespace profiler { +std::unordered_map InputParser::DynoLogGetOpts(const std::string& msg) +{ + std::unordered_map res; + pairs = msg.split("\n"); + for (auto pair : pairs) { + cfgSplit = pair.split("="); + if (cfgSplit.size() == 2) { + res[cfgSplit[0]] = cfgSplit[1]; + } else { + PRINT_INFO("Msg from dynolog is invalid"); + } + } + return res; +} +} +} \ No newline at end of file diff --git a/dynolog_npu/plugin/ipc_monitor/InputParser.h b/dynolog_npu/plugin/ipc_monitor/InputParser.h new file mode 100644 index 0000000000000000000000000000000000000000..4f3f8d94e4d68b3f3ac03ca3098a545538c0cef6 --- /dev/null +++ b/dynolog_npu/plugin/ipc_monitor/InputParser.h @@ -0,0 +1,16 @@ +#pragma once +#include +#include +#include +#include + +namespace dynolog_npu { +namespace profiler { + +class InputParser: public dynolog_npu::ipc_monitor::Singleton { +public: + std::unordered_map DynoLogGetOpts(const std::string& msg); +}; + +} // namespace profiler +} // namespace torch_npu diff --git a/dynolog_npu/plugin/ipc_monitor/MonitorBase.h b/dynolog_npu/plugin/ipc_monitor/MonitorBase.h index 108023c7624b747e5987be9184d6c594decd360a..689b01bb4feacd3244f1ed3c942602cdb05e5476 100644 --- a/dynolog_npu/plugin/ipc_monitor/MonitorBase.h +++ b/dynolog_npu/plugin/ipc_monitor/MonitorBase.h @@ -15,4 +15,4 @@ public: } // namespace ipc_monitor } // namespace dynolog_npu -#endif \ No newline at end of file +#endif diff --git a/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.cpp b/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.cpp index 97966e8eeacc7276426feb237aa122eb8dee046f..facb017a38707575a3adcc45185c10bd668a5e92 100644 --- a/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.cpp +++ b/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.cpp @@ -135,4 +135,4 @@ std::unique_ptr IpcClient::PollRecvMessage(int maxRetry, int sleeTimeUs } } // namespace ipc_monitor -} // namespace dynolog_npu \ No newline at end of file +} // namespace dynolog_npu diff --git a/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.h b/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.h index ae7b00eb51b935db4e799fab470c3343e78bcb6f..35b099ac0dfb36da00e9a7d6297536f1f2f3e60e 100644 --- a/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.h +++ b/dynolog_npu/plugin/ipc_monitor/NpuIpcClient.h @@ -100,4 +100,4 @@ private: } // namespace ipc_monitor } // namespace dynolog_npu -#endif \ No newline at end of file +#endif diff --git a/dynolog_npu/plugin/ipc_monitor/log.cpp b/dynolog_npu/plugin/ipc_monitor/log.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f602c556a28122644264bbe871b654c58bdc7107 --- /dev/null +++ b/dynolog_npu/plugin/ipc_monitor/log.cpp @@ -0,0 +1,10 @@ +#include "log.h" + +void Log::PrintMsg(const std::string& msg, const std::string& level) const +{ + std::ostringstream oss; + oss << "\n" << level << getCurrentTimestamp() << " (PID:" << getpid() << ")"; + oss << msg << "\n" + + std::cout << oss.str(); +} diff --git a/dynolog_npu/plugin/ipc_monitor/log.h b/dynolog_npu/plugin/ipc_monitor/log.h new file mode 100644 index 0000000000000000000000000000000000000000..287b5975ee575f9cb395fab38d2779a1929d6f86 --- /dev/null +++ b/dynolog_npu/plugin/ipc_monitor/log.h @@ -0,0 +1,23 @@ +#include "singleton.h" + +#define PRINT_INFO(format, ...) \ + do { \ + Log::GetInstance()->PrintMsg(format, "[INFO]"); \ + } while(0) \ + +#define PRINT_WARNING(format, ...) \ + do { \ + Log::GetInstance()->PrintMsg(format, "[WARNING]"); \ + } while(0) \ + +#define PRINT_ERROR(format, ...) \ + do { \ + Log::GetInstance()->PrintMsg(format, "[ERROR]"); \ + } while(0) \ + +class Log : public dynolog_npu::ipc_monitor::Singleton +{ +public: + void PrintMsg(const std::string& msg, const std::string& level) const; +}; + diff --git a/dynolog_npu/plugin/ipc_monitor/singleton.h b/dynolog_npu/plugin/ipc_monitor/singleton.h index 8bb106f3adc8b365ef81feb603c6aaac917a00e2..b0c8a422cef19b15e7a3f83f2dcbb735b1162e11 100644 --- a/dynolog_npu/plugin/ipc_monitor/singleton.h +++ b/dynolog_npu/plugin/ipc_monitor/singleton.h @@ -28,4 +28,4 @@ private: } // ipc_monitor } // dynolog_npu -#endif \ No newline at end of file +#endif diff --git a/dynolog_npu/plugin/ipc_monitor/utils.cpp b/dynolog_npu/plugin/ipc_monitor/utils.cpp index 936821fd34bc34bc9db9e09515132e8af39ba57a..93fba59eaaf6387e42d7301aa5e83e8415ae29ae 100644 --- a/dynolog_npu/plugin/ipc_monitor/utils.cpp +++ b/dynolog_npu/plugin/ipc_monitor/utils.cpp @@ -1,4 +1,7 @@ #include "utils.h" +#include +#include +#include "log.h" namespace dynolog_npu { namespace ipc_monitor { @@ -131,5 +134,42 @@ std::string GenerateUuidV4() return stringStream.str(); } +bool Str2Uint32(uint32_t& dest, const std::string& str) +{ + if (str.empty()) { + PRINT_INFO("Str to uint32 fail, input string is null"); + return false; + } + size_t pos = 0; + try { + dest = static_cast(std::stoul(str, &pos)); + } catch(...) { + PRINT_INFO("Str to uint32 fail, input string is %s", numStr.c_str()); + return false; + } + if (pos != str.size()) { + PRINT_INFO("Str to uint32 fail, input string is %s", numStr.c_str()); + return false; + } + return true; +} + +bool Str2Bool(bool& dest, const std::string& str) { + std::string lower_str = str; + std::transform(lower_str.begin(), lower_str.end(), lower_str.begin(), ::tolower); + + if (lower_str == "true" || lower_str == "1") { + dest = true; + return true; + } + + if (lower_str == "false" || lower_str == "0") { + dest = false; + return true; + } + PRINT_ERROR("Invalid boolean string: %s", std.c_str()); + return false; +} + +} // namespace profiler } // namespace ipc_monitor -} // namespace dynolog_npu diff --git a/dynolog_npu/plugin/ipc_monitor/utils.h b/dynolog_npu/plugin/ipc_monitor/utils.h index 0d8ceb8cfd0bf81b6d8b807c6ac1b505276ddf83..7c292240c271163b772c39fcc4bc2c396a01e43d 100644 --- a/dynolog_npu/plugin/ipc_monitor/utils.h +++ b/dynolog_npu/plugin/ipc_monitor/utils.h @@ -24,6 +24,8 @@ std::vector GetPids(); std::pair GetParentPidAndCommand(int32_t pid); std::vector> GetPidCommandPairsofAncestors(); std::string getCurrentTimestamp(); +bool Str2Uint32(uint32_t& dest, const std::string& str); +bool Str2Bool(bool& dest, const std::string& str); enum class SubModule { IPC = 0