// // ModuleBasic.cpp // MNN // // Created by MNN on 2021/10/15. // Copyright © 2018, Alibaba Group Holding Limited // #include "MNN_generated.h" #include #include #include #include #include #include "rapidjson/document.h" #include #include #include #include #include #include using namespace MNN::Express; using namespace MNN; static std::string _getDataType(const halide_type_t& type) { switch (type.code) { case halide_type_float: if (type.bits == 32) { return "float"; } if (type.bits == 16) { return "half"; } break; case halide_type_uint: if (type.bits == 32) { return "uint32"; } if (type.bits == 16) { return "uint16"; } if (type.bits == 8) { return "uint8"; } break; case halide_type_int: if (type.bits == 32) { return "int32"; } if (type.bits == 16) { return "int16"; } if (type.bits == 8) { return "int8"; } break; default: break; } return "Unknown"; } static std::string _getFormatString(Dimensionformat format) { switch (format) { case MNN::Express::NCHW: return "NCHW"; case MNN::Express::NHWC: return "NHWC"; case MNN::Express::NC4HW4: return "NC4HW4"; default: break; } return "Unknown"; } int main(int argc, char *argv[]) { if (argc < 2) { MNN_ERROR("Usage: ./GetMNNInfo ${test.mnn}\n"); return 0; } std::string modelName = argv[1]; std::vector empty; std::shared_ptr net(Module::load(empty, empty, argv[1])); if (nullptr == net.get()) { MNN_ERROR("Load MNN from %s Failed\n", argv[1]); return 1; } auto info = net->getInfo(); MNN_ASSERT(info->inputNames.size() == info->inputs.size()); MNN_PRINT("Model default dimensionFormat is %s\n", _getFormatString(info->defaultFormat).c_str()); MNN_PRINT("Model Inputs:\n"); for (int i=0; iinputNames.size(); ++i) { auto& varInfo = info->inputs[i]; MNN_PRINT("[ %s ]: dimensionFormat: %s, ", info->inputNames[i].c_str(), _getFormatString(varInfo.order).c_str()); MNN_PRINT("size: [ "); if (varInfo.dim.size() > 0) { for (int j=0; j<(int)varInfo.dim.size() - 1; ++j) { MNN_PRINT("%d,", varInfo.dim[j]); } MNN_PRINT("%d ", varInfo.dim[(int)varInfo.dim.size() - 1]); } MNN_PRINT("], "); MNN_PRINT("type is %s\n", _getDataType(varInfo.type).c_str()); } MNN_PRINT("Model Outputs:\n"); for (int i=0; ioutputNames.size(); ++i) { MNN_PRINT("[ %s ]\n", info->outputNames[i].c_str()); } if (info->version.empty()) { MNN_PRINT("Model Version: < 2.0.0\n"); } else { MNN_PRINT("Model Version: %s \n", info->version.c_str()); } if (!info->bizCode.empty()) { MNN_PRINT("Model bizCode: %s\n", info->bizCode.c_str()); } if (!info->metaData.empty()) { MNN_PRINT("MetaData: Begin \n"); for (auto& iter : info->metaData) { MNN_PRINT("[Meta] %s : %s\n", iter.first.c_str(), iter.second.c_str()); } MNN_PRINT("MetaData: End \n"); } MNN_PRINT("Get Op info to op.txt\n"); std::set originTypes; { MNN_PRINT("Appen op lists to op.txt\n"); std::ifstream is("op.txt"); if (!is.fail()) { std::string tmp; while (std::getline(is, tmp, '\n')) { originTypes.insert(tmp); } } } MNN_PRINT("Origin Op: %d\n", originTypes.size()); // Load origin tyes { std::shared_ptr bufferTmp(MNN::Interpreter::createFromFile(modelName.c_str())); auto buffer = bufferTmp->getModelBuffer(); auto collect = [&](const flatbuffers::Vector>* oplists) { for (int i=0; isize(); ++i) { auto op = oplists->GetAs(i); originTypes.insert(EnumNameOpType(op->type())); } }; auto net = GetNet(buffer.first); collect(net->oplists()); if (nullptr != net->subgraphs()) { for (int i=0; isubgraphs()->size(); ++i) { auto graph = net->subgraphs()->GetAs(i); collect(graph->nodes()); } } } MNN_PRINT("Current Op: %d\n", originTypes.size()); { MNN_PRINT("Appen op lists to op.txt\n"); std::ofstream os("op.txt"); for (auto& s : originTypes) { os << s << std::endl; } } return 0; }