| 292 | } |
| 293 | |
| 294 | GraphDumper::DumpResult GraphDumperOSSV2::dump( |
| 295 | const SymbolVarArray& output_vars, const DumpConfig& config, |
| 296 | const Metadata& metadata) { |
| 297 | mgb_throw_if(output_vars.empty(), SerializationError, "Can't dump empty graph"); |
| 298 | |
| 299 | auto new_output_vars = output_vars; |
| 300 | if (!config.no_change_graph) { |
| 301 | new_output_vars = converter_all_opr_to_compatiable(output_vars); |
| 302 | mgb_assert(output_vars.size() == new_output_vars.size()); |
| 303 | for (size_t id = 0; id < output_vars.size(); id++) { |
| 304 | auto& new_var = new_output_vars[id]; |
| 305 | new_var.rename(output_vars[id].node()->name()); |
| 306 | } |
| 307 | } |
| 308 | |
| 309 | auto begin_pos = m_file->tell(); |
| 310 | m_config = config; |
| 311 | m_builder.Reset(); |
| 312 | |
| 313 | m_output_vars.clear(); |
| 314 | m_cur_rst = {}; |
| 315 | m_used_input_names.clear(); |
| 316 | m_used_param_names.clear(); |
| 317 | m_var_remove_in_dump.clear(); |
| 318 | m_model_middle_tensors.clear(); |
| 319 | m_var2midtensor_id.clear(); |
| 320 | m_nr_shared_tensor = 0; |
| 321 | |
| 322 | // process output vars |
| 323 | bool keep_output_var_name = m_config.keep_var_name >= 1; |
| 324 | std::unordered_set<std::string> output_var_names; |
| 325 | for (auto i : new_output_vars) { |
| 326 | mgb_assert( |
| 327 | !i.node()->contain_flag(VarNode::Flag::VOLATILE_CONTENT), |
| 328 | "can not dump var with VOLATILE_CONTENT flag: %s", |
| 329 | cg::dump_var_info({i.node()}).c_str()); |
| 330 | if (m_output_vars.insert(i.node()).second && keep_output_var_name) { |
| 331 | auto name_ins = output_var_names.insert(i.node()->name()).second; |
| 332 | mgb_assert(name_ins, "duplicated output var name: %s", i.node()->cname()); |
| 333 | } |
| 334 | } |
| 335 | |
| 336 | // Dump metadata |
| 337 | auto fbmeta = build_metadata(metadata); |
| 338 | |
| 339 | // Dump operators |
| 340 | init_oprs_to_dump(new_output_vars); |
| 341 | std::vector<flatbuffers::Offset<fbs::v2::Operator>> oprs; |
| 342 | for (auto&& i : m_oprs_to_dump) { |
| 343 | record_opr_dumped(i.second->type_id, i.second->name, i.second->version); |
| 344 | oprs.emplace_back(build_single_opr(i.first, i.second)); |
| 345 | } |
| 346 | auto fb_oprs = m_builder.CreateVector(oprs); |
| 347 | |
| 348 | // Dump output vars |
| 349 | std::vector<flatbuffers::Offset<fbs::v2::OutputVar>> output_vars_idx; |
| 350 | output_vars_idx.reserve(new_output_vars.size()); |
| 351 | for (auto i : new_output_vars) { |
nothing calls this directly
no test coverage detected