• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1From 9b1f17ffcb18cd58f796c9f30c0bc37e31347450 Mon Sep 17 00:00:00 2001
2From: zhangyanhui <zhangyanhui17@huawei.com>
3Date: Fri, 21 Jun 2024 16:08:21 +0800
4Subject: [PATCH] auto-apply 0002-train-and-build.patch
5
6---
7 .../plugin/device/cpu/kernel/nnacl/BUILD.gn   |  16 +-
8 mindspore/lite/BUILD.gn                       | 229 +++++++++++++++++-
9 .../include/registry/opencl_runtime_wrapper.h |   2 +-
10 mindspore/lite/src/litert/kernel/cpu/BUILD.gn |   1 +
11 .../litert/kernel/cpu/fp32/oneslike_fp32.cc   |  51 ++++
12 .../litert/kernel/cpu/fp32/oneslike_fp32.h    |  46 ++++
13 mindspore/lite/src/litert/lite_model.h        |   2 +-
14 mindspore/lite/src/litert/lite_session.cc     |   1 +
15 mindspore/lite/src/litert/weight_decoder.h    |   2 +-
16 mindspore/lite/src/tensor.h                   |   2 +-
17 mindspore/lite/src/tensorlist.h               |   2 +-
18 mindspore/lite/src/train/train_session.cc     |   6 +-
19 .../lite/tools/benchmark_train/net_train.h    |   2 +-
20 .../tools/converter/converter_metagraph.cc    |  14 +-
21 .../tools/converter/graphdef_transform.cc     |   4 +
22 .../legacy_optimizer/graph/CMakeLists.txt     |   1 +
23 .../legacy_optimizer/graph/node_name_pass.cc  |  96 ++++++++
24 .../legacy_optimizer/graph/node_name_pass.h   |  35 +++
25 18 files changed, 493 insertions(+), 19 deletions(-)
26 create mode 100644 mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.cc
27 create mode 100644 mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.h
28 create mode 100644 mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.cc
29 create mode 100644 mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.h
30
31diff --git a/mindspore/ccsrc/plugin/device/cpu/kernel/nnacl/BUILD.gn b/mindspore/ccsrc/plugin/device/cpu/kernel/nnacl/BUILD.gn
32index a1e7908e..7bbc3782 100644
33--- a/mindspore/ccsrc/plugin/device/cpu/kernel/nnacl/BUILD.gn
34+++ b/mindspore/ccsrc/plugin/device/cpu/kernel/nnacl/BUILD.gn
35@@ -714,7 +714,17 @@ arm32_assembly_sources = [
36   "assembly/arm32/WinogradTransRight.S",
37 ]
38
39-fp16_assembly_sources = [
40+arm32_fp16_assembly_sources = [
41+  "assembly/arm82_aarch32_fp16/Float16Tofloat32.S",
42+  "assembly/arm82_aarch32_fp16/Float32ToFloat16.S",
43+  "assembly/arm82_aarch32_fp16/Matmul12x8Fp16.S",
44+  "assembly/arm82_aarch32_fp16/MatVecMulFp16.S",
45+  "assembly/arm82_aarch32_fp16/TiledC4MatmulFp16.S",
46+  "assembly/arm82_aarch32_fp16/WinogradTransLeft.S",
47+  "assembly/arm82_aarch32_fp16/WinogradTransRight.S",
48+]
49+
50+arm64_fp16_assembly_sources = [
51   "assembly/fp16/CalculateMinMaxFp16Count8.S",
52   "assembly/fp16/ConvDwFp16Border.S",
53   "assembly/fp16/ConvDwFp16Center.S",
54@@ -839,11 +849,13 @@ nnacl_sources += infer_control_sources
55
56 # source files on arm32
57 arm_only_sources = arm32_assembly_sources
58+#arm_only_sources += arm32_fp16_assembly_sources
59+not_needed(arm32_fp16_assembly_sources)
60
61 # source files on arm64
62 arm64_only_sources = fp16_kernel_sources
63 arm64_only_sources += fp16_grad_sources
64-arm64_only_sources += fp16_assembly_sources
65+arm64_only_sources += arm64_fp16_assembly_sources
66 arm64_only_sources += arm64_assembly_sources
67 arm64_only_sources += optimizing_assembly_sources
68 arm64_only_sources += arm64_fp32_kernel_sources
69diff --git a/mindspore/lite/BUILD.gn b/mindspore/lite/BUILD.gn
70index 6d83e6f9..8a492bf9 100644
71--- a/mindspore/lite/BUILD.gn
72+++ b/mindspore/lite/BUILD.gn
73@@ -74,10 +74,12 @@ import("//build/ohos.gni")
74 ohos_group("mindspore") {
75   deps = [
76     ":mindspore_lib",
77+    ":mindspore_train_lib",
78     "mindir:mindir_lib",
79   ]
80 }
81
82+# Inference library
83 cxx_api_sources = [
84   "src/litert/cxx_api/cell.cc",
85   "src/litert/cxx_api/context.cc",
86@@ -429,7 +431,6 @@ ohos_shared_library("mindspore_lib") {
87   SUPPORT_NNRT = true
88   if (SUPPORT_NNRT) {
89     sources += [
90-      # "mindir/src/mindir_nnrt_lite_graph.cc",
91       "src/litert/delegate/nnrt/checker/primitive_check.cc",
92       "src/litert/delegate/nnrt/nnrt_delegate.cc",
93       "src/litert/delegate/nnrt/nnrt_model_kernel.cc",
94@@ -444,8 +445,9 @@ ohos_shared_library("mindspore_lib") {
95     external_deps += [ "neural_network_runtime:nnrt_target" ]
96     deps += [ "mindir:mindir_lib" ]
97     defines += [ "SUPPORT_NNRT" ]
98-    defines += [ "MSLITE_ENABLE_EXPERIMENTAL_KERNEL" ]
99   }
100+  defines += [ "MSLITE_ENABLE_EXPERIMENTAL_KERNEL" ]
101+  defines += [ "SUPPORT_TRAIN" ]
102   cflags_cc = [
103     "-Wno-ignored-qualifiers",
104     "-Wunused-private-field",
105@@ -458,6 +460,225 @@ ohos_shared_library("mindspore_lib") {
106   subsystem_name = "thirdparty"
107 }
108
109+# Train library
110+expression_cxx_api_sources = [
111+  "src/litert/cxx_api/expression/net.cc",
112+  "src/litert/cxx_api/expression/net_impl.cc",
113+  "src/litert/cxx_api/expression/node_impl.cc",
114+]
115+
116+expression_op_sources = [
117+  "src/expression/ops/activation.cc",
118+  "src/expression/ops/adam.cc",
119+  "src/expression/ops/addn.cc",
120+  "src/expression/ops/arithmetic.cc",
121+  "src/expression/ops/arithmetic_self.cc",
122+  "src/expression/ops/assign.cc",
123+  "src/expression/ops/batchnorm.cc",
124+  "src/expression/ops/biasadd.cc",
125+  "src/expression/ops/conv.cc",
126+  "src/expression/ops/dense.cc",
127+  "src/expression/ops/depend.cc",
128+  "src/expression/ops/dropout.cc",
129+  "src/expression/ops/flatten.cc",
130+  "src/expression/ops/pooling.cc",
131+  "src/expression/ops/reduce.cc",
132+  "src/expression/ops/reshape.cc",
133+  "src/expression/ops/softmax.cc",
134+  "src/expression/ops/softmaxCE.cc",
135+  "src/expression/ops/tile.cc",
136+  "src/expression/ops/transpose.cc",
137+]
138+
139+all_expression_sources = [
140+  "src/expression/export.cc",
141+  "src/expression/expr.cc",
142+  "src/expression/import.cc",
143+  "src/expression/net.cc",
144+  "src/expression/node.cc",
145+  "src/expression/ops.cc",
146+  "src/expression/ops_utils.cc",
147+  "src/expression/param.cc",
148+  "src/expression/sequential.cc",
149+]
150+
151+all_expression_sources += expression_cxx_api_sources
152+all_expression_sources += expression_op_sources
153+
154+all_train_sources = [
155+  # ${API_TRAIN_SRC} is empty.
156+  # ${TRAIN_SRC_WITH_MD} is empty.
157+  "src/common/quant_utils.cc",
158+  "src/litert/cxx_api/metrics/accuracy.cc",
159+  "src/litert/cxx_api/train/model_build.cc",
160+  "src/litert/cxx_api/train/model_build_impl.cc",
161+  "src/litert/cxx_api/train/converters.cc",
162+  "src/litert/cxx_api/train/train_support.cc",
163+  "src/train/train_populate_parameter.cc",
164+  "src/train/train_session.cc",
165+  "src/train/graph_fusion.cc",
166+  "src/train/graph_dropout.cc",
167+  "src/train/transfer_session.cc",
168+  "src/train/train_utils.cc",
169+  "src/train/loss_monitor.cc",
170+  "src/train/lr_scheduler.cc",
171+  "src/train/accuracy_metrics.cc",
172+#  "src/train/accuracy_monitor.cc", # depends on minddata header, not compiled
173+  "src/train/classification_train_accuracy_monitor.cc",
174+  "src/train/train_export.cc",
175+  "src/train/opt_allocator.cc",
176+  "src/train/optimizer/common/fusion_utils.cc",
177+  "src/train/optimizer/fusion/matmul_activation_fusion_pass.cc",
178+  "src/train/optimizer/fusion/reshape_gather_reshape_fusion_pass.cc",
179+  "src/train/optimizer/fusion/gru_fusion_pass.cc",
180+  "src/common/storage.cc",
181+  "tools/converter/optimizer.cc",
182+  "tools/converter/legacy_optimizer/fusion/fusion_pass.cc",
183+  "tools/converter/legacy_optimizer/fusion/fusion_pattern.cc",
184+  "tools/common/meta_graph_utils.cc",
185+  "tools/common/statistic_utils.cc",
186+  "tools/converter/legacy_optimizer/fusion/matmul_biasadd_fusion_pass.cc",
187+  "tools/converter/legacy_optimizer/graph/dropout_node_remove_pass.cc",
188+  "tools/converter/legacy_optimizer/graph/isolated_node_remove_pass.cc",
189+  "tools/converter/legacy_optimizer/graph/subgraph_node_pass.cc",
190+]
191+
192+all_train_sources += all_expression_sources
193+
194+fp16_train_kernel_sources = [
195+  "src/litert/kernel/cpu/fp16_grad/activation_fp16_grad.cc",
196+  "src/litert/kernel/cpu/fp16_grad/arithmetic_fp16_grad.cc",
197+  "src/litert/kernel/cpu/fp16_grad/arithmetic_fp16_self_grad.cc",
198+  "src/litert/kernel/cpu/fp16_grad/bias_fp16_grad.cc",
199+  "src/litert/kernel/cpu/fp16_grad/bn_fp16_grad.cc",
200+  "src/litert/kernel/cpu/fp16_grad/convolution_fp16_grad_filter.cc",
201+  "src/litert/kernel/cpu/fp16_grad/convolution_fp16_grad_input.cc",
202+  "src/litert/kernel/cpu/fp16_grad/dropout_fp16_grad.cc",
203+  "src/litert/kernel/cpu/fp16_grad/layernorm_fp16_grad.cc",
204+  "src/litert/kernel/cpu/fp16_grad/neg_fp16_grad.cc",
205+  "src/litert/kernel/cpu/fp16_grad/pooling_fp16_grad.cc",
206+  "src/litert/kernel/cpu/fp16_grad/resize_fp16_grad.cc",
207+  "src/litert/kernel/cpu/fp16_grad/strided_slice_fp16_grad.cc",
208+  "src/litert/kernel/cpu/fp16_grad/unsorted_segment_sum_fp16.cc",
209+]
210+
211+fp32_train_kernel_sources = [
212+  "src/litert/kernel/cpu/fp32_grad/activation_grad.cc",
213+  "src/litert/kernel/cpu/fp32_grad/adam.cc",
214+  "src/litert/kernel/cpu/fp32_grad/adam_weight_decay.cc",
215+  "src/litert/kernel/cpu/fp32_grad/apply_momentum.cc",
216+  "src/litert/kernel/cpu/fp32_grad/arithmetic_grad.cc",
217+  "src/litert/kernel/cpu/fp32_grad/arithmetic_self_grad.cc",
218+  "src/litert/kernel/cpu/fp32_grad/assign.cc",
219+  "src/litert/kernel/cpu/fp32_grad/bias_grad.cc",
220+  "src/litert/kernel/cpu/fp32_grad/bn_grad.cc",
221+  "src/litert/kernel/cpu/fp32_grad/convolution.cc",
222+  "src/litert/kernel/cpu/fp32_grad/convolution_grad_filter.cc",
223+  "src/litert/kernel/cpu/fp32_grad/convolution_grad_input.cc",
224+  "src/litert/kernel/cpu/fp32_grad/deconvolution_grad_filter.cc",
225+  "src/litert/kernel/cpu/fp32_grad/dropout.cc",
226+  "src/litert/kernel/cpu/fp32_grad/dropout_grad.cc",
227+  "src/litert/kernel/cpu/fp32_grad/layernorm_grad.cc",
228+  "src/litert/kernel/cpu/fp32_grad/lstm_grad_data_fp32.cc",
229+  "src/litert/kernel/cpu/fp32_grad/lstm_grad_fp32.cc",
230+  "src/litert/kernel/cpu/fp32_grad/lstm_grad_weight_fp32.cc",
231+  "src/litert/kernel/cpu/fp32_grad/neg_grad.cc",
232+  "src/litert/kernel/cpu/fp32_grad/nllloss_grad.cc",
233+  "src/litert/kernel/cpu/fp32_grad/pooling_grad.cc",
234+  "src/litert/kernel/cpu/fp32_grad/power_grad.cc",
235+  "src/litert/kernel/cpu/fp32_grad/resize_grad.cc",
236+  "src/litert/kernel/cpu/fp32_grad/sgd.cc",
237+  "src/litert/kernel/cpu/fp32_grad/sigmoid_cross_entropy_with_logits.cc",
238+  "src/litert/kernel/cpu/fp32_grad/sigmoid_cross_entropy_with_logits_grad.cc",
239+  "src/litert/kernel/cpu/fp32_grad/smooth_l1_loss.cc",
240+  "src/litert/kernel/cpu/fp32_grad/smooth_l1_loss_grad.cc",
241+  "src/litert/kernel/cpu/fp32_grad/softmax_cross_entropy_with_logits.cc",
242+  "src/litert/kernel/cpu/fp32_grad/softmax_grad.cc",
243+  "src/litert/kernel/cpu/fp32_grad/sparse_softmax_cross_entropy_with_logits.cc",
244+  "src/litert/kernel/cpu/fp32_grad/strided_slice_grad.cc",
245+  "src/litert/kernel/cpu/fp32_grad/unsorted_segment_sum.cc",
246+  "src/litert/kernel/cpu/fp32_grad/binary_cross_entropy.cc",
247+  "src/litert/kernel/cpu/fp32_grad/binary_cross_entropy_grad.cc",
248+]
249+
250+#all_train_sources += fp16_train_kernel_sources
251+not_needed(fp16_train_kernel_sources)
252+all_train_sources += fp32_train_kernel_sources
253+
254+ohos_shared_library("mindspore_train_lib") {
255+  deps = [
256+    ":mindspore_lib",
257+  ]
258+
259+  sources = all_train_sources
260+
261+  include_dirs = [
262+    "//base/hiviewdfx/hilog/interfaces/native/innerkits/include",
263+    "//third_party/flatbuffers/include",
264+    "./",
265+    "../",
266+    "../../",
267+    "../core",
268+    "src",
269+    "src/c_api/",
270+    "../ccsrc/plugin/device/cpu/kernel/",
271+    "../core/mindrt/src/",
272+    "../core/mindrt/include/",
273+    "../../third_party/",
274+    "./schema/",
275+    "../ccsrc/",
276+  ]
277+
278+  defines = [
279+    "ENABLE_MINDRT",
280+    "MS_COMPILE_OHOS",
281+    "PRIMITIVE_WRITEABLE",
282+    "VERSION_STR=\"2.1.0\"",
283+  ]
284+
285+  if (target_cpu == "arm") {
286+    defines += [
287+      "ENABLE_ARM",
288+      "ENABLE_ARM32",
289+      "ENABLE_NEON",
290+    ]
291+  } else if (target_cpu == "arm64") {
292+    defines += [
293+      "ENABLE_ARM",
294+      "ENABLE_ARM64",
295+      "ENABLE_NEON",
296+      "ENABLE_FP16",
297+      "USE_OPENCL_WRAPPER",
298+      "MS_OPENCL_PROFILE=false",
299+      "CL_TARGET_OPENCL_VERSION=200",
300+      "CL_HPP_TARGET_OPENCL_VERSION=120",
301+      "CL_HPP_MINIMUM_OPENCL_VERSION=120",
302+    ]
303+  }
304+  configs = [
305+    ":mindspore_api",
306+    ":disable_android",
307+    ":train_kernel_option",
308+  ]
309+
310+  remove_configs = [ "//build/config/compiler:no_rtti" ]
311+  external_deps = [ "hilog:libhilog" ]
312+  innerapi_tags = [ "platformsdk" ]
313+  output_name = "libmindspore-lite-train"
314+  output_extension = "so"
315+  defines += [ "SUPPORT_TRAIN" ]
316+  cflags_cc = [
317+    "-Wno-ignored-qualifiers",
318+    "-Wunused-private-field",
319+    "-Wno-unused-private-field",
320+    "-Wno-inconsistent-missing-override",
321+    "-Wno-macro-redefined",
322+    "-Wno-constant-conversion",
323+  ]
324+  part_name = "mindspore"
325+}
326+
327+# Build configurations
328 config("opencl_option") {
329   cflags_cc = [ "-Wno-missing-braces" ]
330 }
331@@ -482,3 +703,7 @@ config("disable_android") {
332 config("secure_option") {
333   cflags = [ "-fstack-protector-all" ]
334 }
335+
336+config("train_kernel_option") {
337+  cflags_cc = [ "-fno-finite-math-only" ]
338+}
339diff --git a/mindspore/lite/include/registry/opencl_runtime_wrapper.h b/mindspore/lite/include/registry/opencl_runtime_wrapper.h
340index fb647d37..b55554e4 100644
341--- a/mindspore/lite/include/registry/opencl_runtime_wrapper.h
342+++ b/mindspore/lite/include/registry/opencl_runtime_wrapper.h
343@@ -1,5 +1,5 @@
344 /**
345- * Copyright 2021 Huawei Technologies Co., Ltd
346+ * Copyright 2021-2023 Huawei Technologies Co., Ltd
347  *
348  * Licensed under the Apache License, Version 2.0 (the "License");
349  * you may not use this file except in compliance with the License.
350diff --git a/mindspore/lite/src/litert/kernel/cpu/BUILD.gn b/mindspore/lite/src/litert/kernel/cpu/BUILD.gn
351index b34e0427..48308425 100644
352--- a/mindspore/lite/src/litert/kernel/cpu/BUILD.gn
353+++ b/mindspore/lite/src/litert/kernel/cpu/BUILD.gn
354@@ -112,6 +112,7 @@ cpu_kernel_sources = [
355     "fp32/uniform_real_fp32.cc",
356     "fp32/unstack_fp32.cc",
357     "fp32/where_fp32.cc",
358+    "fp32/oneslike_fp32.cc",
359     "fp32/online_fusion/cast_gather_reduce_fp32.cc",
360     "fp32/online_fusion/reduce_concat_fp32.cc",
361     "fp32/online_fusion/split_reduce_concat_fp32.cc",
362diff --git a/mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.cc b/mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.cc
363new file mode 100644
364index 00000000..b4c3bf7e
365--- /dev/null
366+++ b/mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.cc
367@@ -0,0 +1,51 @@
368+/**
369+ * Copyright 2022 Huawei Technologies Co., Ltd
370+ *
371+ * Licensed under the Apache License, Version 2.0 (the "License");
372+ * you may not use this file except in compliance with the License.
373+ * You may obtain a copy of the License at
374+ *
375+ * http://www.apache.org/licenses/LICENSE-2.0
376+ *
377+ * Unless required by applicable law or agreed to in writing, software
378+ * distributed under the License is distributed on an "AS IS" BASIS,
379+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
380+ * See the License for the specific language governing permissions and
381+ * limitations under the License.
382+ */
383+
384+#include "src/litert/kernel/cpu/fp32/oneslike_fp32.h"
385+#include "schema/model_generated.h"
386+#include "src/litert/kernel_registry.h"
387+#include "include/errorcode.h"
388+
389+using mindspore::kernel::KERNEL_ARCH;
390+using mindspore::lite::KernelRegistrar;
391+using mindspore::lite::RET_ERROR;
392+using mindspore::lite::RET_OK;
393+using mindspore::schema::PrimitiveType_OnesLike;
394+
395+namespace mindspore::kernel {
396+int OnesLikeCPUKernel::Prepare() {
397+  CHECK_LESS_RETURN(in_tensors_.size(), 1);
398+  CHECK_LESS_RETURN(out_tensors_.size(), 1);
399+  return RET_OK;
400+}
401+
402+int OnesLikeCPUKernel::Run() {
403+  auto output = out_tensors_[0];
404+  CHECK_NULL_RETURN(output);
405+  if (output->data_type() == kNumberTypeInt32) {
406+    ApproximateOnesLike(static_cast<int *>(output->data()), output->ElementsNum());
407+  } else if (output->data_type() == kNumberTypeFloat32) {
408+    ApproximateOnesLike(static_cast<float *>(output->data()), output->ElementsNum());
409+  }
410+  return RET_OK;
411+}
412+
413+REG_KERNEL(kCPU, kNumberTypeInt32, PrimitiveType_OnesLike, LiteKernelCreator<OnesLikeCPUKernel>)
414+REG_KERNEL(kCPU, kNumberTypeFloat32, PrimitiveType_OnesLike, LiteKernelCreator<OnesLikeCPUKernel>)
415+#ifdef ENABLE_FP16
416+REG_KERNEL(kCPU, kNumberTypeFloat16, PrimitiveType_OnesLike, LiteKernelCreator<OnesLikeCPUKernel>)
417+#endif
418+}  // namespace mindspore::kernel
419\ No newline at end of file
420diff --git a/mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.h b/mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.h
421new file mode 100644
422index 00000000..f90aebed
423--- /dev/null
424+++ b/mindspore/lite/src/litert/kernel/cpu/fp32/oneslike_fp32.h
425@@ -0,0 +1,46 @@
426+/**
427+ * Copyright 2022 Huawei Technologies Co., Ltd
428+ *
429+ * Licensed under the Apache License, Version 2.0 (the "License");
430+ * you may not use this file except in compliance with the License.
431+ * You may obtain a copy of the License at
432+ *
433+ * http://www.apache.org/licenses/LICENSE-2.0
434+ *
435+ * Unless required by applicable law or agreed to in writing, software
436+ * distributed under the License is distributed on an "AS IS" BASIS,
437+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
438+ * See the License for the specific language governing permissions and
439+ * limitations under the License.
440+ */
441+#ifndef MINDSPORE_LITE_SRC_RUNTIME_KERNEL_CPU_FP32_ONESLike_FP32_H_
442+#define MINDSPORE_LITE_SRC_RUNTIME_KERNEL_CPU_FP32_ONESLike_FP32_H_
443+
444+#include <vector>
445+#include "src/litert/lite_kernel.h"
446+
447+namespace mindspore::kernel {
448+class OnesLikeCPUKernel : public LiteKernel {
449+ public:
450+  OnesLikeCPUKernel(OpParameter *parameter, const std::vector<lite::Tensor *> &inputs,
451+                    const std::vector<lite::Tensor *> &outputs, const lite::InnerContext *ctx)
452+      : LiteKernel(parameter, inputs, outputs, ctx) {}
453+
454+  ~OnesLikeCPUKernel() = default;
455+
456+  int Prepare() override;
457+  int ReSize() override { return lite::RET_OK; }
458+  int Run() override;
459+
460+ private:
461+  template <typename T>
462+  void ApproximateOnesLike(T *output, int data_size) {
463+    for (int i = 0; i < data_size; ++i) {
464+      output[i] = 1;
465+    }
466+    return;
467+  }
468+};
469+}  // namespace mindspore::kernel
470+
471+#endif  // MINDSPORE_LITE_SRC_RUNTIME_KERNEL_CPU_FP32_ONESLike_FP32_H_
472\ No newline at end of file
473diff --git a/mindspore/lite/src/litert/lite_model.h b/mindspore/lite/src/litert/lite_model.h
474index 2b5422fa..635b529a 100644
475--- a/mindspore/lite/src/litert/lite_model.h
476+++ b/mindspore/lite/src/litert/lite_model.h
477@@ -1,5 +1,5 @@
478 /**
479- * Copyright 2020 Huawei Technologies Co., Ltd
480+ * Copyright 2020-2023 Huawei Technologies Co., Ltd
481  *
482  * Licensed under the Apache License, Version 2.0 (the "License");
483  * you may not use this file except in compliance with the License.
484diff --git a/mindspore/lite/src/litert/lite_session.cc b/mindspore/lite/src/litert/lite_session.cc
485index ded4d761..8f54879e 100644
486--- a/mindspore/lite/src/litert/lite_session.cc
487+++ b/mindspore/lite/src/litert/lite_session.cc
488@@ -2022,6 +2022,7 @@ int lite::LiteSession::LoadModelAndCompileByPath(const std::string &model_path,
489     delete model;
490     return RET_ERROR;
491   }
492+  model->Free();
493   set_model(model);
494   return RET_OK;
495 }
496diff --git a/mindspore/lite/src/litert/weight_decoder.h b/mindspore/lite/src/litert/weight_decoder.h
497index 9afaca55..9fbcefde 100644
498--- a/mindspore/lite/src/litert/weight_decoder.h
499+++ b/mindspore/lite/src/litert/weight_decoder.h
500@@ -1,5 +1,5 @@
501 /**
502- * Copyright 2020-2022 Huawei Technologies Co., Ltd
503+ * Copyright 2020-2023 Huawei Technologies Co., Ltd
504  *
505  * Licensed under the Apache License, Version 2.0 (the "License");
506  * you may not use this file except in compliance with the License.
507diff --git a/mindspore/lite/src/tensor.h b/mindspore/lite/src/tensor.h
508index 838892cf..f2eb4d1a 100644
509--- a/mindspore/lite/src/tensor.h
510+++ b/mindspore/lite/src/tensor.h
511@@ -69,7 +69,7 @@ enum CompressType {
512   kFSEInfer = 6
513 };
514
515-class Tensor {
516+class MS_API Tensor {
517  public:
518   Tensor() { tensor_c_ = {false, kTypeUnknown, NHWC, VarTensor, nullptr, 0}; }
519
520diff --git a/mindspore/lite/src/tensorlist.h b/mindspore/lite/src/tensorlist.h
521index bdfdda02..6925cc95 100644
522--- a/mindspore/lite/src/tensorlist.h
523+++ b/mindspore/lite/src/tensorlist.h
524@@ -56,7 +56,7 @@ namespace mindspore::lite {
525  *
526  *  See the code for other constructors.
527  */
528-class TensorList : public Tensor {
529+class MS_API TensorList : public Tensor {
530  public:
531   TensorList() { tensor_list_c_ = {false, kObjectTypeTensorType, DEFAULT_FORMAT, 0, kTypeUnknown, -1, nullptr, 0, 0}; }
532
533diff --git a/mindspore/lite/src/train/train_session.cc b/mindspore/lite/src/train/train_session.cc
534index ef3c71f3..ce6a6437 100644
535--- a/mindspore/lite/src/train/train_session.cc
536+++ b/mindspore/lite/src/train/train_session.cc
537@@ -248,8 +248,8 @@ static int ReshapeWeightTensor(Tensor *orig_tensor, lite::Tensor *new_tensor) {
538
539 int TrainSession::UpdateWeights(std::vector<lite::Tensor *> modify_tensors) {
540   unsigned int num_of_found_tensors = 0;
541-  for (auto tensor : tensors_) {
542-    for (auto modify : modify_tensors) {
543+  for (auto modify : modify_tensors) {
544+    for (auto tensor : tensors_) {
545       if (modify == nullptr) {
546         MS_LOG(ERROR) << "Tensor is nullptr";
547         return RET_PARAM_INVALID;
548@@ -1346,7 +1346,7 @@ int TrainSession::ExportWeightsCollaborateWithMicro(const std::string &file_name
549 std::vector<lite::Tensor *> TrainSession::GetFeatureMaps() const {
550   std::vector<lite::Tensor *> features;
551   for (auto cur_tensor : this->tensors_) {
552-    if (cur_tensor->IsConst() && cur_tensor->data_type() == kNumberTypeFloat32) {
553+    if (cur_tensor->category() == lite::Category::CONST_TENSOR && cur_tensor->data_type() == kNumberTypeFloat32) {
554       features.push_back(cur_tensor);
555     }
556   }
557diff --git a/mindspore/lite/tools/benchmark_train/net_train.h b/mindspore/lite/tools/benchmark_train/net_train.h
558index 43853e99..67e58a04 100644
559--- a/mindspore/lite/tools/benchmark_train/net_train.h
560+++ b/mindspore/lite/tools/benchmark_train/net_train.h
561@@ -1,5 +1,5 @@
562 /**
563- * Copyright 2020 Huawei Technologies Co., Ltd
564+ * Copyright 2020-2023 Huawei Technologies Co., Ltd
565  *
566  * Licensed under the Apache License, Version 2.0 (the "License");
567  * you may not use this file except in compliance with the License.
568diff --git a/mindspore/lite/tools/converter/converter_metagraph.cc b/mindspore/lite/tools/converter/converter_metagraph.cc
569index 6ffff71c..46a66128 100644
570--- a/mindspore/lite/tools/converter/converter_metagraph.cc
571+++ b/mindspore/lite/tools/converter/converter_metagraph.cc
572@@ -104,12 +104,14 @@ schema::MetaGraphT *ConverterToMetaGraph::Build(const std::shared_ptr<ConverterP
573     return nullptr;
574   }
575
576-  // output name will be modified by Transform
577-  status = UpdateMetaGraphOutputName(meta_graph, output_tensor_name);
578-  if (status != RET_OK) {
579-    MS_LOG(ERROR) << "UpdateGraphOutputName failed.";
580-    delete meta_graph;
581-    return nullptr;
582+  if (!param->train_model) {
583+    // output name will be modified by Transform
584+    status = UpdateMetaGraphOutputName(meta_graph, output_tensor_name);
585+    if (status != RET_OK) {
586+      MS_LOG(ERROR) << "UpdateGraphOutputName failed.";
587+      delete meta_graph;
588+      return nullptr;
589+    }
590   }
591
592   return meta_graph;
593diff --git a/mindspore/lite/tools/converter/graphdef_transform.cc b/mindspore/lite/tools/converter/graphdef_transform.cc
594index d571b532..90b744e5 100644
595--- a/mindspore/lite/tools/converter/graphdef_transform.cc
596+++ b/mindspore/lite/tools/converter/graphdef_transform.cc
597@@ -26,6 +26,7 @@
598 #include "tools/converter/legacy_optimizer/graph/dropout_node_remove_pass.h"
599 #include "tools/converter/legacy_optimizer/graph/topological_sort_pass.h"
600 #include "tools/converter/legacy_optimizer/graph/tensor_name_pass.h"
601+#include "tools/converter/legacy_optimizer/graph/node_name_pass.h"
602 #include "tools/converter/legacy_optimizer/graph/set_unused_quant_param_to_default_pass.h"
603 #include "tools/converter/legacy_optimizer/graph/convert_fp32_to_fp16_pass.h"
604 #include "tools/converter/legacy_optimizer/graph/subgraph_node_pass.h"
605@@ -136,6 +137,9 @@ int GraphDefTransform::Transform(const std::shared_ptr<ConverterPara> &param) {
606     Optimizer forming_model_optimizer;
607     forming_model_optimizer.AddPass(new (std::nothrow) InferShapePass(param->fmk_type));
608     forming_model_optimizer.AddPass(new (std::nothrow) SetUnusedQuantParamToDefaultPass(param));
609+    if (param->train_model) {
610+      forming_model_optimizer.AddPass(new (std::nothrow) NodeNamePass());
611+    }
612     forming_model_optimizer.AddPass(new (std::nothrow) TensorNamePass());
613     forming_model_optimizer.AddPass(new (std::nothrow) ConvertFP32ToFP16Pass(param->weight_fp16));
614     status = forming_model_optimizer.Run(graph_defT_);
615diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/CMakeLists.txt b/mindspore/lite/tools/converter/legacy_optimizer/graph/CMakeLists.txt
616index 9b16f4f8..30bccbde 100644
617--- a/mindspore/lite/tools/converter/legacy_optimizer/graph/CMakeLists.txt
618+++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/CMakeLists.txt
619@@ -9,6 +9,7 @@ file(GLOB GRAPH_PASS
620         ${CMAKE_CURRENT_SOURCE_DIR}/convert_fp32_to_fp16_pass.cc
621         ${CMAKE_CURRENT_SOURCE_DIR}/set_unused_quant_param_to_default_pass.cc
622         ${CMAKE_CURRENT_SOURCE_DIR}/tensor_name_pass.cc
623+        ${CMAKE_CURRENT_SOURCE_DIR}/node_name_pass.cc
624         ${CMAKE_CURRENT_SOURCE_DIR}/subgraph_node_pass.cc
625         ${CMAKE_CURRENT_SOURCE_DIR}/subgraph_tensor_pass.cc
626         ${CMAKE_CURRENT_SOURCE_DIR}/const_node_reorder_pass.cc
627diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.cc b/mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.cc
628new file mode 100644
629index 00000000..712927b0
630--- /dev/null
631+++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.cc
632@@ -0,0 +1,96 @@
633+/**
634+ * Copyright 2022 Huawei Technologies Co., Ltd
635+ *
636+ * Licensed under the Apache License, Version 2.0 (the "License");
637+ * you may not use this file except in compliance with the License.
638+ * You may obtain a copy of the License at
639+ *
640+ * http://www.apache.org/licenses/LICENSE-2.0
641+ *
642+ * Unless required by applicable law or agreed to in writing, software
643+ * distributed under the License is distributed on an "AS IS" BASIS,
644+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
645+ * See the License for the specific language governing permissions and
646+ * limitations under the License.
647+ */
648+
649+#include "tools/converter/legacy_optimizer/graph/node_name_pass.h"
650+#include <string>
651+#include <vector>
652+#include "tools/converter/converter_context.h"
653+
654+namespace mindspore::lite {
655+std::string CutShortName(const std::string &fullname, const std::string &delimiter) {
656+  size_t end_pos = fullname.find_last_of(delimiter);
657+  std::string name = "";
658+  if (end_pos != std::string::npos) {
659+    name = fullname.substr(end_pos + 1);
660+  }
661+  if ((fullname.find("op") != std::string::npos) && (name.find("op") == std::string::npos) &&
662+      (end_pos != std::string::npos)) {
663+    size_t pos = fullname.rfind(delimiter, end_pos - 1);
664+    if (pos != std::string::npos) {
665+      name.insert(0, fullname.substr(pos + 1, end_pos - pos));
666+    } else {
667+      name.insert(0, fullname.substr(0, end_pos + 1));
668+    }
669+  }
670+
671+  const std::vector<std::string> loss_names = {"loss_fct", "_loss_fn", "SigmoidCrossEntropy"};
672+  for (auto &s : loss_names) {
673+    if (fullname.find(s) != std::string::npos) {
674+      name.insert(0, s + "/");
675+      break;
676+    }
677+  }
678+
679+  if (fullname.find("Gradients") != std::string::npos) {
680+    size_t pos = fullname.find(delimiter);
681+    if (pos != std::string::npos) {
682+      name.insert(0, fullname.substr(0, pos + 1));
683+    }
684+  }
685+  return name;
686+}
687+
688+STATUS NodeNamePass::Run(schema::MetaGraphT *graph) {
689+  if (graph == nullptr) {
690+    MS_LOG(ERROR) << "graph is nullptr";
691+    return RET_NULL_PTR;
692+  }
693+
694+  std::string delimiter = "/";
695+  for (auto &node : graph->nodes) {
696+    if (node == nullptr || node->primitive == nullptr) {
697+      MS_LOG(ERROR) << "node or node->primitive is nullptr";
698+      return RET_NULL_PTR;
699+    }
700+    std::string node_name = CutShortName(node->name, delimiter);
701+    node->name = node_name != "" ? node_name : node->name;
702+
703+    for (int i = 0; i < static_cast<int>(node->inputIndex.size()); i++) {
704+      auto tensor_id = node->inputIndex.at(i);
705+      auto &tensor = graph->allTensors.at(tensor_id);
706+      if (tensor->name.empty()) {
707+        MS_LOG(DEBUG) << "input tensor (id = " << tensor_id << ") name is null";
708+        tensor->name = node->name + "/input-" + std::to_string(i);
709+      } else {
710+        std::string in_tensor_name = CutShortName(tensor->name, delimiter);
711+        tensor->name = in_tensor_name != "" ? in_tensor_name : tensor->name;
712+      }
713+    }
714+
715+    for (int i = 0; i < static_cast<int>(node->outputIndex.size()); i++) {
716+      auto tensor_id = node->outputIndex.at(i);
717+      auto &tensor = graph->allTensors.at(tensor_id);
718+      if (tensor->name.empty()) {
719+        tensor->name = node->name + "/output-" + std::to_string(i);
720+      } else {
721+        std::string out_tensor_name = CutShortName(tensor->name, delimiter);
722+        tensor->name = out_tensor_name != "" ? out_tensor_name : tensor->name;
723+      }
724+    }
725+  }
726+  return RET_OK;
727+}
728+}  // namespace mindspore::lite
729\ No newline at end of file
730diff --git a/mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.h b/mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.h
731new file mode 100644
732index 00000000..4e58e5c7
733--- /dev/null
734+++ b/mindspore/lite/tools/converter/legacy_optimizer/graph/node_name_pass.h
735@@ -0,0 +1,35 @@
736+/**
737+ * Copyright 2022 Huawei Technologies Co., Ltd
738+ *
739+ * Licensed under the Apache License, Version 2.0 (the "License");
740+ * you may not use this file except in compliance with the License.
741+ * You may obtain a copy of the License at
742+ *
743+ * http://www.apache.org/licenses/LICENSE-2.0
744+ *
745+ * Unless required by applicable law or agreed to in writing, software
746+ * distributed under the License is distributed on an "AS IS" BASIS,
747+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
748+ * See the License for the specific language governing permissions and
749+ * limitations under the License.
750+ */
751+#ifndef MINDSPORE_LITE_TOOLS_CONVERTER_LEGACY_OPTIMIZER_GRAPH_NODE_NAME_PASS_H_
752+#define MINDSPORE_LITE_TOOLS_CONVERTER_LEGACY_OPTIMIZER_GRAPH_NODE_NAME_PASS_H_
753+
754+#include <memory>
755+#include "tools/converter/optimizer.h"
756+#include "tools/common/graph_util.h"
757+
758+namespace mindspore {
759+namespace lite {
760+class NodeNamePass : public GraphPass {
761+ public:
762+  NodeNamePass() {}
763+
764+  ~NodeNamePass() override = default;
765+
766+  STATUS Run(schema::MetaGraphT *graph) override;
767+};
768+}  // namespace lite
769+}  // namespace mindspore
770+#endif  // MINDSPORE_LITE_TOOLS_CONVERTER_LEGACY_OPTIMIZER_GRAPH_NODE_NAME_PASS_H_
771--
7722.25.1
773
774