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.
196 lines
5.1 KiB
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 {
|
|
PARSER = 0,
|
|
INFER_SHAPE = 1,
|
|
CHECKSUPPORT = 2,
|
|
GRAPH_OPTIMIZE = 3,
|
|
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;
|
|
|
|
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;
|
|
};
|
|
}
|
|
|
|
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<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);
|
|
|
|
/**
|
|
* @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;
|
|
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 SaveOpInfo(ge::OpDescPtr desc, analyzer::DataInfo &data_info,
|
|
std::shared_ptr<analyzer::GraphInfo> graph_info);
|
|
|
|
void ClearHistoryFile();
|
|
ge::Status CreateAnalyzerFile();
|
|
|
|
explicit Analyzer() {};
|
|
~Analyzer() = default;
|
|
|
|
private:
|
|
std::map<uint64_t, std::map<uint64_t, std::shared_ptr<analyzer::GraphInfo>>> 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_
|