[CPU] Refactor node dumping to avoid extra code in Infer method (#6931)
This commit is contained in:
@@ -317,6 +317,7 @@ void MKLDNNGraph::Replicate(const CNNNetwork &network, const MKLDNNExtensionMana
|
||||
|
||||
void MKLDNNGraph::InitGraph() {
|
||||
MKLDNNGraphOptimizer optimizer;
|
||||
ENABLE_CPU_DEBUG_CAP(initNodeDumper(config.debugCaps));
|
||||
|
||||
SortTopologically();
|
||||
InitNodes();
|
||||
@@ -398,19 +399,19 @@ void MKLDNNGraph::ExtractConstantNodes() {
|
||||
}
|
||||
}
|
||||
|
||||
void MKLDNNGraph::ExecuteConstantNodesOnly() {
|
||||
void MKLDNNGraph::ExecuteConstantNodesOnly() const {
|
||||
OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::MKLDNN_LT, "MKLDNNGraph::ExecuteConstantNodesOnly");
|
||||
mkldnn::stream stream(eng);
|
||||
|
||||
using shared_memory_ptr = MKLDNNWeightsSharing::MKLDNNSharedMemory::Ptr;
|
||||
|
||||
auto acquireSharedOutputs = [this](MKLDNNNodePtr & graphNode) {
|
||||
auto acquireSharedOutputs = [this](const MKLDNNNodePtr & node) {
|
||||
std::vector<shared_memory_ptr> outputs;
|
||||
bool hasLocalAllocatedEdges = false;
|
||||
bool hasExternalInvalidEdges = false;
|
||||
|
||||
for (size_t i = 0; i < graphNode->getChildEdges().size(); ++i) {
|
||||
auto edgePtr = graphNode->getChildEdgeAt(i);
|
||||
for (size_t i = 0; i < node->getChildEdges().size(); ++i) {
|
||||
auto edgePtr = node->getChildEdgeAt(i);
|
||||
if (edgePtr) {
|
||||
if (edgePtr->isUseExternalMemory()) {
|
||||
auto ptr = weightsCache->get(edgePtr->name());
|
||||
@@ -426,18 +427,18 @@ void MKLDNNGraph::ExecuteConstantNodesOnly() {
|
||||
return std::make_tuple(hasExternalInvalidEdges, hasLocalAllocatedEdges, outputs);
|
||||
};
|
||||
|
||||
for (auto &graphNode : constantGraphNodes) {
|
||||
for (const auto &node : constantGraphNodes) {
|
||||
if (weightsCache) {
|
||||
auto sharedOutputs = acquireSharedOutputs(graphNode);
|
||||
auto sharedOutputs = acquireSharedOutputs(node);
|
||||
|
||||
if (std::get<0>(sharedOutputs) || std::get<1>(sharedOutputs)) {
|
||||
graphNode->execute(stream);
|
||||
ExecuteNode(node, stream);
|
||||
|
||||
for (auto & output : std::get<2>(sharedOutputs))
|
||||
output->valid(true);
|
||||
}
|
||||
} else {
|
||||
graphNode->execute(stream);
|
||||
ExecuteNode(node, stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -809,6 +810,16 @@ void MKLDNNGraph::PullOutputData(BlobMap &out) {
|
||||
}
|
||||
}
|
||||
|
||||
inline void MKLDNNGraph::ExecuteNode(const MKLDNNNodePtr& node, const mkldnn::stream& stream) const {
|
||||
DUMP(node, infer_count);
|
||||
OV_ITT_SCOPED_TASK(itt::domains::MKLDNNPlugin, node->profiling.execute);
|
||||
|
||||
if (node->isDynamicNode())
|
||||
node->executeDynamic(stream);
|
||||
else
|
||||
node->execute(stream);
|
||||
}
|
||||
|
||||
void MKLDNNGraph::Infer(MKLDNNInferRequest* request, int batch) {
|
||||
if (!IsReady()) {
|
||||
IE_THROW() << "Wrong state. Topology is not ready.";
|
||||
@@ -816,33 +827,12 @@ void MKLDNNGraph::Infer(MKLDNNInferRequest* request, int batch) {
|
||||
|
||||
mkldnn::stream stream(eng);
|
||||
|
||||
ENABLE_CPU_DEBUG_CAP(NodeDumper nd(config.debugCaps, infer_count));
|
||||
|
||||
#ifdef CPU_DEBUG_CAPS
|
||||
for (const auto& node : constantGraphNodes) {
|
||||
if (request != nullptr)
|
||||
request->ThrowIfCanceled();
|
||||
|
||||
ENABLE_CPU_DEBUG_CAP(nd.dumpInputBlobs(node));
|
||||
ENABLE_CPU_DEBUG_CAP(nd.dumpOutputBlobs(node));
|
||||
}
|
||||
#endif
|
||||
|
||||
for (const auto& node : mutableGraphNodes) {
|
||||
PERF(config.collectPerfCounters, node);
|
||||
if (request != nullptr)
|
||||
if (request)
|
||||
request->ThrowIfCanceled();
|
||||
|
||||
ENABLE_CPU_DEBUG_CAP(nd.dumpInputBlobs(node));
|
||||
|
||||
OV_ITT_SCOPED_TASK(itt::domains::MKLDNNPlugin, node->profiling.execute);
|
||||
if (node->isDynamicNode()) {
|
||||
node->executeDynamic(stream);
|
||||
} else {
|
||||
node->execute(stream);
|
||||
}
|
||||
|
||||
ENABLE_CPU_DEBUG_CAP(nd.dumpOutputBlobs(node));
|
||||
ExecuteNode(node, stream);
|
||||
}
|
||||
|
||||
if (infer_count != -1) infer_count++;
|
||||
|
||||
@@ -236,7 +236,8 @@ protected:
|
||||
void AllocateWithReuse();
|
||||
void CreatePrimitives();
|
||||
void ExtractConstantNodes();
|
||||
void ExecuteConstantNodesOnly();
|
||||
void ExecuteNode(const MKLDNNNodePtr& node, const mkldnn::stream& stream) const;
|
||||
void ExecuteConstantNodesOnly() const;
|
||||
|
||||
friend class MKLDNNInferRequest;
|
||||
friend class MKLDNNGraphlessInferRequest;
|
||||
|
||||
@@ -20,10 +20,9 @@ using namespace InferenceEngine;
|
||||
|
||||
namespace MKLDNNPlugin {
|
||||
|
||||
NodeDumper::NodeDumper(const DebugCaps::Config& config, const int _count)
|
||||
NodeDumper::NodeDumper(const DebugCaps::Config& config)
|
||||
: dumpFormat(FORMAT::BIN)
|
||||
, dumpDirName("mkldnn_dump")
|
||||
, count(_count) {
|
||||
, dumpDirName("mkldnn_dump") {
|
||||
if (!config.blobDumpDir.empty())
|
||||
dumpDirName = config.blobDumpDir;
|
||||
|
||||
@@ -43,7 +42,7 @@ NodeDumper::NodeDumper(const DebugCaps::Config& config, const int _count)
|
||||
dumpFilters[FILTER::BY_NAME] = config.blobDumpNodeName;
|
||||
}
|
||||
|
||||
void NodeDumper::dumpInputBlobs(const MKLDNNNodePtr& node) const {
|
||||
void NodeDumper::dumpInputBlobs(const MKLDNNNodePtr& node, int count) const {
|
||||
if (!shouldBeDumped(node, "IN"))
|
||||
return;
|
||||
|
||||
@@ -77,7 +76,7 @@ void NodeDumper::dumpInputBlobs(const MKLDNNNodePtr& node) const {
|
||||
dumpInternalBlobs(node);
|
||||
}
|
||||
|
||||
void NodeDumper::dumpOutputBlobs(const MKLDNNNodePtr& node) const {
|
||||
void NodeDumper::dumpOutputBlobs(const MKLDNNNodePtr& node, int count) const {
|
||||
if (!shouldBeDumped(node, "OUT"))
|
||||
return;
|
||||
|
||||
@@ -210,5 +209,16 @@ void NodeDumper::formatNodeName(std::string& name) const {
|
||||
std::replace(name.begin(), name.end(), ':', '-');
|
||||
}
|
||||
|
||||
std::unique_ptr<NodeDumper> nd;
|
||||
|
||||
void initNodeDumper(const DebugCaps::Config& config) {
|
||||
nd.reset(new NodeDumper(config));
|
||||
}
|
||||
|
||||
const std::unique_ptr<NodeDumper>& getNodeDumper() {
|
||||
assert(nd.get() != nullptr);
|
||||
return nd;
|
||||
}
|
||||
|
||||
} // namespace MKLDNNPlugin
|
||||
#endif // CPU_DEBUG_CAPS
|
||||
|
||||
@@ -23,10 +23,10 @@ namespace MKLDNNPlugin {
|
||||
*/
|
||||
class NodeDumper {
|
||||
public:
|
||||
NodeDumper(const DebugCaps::Config& config, const int _count);
|
||||
NodeDumper(const DebugCaps::Config& config);
|
||||
|
||||
void dumpInputBlobs(const MKLDNNNodePtr &node) const;
|
||||
void dumpOutputBlobs(const MKLDNNNodePtr &node) const;
|
||||
void dumpInputBlobs(const MKLDNNNodePtr &node, int count = -1) const;
|
||||
void dumpOutputBlobs(const MKLDNNNodePtr &node, int count = -1) const;
|
||||
|
||||
private:
|
||||
void dumpInternalBlobs(const MKLDNNNodePtr& node) const;
|
||||
@@ -55,5 +55,26 @@ private:
|
||||
// std::hash<int> is necessary for Ubuntu-16.04 (gcc-5.4 and defect in C++11 standart)
|
||||
std::unordered_map<FILTER, std::string, std::hash<int>> dumpFilters;
|
||||
};
|
||||
|
||||
void initNodeDumper(const DebugCaps::Config& config);
|
||||
const std::unique_ptr<NodeDumper>& getNodeDumper();
|
||||
|
||||
class DumpHelper {
|
||||
const MKLDNNNodePtr& node;
|
||||
const int count;
|
||||
|
||||
public:
|
||||
explicit DumpHelper(const MKLDNNNodePtr& _node, int _count = -1): node(_node), count(_count) {
|
||||
getNodeDumper()->dumpInputBlobs(node, count);
|
||||
}
|
||||
|
||||
~DumpHelper() {
|
||||
getNodeDumper()->dumpOutputBlobs(node, count);
|
||||
}
|
||||
};
|
||||
|
||||
#define DUMP(...) DumpHelper __helper##__node (__VA_ARGS__);
|
||||
} // namespace MKLDNNPlugin
|
||||
#else // CPU_DEBUG_CAPS
|
||||
#define DUMP(...)
|
||||
#endif // CPU_DEBUG_CAPS
|
||||
|
||||
Reference in New Issue
Block a user