You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

common.cc 40 kB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. /**
  2. * Copyright 2019-2020 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. #include <math.h>
  17. #include <stdint.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <iostream>
  21. #include <vector>
  22. #include "common.h"
  23. #include "model.h"
  24. #define MAX_HEAD_SIZE 50
  25. using namespace std;
  26. using namespace ge;
  27. void update_op_format(Operator ops, Format format) {
  28. printf("set format begin.........\n");
  29. ge::TensorDesc tensor_desc_x = ops.GetInputDesc("x");
  30. ge::TensorDesc tensor_desc_y = ops.GetOutputDesc("y");
  31. Format f_x0 = tensor_desc_x.GetFormat();
  32. Format f_y0 = tensor_desc_x.GetFormat();
  33. printf("before set x format:%d \n", f_x0);
  34. printf("before set y format:%d \n", f_y0);
  35. printf("format to be set is :%d \n", format);
  36. tensor_desc_x.SetFormat(format);
  37. tensor_desc_y.SetFormat(format);
  38. ops.UpdateInputDesc("x", tensor_desc_x);
  39. ops.UpdateOutputDesc("y", tensor_desc_y);
  40. Format f_x = tensor_desc_x.GetFormat();
  41. Format f_y = tensor_desc_y.GetFormat();
  42. printf("after set x format:%d \n", f_x);
  43. printf("after set y format:%d \n", f_y);
  44. }
  45. /// getDimInfo: get dim info from data file
  46. /// param:
  47. /// fp: the testing datafile object
  48. ///
  49. /// return :
  50. /// dim_info: array to store the info of the dim in datafile, like [4,3,3,6,3,162(3*3*6*3)],4 is dim size,3,3,6,3 is the
  51. /// dim shape data_size: the size of the testing data including the data file
  52. void getDimInfo(FILE *fp, std::vector<uint64_t> &dim_info) {
  53. // get dim info from hisi testing data file
  54. uint32_t *dim_buffer = (uint32_t *)malloc(MAX_HEAD_SIZE * sizeof(uint32_t));
  55. fread(dim_buffer, sizeof(uint32_t), MAX_HEAD_SIZE, fp);
  56. dim_info.push_back(*dim_buffer); // get dim size
  57. // get data shape to compute the datasize
  58. uint64_t data_size = 1;
  59. uint32_t i = 1;
  60. for (; i <= dim_info[0]; i++) {
  61. dim_info.push_back(*(dim_buffer + i));
  62. data_size *= *(dim_buffer + i);
  63. }
  64. dim_info.push_back(data_size);
  65. free(dim_buffer);
  66. }
  67. /// readTestDataFile: read test date from hisi .t datafile
  68. /// param:
  69. /// infile: the path of hisi .t datafile
  70. /// return:
  71. /// dim_info: array to store the info of the dim in datafile, like [4,3,3,6,3],4 is dim size,3,3,6,3 is the dim shape
  72. void *readTestDataFile(std::string infile, std::vector<uint64_t> &dim_info) {
  73. FILE *fp;
  74. fp = fopen(infile.c_str(), "r");
  75. if (fp == NULL) {
  76. printf("ERROR: cant't open file %s\n", infile.c_str());
  77. return NULL;
  78. } else {
  79. getDimInfo(fp, dim_info);
  80. uint64_t data_size = dim_info[dim_info.size() - 1];
  81. fclose(fp);
  82. fp = fopen(infile.c_str(), "r");
  83. if (fp == NULL) {
  84. printf("ERROR: cant't open file %s\n", infile.c_str());
  85. return NULL;
  86. }
  87. uint32_t *memory = (uint32_t *)malloc((dim_info[0] + 1 + data_size) * sizeof(uint32_t));
  88. fread(memory, sizeof(uint32_t), (dim_info[0] + 1 + data_size), fp);
  89. fclose(fp);
  90. return memory + (dim_info[0] + 1);
  91. }
  92. }
  93. void *readUint8TestDataFile(std::string infile, int size) {
  94. FILE *fp;
  95. fp = fopen(infile.c_str(), "r");
  96. if (fp == NULL) {
  97. printf("ERROR: cant't open file %s\n", infile.c_str());
  98. return NULL;
  99. }
  100. uint8_t *memory = (uint8_t *)malloc((size) * sizeof(uint8_t));
  101. fread(memory, sizeof(uint8_t), (size), fp);
  102. fclose(fp);
  103. return memory;
  104. }
  105. /// allclose
  106. /// param:
  107. /// a:compared file a
  108. /// b:compared file b
  109. /// count: the count size which will compare
  110. /// rtol:
  111. /// atol:
  112. /// return:
  113. /// true or false
  114. bool allclose(float *a, float *b, uint64_t count, float rtol = 1e-05, float atol = 1e-08) {
  115. uint32_t i = 0;
  116. for (; i < count; ++i) {
  117. if (fabs(a[i] - b[i]) > (atol + rtol * fabs(b[i]))) {
  118. printf("compara failed: i= %d, a[i]=%f, b[i]=%f,atol=%f,rtol=%f\n", i, a[i], b[i], atol, rtol);
  119. return false;
  120. }
  121. }
  122. return true;
  123. }
  124. /// compFp32WithTData: compare the data with the data in hisi .t file
  125. /// param:
  126. /// actual_output_data: the result of ge
  127. /// expected_data_file: the path of hisi .t result file
  128. /// rtol:
  129. /// atol:
  130. /// return:
  131. /// true of false
  132. bool compFp32WithTData(float *actual_output_data, std::string expected_data_file, float rtol = 1e-05, float atol = 1e-08) {
  133. std::vector<uint64_t> dim_info;
  134. float *expected_output_data = (float *)readTestDataFile(expected_data_file, dim_info);
  135. uint32_t i = 1;
  136. uint64_t data_size = 1;
  137. for (; i <= dim_info[0]; i++) {
  138. data_size *= dim_info[i];
  139. }
  140. return allclose(actual_output_data, expected_output_data, data_size, rtol, atol);
  141. }
  142. int SwitchDatatype(DataType dt) {
  143. int size = 1;
  144. if (dt == ge::DT_FLOAT) size = 4;
  145. if (dt == ge::DT_INT32) size = 4;
  146. if (dt == ge::DT_FLOAT16) size = 2;
  147. if (dt == ge::DT_INT64) size = 8;
  148. return size;
  149. }
  150. ge::Tensor genTensor(std::vector<int64_t> tensor_shape, Format format, DataType dt) {
  151. int size = 1;
  152. for (int i = 0; i < tensor_shape.size(); i++) {
  153. size = size * tensor_shape[i];
  154. }
  155. int data_type_size = SwitchDatatype(dt);
  156. size = abs(size * data_type_size);
  157. vector<uint8_t> data_value;
  158. if (size == 0) {
  159. TensorDesc input_tensor_desc = TensorDesc(ge::Shape(tensor_shape), format, dt);
  160. input_tensor_desc.SetRealDimCnt(tensor_shape.size());
  161. Tensor gen_tensor = Tensor(input_tensor_desc, data_value);
  162. return gen_tensor;
  163. }
  164. for (int i = 0; i < size; i++) {
  165. data_value.push_back(1);
  166. }
  167. TensorDesc input_tensor_desc = TensorDesc(ge::Shape(tensor_shape), format, dt);
  168. input_tensor_desc.SetRealDimCnt(tensor_shape.size());
  169. Tensor gen_tensor = Tensor(input_tensor_desc, data_value);
  170. return gen_tensor;
  171. }
  172. ge::Tensor genTensor_withVaule(std::vector<int64_t> tensor_shape, float value) {
  173. int size = 1;
  174. for (int i = 0; i < tensor_shape.size(); i++) {
  175. size = size * tensor_shape[i];
  176. }
  177. float *data_value = new float[size];
  178. for (int i = 0; i < size; i++) {
  179. *(data_value + i) = value;
  180. }
  181. Tensor gen_ge_tensor;
  182. TensorDesc input_tensor_desc = TensorDesc(ge::Shape(tensor_shape), FORMAT_NCHW);
  183. gen_ge_tensor.SetTensorDesc(input_tensor_desc);
  184. gen_ge_tensor.SetData((uint8_t *)data_value, size * 4);
  185. return gen_ge_tensor;
  186. }
  187. Tensor genTesnor_Shape_as_data(std::vector<int64_t> tensor_shape) {
  188. Format format = FORMAT_NCHW;
  189. DataType dt = DT_INT32;
  190. int size = tensor_shape.size();
  191. int32_t *tensor_data = new int32_t[size];
  192. std::cout << "shape tensor size:" << size << endl;
  193. for (int i = 0; i < size; i++) {
  194. *(tensor_data + i) = tensor_shape[i];
  195. }
  196. Tensor gen_tensor;
  197. TensorDesc input_tensor_desc = TensorDesc(ge::Shape({size}), FORMAT_NCHW, DT_INT32);
  198. gen_tensor.SetData((uint8_t *)tensor_data, size * GetDatTypeSize(dt));
  199. gen_tensor.SetTensorDesc(input_tensor_desc);
  200. return gen_tensor;
  201. }
  202. /// train_flag is 0 when infer; train_flag is 1 when train; train_flag is 0 default
  203. /// run_mode_path is not 0,1,2 when TBE; run_mode_path is 1 when FE; run_mode_path is 0 default
  204. /// run_mode_path is 2 now when AICPU, ge.enabledlocalFmkop is 1
  205. ge::Status GEInitialize_api(string train_flag, string run_mode_path) {
  206. ge::Status ret;
  207. if (run_mode_path == "0") {
  208. const std::map<string, string> config = {
  209. {"device_id", "0,2,4,6"},
  210. {"rank_table_file", "hccl from csa/paas"},
  211. {"ge.graphRunMode", train_flag},
  212. {"ge.aicpuFlag", "1"},
  213. {"ge.feFlag", "1"},
  214. {DDK_VERSION_FLAG, "1.60.T17.B830"},
  215. {"ge.soLoadPath",
  216. "/usr/local/HiAI/runtime/lib64/plugin/opskernel/libfe.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/"
  217. "libaicpu_plugin.so"}};
  218. ret = ge::GEInitialize(config);
  219. } else if (run_mode_path == "1") {
  220. const std::map<string, string> config = {
  221. {"device_id", "0,2,4,6"},
  222. {"rank_table_file", "hccl from csa/paas"},
  223. {"ge.graphRunMode", train_flag},
  224. {"ge.feFlag", "1"},
  225. {DDK_VERSION_FLAG, "1.60.T17.B830"},
  226. {TBE_PLUGIN_PATH_FLAG, "/usr/local/HiAI/runtime/lib64/tbe_plugin/bert"},
  227. {"ge.soLoadPath", "/usr/local/HiAI/runtime/lib64/plugin/opskernel/libfe.so"}};
  228. ret = ge::GEInitialize(config);
  229. } else if (run_mode_path == "2") {
  230. const std::map<string, string> config = {{"device_id", "0,2,4,6"},
  231. {"rank_table_file", "hccl from csa/paas"},
  232. {"ge.graphRunMode", train_flag},
  233. {LOCAL_FMKOP_FLAG, "1"}};
  234. ret = ge::GEInitialize(config);
  235. } else {
  236. const std::map<string, string> config = {
  237. {"device_id", "0,2,4,6"},
  238. {"rank_table_file", "hccl from csa/paas"},
  239. {"ge.graphRunMode", train_flag},
  240. {DDK_VERSION_FLAG, "1.60.T17.B830"},
  241. {TBE_PLUGIN_PATH_FLAG, "/usr/local/HiAI/runtime/lib64/tbe_plugin/" + run_mode_path}};
  242. ret = ge::GEInitialize(config);
  243. }
  244. std::cout << "GEInitialize_ret is " << ret << std::endl;
  245. return ret;
  246. }
  247. /// train_flag is infer default
  248. /// run_mode: is multi group of [fe,aicpu,bert,deeplabv3,mobilenetv2,single_path_nas,ssd]
  249. /// but bert,deeplabv3,mobilenetv2,single_path_nas,ssd can only set one value from array
  250. /// eg:"fe,aicpu,bert" or "fe", default is “fe”
  251. /// "fe,aicpu,bert" remain open fe aicpu and bert
  252. ge::Status GEInitialize_api_new(string train_flag, string run_mode) {
  253. ge::Status ret;
  254. vector<string> modes;
  255. char *strs = new char[run_mode.length() + 1];
  256. strcpy(strs, run_mode.c_str());
  257. const char *delim = ",";
  258. char *p = strtok(strs, delim);
  259. while (p) {
  260. string s = p; // transform substr to string
  261. modes.push_back(s); // save to result array
  262. p = strtok(NULL, delim);
  263. }
  264. std::map<string, string> config = {
  265. {"device_id", "0,2,4,6"},
  266. {"rank_table_file", "hccl from csa/paas"},
  267. {DDK_VERSION_FLAG, "1.60.T17.B830"},
  268. {"ge.opsProtoLibPath", "/usr/local/HiAI/runtime/ops/op_proto/built-in/libopsproto.so"}};
  269. if (train_flag == "infer")
  270. config.insert(pair<string, string>("ge.graphRunMode", "0"));
  271. else if (train_flag == "train")
  272. config.insert(pair<string, string>("ge.graphRunMode", "1"));
  273. else
  274. std::cout << "GeInitialize give the error param" << std::endl;
  275. for (int i = 0; i < modes.size(); i++) {
  276. if (modes[i] == "fe") {
  277. config.insert(pair<string, string>("ge.feFlag", "1"));
  278. if (config.find("ge.soLoadPath") != config.end()) {
  279. config["ge.soLoadPath"] =
  280. "/usr/local/HiAI/runtime/lib64/plugin/opskernel/libfe.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/"
  281. "libaicpu_plugin.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/HiAI/"
  282. "runtime/lib64/plugin/opskernel/librts_engine.so";
  283. } else {
  284. config.insert(pair<string, string>(
  285. "ge.soLoadPath",
  286. "/usr/local/HiAI/runtime/lib64/plugin/opskernel/libfe.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/"
  287. "libge_local_engine.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/librts_engine.so"));
  288. }
  289. } else if (modes[i] == "aicpu") {
  290. config.insert(pair<string, string>("ge.aicpuFlag", "1"));
  291. if (config.find("ge.soLoadPath") != config.end()) {
  292. config["ge.soLoadPath"] =
  293. "/usr/local/HiAI/runtime/lib64/plugin/opskernel/libfe.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/"
  294. "libaicpu_plugin.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/HiAI/"
  295. "runtime/lib64/plugin/opskernel/librts_engine.so";
  296. } else {
  297. config.insert(pair<string, string>(
  298. "ge.soLoadPath",
  299. "/usr/local/HiAI/runtime/lib64/plugin/opskernel/libaicpu_plugin.so:/usr/local/HiAI/runtime/lib64/plugin/"
  300. "opskernel/libge_local_engine.so:/usr/local/HiAI/runtime/lib64/plugin/opskernel/librts_engine.so"));
  301. }
  302. } else if (modes[i] == "bert" || modes[i] == "deeplabv3" || modes[i] == "mobilenetv2" ||
  303. modes[i] == "single_path_nas" || modes[i] == "ssd") {
  304. config.insert(pair<string, string>(TBE_PLUGIN_PATH_FLAG, "/usr/local/HiAI/runtime/lib64/tbe_plugin/" + modes[i]));
  305. } else if (modes[i] == "plugin") {
  306. } else
  307. std::cout << "GeInitialize give the error param" << std::endl;
  308. }
  309. ret = ge::GEInitialize(config);
  310. std::cout << "GEInitialize_ret is " << ret << std::endl;
  311. return ret;
  312. }
  313. ge::Status GEFinalize_api() {
  314. ge::Status ret = ge::GEFinalize();
  315. std::cout << "GEFinalize ret is " << ret << std::endl;
  316. return ret;
  317. }
  318. /// set train_flag
  319. /// if run_mode_path is "fe" remain FE process; "fe,plugin" is FE and TBE plugin process
  320. /// "aicpu" is open aicpu plugin
  321. int RunGraph_initData(Graph &graph, string op_name, map<string, std::vector<int64_t>> attr_test, string train_flag,
  322. string run_mode_path) {
  323. std::map<string, string> options = {{RUN_FLAG, "1"}};
  324. uint32_t graph_id = 0;
  325. ge::Status ret = GEInitialize_api_new(train_flag, run_mode_path);
  326. EXPECT_EQ(ret, ge::SUCCESS);
  327. ge::Session *session = new Session(options);
  328. ASSERT_TRUE(session != NULL);
  329. std::vector<Tensor> input;
  330. if (attr_test.find("input1") != attr_test.end()) {
  331. Tensor input_tensor = genTensor(attr_test["input1"]);
  332. input.push_back(input_tensor);
  333. }
  334. if (attr_test.find("input2") != attr_test.end()) {
  335. Tensor input_tensor = genTensor(attr_test["input2"]);
  336. input.push_back(input_tensor);
  337. }
  338. if (attr_test.find("input3") != attr_test.end()) {
  339. Tensor input_tensor = genTensor(attr_test["input3"]);
  340. input.push_back(input_tensor);
  341. }
  342. std::vector<Tensor> output;
  343. ret = session->AddGraph(graph_id, graph);
  344. EXPECT_EQ(ret, ge::SUCCESS);
  345. if (train_flag == "1") {
  346. setenv("GE_TRAIN", "1", true);
  347. ret = session->RunGraph(graph_id, input, output);
  348. setenv("GE_TRAIN", "0", true);
  349. } else {
  350. ret = session->RunGraph(graph_id, input, output);
  351. }
  352. delete session;
  353. GEFinalize_api();
  354. if (ret != ge::SUCCESS) {
  355. std::cout << " run graph failed" << std::endl;
  356. return -1;
  357. } else {
  358. return 0;
  359. }
  360. }
  361. ge::Status session_add_and_run_graph(ge::Session *session, uint32_t graph_id, Graph &graph, std::vector<Tensor> inputs,
  362. std::vector<Tensor> &outputs) {
  363. ge::Status ret = session->AddGraph(graph_id, graph);
  364. EXPECT_EQ(ret, ge::SUCCESS);
  365. ret = session->RunGraph(graph_id, inputs, outputs);
  366. return ret;
  367. }
  368. ge::Session *create_session() {
  369. // Init session
  370. std::map<string, string> options = {{"a", "b"}, {TRAIN_FLAG, "1"}};
  371. ge::Session *session = new Session(options);
  372. ASSERT_TRUE(session != NULL);
  373. return session;
  374. }
  375. ge::Session *create_aipp_session() {
  376. // Init session
  377. std::map<string, string> options = {{"a", "b"}, {TRAIN_FLAG, "1"}, {"ge.insertOpFile", "/root/host/ge/aipp.cfg"}};
  378. ge::Session *session = new Session(options);
  379. ASSERT_TRUE(session != NULL);
  380. return session;
  381. }
  382. int buildCheckPointGraph(Graph &graph, map<string, TensorDesc> variables) {
  383. std::vector<Operator> inputs{};
  384. std::vector<Operator> outputs{};
  385. for (map<string, TensorDesc>::iterator it = variables.begin(); it != variables.end(); ++it) {
  386. auto var = op::Variable(string(it->first));
  387. var.update_output_desc_y(it->second);
  388. inputs.push_back(var);
  389. graph.AddOp(var);
  390. }
  391. auto save = op::Save().create_dynamic_input_tensors(inputs.size());
  392. for (int i = 0; i < inputs.size(); i++) {
  393. save.set_dynamic_input_tensors(i, inputs[i]);
  394. }
  395. graph.SetInputs(inputs).SetOutputs(outputs);
  396. return 0;
  397. }
  398. int buildInitGraph(Graph &graph, std::vector<TensorDesc> desc_var, std::vector<std::string> name_var,
  399. std::vector<float> values_var) {
  400. std::vector<Operator> inputs{};
  401. std::vector<Operator> outputs{};
  402. for (int i = 0; i < desc_var.size(); i++) {
  403. desc_var[i].SetRealDimCnt(desc_var[i].GetShape().GetDimNum());
  404. auto tensor_data = genTensor_withVaule(desc_var[i].GetShape().GetDims(), values_var[i]);
  405. auto var_constant = op::Constant().set_attr_value(tensor_data);
  406. var_constant.update_output_desc_y(desc_var[i]);
  407. auto var_init = op::Variable(string(name_var[i]));
  408. var_init.update_output_desc_y(desc_var[i]);
  409. auto var_assign = op::Assign().set_input_ref(var_init).set_input_value(var_constant);
  410. inputs.push_back(var_init);
  411. }
  412. graph.SetInputs(inputs).SetOutputs(outputs);
  413. return 0;
  414. }
  415. int buildInitGraph_other_dataType(Graph &graph, std::vector<TensorDesc> desc_var, std::vector<std::string> name_var) {
  416. std::vector<Operator> inputs{};
  417. std::vector<Operator> outputs{};
  418. for (int i = 0; i < desc_var.size(); i++) {
  419. desc_var[i].SetRealDimCnt(desc_var[i].GetShape().GetDimNum());
  420. auto tensor_data = genTensor(desc_var[i].GetShape().GetDims(), desc_var[i].GetFormat(), desc_var[i].GetDataType());
  421. auto var_constant = op::Constant().set_attr_value(tensor_data);
  422. var_constant.update_output_desc_y(desc_var[i]);
  423. auto var_init = op::Variable(string(name_var[i]));
  424. var_init.update_output_desc_y(desc_var[i]);
  425. auto var_assign = op::Assign().set_input_ref(var_init).set_input_value(var_constant);
  426. inputs.push_back(var_init);
  427. graph.AddOp(var_constant);
  428. graph.AddOp(var_init);
  429. graph.AddOp(var_assign);
  430. }
  431. graph.SetInputs(inputs).SetOutputs(outputs);
  432. return 0;
  433. }
  434. bool build_multi_input_multi_output_graph(Graph &graph) {
  435. auto data1 = op::Data("Data1").set_attr_index(0);
  436. auto data2 = op::Data("Data2").set_attr_index(1);
  437. vector<uint64_t> dim_info;
  438. auto relu1 = op::Relu("Relu1").set_input_x(data1);
  439. auto relu2 = op::Relu("Relu2").set_input_x(data2);
  440. auto eltwise = op::Eltwise("Eltwise")
  441. .create_dynamic_input_x(2)
  442. .set_dynamic_input_x(0, relu1)
  443. .set_dynamic_input_x(1, relu2)
  444. .set_attr_N(2)
  445. .set_attr_mode(1)
  446. .set_attr_coeff({1, 1});
  447. auto eltwise1 = op::Eltwise("Eltwise1")
  448. .create_dynamic_input_x(2)
  449. .set_dynamic_input_x(0, eltwise)
  450. .set_dynamic_input_x(1, eltwise)
  451. .set_attr_N(2)
  452. .set_attr_mode(1)
  453. .set_attr_coeff({1, 1});
  454. auto eltwise2 = op::Eltwise("Eltwise2")
  455. .create_dynamic_input_x(2)
  456. .set_dynamic_input_x(0, eltwise)
  457. .set_dynamic_input_x(1, eltwise)
  458. .set_attr_N(2)
  459. .set_attr_mode(1)
  460. .set_attr_coeff({1, 1});
  461. std::vector<Operator> inputs{data1, data2};
  462. std::vector<Operator> outputs{eltwise1, eltwise2};
  463. graph.SetInputs(inputs).SetOutputs(outputs);
  464. return true;
  465. }
  466. void build_big_graph(Graph &graph, map<string, std::vector<int64_t>> attr) {
  467. auto data = op::Data("Data").set_attr_index(0);
  468. auto weight = op::Const("weight1").set_attr_value(genTensor(attr["weight"]));
  469. vector<int64_t> weight_shape(attr["weight"].begin(), attr["weight"].end());
  470. TensorDesc weight_desc(ge::Shape(weight_shape), FORMAT_NCHW, DT_FLOAT);
  471. weight.update_output_desc_y(weight_desc);
  472. auto conv_1 = op::Conv2D("conv1").set_input_x(data).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  473. auto conv_2 = op::Conv2D("conv2").set_input_x(conv_1).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  474. auto conv_3 = op::Conv2D("conv3").set_input_x(conv_2).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  475. auto conv_4 = op::Conv2D("conv4").set_input_x(conv_3).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  476. auto conv_5 = op::Conv2D("conv5").set_input_x(conv_4).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  477. auto conv_6 = op::Conv2D("conv6").set_input_x(conv_5).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  478. auto conv_7 = op::Conv2D("conv7").set_input_x(conv_6).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  479. auto conv_8 = op::Conv2D("conv8").set_input_x(conv_7).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  480. auto conv_9 = op::Conv2D("conv9").set_input_x(conv_8).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  481. auto conv_10 = op::Conv2D("conv10").set_input_x(conv_9).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  482. auto conv_11 = op::Conv2D("conv11").set_input_x(conv_10).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  483. auto conv_12 = op::Conv2D("conv12").set_input_x(conv_11).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  484. auto conv_13 = op::Conv2D("conv13").set_input_x(conv_12).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  485. auto conv_14 = op::Conv2D("conv14").set_input_x(conv_13).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  486. auto conv_15 = op::Conv2D("conv15").set_input_x(conv_14).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  487. auto conv_16 = op::Conv2D("conv16").set_input_x(conv_15).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  488. auto conv_17 = op::Conv2D("conv17").set_input_x(conv_16).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  489. auto conv_18 = op::Conv2D("conv18").set_input_x(conv_17).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  490. auto conv_19 = op::Conv2D("conv19").set_input_x(conv_18).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  491. auto conv_20 = op::Conv2D("conv20").set_input_x(conv_19).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  492. auto conv_21 = op::Conv2D("conv21").set_input_x(conv_20).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  493. auto conv_22 = op::Conv2D("conv22").set_input_x(conv_21).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  494. auto conv_23 = op::Conv2D("conv23").set_input_x(conv_22).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  495. auto conv_24 = op::Conv2D("conv24").set_input_x(conv_23).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  496. auto conv_25 = op::Conv2D("conv25").set_input_x(conv_24).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  497. auto conv_26 = op::Conv2D("conv26").set_input_x(conv_25).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  498. auto conv_27 = op::Conv2D("conv27").set_input_x(conv_26).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  499. auto conv_28 = op::Conv2D("conv28").set_input_x(conv_27).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  500. auto conv_29 = op::Conv2D("conv29").set_input_x(conv_28).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  501. auto conv_30 = op::Conv2D("conv30").set_input_x(conv_29).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  502. auto conv_31 = op::Conv2D("conv31").set_input_x(conv_30).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  503. auto conv_32 = op::Conv2D("conv32").set_input_x(conv_31).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  504. auto conv_33 = op::Conv2D("conv33").set_input_x(conv_32).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  505. auto conv_34 = op::Conv2D("conv34").set_input_x(conv_33).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  506. auto conv_35 = op::Conv2D("conv35").set_input_x(conv_34).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  507. auto conv_36 = op::Conv2D("conv36").set_input_x(conv_35).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  508. auto conv_37 = op::Conv2D("conv37").set_input_x(conv_36).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  509. auto conv_38 = op::Conv2D("conv38").set_input_x(conv_37).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  510. auto conv_39 = op::Conv2D("conv39").set_input_x(conv_38).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  511. auto conv_40 = op::Conv2D("conv40").set_input_x(conv_39).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  512. auto conv_41 = op::Conv2D("conv41").set_input_x(conv_40).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  513. auto conv_42 = op::Conv2D("conv42").set_input_x(conv_41).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  514. auto conv_43 = op::Conv2D("conv43").set_input_x(conv_42).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  515. auto conv_44 = op::Conv2D("conv44").set_input_x(conv_43).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  516. auto conv_45 = op::Conv2D("conv45").set_input_x(conv_44).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  517. auto conv_46 = op::Conv2D("conv46").set_input_x(conv_45).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  518. auto conv_47 = op::Conv2D("conv47").set_input_x(conv_46).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  519. auto conv_48 = op::Conv2D("conv48").set_input_x(conv_47).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  520. auto conv_49 = op::Conv2D("conv49").set_input_x(conv_48).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  521. auto conv_50 = op::Conv2D("conv50").set_input_x(conv_49).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  522. auto conv_51 = op::Conv2D("conv51").set_input_x(conv_50).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  523. auto conv_52 = op::Conv2D("conv52").set_input_x(conv_51).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  524. auto conv_53 = op::Conv2D("conv53").set_input_x(conv_52).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  525. auto conv_54 = op::Conv2D("conv54").set_input_x(conv_53).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  526. auto conv_55 = op::Conv2D("conv55").set_input_x(conv_54).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  527. auto conv_56 = op::Conv2D("conv56").set_input_x(conv_55).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  528. auto conv_57 = op::Conv2D("conv57").set_input_x(conv_56).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  529. auto conv_58 = op::Conv2D("conv58").set_input_x(conv_57).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  530. auto conv_59 = op::Conv2D("conv59").set_input_x(conv_58).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  531. auto conv_60 = op::Conv2D("conv60").set_input_x(conv_59).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  532. auto conv_61 = op::Conv2D("conv61").set_input_x(conv_60).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  533. auto conv_62 = op::Conv2D("conv62").set_input_x(conv_61).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  534. auto conv_63 = op::Conv2D("conv63").set_input_x(conv_62).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  535. auto conv_64 = op::Conv2D("conv64").set_input_x(conv_63).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  536. auto conv_65 = op::Conv2D("conv65").set_input_x(conv_64).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  537. auto conv_66 = op::Conv2D("conv66").set_input_x(conv_65).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  538. auto conv_67 = op::Conv2D("conv67").set_input_x(conv_66).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  539. auto conv_68 = op::Conv2D("conv68").set_input_x(conv_67).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  540. auto conv_69 = op::Conv2D("conv69").set_input_x(conv_68).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  541. auto conv_70 = op::Conv2D("conv70").set_input_x(conv_69).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  542. auto conv_71 = op::Conv2D("conv71").set_input_x(conv_70).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  543. auto conv_72 = op::Conv2D("conv72").set_input_x(conv_71).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  544. auto conv_73 = op::Conv2D("conv73").set_input_x(conv_72).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  545. auto conv_74 = op::Conv2D("conv74").set_input_x(conv_73).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  546. auto conv_75 = op::Conv2D("conv75").set_input_x(conv_74).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  547. auto conv_76 = op::Conv2D("conv76").set_input_x(conv_75).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  548. auto conv_77 = op::Conv2D("conv77").set_input_x(conv_76).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  549. auto conv_78 = op::Conv2D("conv78").set_input_x(conv_77).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  550. auto conv_79 = op::Conv2D("conv79").set_input_x(conv_78).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  551. auto conv_80 = op::Conv2D("conv80").set_input_x(conv_79).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  552. auto conv_81 = op::Conv2D("conv81").set_input_x(conv_80).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  553. auto conv_82 = op::Conv2D("conv82").set_input_x(conv_81).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  554. auto conv_83 = op::Conv2D("conv83").set_input_x(conv_82).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  555. auto conv_84 = op::Conv2D("conv84").set_input_x(conv_83).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  556. auto conv_85 = op::Conv2D("conv85").set_input_x(conv_84).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  557. auto conv_86 = op::Conv2D("conv86").set_input_x(conv_85).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  558. auto conv_87 = op::Conv2D("conv87").set_input_x(conv_86).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  559. auto conv_88 = op::Conv2D("conv88").set_input_x(conv_87).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  560. auto conv_89 = op::Conv2D("conv89").set_input_x(conv_88).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  561. auto conv_90 = op::Conv2D("conv90").set_input_x(conv_89).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  562. auto conv_91 = op::Conv2D("conv91").set_input_x(conv_80).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  563. auto conv_92 = op::Conv2D("conv92").set_input_x(conv_91).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  564. auto conv_93 = op::Conv2D("conv93").set_input_x(conv_92).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  565. auto conv_94 = op::Conv2D("conv94").set_input_x(conv_93).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  566. auto conv_95 = op::Conv2D("conv95").set_input_x(conv_94).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  567. auto conv_96 = op::Conv2D("conv96").set_input_x(conv_95).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  568. auto conv_97 = op::Conv2D("conv97").set_input_x(conv_96).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  569. auto conv_98 = op::Conv2D("conv98").set_input_x(conv_97).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  570. auto conv_99 = op::Conv2D("conv99").set_input_x(conv_98).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  571. auto conv_100 = op::Conv2D("conv100").set_input_x(conv_99).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  572. auto conv_101 = op::Conv2D("conv101").set_input_x(conv_100).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  573. auto conv_102 = op::Conv2D("conv102").set_input_x(conv_101).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  574. auto conv_103 = op::Conv2D("conv103").set_input_x(conv_102).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  575. auto conv_104 = op::Conv2D("conv104").set_input_x(conv_103).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  576. auto conv_105 = op::Conv2D("conv105").set_input_x(conv_104).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  577. auto conv_106 = op::Conv2D("conv106").set_input_x(conv_105).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  578. auto conv_107 = op::Conv2D("conv107").set_input_x(conv_106).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  579. auto conv_108 = op::Conv2D("conv108").set_input_x(conv_107).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  580. auto conv_109 = op::Conv2D("conv109").set_input_x(conv_108).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  581. auto conv_110 = op::Conv2D("conv110").set_input_x(conv_109).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  582. auto conv_111 = op::Conv2D("conv111").set_input_x(conv_110).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  583. auto conv_112 = op::Conv2D("conv112").set_input_x(conv_111).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  584. auto conv_113 = op::Conv2D("conv113").set_input_x(conv_112).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  585. auto conv_114 = op::Conv2D("conv114").set_input_x(conv_113).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  586. auto conv_115 = op::Conv2D("conv115").set_input_x(conv_114).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  587. auto conv_116 = op::Conv2D("conv116").set_input_x(conv_115).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  588. auto conv_117 = op::Conv2D("conv117").set_input_x(conv_116).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  589. auto conv_118 = op::Conv2D("conv118").set_input_x(conv_117).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  590. auto conv_119 = op::Conv2D("conv119").set_input_x(conv_118).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  591. auto conv_120 = op::Conv2D("conv120").set_input_x(conv_119).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  592. auto conv_121 = op::Conv2D("conv121").set_input_x(conv_120).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  593. auto conv_122 = op::Conv2D("conv122").set_input_x(conv_121).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  594. auto conv_123 = op::Conv2D("conv123").set_input_x(conv_122).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  595. auto conv_124 = op::Conv2D("conv124").set_input_x(conv_123).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  596. auto conv_125 = op::Conv2D("conv125").set_input_x(conv_124).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  597. auto conv_126 = op::Conv2D("conv126").set_input_x(conv_125).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  598. auto conv_127 = op::Conv2D("conv127").set_input_x(conv_126).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  599. auto conv_128 = op::Conv2D("conv128").set_input_x(conv_127).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  600. auto conv_129 = op::Conv2D("conv129").set_input_x(conv_128).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  601. auto conv_130 = op::Conv2D("conv130").set_input_x(conv_129).set_input_filter(weight).set_attr_pads({0,0,0,0}).set_attr_strides({1,1,1,1});
  602. std::vector<Operator> inputs{data};
  603. std::vector<Operator> outputs{conv_130};
  604. graph.SetInputs(inputs).SetOutputs(outputs);
  605. }
  606. int GetDatTypeSize(DataType dt) {
  607. int dailation = 1;
  608. if (dt == ge::DT_FLOAT)
  609. dailation = 4;
  610. else if (dt == ge::DT_FLOAT16)
  611. dailation = 2;
  612. else if (dt == ge::DT_INT16)
  613. dailation = 2;
  614. else if (dt == ge::DT_UINT16)
  615. dailation = 2;
  616. else if (dt == ge::DT_INT32)
  617. dailation = 4;
  618. else if (dt == ge::DT_UINT32)
  619. dailation = 4;
  620. else if (dt == ge::DT_INT64)
  621. dailation = 8;
  622. else if (dt == ge::DT_UINT64)
  623. dailation = 8;
  624. else if (dt == ge::DT_INT8)
  625. dailation = 1;
  626. return dailation;
  627. }
  628. int buildConvGraph_new(Graph &graph, std::vector<TensorDesc> desc_var, std::vector<std::string> name_var, int flag,
  629. Format format) {
  630. auto data_x_shape = op::Data("xShape").set_attr_index(0);
  631. auto var = op::Variable(name_var[0]);
  632. auto var1 = op::Variable(name_var[1]); //add one seat of ApplyMomentum()
  633. auto label1 = op::Variable(name_var[2]); //add one seat of ApplyMomentum()
  634. auto conv2dgrad = op::Conv2DBackpropFilterD("output_1");
  635. auto test2 = op::ApplyMomentum();
  636. var.update_output_desc_y(desc_var[0]);
  637. var1.update_output_desc_y(desc_var[1]);
  638. label1.update_output_desc_y(desc_var[2]);
  639. graph.AddOp(var);
  640. graph.AddOp(var1);
  641. graph.AddOp(label1);
  642. auto conv2d = op::Conv2D().set_input_x(data_x_shape).set_input_filter(var).set_attr_strides({1, 1, 1, 1}).set_attr_pads({0,0,0,0});
  643. update_op_format(conv2d, format);
  644. ge::TensorDesc tensor_desc_w = conv2d.GetInputDesc("filter");
  645. tensor_desc_w.SetFormat(format);
  646. conv2d.UpdateInputDesc("filter", tensor_desc_w);
  647. if (flag >= 1) {
  648. conv2dgrad.set_input_x(data_x_shape)
  649. .set_attr_filter_size(desc_var[0].GetShape().GetDims())
  650. .set_input_out_backprop(conv2d)
  651. .set_attr_strides({1, 1, 1, 1})
  652. .set_attr_pads({0, 0, 0, 0});
  653. update_op_format(conv2dgrad, format);
  654. graph.AddOp(conv2dgrad);
  655. }
  656. if (flag >= 2) {
  657. // set conv2dgrad var
  658. test2.set_input_accum(var1)
  659. .set_input_grad(conv2dgrad)
  660. .set_input_lr(label1)
  661. .set_input_momentum(label1)
  662. .set_input_var(var);
  663. graph.AddOp(test2);
  664. }
  665. std::vector<Operator> inputs{data_x_shape}; // set all val
  666. std::vector<Operator> outputs{conv2d};
  667. graph.SetInputs(inputs).SetOutputs(outputs);
  668. graph.AddOp(conv2d);
  669. return 0;
  670. }
  671. /// load bin data_fail
  672. /// input_path: path of bin data_file
  673. /// shapes: the shape of Tensor
  674. /// ft: the format of Tensor
  675. /// dt: the dataType of Tensor
  676. Tensor load_variable_input_data(string input_path, std::vector<int64_t> shapes, Format ft, DataType dt) {
  677. vector<uint64_t> dim_info1;
  678. uint8_t *input_data = (uint8_t *)readTestDataFile(input_path, dim_info1); // common.h
  679. TensorDesc input_tensor_desc = TensorDesc(ge::Shape(shapes), ft, dt);
  680. input_tensor_desc.SetRealDimCnt(shapes.size());
  681. Tensor input_tensor = Tensor(input_tensor_desc, input_data, GetDatTypeSize(dt) * dim_info1[dim_info1[0] + 1]);
  682. return input_tensor;
  683. }

图引擎模块(GE)是MindSpore的一个子模块,其代码由C++实现,位于前端模块ME和底层硬件之间,起到承接作用。图引擎模块以ME下发的图作为输入,然后进行一系列的深度图优化操作,最后输出一张可以在底层硬件上高效运行的图。GE针对昇腾AI处理器的硬件结构特点,做了特定的优化工作,以此来充分发挥出昇腾AI处理器的强大算力。在进行模型训练/推理时,GE会被自动调用而用户并不感知。GE主要由GE API和GE Core两部分组成,详细的架构图如下所示