/** * Copyright 2019-2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef DOMI_ANALYZER_ANANLYZER_H_ #define DOMI_ANALYZER_ANANLYZER_H_ #include "nlohmann/json.hpp" #include #include #include #include #include #include #include "external/ge/ge_api_types.h" #include "graph/compute_graph.h" #include "graph/node.h" namespace ge { namespace analyzer { enum AnalyzeType { PARSER = 0, INFER_SHAPE = 1, CHECKSUPPORT = 2, GRAPH_OPTIMIZE = 3, GRAPH_PARTION = 4, GRAPH_BUILDER = 5, }; struct TensorInfo { vector shape; string d_type; string layout; }; struct OpInfo { string error_type; string op_name; string op_type; std::vector input_info; std::vector output_info; string reason; }; struct GraphInfo { uint64_t session_id = 0; uint64_t graph_id = 0; std::vector op_info; }; struct DataInfo { DataInfo() = default; ~DataInfo() = default; DataInfo(uint64_t sess, uint64_t graph, AnalyzeType type, ge::NodePtr node, std::string error_info) { session_id = sess; graph_id = graph; analyze_type = type; node_ptr = node; reason = error_info; } uint64_t session_id; uint64_t graph_id; AnalyzeType analyze_type; ge::NodePtr node_ptr{nullptr}; std::string reason; }; } // namespace analyzer class Analyzer { public: /** * @ingroup ge * @brief: get analyzer instance. * @param [in]: None * @return: Analyzer instance ptr */ static Analyzer *GetInstance(); /** * @ingroup ge * @brief: check whether env var ENABLE_NETWORK_ANALYSIS_DEBUG is enabled. * When enable env, it will keep adaptor sink geop graph even though fail. * @param [in]: None * @return: true: enable env false : disable env */ bool IsEnableNetAnalyzeDebug() { return std::getenv("ENABLE_NETWORK_ANALYSIS_DEBUG") != nullptr; } /** * @ingroup ge * @brief: build buff object by sess id and graph id . * @param [in]: session id & graph id * @return: 0: success other: failed */ ge::Status BuildJsonObject(uint64_t session_id, uint64_t graph_id); /** * @ingroup ge * @brief: get buff object by sess id and graph id . * @param [in]: session id & graph id * @return: nullptr if failed */ std::shared_ptr GetJsonObject(uint64_t session_id, uint64_t graph_id); /** * @ingroup ge * @brief: analyzer globle init method. * @param [in]: None * @return: None */ ge::Status Initialize(); /** * @ingroup ge * @brief: DeConstruct method. Release all used resource of analyzer. * @param [in]: None * @return: None */ void Finalize(); /** * @ingroup ge * @brief: DeConstruct method. Only release resource about session id. * @param [in]: None * @return: None */ void DestroySessionJsonObject(uint64_t session_id); /** * @ingroup ge * @brief: DeConstruct method. Only release resource about session id and graph id. * @param [in]: None * @return: None */ void DestroyGraphJsonObject(uint64_t session_id, uint64_t graph_id); /** * @ingroup ge * @brief: main process method. Buff analyzed data and output to json file * @param [in]: DataInfo Object * @return: 0: SUCCESS other: FAILED */ ge::Status DoAnalyze(analyzer::DataInfo &data_info); Analyzer(const Analyzer &) = delete; Analyzer &operator=(const Analyzer &) = delete; Analyzer(Analyzer &&) = delete; Analyzer &operator=(Analyzer &&) = delete; private: void TensorInfoToJson(nlohmann::json &j, const analyzer::TensorInfo &tensor_info); void OpInfoToJson(nlohmann::json &j, const analyzer::OpInfo &op_info); void GraphInfoToJson(nlohmann::json &j, const analyzer::GraphInfo &graph_info); ge::Status SaveAnalyzerDataToFile(); ge::Status SaveOpInfo(ge::OpDescPtr desc, analyzer::DataInfo &data_info, std::shared_ptr graph_info); void ClearHistoryFile(); ge::Status CreateAnalyzerFile(); explicit Analyzer(){}; ~Analyzer() = default; private: std::map>> graph_infos_; std::recursive_mutex mutex_; // protect graph_infos_ std::mutex file_mutex_; // protect json_file_ std::ofstream json_file_; std::string json_file_name_; std::atomic_bool is_json_file_create_{false}; }; } // namespace ge #endif // DOMI_ANALYZER_ANANLYZER_H_