/** * Copyright (c) Huawei Technologies Co., Ltd. 2020~2022. All rights reserved. * * 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. */ #include "parser/caffe/caffe_data_parser.h" #include #include #include "framework/omg/parser/parser_types.h" #include "common/util.h" #include "common/util/error_manager/error_manager.h" #include "framework/common/debug/ge_log.h" #include "framework/omg/parser/parser_inner_ctx.h" #include "parser/common/op_parser_factory.h" using namespace ge::parser; using domi::CAFFE; namespace ge { namespace { const char *kData = "Data"; } Status CaffeDataParser::GetOutputDesc(const string &name, const std::vector &input_dims, const ge::OpDescPtr &op) const { GE_CHECK_NOTNULL(op); GELOGI("The input dim size is %zu in layer %s.", input_dims.size(), name.c_str()); // Caffe default data type is float32 GE_IF_BOOL_EXEC(!(ge::AttrUtils::SetInt(op, DATA_ATTR_NAME_DATA_TYPE, ge::DT_FLOAT)), GELOGW("SetInt failed for op %s.", op->GetName().c_str());); // no need to return // Initialize input and output description of OP according to input_dims information GE_RETURN_WITH_LOG_IF_ERROR(ParseShape(input_dims, op), "[Parse][Shape] failed for data layer %s", name.c_str()); return SUCCESS; } Status CaffeDataParser::ParseParams(const Message *op_src, ge::OpDescPtr &op) { GE_CHECK_NOTNULL(op_src); GE_CHECK_NOTNULL(op); const domi::caffe::LayerParameter *layer = DOMI_DYNAMIC_CAST(op_src); GE_CHECK_NOTNULL(layer); GELOGD("Caffe layer name = %s, layer type= %s, parse params", layer->name().c_str(), layer->type().c_str()); if (layer->type() == ge::parser::INPUT_TYPE) { GE_CHK_STATUS_RET(ParseParamsForInput(*layer, op), "[Parse][Params] failed, Caffe layer name = %s, " "layer type= %s", layer->name().c_str(), layer->type().c_str()); } else if (layer->type() == ge::parser::DUMMY_DATA) { GE_CHK_STATUS_RET(ParseParamsForDummyData(*layer, op), "[Parse][Params] failed, Caffe layer name = %s, " "layer type= %s", layer->name().c_str(), layer->type().c_str()); } else { REPORT_INNER_ERROR("E19999", "layer:%s(%s) type is not %s or %s, check invalid", layer->name().c_str(), layer->type().c_str(), ge::parser::INPUT_TYPE.c_str(), ge::parser::DUMMY_DATA.c_str()); GELOGE(PARAM_INVALID, "[Check][Param] Caffe prototxt has no optype [Input]"); return FAILED; } return SUCCESS; } Status CaffeDataParser::ParseParamsForInput(const domi::caffe::LayerParameter &layer, ge::OpDescPtr &op) const { if (layer.has_input_param()) { const domi::caffe::InputParameter &input_param = layer.input_param(); if (input_param.shape_size() == 0) { ErrorManager::GetInstance().ATCReportErrMessage( "E11027", {"layername", "layertype"}, {layer.name(), layer.type()}); GELOGE(PARAM_INVALID, "[Check][Param]input_param shape size is zero, check invalid, " "caffe layer name [%s], layer type [%s].", layer.name().c_str(), layer.type().c_str()); return FAILED; } for (int i = 0; i < input_param.shape_size(); i++) { const domi::caffe::BlobShape &blob_shape = input_param.shape(i); vector shape; std::map> &shape_map = GetParserContext().input_dims; std::vector model_dims; for (auto &blob_shape_dim_temp : blob_shape.dim()) { model_dims.push_back(blob_shape_dim_temp); } string name = layer.name(); GE_IF_BOOL_EXEC(shape_map.count(name) != 0, model_dims = shape_map.at(name)); GE_CHK_STATUS_RET(GetOutputDesc(name, model_dims, op), "[Get][OutputDesc] failed in layer %s", name.c_str()); } } else { // Get from external input const ge::ParserContext &ctx = GetParserContext(); std::map> input_dims = ctx.input_dims; string name = layer.name(); std::map>::const_iterator search = input_dims.find(name); if (search == input_dims.end()) { REPORT_INPUT_ERROR("E11005", std::vector({"input"}), std::vector({layer.name()})); GELOGE(PARAM_INVALID, "[Check][Param] Caffe prototxt has no input_param or user " "should set --input_shape in atc parameter, caffe layer name [%s], layer type [%s].", layer.name().c_str(), layer.type().c_str()); return FAILED; } std::vector dims = search->second; GE_CHK_STATUS_RET(GetOutputDesc(name, dims, op), "[Get][OutputDesc] failed in layer %s.", name.c_str()); } return SUCCESS; } Status CaffeDataParser::ParseParamsForDummyData(const domi::caffe::LayerParameter &layer, ge::OpDescPtr &op) const { if (layer.has_dummy_data_param()) { const domi::caffe::DummyDataParameter &dummy_data_param = layer.dummy_data_param(); if (dummy_data_param.shape_size() == 0) { ErrorManager::GetInstance().ATCReportErrMessage( "E11027", {"layername", "layertype"}, {layer.name(), layer.type()}); GELOGE(PARAM_INVALID, "[Check][Param] input_param shape size is zero, caffe layer name [%s], layer type [%s].", layer.name().c_str(), layer.type().c_str()); return FAILED; } for (int i = 0; i < dummy_data_param.shape_size(); i++) { const domi::caffe::BlobShape &blob_shape = dummy_data_param.shape(i); vector shape; std::map> &shape_map = GetParserContext().input_dims; std::vector model_dims; for (auto &blob_shape_dim_temp : blob_shape.dim()) { model_dims.push_back(blob_shape_dim_temp); } string name = layer.name(); GE_IF_BOOL_EXEC(shape_map.count(name) != 0, model_dims = shape_map.at(name)); GE_CHK_STATUS_RET(GetOutputDesc(name, model_dims, op), "[Get][OutputDesc] failed in layer %s", name.c_str()); } } else { // Get from external input const ge::ParserContext &ctx = GetParserContext(); std::map> input_dims = ctx.input_dims; string name = layer.name(); std::map>::const_iterator search = input_dims.find(name); if (search == input_dims.end()) { REPORT_INPUT_ERROR("E11005", std::vector({"input"}), std::vector({layer.name()})); GELOGE(PARAM_INVALID, "[Check][Param] Caffe prototxt has no input_param or user " "should set --input_shape in atc parameter, caffe layer name [%s], layer type [%s].", layer.name().c_str(), layer.type().c_str()); return FAILED; } std::vector dims = search->second; GE_CHK_STATUS_RET(GetOutputDesc(name, dims, op), "[Get][OutputDesc] failed in layer %s.", name.c_str()); } return SUCCESS; } REGISTER_OP_PARSER_CREATOR(CAFFE, kData, CaffeDataParser); } // namespace ge