mindspore 2.4.10__cp39-cp39-win_amd64.whl → 2.6.0rc1__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mindspore might be problematic. Click here for more details.
- mindspore/.commit_id +1 -1
- mindspore/__init__.py +13 -6
- mindspore/_c_dataengine.cp39-win_amd64.pyd +0 -0
- mindspore/_c_expression.cp39-win_amd64.pyd +0 -0
- mindspore/_c_mindrecord.cp39-win_amd64.pyd +0 -0
- mindspore/_check_jit_forbidden_api.py +3 -0
- mindspore/_checkparam.py +3 -38
- mindspore/_deprecated/__init__.py +17 -0
- mindspore/_deprecated/jit.py +198 -0
- mindspore/_extends/builtin_operations.py +1 -1
- mindspore/_extends/parallel_compile/akg_compiler/gen_custom_op_files.py +1 -1
- mindspore/_extends/parse/__init__.py +6 -7
- mindspore/_extends/parse/compile_config.py +83 -0
- mindspore/_extends/parse/deprecated/__init__.py +0 -0
- mindspore/_extends/parse/deprecated/deprecated_tensor_method.py +394 -0
- mindspore/_extends/parse/jit_fallback_modules/__init__.py +0 -0
- mindspore/_extends/parse/jit_fallback_modules/check_utils.py +123 -0
- mindspore/_extends/parse/jit_fallback_modules/third_party_modules.py +50 -0
- mindspore/_extends/parse/parser.py +46 -197
- mindspore/_extends/parse/resources.py +1 -5
- mindspore/_extends/parse/standard_method.py +217 -98
- mindspore/_extends/pijit/__init__.py +2 -2
- mindspore/_extends/pijit/pijit_func_white_list.py +17 -12
- mindspore/_extends/pijit/tensor_func_list.py +27 -0
- mindspore/_extends/utils.py +1 -1
- mindspore/amp.py +11 -5
- mindspore/avcodec-59.dll +0 -0
- mindspore/avdevice-59.dll +0 -0
- mindspore/avfilter-8.dll +0 -0
- mindspore/avformat-59.dll +0 -0
- mindspore/avutil-57.dll +0 -0
- mindspore/boost/__init__.py +2 -2
- mindspore/boost/base.py +3 -7
- mindspore/boost/boost_cell_wrapper.py +138 -43
- mindspore/common/__init__.py +6 -3
- mindspore/common/_grad_function.py +56 -0
- mindspore/common/_pijit_context.py +14 -5
- mindspore/common/_register_for_tensor.py +1 -2
- mindspore/common/_stub_tensor.py +30 -14
- mindspore/common/_tensor_cpp_method.py +17 -0
- mindspore/common/_tensor_docs.py +4760 -0
- mindspore/common/api.py +435 -371
- mindspore/common/auto_dynamic_shape.py +41 -44
- mindspore/common/dtype.py +39 -36
- mindspore/common/dump.py +9 -6
- mindspore/common/file_system.py +9 -1
- mindspore/common/generator.py +2 -0
- mindspore/common/hook_handle.py +6 -2
- mindspore/common/initializer.py +13 -10
- mindspore/common/jit_begin_end.py +94 -0
- mindspore/common/jit_config.py +6 -1
- mindspore/common/jit_context.py +76 -0
- mindspore/common/jit_trace.py +378 -0
- mindspore/common/lazy_inline.py +9 -3
- mindspore/common/mindir_util.py +10 -2
- mindspore/common/mutable.py +5 -4
- mindspore/common/parameter.py +135 -52
- mindspore/common/seed.py +2 -2
- mindspore/common/sparse_tensor.py +23 -17
- mindspore/common/tensor.py +951 -1992
- mindspore/communication/__init__.py +7 -5
- mindspore/communication/_comm_helper.py +52 -2
- mindspore/communication/comm_func.py +240 -181
- mindspore/communication/management.py +95 -26
- mindspore/context.py +314 -566
- mindspore/dataset/__init__.py +65 -37
- mindspore/dataset/audio/__init__.py +2 -8
- mindspore/dataset/audio/transforms.py +3 -17
- mindspore/dataset/callback/ds_callback.py +2 -1
- mindspore/dataset/core/config.py +87 -6
- mindspore/dataset/engine/cache_admin.py +3 -3
- mindspore/dataset/engine/cache_client.py +6 -5
- mindspore/dataset/engine/datasets.py +292 -267
- mindspore/dataset/engine/datasets_audio.py +22 -8
- mindspore/dataset/engine/datasets_standard_format.py +46 -27
- mindspore/dataset/engine/datasets_text.py +78 -48
- mindspore/dataset/engine/datasets_user_defined.py +182 -116
- mindspore/dataset/engine/datasets_vision.py +120 -44
- mindspore/dataset/engine/iterators.py +283 -63
- mindspore/dataset/engine/obs/obs_mindrecord_dataset.py +1 -1
- mindspore/dataset/engine/obs/util.py +8 -0
- mindspore/dataset/engine/queue.py +40 -0
- mindspore/dataset/engine/samplers.py +289 -43
- mindspore/dataset/engine/serializer_deserializer.py +3 -2
- mindspore/dataset/engine/validators.py +53 -11
- mindspore/dataset/text/__init__.py +7 -6
- mindspore/dataset/text/transforms.py +6 -5
- mindspore/dataset/text/utils.py +3 -3
- mindspore/dataset/transforms/__init__.py +0 -9
- mindspore/dataset/transforms/py_transforms_util.py +17 -0
- mindspore/dataset/transforms/transforms.py +31 -14
- mindspore/dataset/utils/browse_dataset.py +1 -1
- mindspore/dataset/vision/__init__.py +2 -9
- mindspore/dataset/vision/transforms.py +202 -158
- mindspore/dataset/vision/utils.py +7 -5
- mindspore/dataset/vision/validators.py +1 -2
- mindspore/device_context/__init__.py +21 -0
- mindspore/device_context/ascend/__init__.py +25 -0
- mindspore/device_context/ascend/device.py +72 -0
- mindspore/device_context/ascend/op_debug.py +153 -0
- mindspore/device_context/ascend/op_precision.py +193 -0
- mindspore/device_context/ascend/op_tuning.py +123 -0
- mindspore/{ops_generate/gen_constants.py → device_context/cpu/__init__.py} +6 -17
- mindspore/device_context/cpu/device.py +62 -0
- mindspore/device_context/cpu/op_tuning.py +43 -0
- mindspore/device_context/gpu/__init__.py +21 -0
- mindspore/device_context/gpu/device.py +70 -0
- mindspore/device_context/gpu/op_precision.py +67 -0
- mindspore/device_context/gpu/op_tuning.py +175 -0
- mindspore/device_manager.py +170 -0
- mindspore/experimental/es/embedding_service.py +35 -27
- mindspore/experimental/llm_boost/__init__.py +1 -0
- mindspore/experimental/llm_boost/ascend_native/__init__.py +22 -0
- mindspore/experimental/llm_boost/ascend_native/llama_boost_ascend_native.py +211 -0
- mindspore/experimental/llm_boost/ascend_native/llm_boost.py +52 -0
- mindspore/experimental/llm_boost/atb/boost_base.py +2 -3
- mindspore/experimental/llm_boost/atb/llama_boost.py +6 -1
- mindspore/experimental/llm_boost/register.py +1 -0
- mindspore/experimental/map_parameter.py +4 -4
- mindspore/experimental/optim/adadelta.py +6 -6
- mindspore/experimental/optim/adagrad.py +4 -4
- mindspore/experimental/optim/adam.py +7 -0
- mindspore/experimental/optim/adamax.py +4 -4
- mindspore/experimental/optim/adamw.py +4 -0
- mindspore/experimental/optim/asgd.py +1 -1
- mindspore/experimental/optim/lr_scheduler.py +73 -46
- mindspore/experimental/optim/radam.py +34 -31
- mindspore/experimental/optim/rprop.py +1 -1
- mindspore/experimental/optim/sgd.py +1 -1
- mindspore/hal/contiguous_tensors_handle.py +6 -10
- mindspore/hal/device.py +55 -53
- mindspore/hal/event.py +52 -52
- mindspore/hal/memory.py +157 -117
- mindspore/hal/stream.py +150 -109
- mindspore/include/api/context.h +0 -1
- mindspore/include/dataset/constants.h +7 -4
- mindspore/include/dataset/execute.h +2 -2
- mindspore/jpeg62.dll +0 -0
- mindspore/log.py +50 -0
- mindspore/mindrecord/__init__.py +21 -8
- mindspore/mindrecord/config.py +17 -316
- mindspore/mindrecord/filereader.py +1 -9
- mindspore/mindrecord/filewriter.py +5 -15
- mindspore/mindrecord/mindpage.py +1 -9
- mindspore/mindspore_backend_common.dll +0 -0
- mindspore/mindspore_backend_manager.dll +0 -0
- mindspore/mindspore_common.dll +0 -0
- mindspore/mindspore_core.dll +0 -0
- mindspore/mindspore_dump.dll +0 -0
- mindspore/mindspore_frontend.dll +0 -0
- mindspore/mindspore_memory_pool.dll +0 -0
- mindspore/mindspore_ms_backend.dll +0 -0
- mindspore/mindspore_ops.dll +0 -0
- mindspore/{mindspore_backend.dll → mindspore_ops_host.dll} +0 -0
- mindspore/mindspore_ops_kernel_common.dll +0 -0
- mindspore/mindspore_profiler.dll +0 -0
- mindspore/mindspore_pyboost.dll +0 -0
- mindspore/mindspore_pynative.dll +0 -0
- mindspore/mindspore_res_manager.dll +0 -0
- mindspore/mindspore_runtime_pipeline.dll +0 -0
- mindspore/mint/__init__.py +796 -759
- mindspore/mint/distributed/__init__.py +70 -4
- mindspore/mint/distributed/distributed.py +2679 -44
- mindspore/mint/linalg/__init__.py +8 -0
- mindspore/mint/nn/__init__.py +743 -22
- mindspore/mint/nn/functional.py +716 -23
- mindspore/mint/nn/layer/__init__.py +21 -4
- mindspore/mint/nn/layer/_functions.py +334 -0
- mindspore/mint/nn/layer/activation.py +276 -1
- mindspore/mint/nn/layer/basic.py +123 -0
- mindspore/mint/nn/layer/conv.py +921 -0
- mindspore/mint/nn/layer/normalization.py +223 -28
- mindspore/mint/nn/layer/padding.py +797 -0
- mindspore/mint/nn/layer/pooling.py +235 -0
- mindspore/mint/optim/__init__.py +3 -1
- mindspore/mint/optim/adam.py +223 -0
- mindspore/mint/optim/adamw.py +26 -19
- mindspore/mint/optim/sgd.py +171 -0
- mindspore/mint/special/__init__.py +2 -1
- mindspore/multiprocessing/__init__.py +5 -0
- mindspore/nn/__init__.py +4 -1
- mindspore/nn/cell.py +1370 -189
- mindspore/nn/dynamic_lr.py +2 -1
- mindspore/nn/layer/activation.py +29 -27
- mindspore/nn/layer/basic.py +51 -35
- mindspore/nn/layer/channel_shuffle.py +3 -3
- mindspore/nn/layer/container.py +1 -1
- mindspore/nn/layer/conv.py +22 -17
- mindspore/nn/layer/embedding.py +12 -11
- mindspore/nn/layer/normalization.py +56 -49
- mindspore/nn/layer/padding.py +4 -3
- mindspore/nn/layer/pooling.py +120 -42
- mindspore/nn/layer/rnn_cells.py +1 -1
- mindspore/nn/layer/rnns.py +2 -1
- mindspore/nn/layer/timedistributed.py +5 -5
- mindspore/nn/layer/transformer.py +59 -36
- mindspore/nn/learning_rate_schedule.py +8 -4
- mindspore/nn/loss/loss.py +58 -55
- mindspore/nn/optim/ada_grad.py +7 -5
- mindspore/nn/optim/adadelta.py +11 -9
- mindspore/nn/optim/adafactor.py +1 -1
- mindspore/nn/optim/adam.py +17 -13
- mindspore/nn/optim/adamax.py +8 -7
- mindspore/nn/optim/adasum.py +5 -5
- mindspore/nn/optim/asgd.py +1 -1
- mindspore/nn/optim/ftrl.py +11 -9
- mindspore/nn/optim/lamb.py +1 -1
- mindspore/nn/optim/lars.py +1 -4
- mindspore/nn/optim/lazyadam.py +12 -10
- mindspore/nn/optim/momentum.py +7 -6
- mindspore/nn/optim/optimizer.py +3 -3
- mindspore/nn/optim/proximal_ada_grad.py +12 -10
- mindspore/nn/optim/rmsprop.py +13 -12
- mindspore/nn/optim/rprop.py +11 -9
- mindspore/nn/optim/sgd.py +9 -6
- mindspore/nn/optim/tft_wrapper.py +5 -2
- mindspore/nn/optim/thor.py +2 -1
- mindspore/nn/probability/bijector/bijector.py +17 -11
- mindspore/nn/probability/bijector/gumbel_cdf.py +5 -5
- mindspore/nn/probability/bijector/invert.py +2 -2
- mindspore/nn/probability/bijector/scalar_affine.py +3 -3
- mindspore/nn/probability/bijector/softplus.py +3 -2
- mindspore/nn/probability/distribution/beta.py +3 -3
- mindspore/nn/probability/distribution/categorical.py +1 -1
- mindspore/nn/probability/distribution/cauchy.py +4 -2
- mindspore/nn/probability/distribution/exponential.py +6 -7
- mindspore/nn/probability/distribution/gamma.py +2 -2
- mindspore/nn/probability/distribution/gumbel.py +2 -2
- mindspore/nn/probability/distribution/half_normal.py +5 -3
- mindspore/nn/probability/distribution/logistic.py +5 -3
- mindspore/nn/probability/distribution/poisson.py +1 -1
- mindspore/nn/probability/distribution/uniform.py +5 -3
- mindspore/nn/reinforcement/_tensors_queue.py +1 -1
- mindspore/nn/reinforcement/tensor_array.py +1 -1
- mindspore/nn/utils/init.py +13 -11
- mindspore/nn/wrap/__init__.py +6 -6
- mindspore/nn/wrap/cell_wrapper.py +181 -122
- mindspore/nn/wrap/grad_reducer.py +45 -36
- mindspore/nn/wrap/loss_scale.py +6 -7
- mindspore/numpy/array_creations.py +63 -65
- mindspore/numpy/array_ops.py +149 -144
- mindspore/numpy/logic_ops.py +41 -42
- mindspore/numpy/math_ops.py +365 -363
- mindspore/numpy/utils.py +17 -18
- mindspore/numpy/utils_const.py +5 -6
- mindspore/opencv_core452.dll +0 -0
- mindspore/opencv_imgcodecs452.dll +0 -0
- mindspore/opencv_imgproc452.dll +0 -0
- mindspore/ops/__init__.py +5 -3
- mindspore/ops/_grad_experimental/grad_comm_ops.py +112 -16
- mindspore/ops/_grad_experimental/grad_debug_ops.py +14 -2
- mindspore/ops/_grad_experimental/grad_inner_ops.py +9 -0
- mindspore/ops/_grad_experimental/grad_math_ops.py +2 -1
- mindspore/ops/_grad_experimental/taylor_rule.py +29 -0
- mindspore/ops/_op_impl/cpu/__init__.py +1 -0
- mindspore/ops/_op_impl/cpu/raise_op.py +28 -0
- mindspore/ops/_register_for_op.py +0 -11
- mindspore/{ops_generate → ops/_utils}/arg_dtype_cast.py +123 -4
- mindspore/{ops_generate → ops/_utils}/arg_handler.py +3 -65
- mindspore/ops/_vmap/vmap_array_ops.py +27 -25
- mindspore/ops/_vmap/vmap_base.py +0 -2
- mindspore/ops/_vmap/vmap_grad_nn_ops.py +21 -14
- mindspore/ops/_vmap/vmap_math_ops.py +15 -16
- mindspore/ops/_vmap/vmap_nn_ops.py +29 -42
- mindspore/ops/auto_generate/__init__.py +4 -3
- mindspore/ops/auto_generate/cpp_create_prim_instance_helper.py +236 -46
- mindspore/ops/auto_generate/gen_extend_func.py +764 -124
- mindspore/ops/auto_generate/gen_ops_def.py +4018 -2264
- mindspore/ops/auto_generate/gen_ops_prim.py +15463 -5037
- mindspore/ops/auto_generate/pyboost_inner_prim.py +221 -87
- mindspore/ops/composite/__init__.py +2 -1
- mindspore/ops/composite/base.py +20 -25
- mindspore/ops/composite/math_ops.py +6 -16
- mindspore/ops/composite/multitype_ops/__init__.py +5 -2
- mindspore/ops/composite/multitype_ops/_compile_utils.py +228 -30
- mindspore/ops/composite/multitype_ops/_constexpr_utils.py +1 -2
- mindspore/ops/composite/multitype_ops/add_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/bitwise_and_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/bitwise_or_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/bitwise_xor_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/div_impl.py +6 -4
- mindspore/ops/composite/multitype_ops/equal_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/floordiv_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/getitem_impl.py +3 -2
- mindspore/ops/composite/multitype_ops/greater_equal_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/greater_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/in_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/invert_impl.py +50 -0
- mindspore/ops/composite/multitype_ops/left_shift_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/less_equal_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/less_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/logic_not_impl.py +3 -2
- mindspore/ops/composite/multitype_ops/logical_and_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/logical_or_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/mod_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/mul_impl.py +3 -2
- mindspore/ops/composite/multitype_ops/negative_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/not_equal_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/not_in_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/ones_like_impl.py +18 -0
- mindspore/ops/composite/multitype_ops/pow_impl.py +2 -30
- mindspore/ops/composite/multitype_ops/right_shift_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/setitem_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/sub_impl.py +2 -1
- mindspore/ops/function/__init__.py +40 -2
- mindspore/ops/function/_add_attr_func.py +58 -0
- mindspore/ops/function/array_func.py +2089 -2403
- mindspore/ops/function/clip_func.py +80 -23
- mindspore/ops/function/debug_func.py +57 -57
- mindspore/ops/function/grad/__init__.py +1 -0
- mindspore/ops/function/grad/grad_func.py +104 -71
- mindspore/ops/function/image_func.py +2 -2
- mindspore/ops/function/linalg_func.py +47 -78
- mindspore/ops/function/math_func.py +4501 -3802
- mindspore/ops/function/nn_func.py +1726 -620
- mindspore/ops/function/other_func.py +159 -1
- mindspore/ops/function/parameter_func.py +18 -84
- mindspore/ops/function/random_func.py +440 -387
- mindspore/ops/function/reshard_func.py +4 -70
- mindspore/ops/function/sparse_func.py +3 -3
- mindspore/ops/function/sparse_unary_func.py +6 -6
- mindspore/ops/function/spectral_func.py +25 -58
- mindspore/ops/function/vmap_func.py +24 -17
- mindspore/ops/functional.py +22 -7
- mindspore/ops/functional_overload.py +1440 -0
- mindspore/ops/op_info_register.py +32 -244
- mindspore/ops/operations/__init__.py +13 -7
- mindspore/ops/operations/_custom_ops_utils.py +247 -0
- mindspore/ops/operations/_embedding_cache_ops.py +4 -4
- mindspore/ops/operations/_grad_ops.py +2 -43
- mindspore/ops/operations/_infer_ops.py +2 -1
- mindspore/ops/operations/_inner_ops.py +43 -84
- mindspore/ops/operations/_ms_kernel.py +4 -10
- mindspore/ops/operations/_rl_inner_ops.py +1 -1
- mindspore/ops/operations/_scalar_ops.py +3 -2
- mindspore/ops/operations/_sequence_ops.py +1 -1
- mindspore/ops/operations/_tensor_array.py +1 -1
- mindspore/ops/operations/array_ops.py +81 -324
- mindspore/ops/operations/comm_ops.py +154 -108
- mindspore/ops/operations/custom_ops.py +232 -78
- mindspore/ops/operations/debug_ops.py +153 -59
- mindspore/ops/operations/inner_ops.py +7 -5
- mindspore/ops/operations/linalg_ops.py +1 -57
- mindspore/ops/operations/manually_defined/_inner.py +1 -1
- mindspore/ops/operations/manually_defined/ops_def.py +928 -180
- mindspore/ops/operations/math_ops.py +32 -234
- mindspore/ops/operations/nn_ops.py +210 -498
- mindspore/ops/operations/other_ops.py +62 -9
- mindspore/ops/operations/random_ops.py +13 -7
- mindspore/ops/operations/reshard_ops.py +1 -1
- mindspore/ops/operations/sparse_ops.py +2 -2
- mindspore/ops/primitive.py +66 -53
- mindspore/ops/tensor_method.py +1888 -0
- mindspore/ops_generate/__init__.py +0 -5
- mindspore/ops_generate/aclnn/__init__.py +0 -0
- mindspore/ops_generate/aclnn/aclnn_kernel_register_auto_cc_generator.py +135 -0
- mindspore/ops_generate/aclnn/gen_aclnn_implement.py +257 -0
- mindspore/ops_generate/api/__init__.py +0 -0
- mindspore/ops_generate/api/add_tensor_docs_generator.py +56 -0
- mindspore/ops_generate/api/cpp_create_prim_instance_helper_generator.py +105 -0
- mindspore/ops_generate/api/functional_map_cpp_generator.py +504 -0
- mindspore/ops_generate/api/functional_overload_py_generator.py +112 -0
- mindspore/ops_generate/api/functions_cc_generator.py +237 -0
- mindspore/ops_generate/api/gen_api.py +103 -0
- mindspore/ops_generate/api/op_api_proto.py +235 -0
- mindspore/ops_generate/api/tensor_func_reg_cpp_generator.py +461 -0
- mindspore/ops_generate/common/__init__.py +0 -0
- mindspore/ops_generate/common/base_generator.py +11 -0
- mindspore/ops_generate/common/gen_constants.py +91 -0
- mindspore/ops_generate/common/gen_utils.py +348 -0
- mindspore/ops_generate/common/op_proto.py +473 -0
- mindspore/ops_generate/common/template.py +523 -0
- mindspore/ops_generate/gen_ops.py +22 -1069
- mindspore/ops_generate/op_def/__init__.py +0 -0
- mindspore/ops_generate/op_def/gen_op_def.py +90 -0
- mindspore/ops_generate/op_def/lite_ops_cpp_generator.py +191 -0
- mindspore/ops_generate/op_def/ops_def_cc_generator.py +299 -0
- mindspore/ops_generate/op_def/ops_def_h_generator.py +74 -0
- mindspore/ops_generate/op_def/ops_name_h_generator.py +83 -0
- mindspore/ops_generate/op_def/ops_primitive_h_generator.py +125 -0
- mindspore/ops_generate/op_def_py/__init__.py +0 -0
- mindspore/ops_generate/op_def_py/gen_op_def_py.py +47 -0
- mindspore/ops_generate/op_def_py/op_def_py_generator.py +132 -0
- mindspore/ops_generate/op_def_py/op_prim_py_generator.py +489 -0
- mindspore/ops_generate/pyboost/__init__.py +0 -0
- mindspore/ops_generate/pyboost/auto_grad_impl_cc_generator.py +139 -0
- mindspore/ops_generate/pyboost/auto_grad_reg_cc_generator.py +93 -0
- mindspore/ops_generate/pyboost/gen_pyboost_func.py +175 -0
- mindspore/ops_generate/pyboost/op_template_parser.py +517 -0
- mindspore/ops_generate/pyboost/pyboost_functions_cpp_generator.py +407 -0
- mindspore/ops_generate/pyboost/pyboost_functions_h_generator.py +100 -0
- mindspore/ops_generate/pyboost/pyboost_functions_py_generator.py +148 -0
- mindspore/ops_generate/pyboost/pyboost_grad_function_cpp_generator.py +155 -0
- mindspore/ops_generate/pyboost/pyboost_inner_prim_generator.py +132 -0
- mindspore/ops_generate/pyboost/pyboost_native_grad_functions_generator.py +272 -0
- mindspore/ops_generate/pyboost/pyboost_op_cpp_code_generator.py +938 -0
- mindspore/ops_generate/pyboost/pyboost_overload_functions_cpp_generator.py +357 -0
- mindspore/ops_generate/{pyboost_utils.py → pyboost/pyboost_utils.py} +179 -36
- mindspore/ops_generate/resources/__init__.py +0 -0
- mindspore/ops_generate/resources/resource_list.py +30 -0
- mindspore/ops_generate/resources/resource_loader.py +36 -0
- mindspore/ops_generate/resources/resource_manager.py +64 -0
- mindspore/ops_generate/resources/yaml_loader.py +88 -0
- mindspore/ops_generate/tensor_py_cc_generator.py +122 -0
- mindspore/parallel/__init__.py +7 -3
- mindspore/parallel/_auto_parallel_context.py +152 -34
- mindspore/parallel/_cell_wrapper.py +130 -15
- mindspore/parallel/_parallel_serialization.py +107 -5
- mindspore/parallel/_ps_context.py +1 -1
- mindspore/parallel/_recovery_context.py +7 -2
- mindspore/parallel/_tensor.py +142 -18
- mindspore/parallel/_utils.py +199 -23
- mindspore/parallel/algo_parameter_config.py +4 -4
- mindspore/parallel/auto_parallel.py +732 -0
- mindspore/parallel/checkpoint_convert.py +159 -0
- mindspore/parallel/checkpoint_transform.py +698 -35
- mindspore/parallel/cluster/process_entity/_api.py +276 -50
- mindspore/parallel/cluster/process_entity/_utils.py +41 -6
- mindspore/parallel/cluster/run.py +21 -4
- mindspore/parallel/function/__init__.py +24 -0
- mindspore/parallel/function/reshard_func.py +259 -0
- mindspore/parallel/nn/__init__.py +25 -0
- mindspore/parallel/nn/parallel_cell_wrapper.py +263 -0
- mindspore/parallel/nn/parallel_grad_reducer.py +169 -0
- mindspore/parallel/parameter_broadcast.py +25 -14
- mindspore/parallel/shard.py +137 -58
- mindspore/parallel/transform_safetensors.py +363 -305
- mindspore/profiler/__init__.py +22 -5
- mindspore/profiler/analysis/__init__.py +0 -0
- mindspore/profiler/analysis/parser/__init__.py +0 -0
- mindspore/profiler/analysis/parser/ascend_cann_parser.py +170 -0
- mindspore/profiler/analysis/parser/base_parser.py +158 -0
- mindspore/profiler/analysis/parser/framework_cann_relation_parser.py +45 -0
- mindspore/profiler/analysis/parser/ms_framework_parser.py +142 -0
- mindspore/profiler/analysis/parser/ms_minddata_parser.py +145 -0
- mindspore/profiler/analysis/parser/timeline_assembly_factory/__init__.py +0 -0
- mindspore/profiler/analysis/parser/timeline_assembly_factory/ascend_timeline_assembler.py +264 -0
- mindspore/profiler/analysis/parser/timeline_assembly_factory/base_timeline_assembler.py +40 -0
- mindspore/profiler/analysis/parser/timeline_assembly_factory/trace_view_container.py +106 -0
- mindspore/profiler/analysis/parser/timeline_creator/__init__.py +0 -0
- mindspore/profiler/analysis/parser/timeline_creator/base_timeline_creator.py +44 -0
- mindspore/profiler/analysis/parser/timeline_creator/cpu_op_timeline_creator.py +90 -0
- mindspore/profiler/analysis/parser/timeline_creator/fwk_timeline_creator.py +76 -0
- mindspore/profiler/analysis/parser/timeline_creator/msprof_timeline_creator.py +103 -0
- mindspore/profiler/analysis/parser/timeline_creator/scope_layer_timeline_creator.py +134 -0
- mindspore/profiler/analysis/parser/timeline_event/__init__.py +0 -0
- mindspore/profiler/analysis/parser/timeline_event/base_event.py +233 -0
- mindspore/profiler/analysis/parser/timeline_event/cpu_op_event.py +47 -0
- mindspore/profiler/analysis/parser/timeline_event/flow_event.py +36 -0
- mindspore/profiler/analysis/parser/timeline_event/fwk_event.py +415 -0
- mindspore/profiler/analysis/parser/timeline_event/msprof_event.py +73 -0
- mindspore/profiler/analysis/parser/timeline_event/scope_layer_event.py +53 -0
- mindspore/profiler/analysis/parser/timeline_event/timeline_event_pool.py +146 -0
- mindspore/profiler/analysis/task_manager.py +131 -0
- mindspore/profiler/analysis/time_converter.py +84 -0
- mindspore/profiler/analysis/viewer/__init__.py +0 -0
- mindspore/profiler/analysis/viewer/ascend_communication_viewer.py +372 -0
- mindspore/profiler/analysis/viewer/ascend_integrate_viewer.py +87 -0
- mindspore/profiler/analysis/viewer/ascend_kernel_details_viewer.py +250 -0
- mindspore/profiler/analysis/viewer/ascend_memory_viewer.py +320 -0
- mindspore/profiler/analysis/viewer/ascend_op_memory_viewer.py +327 -0
- mindspore/profiler/analysis/viewer/ascend_step_trace_time_viewer.py +376 -0
- mindspore/profiler/analysis/viewer/ascend_timeline_viewer.py +58 -0
- mindspore/profiler/analysis/viewer/base_viewer.py +26 -0
- mindspore/profiler/analysis/viewer/ms_dataset_viewer.py +96 -0
- mindspore/profiler/analysis/viewer/ms_minddata_viewer.py +581 -0
- mindspore/profiler/analysis/work_flow.py +73 -0
- mindspore/profiler/common/ascend_msprof_exporter.py +139 -0
- mindspore/profiler/common/command_executor.py +90 -0
- mindspore/profiler/common/constant.py +186 -3
- mindspore/profiler/common/file_manager.py +208 -0
- mindspore/profiler/common/log.py +130 -0
- mindspore/profiler/common/msprof_cmd_tool.py +221 -0
- mindspore/profiler/common/path_manager.py +395 -0
- mindspore/profiler/common/process_bar.py +168 -0
- mindspore/profiler/common/process_pool.py +9 -3
- mindspore/profiler/common/profiler_context.py +500 -0
- mindspore/profiler/common/profiler_info.py +304 -0
- mindspore/profiler/common/profiler_meta_data.py +74 -0
- mindspore/profiler/common/profiler_output_path.py +284 -0
- mindspore/profiler/common/profiler_parameters.py +251 -0
- mindspore/profiler/common/profiler_path_manager.py +179 -0
- mindspore/profiler/common/record_function.py +76 -0
- mindspore/profiler/common/tlv_decoder.py +76 -0
- mindspore/profiler/common/util.py +75 -2
- mindspore/profiler/dynamic_profiler.py +341 -75
- mindspore/profiler/envprofiler.py +163 -0
- mindspore/profiler/experimental_config.py +197 -0
- mindspore/profiler/mstx.py +242 -0
- mindspore/profiler/platform/__init__.py +21 -0
- mindspore/profiler/platform/base_profiler.py +40 -0
- mindspore/profiler/platform/cpu_profiler.py +124 -0
- mindspore/profiler/platform/gpu_profiler.py +74 -0
- mindspore/profiler/platform/npu_profiler.py +335 -0
- mindspore/profiler/profiler.py +1073 -90
- mindspore/profiler/profiler_action_controller.py +187 -0
- mindspore/profiler/profiler_interface.py +118 -0
- mindspore/profiler/schedule.py +243 -0
- mindspore/rewrite/api/node.py +15 -13
- mindspore/rewrite/api/symbol_tree.py +2 -3
- mindspore/run_check/_check_version.py +27 -20
- mindspore/run_check/run_check.py +1 -1
- mindspore/runtime/__init__.py +37 -0
- mindspore/runtime/device.py +27 -0
- mindspore/runtime/event.py +209 -0
- mindspore/runtime/executor.py +177 -0
- mindspore/runtime/memory.py +409 -0
- mindspore/runtime/stream.py +460 -0
- mindspore/runtime/thread_bind_core.py +401 -0
- mindspore/safeguard/rewrite_obfuscation.py +12 -9
- mindspore/swresample-4.dll +0 -0
- mindspore/swscale-6.dll +0 -0
- mindspore/tinyxml2.dll +0 -0
- mindspore/train/__init__.py +8 -8
- mindspore/train/_utils.py +88 -25
- mindspore/train/amp.py +9 -5
- mindspore/train/callback/__init__.py +2 -2
- mindspore/train/callback/_callback.py +2 -16
- mindspore/train/callback/_checkpoint.py +53 -55
- mindspore/train/callback/_cluster_monitor.py +14 -18
- mindspore/train/callback/_early_stop.py +1 -1
- mindspore/train/callback/_flops_collector.py +103 -68
- mindspore/train/callback/_history.py +8 -5
- mindspore/train/callback/_lambda_callback.py +2 -2
- mindspore/train/callback/_landscape.py +0 -3
- mindspore/train/callback/_loss_monitor.py +2 -1
- mindspore/train/callback/_on_request_exit.py +6 -5
- mindspore/train/callback/_reduce_lr_on_plateau.py +11 -6
- mindspore/train/callback/_summary_collector.py +52 -19
- mindspore/train/callback/_time_monitor.py +2 -1
- mindspore/train/callback/{_tft_register.py → _train_fault_tolerance.py} +204 -107
- mindspore/train/data_sink.py +25 -2
- mindspore/train/dataset_helper.py +15 -16
- mindspore/train/loss_scale_manager.py +8 -7
- mindspore/train/metrics/accuracy.py +3 -3
- mindspore/train/metrics/confusion_matrix.py +9 -9
- mindspore/train/metrics/error.py +3 -3
- mindspore/train/metrics/hausdorff_distance.py +4 -4
- mindspore/train/metrics/mean_surface_distance.py +3 -3
- mindspore/train/metrics/metric.py +0 -12
- mindspore/train/metrics/occlusion_sensitivity.py +4 -2
- mindspore/train/metrics/precision.py +11 -10
- mindspore/train/metrics/recall.py +9 -9
- mindspore/train/metrics/root_mean_square_surface_distance.py +2 -2
- mindspore/train/mind_ir_pb2.py +174 -46
- mindspore/train/model.py +184 -113
- mindspore/train/serialization.py +622 -978
- mindspore/train/summary/_summary_adapter.py +2 -2
- mindspore/train/summary/summary_record.py +2 -3
- mindspore/train/train_thor/model_thor.py +1 -1
- mindspore/turbojpeg.dll +0 -0
- mindspore/utils/__init__.py +6 -3
- mindspore/utils/dryrun.py +140 -0
- mindspore/utils/hooks.py +81 -0
- mindspore/utils/runtime_execution_order_check.py +550 -0
- mindspore/utils/utils.py +138 -4
- mindspore/version.py +1 -1
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/METADATA +3 -3
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/RECORD +562 -393
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/entry_points.txt +1 -1
- mindspore/_install_custom.py +0 -43
- mindspore/common/_register_for_adapter.py +0 -74
- mindspore/common/_tensor_overload.py +0 -139
- mindspore/mindspore_np_dtype.dll +0 -0
- mindspore/ops/auto_generate/gen_arg_dtype_cast.py +0 -252
- mindspore/ops/auto_generate/gen_arg_handler.py +0 -197
- mindspore/ops/operations/_opaque_predicate_registry.py +0 -41
- mindspore/ops_generate/gen_aclnn_implement.py +0 -263
- mindspore/ops_generate/gen_ops_inner_prim.py +0 -131
- mindspore/ops_generate/gen_pyboost_func.py +0 -1052
- mindspore/ops_generate/gen_utils.py +0 -209
- mindspore/ops_generate/op_proto.py +0 -145
- mindspore/ops_generate/template.py +0 -261
- mindspore/profiler/envprofiling.py +0 -254
- mindspore/profiler/profiling.py +0 -1926
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/WHEEL +0 -0
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Copyright 2024-2025 Huawei Technologies Co., Ltd
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ============================================================================
|
|
15
|
+
"""Profiler Action Controller"""
|
|
16
|
+
from functools import partial
|
|
17
|
+
from typing import Dict, Optional, Callable, Any
|
|
18
|
+
|
|
19
|
+
from mindspore.profiler.profiler_interface import ProfilerInterface
|
|
20
|
+
from mindspore.profiler.schedule import ProfilerAction
|
|
21
|
+
|
|
22
|
+
from mindspore import log as logger
|
|
23
|
+
|
|
24
|
+
__all__ = []
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ProfilerActionController:
|
|
28
|
+
"""
|
|
29
|
+
A controller class for managing profiler actions and transitions.
|
|
30
|
+
|
|
31
|
+
This class handles the actions and transitions between different profiler states.
|
|
32
|
+
It uses two maps, abnormal_action_map and normal_action_map, to determine the actions
|
|
33
|
+
to take based on the previous and current profiler actions.
|
|
34
|
+
|
|
35
|
+
Attributes:
|
|
36
|
+
profiler: The profiler instance associated with this controller.
|
|
37
|
+
prof_interface (ProfilerInterface): The profiler interface instance.
|
|
38
|
+
on_trace_ready (Optional[Callable[..., Any]]): A callback function to be called when the trace is ready.
|
|
39
|
+
abnormal_action_map (Dict): A map of abnormal transitions and their corresponding actions.
|
|
40
|
+
normal_action_map (Dict): A map of normal transitions and their corresponding actions.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, prof_interface: ProfilerInterface, on_trace_ready: Optional[Callable[..., Any]] = None) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Initializes a new instance of ProfActionController.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
prof_interface (ProfilerInterface): The profiler interface instance.
|
|
49
|
+
on_trace_ready (Optional[Callable[..., Any]]): A callback function to be called when the trace is ready.
|
|
50
|
+
"""
|
|
51
|
+
self.prof_interface = prof_interface
|
|
52
|
+
self.abnormal_action_map: Dict = self.init_abnormal_action_map()
|
|
53
|
+
self.normal_action_map: Dict = self.init_normal_action_map()
|
|
54
|
+
self.on_trace_ready = on_trace_ready
|
|
55
|
+
|
|
56
|
+
def _trace_ready(self):
|
|
57
|
+
"""
|
|
58
|
+
Calls the on_trace_ready callback function if it is set.
|
|
59
|
+
|
|
60
|
+
This method is called when the trace is ready to notify the callback function.
|
|
61
|
+
"""
|
|
62
|
+
if self.on_trace_ready:
|
|
63
|
+
self.on_trace_ready()
|
|
64
|
+
|
|
65
|
+
def transit_action(self, prev_action: ProfilerAction, current_action: ProfilerAction) -> None:
|
|
66
|
+
"""
|
|
67
|
+
Handles actions between previous action and latter action
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
prev_action: The previous state
|
|
71
|
+
current_action: the latter state
|
|
72
|
+
"""
|
|
73
|
+
# Check whether the action is in the abnormal map
|
|
74
|
+
action_list = self.abnormal_action_map.get((prev_action, current_action), [])
|
|
75
|
+
if not action_list:
|
|
76
|
+
if isinstance(prev_action, ProfilerAction) and isinstance(current_action, ProfilerAction):
|
|
77
|
+
# Check whether the action is in the normal map
|
|
78
|
+
action_list = self.handle_normal_action(prev_action, current_action)
|
|
79
|
+
if not action_list:
|
|
80
|
+
return
|
|
81
|
+
for action in action_list:
|
|
82
|
+
action()
|
|
83
|
+
|
|
84
|
+
def handle_normal_action(self, start_state: ProfilerAction, end_state: ProfilerAction) -> list:
|
|
85
|
+
"""
|
|
86
|
+
Obtain the action in the normal state
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
start_state: The previous state
|
|
90
|
+
end_state: the latter state
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
process_action list
|
|
94
|
+
"""
|
|
95
|
+
process_action = []
|
|
96
|
+
initial_state = start_state
|
|
97
|
+
|
|
98
|
+
# Handle special case for ProfilerAction.RECORD_AND_SAVE to ProfilerAction.RECORD_AND_SAVE transition
|
|
99
|
+
if start_state == ProfilerAction.RECORD_AND_SAVE and end_state == ProfilerAction.RECORD_AND_SAVE:
|
|
100
|
+
process_action = [self.prof_interface.stop, self.prof_interface.finalize,
|
|
101
|
+
self._trace_ready, self.prof_interface.clear, self.prof_interface.init,
|
|
102
|
+
self.prof_interface.start]
|
|
103
|
+
else:
|
|
104
|
+
while start_state != end_state:
|
|
105
|
+
process_action.extend(self.normal_action_map[start_state])
|
|
106
|
+
start_state = ProfilerAction.get_by_value((start_state.value + 1) % len(ProfilerAction))
|
|
107
|
+
|
|
108
|
+
# Handle special cases for NONE to NONE, WARM_UP to WARM_UP, RECORD to RECORD transitions
|
|
109
|
+
if initial_state == start_state and initial_state != ProfilerAction.RECORD_AND_SAVE:
|
|
110
|
+
process_action = []
|
|
111
|
+
|
|
112
|
+
return process_action
|
|
113
|
+
|
|
114
|
+
def init_normal_action_map(self) -> dict:
|
|
115
|
+
"""
|
|
116
|
+
Generate a normal action map
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
normal_action_map map
|
|
120
|
+
"""
|
|
121
|
+
return {
|
|
122
|
+
ProfilerAction.NONE: [self.prof_interface.init],
|
|
123
|
+
ProfilerAction.WARM_UP: [self.prof_interface.start],
|
|
124
|
+
ProfilerAction.RECORD: [],
|
|
125
|
+
ProfilerAction.RECORD_AND_SAVE: [
|
|
126
|
+
self.prof_interface.stop,
|
|
127
|
+
self.prof_interface.finalize,
|
|
128
|
+
self._trace_ready,
|
|
129
|
+
self.prof_interface.clear
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
def init_abnormal_action_map(self) -> dict:
|
|
134
|
+
"""
|
|
135
|
+
Generate a abnormal action map
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
abnormal_action_map map
|
|
139
|
+
"""
|
|
140
|
+
return {
|
|
141
|
+
(ProfilerAction.WARM_UP, ProfilerAction.NONE): [
|
|
142
|
+
partial(logger.warning, "Incorrect schedule: WARMUP followed by NONE"),
|
|
143
|
+
self.prof_interface.start,
|
|
144
|
+
self.prof_interface.stop,
|
|
145
|
+
self.prof_interface.finalize,
|
|
146
|
+
self.prof_interface.clear
|
|
147
|
+
],
|
|
148
|
+
(ProfilerAction.RECORD, ProfilerAction.NONE): [
|
|
149
|
+
partial(logger.warning, "Incorrect schedule: RECORD followed by NONE"),
|
|
150
|
+
self.prof_interface.stop,
|
|
151
|
+
self.prof_interface.finalize,
|
|
152
|
+
self.prof_interface.clear
|
|
153
|
+
],
|
|
154
|
+
(ProfilerAction.RECORD, ProfilerAction.WARM_UP): [
|
|
155
|
+
partial(logger.warning, "Incorrect schedule: RECORD followed by WARMUP"),
|
|
156
|
+
self.prof_interface.stop,
|
|
157
|
+
self.prof_interface.finalize,
|
|
158
|
+
self.prof_interface.clear
|
|
159
|
+
],
|
|
160
|
+
# used for exit action
|
|
161
|
+
(ProfilerAction.WARM_UP, None): [
|
|
162
|
+
partial(logger.warning,
|
|
163
|
+
"Incorrect schedule: Stop profiler while current state is WARMUP "
|
|
164
|
+
"which will result in empty parsed data."),
|
|
165
|
+
self.prof_interface.finalize,
|
|
166
|
+
self.prof_interface.clear,
|
|
167
|
+
self.prof_interface.delete_dir
|
|
168
|
+
],
|
|
169
|
+
(ProfilerAction.RECORD, None): [
|
|
170
|
+
partial(logger.warning,
|
|
171
|
+
"Incorrect schedule: Stop profiler while current state is RECORD "
|
|
172
|
+
"which may result in incomplete parsed data."),
|
|
173
|
+
self.prof_interface.stop,
|
|
174
|
+
self.prof_interface.finalize,
|
|
175
|
+
self._trace_ready,
|
|
176
|
+
self.prof_interface.clear
|
|
177
|
+
],
|
|
178
|
+
(ProfilerAction.RECORD_AND_SAVE, None): [
|
|
179
|
+
partial(logger.warning,
|
|
180
|
+
"Stop profiler while current state is RECORD_AND_SAVE, "
|
|
181
|
+
"perhaps the scheduling cycle has not yet completed."),
|
|
182
|
+
self.prof_interface.stop,
|
|
183
|
+
self.prof_interface.finalize,
|
|
184
|
+
self._trace_ready,
|
|
185
|
+
self.prof_interface.clear
|
|
186
|
+
]
|
|
187
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Copyright 2020-2024 Huawei Technologies Co., Ltd
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ============================================================================
|
|
15
|
+
"""ProfilerInterface"""
|
|
16
|
+
from typing import Set
|
|
17
|
+
|
|
18
|
+
from mindspore import log as logger
|
|
19
|
+
from mindspore.common.api import _pynative_executor
|
|
20
|
+
from mindspore.profiler.common.registry import PROFILERS
|
|
21
|
+
from mindspore.profiler.platform.base_profiler import BaseProfiler
|
|
22
|
+
from mindspore.profiler.common.profiler_context import ProfilerContext
|
|
23
|
+
from mindspore.profiler.common.log import ProfilerLogger
|
|
24
|
+
from mindspore.profiler.common.profiler_path_manager import ProfilerPathManager
|
|
25
|
+
from mindspore.profiler.common.profiler_meta_data import ProfilerMetaData
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ProfilerInterface:
|
|
29
|
+
"""
|
|
30
|
+
Profiler interface
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
cpu_profiler: BaseProfiler = None
|
|
34
|
+
device_profiler: BaseProfiler = None
|
|
35
|
+
platform_profilers_set: Set[BaseProfiler] = set()
|
|
36
|
+
is_initialized = False
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def init(cls):
|
|
40
|
+
"""ProfilerInterface init"""
|
|
41
|
+
if cls.is_initialized:
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
ProfilerPathManager().set_ascend_ms_dir()
|
|
45
|
+
ProfilerPathManager().create_profiler_paths()
|
|
46
|
+
platforms = ProfilerContext().device_target_set
|
|
47
|
+
for device_target in platforms:
|
|
48
|
+
cls.platform_profilers_set.add(PROFILERS.modules.get(device_target)())
|
|
49
|
+
|
|
50
|
+
cls.is_initialized = True
|
|
51
|
+
logger.info("ProfilerInterface init")
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def start(cls):
|
|
55
|
+
"""ProfilerInterface start"""
|
|
56
|
+
if not cls.is_initialized:
|
|
57
|
+
logger.warning("ProfilerInterface start failed, profiler has not been initialized.")
|
|
58
|
+
return
|
|
59
|
+
|
|
60
|
+
for profiler in cls.platform_profilers_set:
|
|
61
|
+
profiler.start()
|
|
62
|
+
|
|
63
|
+
logger.info("ProfilerInterface start")
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def stop(cls):
|
|
67
|
+
"""ProfilerInterface stop"""
|
|
68
|
+
if not cls.is_initialized:
|
|
69
|
+
logger.warning("ProfilerInterface stop failed, profiler has not been initialized.")
|
|
70
|
+
return
|
|
71
|
+
|
|
72
|
+
_pynative_executor.sync()
|
|
73
|
+
for profiler in cls.platform_profilers_set:
|
|
74
|
+
profiler.stop()
|
|
75
|
+
|
|
76
|
+
logger.info("ProfilerInterface stop")
|
|
77
|
+
|
|
78
|
+
@classmethod
|
|
79
|
+
def analyse(cls):
|
|
80
|
+
"""ProfilerInterface analyse"""
|
|
81
|
+
if not cls.is_initialized:
|
|
82
|
+
logger.warning("ProfilerInterface analyse failed, profiler has not been initialized.")
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
for profiler in cls.platform_profilers_set:
|
|
86
|
+
profiler.analyse()
|
|
87
|
+
|
|
88
|
+
logger.info("ProfilerInterface analyse")
|
|
89
|
+
|
|
90
|
+
@classmethod
|
|
91
|
+
def finalize(cls):
|
|
92
|
+
"""ProfilerInterface finalize"""
|
|
93
|
+
if not cls.is_initialized:
|
|
94
|
+
logger.warning("ProfilerInterface finalize failed, profiler has not been initialized.")
|
|
95
|
+
return
|
|
96
|
+
|
|
97
|
+
ProfilerMetaData.dump_metadata()
|
|
98
|
+
for profiler in cls.platform_profilers_set:
|
|
99
|
+
profiler.finalize()
|
|
100
|
+
profiler = None
|
|
101
|
+
|
|
102
|
+
logger.info("ProfilerInterface finalize")
|
|
103
|
+
|
|
104
|
+
@classmethod
|
|
105
|
+
def clear(cls):
|
|
106
|
+
"""ProfilerInterface clear"""
|
|
107
|
+
if not cls.is_initialized:
|
|
108
|
+
logger.warning("ProfilerInterface clear failed, profiler has not been initialized.")
|
|
109
|
+
return
|
|
110
|
+
cls.platform_profilers_set.clear()
|
|
111
|
+
cls.is_initialized = False
|
|
112
|
+
ProfilerLogger.destroy()
|
|
113
|
+
logger.info("ProfilerInterface clear")
|
|
114
|
+
|
|
115
|
+
@classmethod
|
|
116
|
+
def delete_dir(cls):
|
|
117
|
+
"""ProfilerInterface delete dir"""
|
|
118
|
+
logger.info("ProfilerInterface delete dir")
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Copyright 2020-2023 Huawei Technologies Co., Ltd
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
# ============================================================================
|
|
15
|
+
"""Profiler Schedule"""
|
|
16
|
+
from enum import Enum
|
|
17
|
+
|
|
18
|
+
from mindspore import log as logger
|
|
19
|
+
|
|
20
|
+
__all__ = ["ProfilerAction", "Schedule"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ProfilerAction(Enum):
|
|
24
|
+
"""
|
|
25
|
+
Enum class representing different actions that can be performed by the profiler.
|
|
26
|
+
|
|
27
|
+
Each member of the enum represents a specific profiling action, which can be used
|
|
28
|
+
to control the behavior of the profiler at different stages of execution.
|
|
29
|
+
|
|
30
|
+
Attributes:
|
|
31
|
+
NONE (ProfilerAction): No profiling action.
|
|
32
|
+
WARM_UP (ProfilerAction): Warm-up phase of profiling.
|
|
33
|
+
RECORD (ProfilerAction): Record phase of profiling.
|
|
34
|
+
RECORD_AND_SAVE (ProfilerAction): Record and save phase of profiling.
|
|
35
|
+
"""
|
|
36
|
+
NONE = 0
|
|
37
|
+
WARM_UP = 1
|
|
38
|
+
RECORD = 2
|
|
39
|
+
RECORD_AND_SAVE = 3
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def get_by_value(value):
|
|
43
|
+
"""
|
|
44
|
+
Retrieves a ProfilerAction enum member by its value.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
value (int): The value of the ProfilerAction enum member to retrieve.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
ProfilerAction, The enum member corresponding to the given value, or None if not found.
|
|
51
|
+
"""
|
|
52
|
+
value_map = {action.value: action for action in ProfilerAction}
|
|
53
|
+
return value_map.get(value, None)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class Schedule:
|
|
57
|
+
r"""
|
|
58
|
+
This class use to get the actions of each step.
|
|
59
|
+
The schedule is as follows:
|
|
60
|
+
|
|
61
|
+
.. code-block::
|
|
62
|
+
|
|
63
|
+
(NONE) (NONE) (NONE) (WARM_UP) (RECORD) (RECORD) (RECORD_AND_SAVE) None
|
|
64
|
+
START------->skip_first------->wait-------->warmup-------->active........active.........active----------->stop
|
|
65
|
+
| |
|
|
66
|
+
| repeat_1 |
|
|
67
|
+
---------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
The profiler will skip the first ``skip_first`` steps, then wait for ``wait`` steps,
|
|
70
|
+
then do the warmup for the next ``warmup`` steps, then do the active recording for the next
|
|
71
|
+
``active`` steps and then repeat the cycle starting with ``wait`` steps. The optional number
|
|
72
|
+
of cycles is specified with the ``repeat`` parameter, the zero value means that
|
|
73
|
+
the cycles will continue until the profiling is finished.
|
|
74
|
+
|
|
75
|
+
Keyword Args:
|
|
76
|
+
wait (int): The number of steps to wait before starting the warm-up phase.
|
|
77
|
+
must be greater than or equal to 0. If the wait parameter is not set externally,
|
|
78
|
+
it is set to ``0`` when the schedule class is initialized.
|
|
79
|
+
active (int): The number of steps to record data during the active phase.
|
|
80
|
+
must be greater than or equal to 1. If the active parameter is not set externally,
|
|
81
|
+
it is set to ``1`` when the schedule class is initialized.
|
|
82
|
+
warmup (int, optional): The number of steps to perform the warm-up phase.
|
|
83
|
+
must be greater than or equal to 0. Default value: ``0``.
|
|
84
|
+
repeat (int, optional): The number of times to repeat the cycle.
|
|
85
|
+
If repeat is set to 0, the Profiler will determine the repeat value based on the number of times the model
|
|
86
|
+
is trained, which will generate one more performance data with incomplete collection. The data in the last
|
|
87
|
+
step is abnormal data that users do not need to pay attention to. Default value: ``0``.
|
|
88
|
+
skip_first (int, optional): The number of steps to skip at the beginning. Must be greater than or equal to 0.
|
|
89
|
+
Default value: ``0``
|
|
90
|
+
|
|
91
|
+
Raises:
|
|
92
|
+
ValueError: When the parameter step is less than 0.
|
|
93
|
+
|
|
94
|
+
Supported Platforms:
|
|
95
|
+
``Ascend``
|
|
96
|
+
|
|
97
|
+
Examples:
|
|
98
|
+
>>> import numpy as np
|
|
99
|
+
>>> import mindspore
|
|
100
|
+
>>> import mindspore.dataset as ds
|
|
101
|
+
>>> from mindspore import context, nn
|
|
102
|
+
>>> from mindspore.profiler import ProfilerLevel, AicoreMetrics, ExportType, ProfilerActivity
|
|
103
|
+
>>>
|
|
104
|
+
>>> class Net(nn.Cell):
|
|
105
|
+
... def __init__(self):
|
|
106
|
+
... super(Net, self).__init__()
|
|
107
|
+
... self.fc = nn.Dense(2, 2)
|
|
108
|
+
...
|
|
109
|
+
... def construct(self, x):
|
|
110
|
+
... return self.fc(x)
|
|
111
|
+
>>>
|
|
112
|
+
>>> def generator_net():
|
|
113
|
+
... for _ in range(2):
|
|
114
|
+
... yield np.ones([2, 2]).astype(np.float32), np.ones([2]).astype(np.int32)
|
|
115
|
+
>>>
|
|
116
|
+
>>> def train(test_net):
|
|
117
|
+
... optimizer = nn.Momentum(test_net.trainable_params(), 1, 0.9)
|
|
118
|
+
... loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
|
|
119
|
+
... data = ds.GeneratorDataset(generator_net(), ["data", "label"])
|
|
120
|
+
... model = mindspore.train.Model(test_net, loss, optimizer)
|
|
121
|
+
... model.train(1, data)
|
|
122
|
+
>>>
|
|
123
|
+
>>> if __name__ == '__main__':
|
|
124
|
+
... # If the device_target is GPU, set the device_target to "GPU"
|
|
125
|
+
... context.set_context(mode=mindspore.GRAPH_MODE)
|
|
126
|
+
... mindspore.set_device("Ascend")
|
|
127
|
+
...
|
|
128
|
+
... # Init Profiler
|
|
129
|
+
... experimental_config = mindspore.profiler._ExperimentalConfig(
|
|
130
|
+
... profiler_level=ProfilerLevel.Level0,
|
|
131
|
+
... aic_metrics=AicoreMetrics.AiCoreNone,
|
|
132
|
+
... l2_cache=False,
|
|
133
|
+
... mstx=False,
|
|
134
|
+
... data_simplification=False,
|
|
135
|
+
... export_type=[ExportType.Text])
|
|
136
|
+
... steps = 10
|
|
137
|
+
... net = Net()
|
|
138
|
+
... # Note that the Profiler should be initialized before model.train
|
|
139
|
+
... with mindspore.profiler.profile(activities=[ProfilerActivity.CPU, ProfilerActivity.NPU],
|
|
140
|
+
... schedule=mindspore.profiler.schedule(wait=1, warmup=1, active=2,
|
|
141
|
+
... repeat=1, skip_first=2),
|
|
142
|
+
... on_trace_ready=mindspore.profiler.tensorboard_trace_handler("./data"),
|
|
143
|
+
... profile_memory=False,
|
|
144
|
+
... experimental_config=experimental_config) as prof:
|
|
145
|
+
...
|
|
146
|
+
... # Train Model
|
|
147
|
+
... for step in range(steps):
|
|
148
|
+
... train(net)
|
|
149
|
+
... prof.step()
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
def __init__(self, *, wait: int, active: int, warmup: int = 0, repeat: int = 0, skip_first: int = 0) -> None:
|
|
153
|
+
self.wait = wait
|
|
154
|
+
self.active = active
|
|
155
|
+
self.warmup = warmup
|
|
156
|
+
self.repeat = repeat
|
|
157
|
+
self.skip_first = skip_first
|
|
158
|
+
self._check_params()
|
|
159
|
+
|
|
160
|
+
def __call__(self, step: int) -> ProfilerAction:
|
|
161
|
+
"""
|
|
162
|
+
Obtain the action of the specified step from the schedule.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
step (int): step num.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
ProfilerAction, The action corresponding to a step.
|
|
169
|
+
"""
|
|
170
|
+
if step < 0:
|
|
171
|
+
raise ValueError("Invalid parameter step, which must be not less than 0.")
|
|
172
|
+
if step < self.skip_first:
|
|
173
|
+
return ProfilerAction.NONE
|
|
174
|
+
|
|
175
|
+
step -= self.skip_first
|
|
176
|
+
|
|
177
|
+
num_steps = self.wait + self.warmup + self.active
|
|
178
|
+
if 0 < self.repeat <= step / num_steps:
|
|
179
|
+
return ProfilerAction.NONE
|
|
180
|
+
|
|
181
|
+
mod_step = step % num_steps
|
|
182
|
+
if mod_step < self.wait:
|
|
183
|
+
return ProfilerAction.NONE
|
|
184
|
+
if mod_step < self.wait + self.warmup:
|
|
185
|
+
return ProfilerAction.WARM_UP
|
|
186
|
+
return ProfilerAction.RECORD if mod_step < num_steps - 1 else ProfilerAction.RECORD_AND_SAVE
|
|
187
|
+
|
|
188
|
+
def __repr__(self):
|
|
189
|
+
return (f"Schedule(wait={self.wait!r}, active={self.active!r}, "
|
|
190
|
+
f"warmup={self.warmup!r}, repeat={self.repeat!r}, "
|
|
191
|
+
f"skip_first={self.skip_first!r})")
|
|
192
|
+
|
|
193
|
+
def _check_params(self):
|
|
194
|
+
"""
|
|
195
|
+
Verify all parameters in the schedule,
|
|
196
|
+
and set them to default values if the parameters are not compliant.
|
|
197
|
+
"""
|
|
198
|
+
if not isinstance(self.wait, int) or isinstance(self.wait, bool) or self.wait < 0:
|
|
199
|
+
logger.warning(f"Parameter 'wait' should be of type int, but got "
|
|
200
|
+
f"{type(self.wait).__name__}. reset to int 0.")
|
|
201
|
+
self.wait = 0
|
|
202
|
+
if not isinstance(self.warmup, int) or isinstance(self.warmup, bool) or self.warmup < 0:
|
|
203
|
+
logger.warning(f"Parameter 'warmup' should be of type int, but got "
|
|
204
|
+
f"{type(self.warmup).__name__}. reset to int 0.")
|
|
205
|
+
self.warmup = 0
|
|
206
|
+
if not isinstance(self.active, int) or isinstance(self.active, bool) or self.active <= 0:
|
|
207
|
+
logger.warning(f"Parameter 'active' should be of type int, but got "
|
|
208
|
+
f"{type(self.active).__name__}. reset to int 1.")
|
|
209
|
+
self.active = 1
|
|
210
|
+
if not isinstance(self.repeat, int) or isinstance(self.repeat, bool) or self.repeat < 0:
|
|
211
|
+
logger.warning(f"Parameter 'repeat' should be of type int, but got "
|
|
212
|
+
f"{type(self.repeat).__name__}. reset to int 0.")
|
|
213
|
+
self.repeat = 0
|
|
214
|
+
if not isinstance(self.skip_first, int) or isinstance(self.skip_first, bool) or self.skip_first < 0:
|
|
215
|
+
logger.warning(f"Parameter 'skip_first' should be of type int, but got "
|
|
216
|
+
f"{type(self.skip_first).__name__}. reset to int 0.")
|
|
217
|
+
self.skip_first = 0
|
|
218
|
+
if self.warmup == 0:
|
|
219
|
+
logger.warning("Profiler won't be using warmup, this can skew profiler results")
|
|
220
|
+
|
|
221
|
+
def to_dict(self):
|
|
222
|
+
"""
|
|
223
|
+
Convert schedule to a dict.
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
dict, the parameters of schedule and their values.
|
|
227
|
+
"""
|
|
228
|
+
return {'wait': self.wait, 'active': self.active, 'warmup': self.warmup,
|
|
229
|
+
'repeat': self.repeat, 'skip_first': self.skip_first}
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _default_schedule_fn(_: int) -> ProfilerAction:
|
|
233
|
+
"""
|
|
234
|
+
Default profiler behavior - immediately starts recording the events,
|
|
235
|
+
keeps doing it on every profiler step.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
_ (int): step num.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
ProfilerAction, The RECORD action.
|
|
242
|
+
"""
|
|
243
|
+
return ProfilerAction.RECORD
|
mindspore/rewrite/api/node.py
CHANGED
|
@@ -28,9 +28,11 @@ from .scoped_value import ScopedValue
|
|
|
28
28
|
|
|
29
29
|
class Node:
|
|
30
30
|
"""
|
|
31
|
-
A node
|
|
32
|
-
|
|
33
|
-
Each node usually corresponds to a statement in
|
|
31
|
+
A node (Node) can be understood as a basic data structure unit in the computational graph of a neural network,
|
|
32
|
+
which represents an operation or computational step in the network.
|
|
33
|
+
Each node usually corresponds to a statement or expression in the source code,
|
|
34
|
+
which contains the information needed to perform the operation,
|
|
35
|
+
such as the type of operation, input data, output result, and connection relationships with other nodes.
|
|
34
36
|
|
|
35
37
|
Nodes can express a ``Cell`` call statement, a ``Primitive`` call statement, an arithmetic operation statement, a
|
|
36
38
|
return statements, etc. of the forward calculation process.
|
|
@@ -66,9 +68,9 @@ class Node:
|
|
|
66
68
|
source code.
|
|
67
69
|
args (List[ScopedValue]): Indicate input names. Used as args of a call expression of an assign statement in
|
|
68
70
|
source code. Default: ``None`` , which indicates the `cell` has no args inputs.
|
|
69
|
-
kwargs (Dict[str, ScopedValue]):
|
|
70
|
-
Indicate keyword input names.
|
|
71
|
-
|
|
71
|
+
kwargs (Dict[str, ScopedValue]): Used as kwargs of a call expression of an assign statement in source
|
|
72
|
+
code. Indicate keyword input names. Type of key must be `str` and type of value must be `ScopedValue`.
|
|
73
|
+
Default: ``None`` , which indicates the `cell` has no kwargs inputs.
|
|
72
74
|
name (str): Indicate the name of node. Used as field name in source code. Default is None. Rewrite will
|
|
73
75
|
generate name from `cell` when name is None. Rewrite will check and ensure the uniqueness of `name`
|
|
74
76
|
while node being inserted. Default: ``""`` .
|
|
@@ -83,7 +85,7 @@ class Node:
|
|
|
83
85
|
TypeError: If `targets` is not `list`.
|
|
84
86
|
TypeError: If the type of `targets` is not in `[ScopedValue, str]`.
|
|
85
87
|
TypeError: If arg in `args` is not a `ScopedValue`.
|
|
86
|
-
TypeError: If key of `
|
|
88
|
+
TypeError: If key of `kwargs` is not a str or value of kwarg in `kwargs` is not a `ScopedValue`.
|
|
87
89
|
|
|
88
90
|
Examples:
|
|
89
91
|
>>> from mindspore.rewrite import SymbolTree, ScopedValue
|
|
@@ -125,9 +127,9 @@ class Node:
|
|
|
125
127
|
source code.
|
|
126
128
|
args (List[ScopedValue]): Indicate input names. Used as args of a call expression of an assign statement in
|
|
127
129
|
source code. Default: ``None`` , which indicates the `function` has no args inputs.
|
|
128
|
-
kwargs (Dict[str, ScopedValue]):
|
|
129
|
-
Indicate keyword input names.
|
|
130
|
-
|
|
130
|
+
kwargs (Dict[str, ScopedValue]): Used as kwargs of a call expression of an assign statement in source
|
|
131
|
+
code. Indicate keyword input names. Type of key must be `str` and type of value must be `ScopedValue`.
|
|
132
|
+
Default: ``None`` , which indicates the `function` has no kwargs inputs.
|
|
131
133
|
|
|
132
134
|
Returns:
|
|
133
135
|
An instance of `Node`.
|
|
@@ -137,7 +139,7 @@ class Node:
|
|
|
137
139
|
TypeError: If `targets` is not `list`.
|
|
138
140
|
TypeError: If the type of `targets` is not in `[ScopedValue, str]`.
|
|
139
141
|
TypeError: If arg in `args` is not a `ScopedValue`.
|
|
140
|
-
TypeError: If key of `
|
|
142
|
+
TypeError: If key of `kwargs` is not a str or value of kwarg in `kwargs` is not a `ScopedValue`.
|
|
141
143
|
|
|
142
144
|
Examples:
|
|
143
145
|
>>> from mindspore.rewrite import SymbolTree, ScopedValue
|
|
@@ -476,14 +478,14 @@ class Node:
|
|
|
476
478
|
... self.relu = nn.ReLU()
|
|
477
479
|
...
|
|
478
480
|
... def construct(self, input):
|
|
479
|
-
... output = self.relu(
|
|
481
|
+
... output = self.relu(input=input)
|
|
480
482
|
... return output
|
|
481
483
|
>>>
|
|
482
484
|
>>> net = ReLUNet()
|
|
483
485
|
>>> stree = SymbolTree.create(net)
|
|
484
486
|
>>> node = stree.get_node("relu")
|
|
485
487
|
>>> print(node.get_kwargs())
|
|
486
|
-
{'
|
|
488
|
+
{'input': input}
|
|
487
489
|
"""
|
|
488
490
|
return self._node.get_kwargs()
|
|
489
491
|
|
|
@@ -74,7 +74,7 @@ class SymbolTree:
|
|
|
74
74
|
|
|
75
75
|
- :class:`mindspore.nn.SequentialCell`
|
|
76
76
|
- Functions(Excludes Python built-in functions and third-party library functions)
|
|
77
|
-
- Control flow statements
|
|
77
|
+
- Control flow statements(such as `if` statements)
|
|
78
78
|
|
|
79
79
|
Note:
|
|
80
80
|
Because the specific execution branch of control flows are still unknown during the rewrite operation
|
|
@@ -331,8 +331,7 @@ class SymbolTree:
|
|
|
331
331
|
Nodes in `new_nodes` will be inserted into SymbolTree sequentially, and then `old_node` will be deleted.
|
|
332
332
|
|
|
333
333
|
Note:
|
|
334
|
-
- Replace support one-to-one replacement or one-to-multi replacement.
|
|
335
|
-
replacement, please refer to `PatternEngine`.
|
|
334
|
+
- Replace only support one-to-one replacement or one-to-multi replacement.
|
|
336
335
|
- Caller should maintain the topological relationship between each node in the `new_nodes` , as well as
|
|
337
336
|
the topological relationship between nodes in the `new_nodes` and nodes in the original tree.
|
|
338
337
|
|