| 55 | } |
| 56 | |
| 57 | void GraphLoader::LoadResult::graph_compile_ahead() { |
| 58 | //! when force_output_use_user_specified_memory is set, the output var may |
| 59 | //! be changed by gopt, then the var in LoadResult can not exist, so here |
| 60 | //! just do basic optimize_for_inference ahead, and replace the var in |
| 61 | //! LoadResult |
| 62 | if (graph->options().force_output_use_user_specified_memory) { |
| 63 | //! if the output var is like dimshuffle, reshape, it maybe memory forward to |
| 64 | //! the output, so add a Copy operator in the end. |
| 65 | for (auto& var : output_var_list) { |
| 66 | if (is_opr_memforward_var(var.node())) { |
| 67 | std::string name = var.node()->name(); |
| 68 | var = opr::Copy::make(var, name); |
| 69 | } |
| 70 | } |
| 71 | auto options = gopt::OptimizeForInferenceOptions{}; |
| 72 | auto new_vars = gopt::optimize_for_inference(output_var_list, options); |
| 73 | output_var_list = new_vars; |
| 74 | output_var_map.clear(); |
| 75 | for (auto& var : new_vars) { |
| 76 | output_var_map[var.node()->cname()] = var; |
| 77 | } |
| 78 | std::unordered_map<size_t, SymbolVar> var_map_id; |
| 79 | for (auto& var : new_vars) { |
| 80 | bool found = false; |
| 81 | for (auto& old_var_it : output_var_map_id) { |
| 82 | if (old_var_it.second.node()->name() == var.node()->name()) { |
| 83 | found = true; |
| 84 | var_map_id[old_var_it.first] = var; |
| 85 | } |
| 86 | } |
| 87 | mgb_assert( |
| 88 | found, "can't find var name %s when optimize_for_inference. ", |
| 89 | var.node()->cname()); |
| 90 | } |
| 91 | output_var_map_id = var_map_id; |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | GraphLoader::SharedTensorNameMap GraphLoader::shared_tensor_name_map() { |
| 96 | SharedTensorNameMap ret; |
no test coverage detected