• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2021 Huawei Technologies Co., Ltd
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "backend/kernel_compiler/tbe/tbe_json/single_tbe_json_creator.h"
18 #include "frontend/parallel/ops_info/ops_utils.h"
19 #include "backend/session/anf_runtime_algorithm.h"
20 #include "backend/kernel_compiler/tbe/tbe_adapter.h"
21 #include "backend/kernel_compiler/tbe/tbe_convert_utils.h"
22 #include "backend/kernel_compiler/tbe/tbe_dynaminc_shape_util.h"
23 #include "backend/kernel_compiler/tbe/tbe_utils.h"
24 #include "runtime/dev.h"
25 #include "utils/ms_utils.h"
26 #include "utils/json_operation_utils.h"
27 #include "backend/kernel_compiler/tbe/tbe_json/tbe_json_utils.h"
28 
29 namespace mindspore::kernel {
30 using mindspore::kernel::tbe::TbeAdapter;
GenJson(const AnfNodePtr & anf_node,nlohmann::json * kernel_json)31 bool SingleTbeJsonCreator::GenJson(const AnfNodePtr &anf_node, nlohmann::json *kernel_json) {
32   MS_EXCEPTION_IF_NULL(anf_node);
33   MS_EXCEPTION_IF_NULL(kernel_json);
34   auto op_name = AnfAlgo::GetCNodeName(anf_node);
35   MS_LOG(DEBUG) << "Start, node [ " << op_name << " ].";
36   nlohmann::json soc_info_json = kernel::tbe::TbeUtils::GenSocInfo();
37   std::vector<nlohmann::json> op_list;
38   if (!GenOpListJson(anf_node, &op_list)) {
39     MS_LOG(ERROR) << "Anf Node [" << op_name << "] generate op_list json failed";
40     return false;
41   }
42   (*kernel_json)[kJSocInfo] = soc_info_json;
43   (*kernel_json)[kJOpList] = op_list;
44   GenFusionOpName(kernel_json);
45   AddOpNameForComputeNode(kernel_json);
46   (*kernel_json)[kJFullName] = anf_node->fullname_with_scope();
47   (*kernel_json)[kJGraphName] = "";
48   (*kernel_json)[kJScopeID] = -1;
49   (*kernel_json)[kJL1Size] = -1;
50   MS_LOG(DEBUG) << "Json info name is : " << GetJsonName() << ", kernel json:" << kernel_json->dump();
51   return true;
52 }
53 
GenOpListJson(const AnfNodePtr & anf_node,std::vector<nlohmann::json> * op_list_json)54 bool SingleTbeJsonCreator::GenOpListJson(const AnfNodePtr &anf_node, std::vector<nlohmann::json> *op_list_json) {
55   MS_EXCEPTION_IF_NULL(anf_node);
56   MS_EXCEPTION_IF_NULL(op_list_json);
57   MS_LOG(DEBUG) << "Start.";
58   nlohmann::json compute_json;
59   if (!GenComputeJson(anf_node, &compute_json)) {
60     MS_LOG(ERROR) << "Anf Node [" << AnfAlgo::GetCNodeName(anf_node) << "] generate compute json failed";
61     return false;
62   }
63   GenDataJson(anf_node, compute_json, op_list_json);
64   (*op_list_json).push_back(compute_json);
65   MS_LOG(DEBUG) << "End.";
66   return true;
67 }
68 
GenDataJson(const AnfNodePtr & anf_node,const nlohmann::json & compute_json,std::vector<nlohmann::json> * op_list_json)69 void SingleTbeJsonCreator::GenDataJson(const AnfNodePtr &anf_node, const nlohmann::json &compute_json,
70                                        std::vector<nlohmann::json> *op_list_json) {
71   MS_EXCEPTION_IF_NULL(anf_node);
72   MS_EXCEPTION_IF_NULL(op_list_json);
73   MS_LOG(DEBUG) << "Start";
74   auto op_name = AnfAlgo::GetCNodeName(anf_node);
75   auto op_info_ptr = mindspore::kernel::tbe::TbeDynamicShapeUtil::FindOp(op_name, anf_node);
76   auto inputs_ptr = op_info_ptr->inputs_ptr();
77   auto inputs_json = GetJsonValue<std::vector<nlohmann::json>>(compute_json, kJInputDesc);
78   for (size_t i = 0; i < inputs_ptr.size(); i++) {
79     auto input_json = inputs_json.at(i);
80     auto input_ptr = inputs_ptr[i];
81     MS_EXCEPTION_IF_NULL(input_ptr);
82     nlohmann::json data_json;
83     std::vector<nlohmann::json> output_desc;
84     if (input_json.is_array()) {
85       data_json[kJName] = input_ptr->name() + "_dynamic";
86       auto tmp_inputs = input_json.get<std::vector<nlohmann::json>>();
87       std::copy(tmp_inputs.begin(), tmp_inputs.end(), std::back_inserter(output_desc));
88     } else {
89       data_json[kJName] = GetJsonValue<std::string>(input_json, kJName);
90       output_desc.push_back(input_json);
91     }
92     data_json[kJOutputDesc] = output_desc;
93     data_json[kJType] = kJData;
94     (*op_list_json).push_back(data_json);
95   }
96   MS_LOG(DEBUG) << "End";
97 }
98 
GenInputsJson(const AnfNodePtr & anf_node,nlohmann::json * compute_json)99 bool SingleTbeJsonCreator::GenInputsJson(const AnfNodePtr &anf_node, nlohmann::json *compute_json) {
100   MS_EXCEPTION_IF_NULL(anf_node);
101   MS_EXCEPTION_IF_NULL(compute_json);
102   MS_LOG(DEBUG) << "Start.";
103   auto op_name = AnfAlgo::GetCNodeName(anf_node);
104   auto op_info_ptr = mindspore::kernel::tbe::TbeDynamicShapeUtil::FindOp(op_name, anf_node);
105   MS_EXCEPTION_IF_NULL(op_info_ptr);
106   std::vector<OpIOInfoPtr> inputs_ptr = op_info_ptr->inputs_ptr();
107   std::vector<nlohmann::json> inputs_json;
108   if (inputs_ptr.empty()) {
109     MS_LOG(DEBUG) << op_name << " registration info has no input info.";
110     (*compute_json)[kJInputDesc] = inputs_json;
111     return true;
112   }
113   std::vector<size_t> inputs_tensor_num;
114   if (!TbeJsonUtils::GetInputsRealNum(anf_node, inputs_ptr, &inputs_tensor_num)) {
115     return false;
116   }
117 
118   std::vector<nlohmann::json> inputs_desc;
119   size_t real_input_num = AnfAlgo::GetInputTensorNum(anf_node);
120   for (size_t i = 0; i < real_input_num; i++) {
121     nlohmann::json input_desc;
122     GenInputDescJson(anf_node, i, &input_desc);
123     inputs_desc.emplace_back(input_desc);
124   }
125 
126   size_t need_input_num = std::accumulate(inputs_tensor_num.begin(), inputs_tensor_num.end(), static_cast<size_t>(0));
127   // gen optional desc
128   for (size_t i = AnfAlgo::GetInputTensorNum(anf_node); i < need_input_num; i++) {
129     nlohmann::json input_desc;
130     input_desc[kJValid] = false;
131     input_desc[kJShape] = kJNull;
132     input_desc[kJDataType] = 0;
133     inputs_desc.emplace_back(input_desc);
134   }
135 
136   std::vector<nlohmann::json> inputs_list;
137   if (!AssignInputsJson(anf_node, inputs_desc, inputs_tensor_num, inputs_ptr, &inputs_list)) {
138     return false;
139   }
140 
141   TbeAdapter::InputOrderPass<nlohmann::json>(anf_node, inputs_list, &inputs_json);
142   (*compute_json)[kJInputDesc] = inputs_json;
143   MS_LOG(DEBUG) << "End.";
144   return true;
145 }
146 
GenInputDescJson(const AnfNodePtr & anf_node,size_t real_input_index,nlohmann::json * input_desc)147 void SingleTbeJsonCreator::GenInputDescJson(const AnfNodePtr &anf_node, size_t real_input_index,
148                                             nlohmann::json *input_desc) {
149   MS_EXCEPTION_IF_NULL(anf_node);
150   MS_EXCEPTION_IF_NULL(input_desc);
151   GenDesJsonCommon(input_desc);
152   auto shape = TbeJsonUtils::GetInputDeviceShapeForTbeBuild(anf_node, real_input_index);
153   auto ori_shape = TbeJsonUtils::GetInputOriShapeForTbeBuild(anf_node, real_input_index);
154   if (shape.empty()) {
155     shape.emplace_back(1);
156   }
157   if (ori_shape.empty()) {
158     ori_shape.emplace_back(1);
159   }
160 
161   auto def_format = TbeJsonUtils::IsNeedChangeDefaultFormat(anf_node) ? kOpFormat_NCDHW : kOpFormat_NCHW;
162   auto format = AnfAlgo::GetInputFormat(anf_node, real_input_index);
163   format = TbeAdapter::FormatPass(format, ori_shape.size());
164   format =
165     (def_format == kOpFormat_NCDHW && k3DFormatSet.find(format) == k3DFormatSet.end()) ? kOpFormat_NCDHW : format;
166   (*input_desc)[kJDtype] = tbe::TypeIdToString(AnfAlgo::GetInputDeviceDataType(anf_node, real_input_index));
167   (*input_desc)[kJDataType] = GetJsonValue<std::string>(*input_desc, kJDtype);
168   (*input_desc)[kJOriShape] = ori_shape;
169   (*input_desc)[kJOriFormat] = def_format;
170   (*input_desc)[kJShape] = shape;
171   (*input_desc)[kJFormat] = format;
172   (*input_desc)[kJValid] = true;
173   (*input_desc)[kJRange] = tbe::TbeDynamicShapeUtil::GetInputDynamicRange(anf_node, real_input_index, format);
174   GenInputConstValue(anf_node, real_input_index, input_desc);
175 }
176 
GenOutputDescJson(const AnfNodePtr & anf_node,size_t node_out_idx,nlohmann::json * output_desc)177 void SingleTbeJsonCreator::GenOutputDescJson(const AnfNodePtr &anf_node, size_t node_out_idx,
178                                              nlohmann::json *output_desc) {
179   MS_EXCEPTION_IF_NULL(anf_node);
180   GenDescJson(anf_node, node_out_idx, node_out_idx, output_desc);
181   output_desc->erase(kJOutputIndex);
182   (*output_desc)[kJValid] = true;
183   (*output_desc)[kJRange] =
184     tbe::TbeDynamicShapeUtil::GetOutputDynamicRange(anf_node, node_out_idx, (*output_desc)[kJFormat]);
185 }
186 
AssignInputsJson(const AnfNodePtr & anf_node,const std::vector<nlohmann::json> & inputs_desc,const std::vector<size_t> & inputs_tensor_num,const std::vector<OpIOInfoPtr> & inputs_ptr,std::vector<nlohmann::json> * inputs_json)187 bool SingleTbeJsonCreator::AssignInputsJson(const AnfNodePtr &anf_node, const std::vector<nlohmann::json> &inputs_desc,
188                                             const std::vector<size_t> &inputs_tensor_num,
189                                             const std::vector<OpIOInfoPtr> &inputs_ptr,
190                                             std::vector<nlohmann::json> *inputs_json) {
191   MS_EXCEPTION_IF_NULL(anf_node);
192   MS_EXCEPTION_IF_NULL(inputs_json);
193   MS_LOG(DEBUG) << "Start.";
194   size_t inputs_desc_index = 0;
195   for (size_t i = 0; i < inputs_tensor_num.size(); i++) {
196     auto input_ptr = inputs_ptr[i];
197     MS_EXCEPTION_IF_NULL(input_ptr);
198     auto param_type = input_ptr->param_type();
199     if (param_type == kJParamOptional) {
200       nlohmann::json current_input_desc;
201       // DynamicRnn and DynamicGRUV2 exist placeholder input
202       current_input_desc = inputs_desc.at(inputs_desc_index);
203       if (TbeAdapter::IsPlaceHolderInput(anf_node, input_ptr)) {
204         current_input_desc[kJValid] = false;
205       }
206       current_input_desc[kJName] = input_ptr->name() + "_optional_";
207       current_input_desc[kJParamType] = input_ptr->param_type();
208       (*inputs_json).emplace_back(current_input_desc);
209       inputs_desc_index++;
210     } else if (param_type == kJParamDynamic) {
211       std::vector<nlohmann::json> dynamic_inputs_desc;
212       for (size_t j = 0; j < inputs_tensor_num[i]; j++) {
213         auto current_input_desc = inputs_desc.at(inputs_desc_index);
214         current_input_desc[kJName] = input_ptr->name() + "_dynamic_" + std::to_string(j);
215         current_input_desc[kJParamType] = input_ptr->param_type();
216         dynamic_inputs_desc.emplace_back(current_input_desc);
217         inputs_desc_index++;
218       }
219       (*inputs_json).emplace_back(dynamic_inputs_desc);
220     } else if (param_type == kJParamRequred) {
221       auto current_input_desc = inputs_desc.at(inputs_desc_index);
222       current_input_desc[kJName] = input_ptr->name() + "_0";
223       current_input_desc[kJParamType] = input_ptr->param_type();
224       (*inputs_json).emplace_back(current_input_desc);
225       inputs_desc_index++;
226     } else {
227       MS_LOG(ERROR) << "Unsupported input param type:[" << param_type
228                     << "], supported list: {optional, dynamic, required}.";
229       return false;
230     }
231   }
232   MS_LOG(DEBUG) << "End.";
233   return true;
234 }
235 
GenOutputsJson(const AnfNodePtr & anf_node,nlohmann::json * compute_json)236 bool SingleTbeJsonCreator::GenOutputsJson(const AnfNodePtr &anf_node, nlohmann::json *compute_json) {
237   MS_EXCEPTION_IF_NULL(anf_node);
238   MS_EXCEPTION_IF_NULL(compute_json);
239   MS_LOG(DEBUG) << "Start.";
240   auto op_name = AnfAlgo::GetCNodeName(anf_node);
241   auto op_info_ptr = mindspore::kernel::tbe::TbeDynamicShapeUtil::FindOp(op_name, anf_node);
242   MS_EXCEPTION_IF_NULL(op_info_ptr);
243   std::vector<size_t> outputs_tensor_num;
244   auto outputs_ptr = op_info_ptr->outputs_ptr();
245   if (!TbeJsonUtils::GetOutputsRealNum(anf_node, outputs_ptr, &outputs_tensor_num)) {
246     return false;
247   }
248 
249   size_t sum_outputs_num =
250     std::accumulate(outputs_tensor_num.begin(), outputs_tensor_num.end(), static_cast<size_t>(0));
251   size_t real_output_num = AnfAlgo::GetOutputTensorNum(anf_node);
252   std::vector<nlohmann::json> outputs_desc;
253   for (size_t i = 0; i < real_output_num; i++) {
254     nlohmann::json output_desc;
255     GenOutputDescJson(anf_node, i, &output_desc);
256     outputs_desc.emplace_back(output_desc);
257   }
258 
259   for (size_t i = real_output_num; i < sum_outputs_num; i++) {
260     nlohmann::json output_desc;
261     output_desc[kJValid] = false;
262     output_desc[kJShape] = kJNull;
263     outputs_desc.emplace_back(output_desc);
264   }
265 
266   std::vector<nlohmann::json> outputs_json;
267   if (!AssignOutputsJson(anf_node, outputs_desc, outputs_tensor_num, outputs_ptr, &outputs_json)) {
268     return false;
269   }
270   (*compute_json)[kJOutputDesc] = outputs_json;
271   MS_LOG(DEBUG) << "End.";
272   return true;
273 }
274 
AssignOutputsJson(const AnfNodePtr & anf_node,const std::vector<nlohmann::json> & outputs_desc,const std::vector<size_t> & outputs_tensor_num,const std::vector<OpIOInfoPtr> & outputs_ptr,std::vector<nlohmann::json> * outputs_json)275 bool SingleTbeJsonCreator::AssignOutputsJson(const AnfNodePtr &anf_node,
276                                              const std::vector<nlohmann::json> &outputs_desc,
277                                              const std::vector<size_t> &outputs_tensor_num,
278                                              const std::vector<OpIOInfoPtr> &outputs_ptr,
279                                              std::vector<nlohmann::json> *outputs_json) {
280   MS_EXCEPTION_IF_NULL(anf_node);
281   MS_LOG(DEBUG) << "Start.";
282   size_t outputs_desc_index = 0;
283   for (size_t i = 0; i < outputs_tensor_num.size(); i++) {
284     auto output_ptr = outputs_ptr[i];
285     MS_EXCEPTION_IF_NULL(output_ptr);
286     auto param_type = output_ptr->param_type();
287     if (param_type == kJParamDynamic) {
288       std::vector<nlohmann::json> dynamic_outputs_desc;
289       for (size_t j = 0; j < outputs_tensor_num[i]; j++) {
290         auto current_input_desc = outputs_desc.at(outputs_desc_index);
291         current_input_desc[kJName] = output_ptr->name();
292         current_input_desc[kJParamType] = output_ptr->param_type();
293         dynamic_outputs_desc.emplace_back(current_input_desc);
294         outputs_desc_index++;
295       }
296       (*outputs_json).emplace_back(dynamic_outputs_desc);
297     } else if (param_type == kJParamRequred || param_type == kJParamOptional) {
298       auto current_input_desc = outputs_desc.at(outputs_desc_index);
299       current_input_desc[kJName] = output_ptr->name();
300       current_input_desc[kJParamType] = output_ptr->param_type();
301       (*outputs_json).emplace_back(current_input_desc);
302       outputs_desc_index++;
303     } else {
304       MS_LOG(ERROR) << "Unsupported output param type:[" << param_type
305                     << "], supported list: {required, dynamic, optional}.";
306       return false;
307     }
308   }
309   MS_LOG(DEBUG) << "End.";
310   return true;
311 }
312 
GenOtherJson(const AnfNodePtr & anf_node,nlohmann::json * compute_json)313 void SingleTbeJsonCreator::GenOtherJson(const AnfNodePtr &anf_node, nlohmann::json *compute_json) {
314   MS_EXCEPTION_IF_NULL(anf_node);
315   MS_EXCEPTION_IF_NULL(compute_json);
316   MS_LOG(DEBUG) << "Start.";
317   (*compute_json)[kJOriName] = {anf_node->fullname_with_scope()};
318   (*compute_json)[kJBuildType] = kAccuratelyBuild;
319   (*compute_json)[kJMissSupportInfo] = "";
320   (*compute_json)[kJMaxKernelID] = kJMaxKernelIDValue;
321   (*compute_json)[kJUnknowShape] = tbe::TbeDynamicShapeUtil::GetDynamicShapeAttr(anf_node);
322   MS_LOG(DEBUG) << "End.";
323 }
324 
GenDescJson(const AnfNodePtr & anf_node,size_t node_out_idx,size_t desc_output_idx,nlohmann::json * output_desc)325 void SelectTbeJsonCreator::GenDescJson(const AnfNodePtr &anf_node, size_t node_out_idx, size_t desc_output_idx,
326                                        nlohmann::json *output_desc) {
327   MS_EXCEPTION_IF_NULL(anf_node);
328   GenDesJsonCommon(output_desc);
329   std::vector<int64_t> shape;
330   std::vector<int64_t> ori_shape;
331   ori_shape = TbeJsonUtils::GetOutputOriShapeForTbeBuild(anf_node, node_out_idx);
332   if (ori_shape.empty()) {
333     ori_shape.emplace_back(1);
334   }
335   shape = ori_shape;
336 
337   auto def_format = TbeJsonUtils::IsNeedChangeDefaultFormat(anf_node) ? kOpFormat_NCDHW : kOpFormat_NCHW;
338   auto format = def_format;
339 
340   (*output_desc)[kJDataType] = tbe::TypeIdToString(AnfAlgo::GetOutputInferDataType(anf_node, node_out_idx));
341   (*output_desc)[kJDtype] = GetJsonValue<std::string>(*output_desc, kJDataType);
342   (*output_desc)[kJFormat] = format;
343   (*output_desc)[kJOriFormat] = def_format;
344   (*output_desc)[kJOriShape] = ori_shape;
345   (*output_desc)[kJShape] = shape;
346   (*output_desc)[kJOutputIndex] = desc_output_idx;
347 }
348 
GenInputDescJson(const AnfNodePtr & anf_node,size_t real_input_index,nlohmann::json * input_desc)349 void SelectTbeJsonCreator::GenInputDescJson(const AnfNodePtr &anf_node, size_t real_input_index,
350                                             nlohmann::json *input_desc) {
351   MS_EXCEPTION_IF_NULL(anf_node);
352   GenDesJsonCommon(input_desc);
353   auto ori_shape = TbeJsonUtils::GetInputOriShapeForTbeBuild(anf_node, real_input_index);
354   if (ori_shape.empty()) {
355     ori_shape.emplace_back(1);
356   }
357   auto shape = ori_shape;
358 
359   auto def_format = TbeJsonUtils::IsNeedChangeDefaultFormat(anf_node) ? kOpFormat_NCDHW : kOpFormat_NCHW;
360   auto format = def_format;
361   (*input_desc)[kJDtype] = tbe::TypeIdToString(AnfAlgo::GetPrevNodeOutputInferDataType(anf_node, real_input_index));
362   (*input_desc)[kJDataType] = GetJsonValue<std::string>(*input_desc, kJDtype);
363   (*input_desc)[kJOriShape] = ori_shape;
364   (*input_desc)[kJOriFormat] = def_format;
365   (*input_desc)[kJShape] = shape;
366   (*input_desc)[kJFormat] = format;
367   (*input_desc)[kJValid] = true;
368   (*input_desc)[kJRange] = tbe::TbeDynamicShapeUtil::GetInputDynamicRange(anf_node, real_input_index, format);
369 }
AttrsJsonPostProcessing(const AnfNodePtr & anf_node,const OpInfoPtr & op_info_ptr,nlohmann::json * attrs_json)370 bool SelectTbeJsonCreator::AttrsJsonPostProcessing(const AnfNodePtr &anf_node, const OpInfoPtr &op_info_ptr,
371                                                    nlohmann::json *attrs_json) {
372   MS_EXCEPTION_IF_NULL(anf_node);
373   MS_EXCEPTION_IF_NULL(op_info_ptr);
374   MS_EXCEPTION_IF_NULL(attrs_json);
375   tbe::TbeAdapter::LayerNormAttrJsonPost(anf_node, attrs_json);
376   return true;
377 }
378 
GenDescJson(const AnfNodePtr & anf_node,size_t node_out_idx,size_t desc_output_idx,nlohmann::json * output_desc)379 void CheckTbeJsonCreator::GenDescJson(const AnfNodePtr &anf_node, size_t node_out_idx, size_t desc_output_idx,
380                                       nlohmann::json *output_desc) {
381   MS_EXCEPTION_IF_NULL(anf_node);
382   GenDesJsonCommon(output_desc);
383   std::vector<int64_t> shape;
384   std::vector<int64_t> ori_shape;
385   ori_shape = TbeJsonUtils::GetOutputOriShapeForTbeBuild(anf_node, node_out_idx);
386   if (ori_shape.empty()) {
387     ori_shape.emplace_back(1);
388   }
389   shape = ori_shape;
390   auto def_format = TbeJsonUtils::IsNeedChangeDefaultFormat(anf_node) ? kOpFormat_NCDHW : kOpFormat_NCHW;
391   auto format = def_format;
392 
393   (*output_desc)[kJDataType] = tbe::TypeIdToString(AnfAlgo::GetOutputDeviceDataType(anf_node, node_out_idx));
394   (*output_desc)[kJDtype] = GetJsonValue<std::string>(*output_desc, kJDataType);
395   (*output_desc)[kJFormat] = format;
396   (*output_desc)[kJOriFormat] = def_format;
397   (*output_desc)[kJOriShape] = ori_shape;
398   (*output_desc)[kJShape] = shape;
399   (*output_desc)[kJOutputIndex] = desc_output_idx;
400 }
401 
GenInputDescJson(const AnfNodePtr & anf_node,size_t real_input_index,nlohmann::json * input_desc)402 void CheckTbeJsonCreator::GenInputDescJson(const AnfNodePtr &anf_node, size_t real_input_index,
403                                            nlohmann::json *input_desc) {
404   MS_EXCEPTION_IF_NULL(anf_node);
405   GenDesJsonCommon(input_desc);
406   auto ori_shape = TbeJsonUtils::GetInputOriShapeForTbeBuild(anf_node, real_input_index);
407   if (ori_shape.empty()) {
408     ori_shape.emplace_back(1);
409   }
410   auto shape = ori_shape;
411 
412   auto def_format = TbeJsonUtils::IsNeedChangeDefaultFormat(anf_node) ? kOpFormat_NCDHW : kOpFormat_NCHW;
413   auto format = def_format;
414   (*input_desc)[kJDtype] = tbe::TypeIdToString(AnfAlgo::GetInputDeviceDataType(anf_node, real_input_index));
415   (*input_desc)[kJDataType] = GetJsonValue<std::string>(*input_desc, kJDtype);
416   (*input_desc)[kJOriShape] = ori_shape;
417   (*input_desc)[kJOriFormat] = def_format;
418   (*input_desc)[kJShape] = shape;
419   (*input_desc)[kJFormat] = format;
420   (*input_desc)[kJValid] = true;
421   (*input_desc)[kJRange] = tbe::TbeDynamicShapeUtil::GetInputDynamicRange(anf_node, real_input_index, format);
422   GenInputConstValue(anf_node, real_input_index, input_desc);
423 }
424 }  // namespace mindspore::kernel
425