You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
graphengine/ge/analyzer/analyzer.h

196 lines
5.1 KiB

/**
* Copyright 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 <map>
#include <string>
#include <mutex>
#include <memory>
#include <fstream>
#include <atomic>
#include "external/ge/ge_api_types.h"
#include "graph/compute_graph.h"
#include "graph/node.h"
namespace ge {
namespace analyzer {
enum AnalyzeType {
4 years ago
PARSER = 0,
INFER_SHAPE = 1,
CHECKSUPPORT = 2,
GRAPH_OPTIMIZE = 3,
4 years ago
GRAPH_PARTION = 4,
GRAPH_BUILDER = 5,
};
struct TensorInfo {
vector<int64_t> shape;
string d_type;
string layout;
};
struct OpInfo {
string error_type;
string op_name;
string op_type;
std::vector<TensorInfo> input_info;
std::vector<TensorInfo> output_info;
string reason;
};
struct GraphInfo {
uint64_t session_id = 0;
uint64_t graph_id = 0;
std::vector<OpInfo> op_info;
};
struct DataInfo {
DataInfo() = default;
~DataInfo() = default;
4 years ago
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;
};
4 years ago
}
class Analyzer {
4 years ago
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<analyzer::GraphInfo> 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);
4 years ago
/**
* @ingroup ge
* @brief: Buff analyzed data and output to json file
* @param [in]: session id , graph id
* @return: 0: SUCCESS other: FAILED
*/
ge::Status SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_id);
Analyzer(const Analyzer &) = delete;
4 years ago
Analyzer& operator=(const Analyzer&) = delete;
Analyzer(Analyzer &&) = delete;
4 years ago
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 SaveOpInfo(ge::OpDescPtr desc, analyzer::DataInfo &data_info,
4 years ago
std::shared_ptr<analyzer::GraphInfo> graph_info);
void ClearHistoryFile();
ge::Status CreateAnalyzerFile();
4 years ago
explicit Analyzer() {};
~Analyzer() = default;
4 years ago
private:
std::map<uint64_t, std::map<uint64_t, std::shared_ptr<analyzer::GraphInfo>>> graph_infos_;
4 years ago
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};
};
4 years ago
} // namespace ge
#endif // DOMI_ANALYZER_ANANLYZER_H_