mindspore 2.4.10__cp310-cp310-win_amd64.whl → 2.6.0__cp310-cp310-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/Microsoft.VisualStudio.Telemetry.dll +0 -0
- mindspore/Newtonsoft.Json.dll +0 -0
- mindspore/__init__.py +13 -6
- mindspore/_c_dataengine.cp310-win_amd64.pyd +0 -0
- mindspore/_c_expression.cp310-win_amd64.pyd +0 -0
- mindspore/_c_mindrecord.cp310-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 +47 -198
- mindspore/_extends/parse/resources.py +1 -5
- mindspore/_extends/parse/standard_method.py +229 -99
- 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/atlprov.dll +0 -0
- 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/c1.dll +0 -0
- mindspore/c1xx.dll +0 -0
- mindspore/c2.dll +0 -0
- 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 +480 -372
- 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 +5 -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 +975 -1981
- 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 +324 -573
- 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 +183 -117
- 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/dnnl.dll +0 -0
- mindspore/dpcmi.dll +0 -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 +209 -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 +179 -120
- 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_glog.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 +798 -761
- 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 +933 -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/msobj140.dll +0 -0
- mindspore/mspdb140.dll +0 -0
- mindspore/mspdbcore.dll +0 -0
- mindspore/mspdbst.dll +0 -0
- mindspore/mspft140.dll +0 -0
- mindspore/msvcdis140.dll +0 -0
- mindspore/msvcp140_1.dll +0 -0
- mindspore/msvcp140_2.dll +0 -0
- mindspore/msvcp140_atomic_wait.dll +0 -0
- mindspore/msvcp140_codecvt_ids.dll +0 -0
- mindspore/multiprocessing/__init__.py +5 -0
- mindspore/nn/__init__.py +4 -1
- mindspore/nn/cell.py +1373 -192
- 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 +53 -42
- 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 +19 -15
- mindspore/nn/optim/adamax.py +8 -7
- mindspore/nn/optim/adasum.py +5 -5
- mindspore/nn/optim/asgd.py +3 -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 +361 -359
- 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 +52 -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 +258 -46
- mindspore/ops/auto_generate/gen_extend_func.py +757 -185
- mindspore/ops/auto_generate/gen_ops_def.py +4197 -2243
- mindspore/ops/auto_generate/gen_ops_prim.py +16976 -6055
- 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 +4351 -3813
- mindspore/ops/function/nn_func.py +1712 -637
- mindspore/ops/function/other_func.py +159 -1
- mindspore/ops/function/parameter_func.py +18 -84
- mindspore/ops/function/random_func.py +452 -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 +26 -18
- mindspore/ops/functional.py +23 -7
- mindspore/ops/functional_overload.py +1548 -0
- mindspore/ops/op_info_register.py +32 -244
- mindspore/ops/operations/__init__.py +23 -15
- mindspore/ops/operations/_custom_ops_utils.py +235 -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 +298 -87
- mindspore/ops/operations/debug_ops.py +157 -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 +212 -531
- 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 +1895 -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 +296 -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 +159 -40
- mindspore/parallel/_cell_wrapper.py +132 -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 +700 -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 +258 -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 -59
- mindspore/parallel/transform_safetensors.py +364 -305
- mindspore/pgodb140.dll +0 -0
- mindspore/pgort140.dll +0 -0
- 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 +109 -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 +416 -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/tbbmalloc.dll +0 -0
- mindspore/tinyxml2.dll +0 -0
- mindspore/train/__init__.py +8 -8
- mindspore/train/_utils.py +96 -27
- 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} +228 -108
- 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 +269 -136
- 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 +552 -0
- mindspore/utils/utils.py +138 -4
- mindspore/vcmeta.dll +0 -0
- mindspore/vcruntime140.dll +0 -0
- mindspore/vcruntime140_1.dll +0 -0
- mindspore/version.py +1 -1
- {mindspore-2.4.10.dist-info → mindspore-2.6.0.dist-info}/METADATA +3 -3
- {mindspore-2.4.10.dist-info → mindspore-2.6.0.dist-info}/RECORD +587 -418
- {mindspore-2.4.10.dist-info → mindspore-2.6.0.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.0.dist-info}/WHEEL +0 -0
- {mindspore-2.4.10.dist-info → mindspore-2.6.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
# Copyright 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
|
+
"""mind data viewer"""
|
|
16
|
+
import os
|
|
17
|
+
from queue import Queue
|
|
18
|
+
from collections import defaultdict
|
|
19
|
+
from typing import List, Dict, Any
|
|
20
|
+
|
|
21
|
+
from mindspore import log as logger
|
|
22
|
+
from mindspore.profiler.common.constant import ProfilerActivity
|
|
23
|
+
from mindspore.profiler.analysis.viewer.base_viewer import BaseViewer
|
|
24
|
+
from mindspore.profiler.common.file_manager import FileManager
|
|
25
|
+
from mindspore.profiler.common.log import ProfilerLogger
|
|
26
|
+
from mindspore.profiler.common.exceptions.exceptions import (
|
|
27
|
+
ProfilerRawFileException,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class MindDataPipelineRawViewer(BaseViewer):
|
|
32
|
+
"""
|
|
33
|
+
MindData Pipeline Raw Viewer for parsing and saving raw pipeline profiling data.
|
|
34
|
+
This class processes the raw pipeline information and saves it in a CSV format.
|
|
35
|
+
"""
|
|
36
|
+
_FILE_NAME = 'minddata_pipeline_raw_{}.csv'
|
|
37
|
+
_COL_NAMES = [
|
|
38
|
+
'op_id', 'op_type', 'num_workers', 'output_queue_size',
|
|
39
|
+
'output_queue_average_size', 'output_queue_length',
|
|
40
|
+
'output_queue_usage_rate', 'sample_interval', 'parent_id', 'children_id'
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
def __init__(self, **kwargs):
|
|
44
|
+
super().__init__()
|
|
45
|
+
self._device_id = kwargs.get("rank_id") if (ProfilerActivity.NPU.value in
|
|
46
|
+
kwargs.get("activities")) else kwargs.get("device_id")
|
|
47
|
+
self._save_path = os.path.join(
|
|
48
|
+
kwargs.get("ascend_profiler_output_path"),
|
|
49
|
+
self._FILE_NAME.format(self._device_id)
|
|
50
|
+
)
|
|
51
|
+
self._ascend_ms_dir = kwargs.get("ascend_ms_dir")
|
|
52
|
+
ProfilerLogger.init(self._ascend_ms_dir)
|
|
53
|
+
self._logger = ProfilerLogger.get_instance()
|
|
54
|
+
|
|
55
|
+
def save(self, data: Dict[str, Any]) -> None:
|
|
56
|
+
if not data.get("pipeline_info"):
|
|
57
|
+
return
|
|
58
|
+
try:
|
|
59
|
+
dict_op_id_info, sampling_interval = data["pipeline_info"]
|
|
60
|
+
op_info_list = self._analyse_data(dict_op_id_info, sampling_interval)
|
|
61
|
+
self._logger.info("Analyse minddata pipeline raw data done")
|
|
62
|
+
self._save_data(op_info_list)
|
|
63
|
+
self._logger.info("Save minddata pipeline raw data done")
|
|
64
|
+
except Exception as e: # pylint: disable=W0703
|
|
65
|
+
self._logger.error("Failed to save minddata %s", e, exc_info=True)
|
|
66
|
+
|
|
67
|
+
def _analyse_data(self, dict_op_id_info: Dict[int, Dict[str, Any]], sample_interval: float) -> List[List[Any]]:
|
|
68
|
+
"""
|
|
69
|
+
Create a list of operator information from the op id info dict.
|
|
70
|
+
Args:
|
|
71
|
+
dict_op_id_info (dict): dict of operator information indexed by op_id.
|
|
72
|
+
sample_interval (int): Sampling interval for the profiling data.
|
|
73
|
+
Returns:
|
|
74
|
+
list: List of operator information for each node in the pipeline.
|
|
75
|
+
Raises:
|
|
76
|
+
ProfilerRawFileException: If the root operator (id=0) does not exist.
|
|
77
|
+
"""
|
|
78
|
+
root_node = dict_op_id_info.get(0)
|
|
79
|
+
if not root_node:
|
|
80
|
+
raise ProfilerRawFileException(
|
|
81
|
+
'The format of minddata pipeline raw file is wrong, '
|
|
82
|
+
'the operator that id is 0 does not exist.'
|
|
83
|
+
)
|
|
84
|
+
root_node['parent_id'] = None
|
|
85
|
+
queue = Queue()
|
|
86
|
+
queue.put_nowait(root_node)
|
|
87
|
+
op_info_list = []
|
|
88
|
+
|
|
89
|
+
while not queue.empty():
|
|
90
|
+
node = queue.get_nowait()
|
|
91
|
+
self._update_child_node(node, dict_op_id_info)
|
|
92
|
+
op_info_list.append(self._get_op_info(node, sample_interval))
|
|
93
|
+
for child_op_id in node.get('children', []):
|
|
94
|
+
sub_node = dict_op_id_info.get(child_op_id)
|
|
95
|
+
sub_node['parent_id'] = node['op_id']
|
|
96
|
+
queue.put_nowait(sub_node)
|
|
97
|
+
|
|
98
|
+
return op_info_list
|
|
99
|
+
|
|
100
|
+
def _save_data(self, op_info_list: List[List[Any]]) -> None:
|
|
101
|
+
self._logger.info("Save minddata pipeline raw data start")
|
|
102
|
+
FileManager.create_csv_file(self._save_path, op_info_list, self._COL_NAMES)
|
|
103
|
+
self._logger.info(
|
|
104
|
+
"Save minddata pipeline raw data done, %d rows saved, save path: %s",
|
|
105
|
+
len(op_info_list),
|
|
106
|
+
self._save_path,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _update_child_node(node: Dict[str, Any], dict_op_id_info: Dict[int, Dict[str, Any]]) -> None:
|
|
111
|
+
"""
|
|
112
|
+
Update the children information for a given node in the pipeline.
|
|
113
|
+
Args:
|
|
114
|
+
node (dict): The current node (operator) being processed.
|
|
115
|
+
dict_op_id_info (dict): Dict of operator information indexed by op_id.
|
|
116
|
+
"""
|
|
117
|
+
child_op_ids = node.get('children', [])
|
|
118
|
+
if not child_op_ids:
|
|
119
|
+
return
|
|
120
|
+
|
|
121
|
+
queue = Queue()
|
|
122
|
+
queue.queue.extend(child_op_ids)
|
|
123
|
+
|
|
124
|
+
new_child_op_ids = []
|
|
125
|
+
while not queue.empty():
|
|
126
|
+
child_op_id = queue.get_nowait()
|
|
127
|
+
child_node = dict_op_id_info.get(child_op_id)
|
|
128
|
+
if not child_node:
|
|
129
|
+
continue
|
|
130
|
+
metrics = child_node.get('metrics')
|
|
131
|
+
if not metrics or not metrics.get('output_queue'):
|
|
132
|
+
children = child_node.get('children', [])
|
|
133
|
+
if children:
|
|
134
|
+
queue.queue.extend(children)
|
|
135
|
+
else:
|
|
136
|
+
new_child_op_ids.append(child_op_id)
|
|
137
|
+
|
|
138
|
+
node['children'] = new_child_op_ids
|
|
139
|
+
|
|
140
|
+
@staticmethod
|
|
141
|
+
def _get_op_info(op_node: Dict[str, Any], sample_interval: float) -> List[Any]:
|
|
142
|
+
"""
|
|
143
|
+
Get the operator information.
|
|
144
|
+
Args:
|
|
145
|
+
op_node (dict): The node represents an operator.
|
|
146
|
+
sample_interval (int): Sampling interval.
|
|
147
|
+
Returns:
|
|
148
|
+
list: A list containing the extracted operator information.
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: If the queue size is None or the queue length is 0.
|
|
151
|
+
"""
|
|
152
|
+
metrics = op_node.get('metrics')
|
|
153
|
+
output_queue_info = metrics.get('output_queue', {}) if metrics else {}
|
|
154
|
+
queue_size = output_queue_info.get('size')
|
|
155
|
+
queue_length = output_queue_info.get('length')
|
|
156
|
+
|
|
157
|
+
if output_queue_info and queue_size is None:
|
|
158
|
+
raise ValueError("The queue size cannot be None.")
|
|
159
|
+
if output_queue_info and queue_length == 0:
|
|
160
|
+
raise ValueError("The length of queue cannot be 0.")
|
|
161
|
+
|
|
162
|
+
queue_average_size = sum(queue_size) / len(queue_size) if queue_size else None
|
|
163
|
+
queue_usage_rate = queue_average_size / queue_length if queue_average_size is not None else None
|
|
164
|
+
|
|
165
|
+
children_id = op_node.get('children')
|
|
166
|
+
return [
|
|
167
|
+
op_node.get('op_id'),
|
|
168
|
+
op_node.get('op_type'),
|
|
169
|
+
op_node.get('num_workers'),
|
|
170
|
+
queue_size,
|
|
171
|
+
queue_average_size,
|
|
172
|
+
queue_length,
|
|
173
|
+
queue_usage_rate,
|
|
174
|
+
sample_interval,
|
|
175
|
+
op_node.get('parent_id'),
|
|
176
|
+
children_id if children_id else None
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class MindDataPiplineSummaryViewer(BaseViewer):
|
|
181
|
+
"""
|
|
182
|
+
MindData Pipeline Summary Viewer for processing and saving pipeline profiling summary data.
|
|
183
|
+
This class calculates various metrics and saves the summary in both JSON and CSV formats.
|
|
184
|
+
"""
|
|
185
|
+
_FILE_NAMES = {
|
|
186
|
+
'json_file': 'minddata_pipeline_summary_{}.json',
|
|
187
|
+
'csv_file': 'minddata_pipeline_summary_{}.csv'
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
def __init__(self, **kwargs):
|
|
191
|
+
super().__init__()
|
|
192
|
+
self._device_id = kwargs.get("rank_id") if (ProfilerActivity.NPU.value in
|
|
193
|
+
kwargs.get("activities")) else kwargs.get("device_id")
|
|
194
|
+
self._device_queue_file_found = None
|
|
195
|
+
self._save_paths = {
|
|
196
|
+
file_type: os.path.join(kwargs.get("ascend_profiler_output_path"), file_name.format(self._device_id))
|
|
197
|
+
for file_type, file_name in self._FILE_NAMES.items()
|
|
198
|
+
}
|
|
199
|
+
self._ascend_ms_dir = kwargs.get("ascend_ms_dir")
|
|
200
|
+
ProfilerLogger.init(self._ascend_ms_dir, "MindDataPiplineSummaryViewer")
|
|
201
|
+
self._logger = ProfilerLogger.get_instance()
|
|
202
|
+
|
|
203
|
+
def save(self, data: Dict[str, Any]) -> None:
|
|
204
|
+
# If there are errors in the data during the parsing phase, the data will be set to empty
|
|
205
|
+
if not (data.get("pipeline_info") and data.get('cpu_util_info') and data.get("device_trace_info")):
|
|
206
|
+
return
|
|
207
|
+
try:
|
|
208
|
+
self._device_queue_file_found = data["device_queue_file_found"]
|
|
209
|
+
summary_dict = self._analyse_data(data)
|
|
210
|
+
self._logger.info("Analyse minddata pipeline summary data done")
|
|
211
|
+
self._save_data(summary_dict)
|
|
212
|
+
self._logger.info("Save minddata pipeline summary data done")
|
|
213
|
+
except Exception as e: # pylint: disable=W0703
|
|
214
|
+
self._logger.error("Failed to save minddata %s", e, exc_info=True)
|
|
215
|
+
|
|
216
|
+
def _analyse_data(self, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
217
|
+
"""
|
|
218
|
+
Calculate the summary information from the raw profiling data.
|
|
219
|
+
Args:
|
|
220
|
+
data (dict): Raw profiling data.
|
|
221
|
+
Returns:
|
|
222
|
+
dict: Calculated summary information.
|
|
223
|
+
"""
|
|
224
|
+
summary_dict = {}
|
|
225
|
+
summary_dict.update(self._analyse_pipeline_info(data["pipeline_info"]))
|
|
226
|
+
summary_dict.update(self._analyse_cpu_util_info(data["cpu_util_info"]))
|
|
227
|
+
summary_dict.update(self._analyse_device_trace_info(data["device_trace_info"]))
|
|
228
|
+
self._check_and_update_summary(summary_dict)
|
|
229
|
+
return summary_dict
|
|
230
|
+
|
|
231
|
+
def _save_data(self, summary_dict: Dict[str, Any]) -> None:
|
|
232
|
+
self._logger.info("Save minddata pipeline summary data start")
|
|
233
|
+
FileManager.create_json_file(self._save_paths['json_file'], summary_dict)
|
|
234
|
+
FileManager.create_csv_file(
|
|
235
|
+
self._save_paths['csv_file'],
|
|
236
|
+
[[key] + value for key, value in summary_dict.items()]
|
|
237
|
+
)
|
|
238
|
+
self._logger.info("Save minddata pipeline summary data done")
|
|
239
|
+
|
|
240
|
+
def _check_and_update_summary(self, summary_dict: Dict[str, Any]) -> None:
|
|
241
|
+
"""
|
|
242
|
+
Check for consistency in the summary data and update with composite information.
|
|
243
|
+
Args:
|
|
244
|
+
summary_dict (dict): Summary dictionary to be checked and updated.
|
|
245
|
+
"""
|
|
246
|
+
num_pipeline_ops = len(summary_dict.get('pipeline_ops', []))
|
|
247
|
+
num_cpu_util_ops = len(summary_dict.get('avg_cpu_pct', []))
|
|
248
|
+
# Check if both pipeline data and CPU utilization data have the same number of ops
|
|
249
|
+
if num_pipeline_ops == num_cpu_util_ops:
|
|
250
|
+
summary_dict.update(self._analyse_composite_info(summary_dict))
|
|
251
|
+
bottleneck_dict = self._analyse_bottleneck_op(summary_dict)
|
|
252
|
+
if bottleneck_dict:
|
|
253
|
+
summary_dict.update(bottleneck_dict)
|
|
254
|
+
else:
|
|
255
|
+
logger.warning(f'Number of ops mismatch: pipeline data ({num_pipeline_ops}) '
|
|
256
|
+
f'vs CPU utilization data ({num_cpu_util_ops})')
|
|
257
|
+
|
|
258
|
+
def _analyse_pipeline_info(self, pipeline_info):
|
|
259
|
+
"""
|
|
260
|
+
Calculate pipeline information from raw pipeline data.
|
|
261
|
+
Args:
|
|
262
|
+
pipeline_info (dict): Raw pipeline information.
|
|
263
|
+
Returns:
|
|
264
|
+
dict: Processed pipeline information.
|
|
265
|
+
Raises:
|
|
266
|
+
ProfilerRawFileException: If the format of the input is wrong.
|
|
267
|
+
"""
|
|
268
|
+
# Since there may be non-linear pipelines, the processed op info needs to be sorted before final output is
|
|
269
|
+
# produced and saved.
|
|
270
|
+
op_id_info_list = sorted(pipeline_info[0].items(), key=lambda item: item[0])
|
|
271
|
+
return_dict = defaultdict(list)
|
|
272
|
+
dict_opid_parent_id = {}
|
|
273
|
+
|
|
274
|
+
for op_id, op_info in op_id_info_list:
|
|
275
|
+
op_name = op_info.get('op_type')[0:-2]
|
|
276
|
+
queue_info_items = self._get_pipeline_metrics_info(op_info.get('metrics', {}))
|
|
277
|
+
children_ids = op_info.get('children', [])
|
|
278
|
+
for child_op_id in children_ids:
|
|
279
|
+
dict_opid_parent_id[child_op_id] = op_id
|
|
280
|
+
|
|
281
|
+
return_dict['op_ids'].append(op_id)
|
|
282
|
+
return_dict['op_names'].append(op_name)
|
|
283
|
+
return_dict['pipeline_ops'].append(f'{op_name}(id={op_id})')
|
|
284
|
+
return_dict['num_workers'].append(op_info.get('num_workers'))
|
|
285
|
+
return_dict['queue_average_size'].append(queue_info_items[2]) # output queue average size
|
|
286
|
+
return_dict['queue_utilization_pct'].append(queue_info_items[3]) # output queue utilization percentage
|
|
287
|
+
return_dict['queue_empty_freq_pct'].append(queue_info_items[4]) # output queue empty frequency percentage
|
|
288
|
+
return_dict['children_ids'].append(children_ids)
|
|
289
|
+
|
|
290
|
+
return_dict['parent_id'] = [dict_opid_parent_id.get(idx, -1) for idx, _ in op_id_info_list]
|
|
291
|
+
return return_dict
|
|
292
|
+
|
|
293
|
+
def _analyse_device_trace_info(self, device_trace_info):
|
|
294
|
+
"""
|
|
295
|
+
Calculate device trace information.
|
|
296
|
+
Args:
|
|
297
|
+
device_trace_info (list): Raw device trace information.
|
|
298
|
+
Returns:
|
|
299
|
+
Dictionary consists of:
|
|
300
|
+
per_batch_time: Average per batch time for pipeline in milliseconds
|
|
301
|
+
per_pipeline_time: Average per pipeline time in milliseconds
|
|
302
|
+
per_push_queue_time: Average per queue push time in milliseconds
|
|
303
|
+
"""
|
|
304
|
+
q_time = [[], [], []] # pipeline time, push TDT time, batch time
|
|
305
|
+
prev_time = 0
|
|
306
|
+
|
|
307
|
+
for line_data in device_trace_info:
|
|
308
|
+
if len(line_data.split(" ")) < 5:
|
|
309
|
+
logger.warning("Invalid device trace data: %s", line_data)
|
|
310
|
+
continue
|
|
311
|
+
record = [int(d) for d in line_data.split(" ")][0:5]
|
|
312
|
+
if record[2] < 2: # skip 1st batch
|
|
313
|
+
prev_time = record[4]
|
|
314
|
+
continue
|
|
315
|
+
if record[0] == 0: # type 0: time record
|
|
316
|
+
q_time[record[1]].append(record[3])
|
|
317
|
+
elif record[0] == 1 and not self._device_queue_file_found: # type 1: connector size record
|
|
318
|
+
q_time[2].append(record[4] - prev_time)
|
|
319
|
+
prev_time = record[4]
|
|
320
|
+
|
|
321
|
+
avg_times = [sum(t) / len(t) if t else -1 for t in q_time]
|
|
322
|
+
return {
|
|
323
|
+
'per_pipeline_time': [round(avg_times[0], 3)],
|
|
324
|
+
'per_push_queue_time': [round(avg_times[1], 3)],
|
|
325
|
+
'per_batch_time': [round(avg_times[2], 3)]
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
@staticmethod
|
|
329
|
+
def _get_pipeline_metrics_info(metrics: Dict[str, Any]) -> List[Any]:
|
|
330
|
+
"""
|
|
331
|
+
Parse and process the pipeline profiling metrics information for a given op.
|
|
332
|
+
Args:
|
|
333
|
+
metrics (dict): The pipeline profiling metrics information for a given op.
|
|
334
|
+
Returns:
|
|
335
|
+
list: A list containing output queue size, length, average size, utilization percentage,
|
|
336
|
+
and empty frequency percentage.
|
|
337
|
+
"""
|
|
338
|
+
queue_metrics = metrics.get('output_queue', {}) if metrics else {}
|
|
339
|
+
queue_size = queue_metrics.get('size', [])
|
|
340
|
+
queue_length = queue_metrics.get('length', 0)
|
|
341
|
+
if not queue_size:
|
|
342
|
+
return [-1] * 5
|
|
343
|
+
queue_average_size = round(sum(queue_size) / len(queue_size), 2)
|
|
344
|
+
queue_utilization_pct = round(100 * queue_average_size / queue_length, 2) if queue_length else -1
|
|
345
|
+
# Compute percentage of time queue is empty
|
|
346
|
+
queue_empty_freq_pct = round(100 * queue_size.count(0) / len(queue_size), 2)
|
|
347
|
+
|
|
348
|
+
return [queue_size, queue_length, queue_average_size, queue_utilization_pct, queue_empty_freq_pct]
|
|
349
|
+
|
|
350
|
+
@staticmethod
|
|
351
|
+
def _analyse_cpu_util_info(cpu_util_info: Dict[str, Any]) -> Dict[str, List[float]]:
|
|
352
|
+
"""
|
|
353
|
+
Calculate CPU utilization information.
|
|
354
|
+
Args:
|
|
355
|
+
cpu_util_info (dict): The CPU utilization profiling information.
|
|
356
|
+
Returns:
|
|
357
|
+
dict: Average CPU utilization percentage for each op, a list ordered by increasing op id
|
|
358
|
+
Raises:
|
|
359
|
+
ProfilerRawFileException: If the format of the CPU utilization file is incorrect.
|
|
360
|
+
"""
|
|
361
|
+
cpu_processor_num = cpu_util_info.get('cpu_processor_num')
|
|
362
|
+
cpu_op_info = cpu_util_info.get('op_info')
|
|
363
|
+
if cpu_processor_num is None or not cpu_op_info:
|
|
364
|
+
raise ProfilerRawFileException('The format of MindData CPU utilization JSON file is wrong.')
|
|
365
|
+
for item in cpu_op_info:
|
|
366
|
+
if not item:
|
|
367
|
+
raise ProfilerRawFileException('The contents of MindData CPU utilization JSON file is wrong.')
|
|
368
|
+
# Note: The CPU utilization data may have an extra entry with op_id=-1
|
|
369
|
+
# Omit info for op_id=1
|
|
370
|
+
dict_opid_cpuutil = {
|
|
371
|
+
op["op_id"]: [op_sys + op_usr for op_sys, op_usr in
|
|
372
|
+
zip(op["metrics"]["sys_utilization"], op["metrics"]["user_utilization"])]
|
|
373
|
+
for op in cpu_op_info if op and op["op_id"] != -1
|
|
374
|
+
}
|
|
375
|
+
# Initialize oplist_avg_cpu_pct with -1 for each pipeline op, since
|
|
376
|
+
# CPU utilization data may not have information for each pipeline op
|
|
377
|
+
oplist_avg_cpu_pct = [-1] * len(dict_opid_cpuutil)
|
|
378
|
+
for op_id, cpu in dict_opid_cpuutil.items():
|
|
379
|
+
op_avg_cpu_pct = sum(cpu) / len(cpu) if cpu else 0
|
|
380
|
+
oplist_avg_cpu_pct[op_id] = round(op_avg_cpu_pct, 2)
|
|
381
|
+
|
|
382
|
+
return {'avg_cpu_pct': oplist_avg_cpu_pct}
|
|
383
|
+
|
|
384
|
+
@staticmethod
|
|
385
|
+
def _analyse_composite_info(summary_dict: Dict[str, Any]) -> Dict[str, List[float]]:
|
|
386
|
+
"""
|
|
387
|
+
Compute composite analysis information from the current summary pipeline data.
|
|
388
|
+
Args:
|
|
389
|
+
summary_dict (dict): Input summary pipeline information.
|
|
390
|
+
Returns:
|
|
391
|
+
dict: Average CPU utilization percentage per worker
|
|
392
|
+
"""
|
|
393
|
+
# Build list: average CPU utilization percentage per worker - for each op
|
|
394
|
+
avg_cpu_pct_per_worker = [
|
|
395
|
+
round(c / n if (n != 0 and c >= 0) else -1, 2)
|
|
396
|
+
for c, n in zip(summary_dict.get('avg_cpu_pct', []), summary_dict.get('num_workers', []))
|
|
397
|
+
]
|
|
398
|
+
return {'avg_cpu_pct_per_worker': avg_cpu_pct_per_worker}
|
|
399
|
+
|
|
400
|
+
@staticmethod
|
|
401
|
+
def _analyse_bottleneck_op(summary_dict: Dict[str, Any]) -> Dict[str, Any]:
|
|
402
|
+
"""
|
|
403
|
+
Calculate the bottleneck operation using the BottleneckCalculator.
|
|
404
|
+
Args:
|
|
405
|
+
summary_dict (dict): Summary dictionary containing pipeline information.
|
|
406
|
+
Returns:
|
|
407
|
+
Dictionary with the following information, if applicable:
|
|
408
|
+
- CPU utilization analysis
|
|
409
|
+
- queue utilization analysis
|
|
410
|
+
- bottleneck warning: Information on the bottleneck op
|
|
411
|
+
(This is returned only if a potential bottleneck is identified.)
|
|
412
|
+
- bottleneck suggestion: Reason why the subject op is it is identified as
|
|
413
|
+
a potential bottleneck, plus suggestion on how to resolve the bottleneck.
|
|
414
|
+
(This is returned only if a potential bottleneck is identified.)
|
|
415
|
+
"""
|
|
416
|
+
try:
|
|
417
|
+
bottleneck_analyzer = BottleneckAnalyzer(summary_dict)
|
|
418
|
+
return bottleneck_analyzer.analyze()
|
|
419
|
+
except IndexError:
|
|
420
|
+
return {}
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
class BottleneckAnalyzer:
|
|
424
|
+
""" analyzer for bottleneck """
|
|
425
|
+
|
|
426
|
+
# These are the threshold values used in the pipeline bottleneck analyzer algorithm
|
|
427
|
+
_THRESHOLDS = {
|
|
428
|
+
'_AVG_CPU_UTIL_PCT_PER_WORKER_MAXIMUM': 75.0,
|
|
429
|
+
'_AVG_CPU_UTIL_PCT_PER_WORKER_MINIMUM': 20.0,
|
|
430
|
+
'_LEAF_OUTPUT_QUEUE_EMPTY_FREQ_PCT_MAXIMUM': 50,
|
|
431
|
+
'_DEVICEQUEUE_INPUT_QUEUE_EMPTY_FREQ_PCT_MAXIMUM': 60,
|
|
432
|
+
'_IN_OUT_QUEUE_UTIL_PCT_DIFF_MAXIMUM': 50,
|
|
433
|
+
'_IN_QUEUE_UTIL_PCT_MAXIMUM': 10
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
_NON_MULTITHREADED_OPS = {
|
|
437
|
+
"Barrier", "Concat", "EpochCtrl", "Rename", "Repeat",
|
|
438
|
+
"Shuffle", "Skip", "Take", "Zip"
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
def __init__(self, summary_dict):
|
|
442
|
+
self.pipeline_ops = summary_dict["pipeline_ops"]
|
|
443
|
+
self.op_names = summary_dict["op_names"]
|
|
444
|
+
self.op_ids = summary_dict["op_ids"]
|
|
445
|
+
self.num_workers = summary_dict["num_workers"]
|
|
446
|
+
self.queue_average_size = summary_dict["queue_average_size"]
|
|
447
|
+
self.queue_utilization_pct = summary_dict["queue_utilization_pct"]
|
|
448
|
+
self.queue_empty_freq_pct = summary_dict["queue_empty_freq_pct"]
|
|
449
|
+
self.children_ids = summary_dict["children_ids"]
|
|
450
|
+
self.parent_id = summary_dict["parent_id"]
|
|
451
|
+
self.avg_cpu_pct = summary_dict["avg_cpu_pct"]
|
|
452
|
+
self.avg_cpu_pct_per_worker = summary_dict["avg_cpu_pct_per_worker"]
|
|
453
|
+
self.op_id_not_exist = -1
|
|
454
|
+
self.queue_usage_not_exist = -1
|
|
455
|
+
|
|
456
|
+
def analyze(self):
|
|
457
|
+
""" analyze all op's usage """
|
|
458
|
+
detailed_analysis = {}
|
|
459
|
+
cpu_analysis = self._analyze_cpu_usage()
|
|
460
|
+
queue_analysis = self._analyze_queue_usage()
|
|
461
|
+
|
|
462
|
+
if cpu_analysis:
|
|
463
|
+
detailed_analysis["cpu_analysis_details"] = cpu_analysis
|
|
464
|
+
if queue_analysis:
|
|
465
|
+
detailed_analysis["queue_analysis_details"] = queue_analysis
|
|
466
|
+
|
|
467
|
+
bottleneck, suggestion = self._analyze_bottleneck()
|
|
468
|
+
if bottleneck[0]:
|
|
469
|
+
detailed_analysis["bottleneck_warning"] = bottleneck
|
|
470
|
+
detailed_analysis["bottleneck_suggestion"] = suggestion
|
|
471
|
+
|
|
472
|
+
return detailed_analysis
|
|
473
|
+
|
|
474
|
+
def _analyze_cpu_usage(self):
|
|
475
|
+
""" analyze cpu usage of each op """
|
|
476
|
+
cpu_usage_analysis = []
|
|
477
|
+
for op_id in self.op_ids:
|
|
478
|
+
if op_id == self.op_id_not_exist or self.op_names[op_id] in self._NON_MULTITHREADED_OPS:
|
|
479
|
+
continue
|
|
480
|
+
|
|
481
|
+
cpu_pct = self.avg_cpu_pct_per_worker[op_id]
|
|
482
|
+
if cpu_pct > self._THRESHOLDS['_AVG_CPU_UTIL_PCT_PER_WORKER_MAXIMUM'] and self.op_names[op_id]:
|
|
483
|
+
cpu_usage_analysis.append(self._format_high_cpu_usage_suggestion(op_id, cpu_pct))
|
|
484
|
+
elif cpu_pct < self._THRESHOLDS['_AVG_CPU_UTIL_PCT_PER_WORKER_MINIMUM'] and self.num_workers[op_id] > 1:
|
|
485
|
+
cpu_usage_analysis.append(self._format_low_cpu_usage_suggestion(op_id, cpu_pct))
|
|
486
|
+
return cpu_usage_analysis
|
|
487
|
+
|
|
488
|
+
def _analyze_queue_usage(self):
|
|
489
|
+
""" analyze queue usage of each op """
|
|
490
|
+
queue_usage_analysis = []
|
|
491
|
+
for op_id in self.op_ids:
|
|
492
|
+
if op_id == self.op_id_not_exist or self.op_names[op_id] in self._NON_MULTITHREADED_OPS:
|
|
493
|
+
continue
|
|
494
|
+
if self.op_names[op_id] == "Batch":
|
|
495
|
+
continue
|
|
496
|
+
in_op_id, out_q = self._get_non_inline_child_recur(op_id), self.queue_utilization_pct[op_id]
|
|
497
|
+
# This is a leaf node since input queue does not exist and output queue exists
|
|
498
|
+
if in_op_id == self.op_id_not_exist and out_q != self.queue_usage_not_exist:
|
|
499
|
+
if out_q < self._THRESHOLDS['_LEAF_OUTPUT_QUEUE_EMPTY_FREQ_PCT_MAXIMUM']:
|
|
500
|
+
queue_usage_analysis.append(self._format_leaf_node_suggestion(op_id, out_q))
|
|
501
|
+
# This is device_queue op
|
|
502
|
+
elif self.op_names[op_id] == "DeviceQueue" and in_op_id != self.op_id_not_exist:
|
|
503
|
+
if (self.queue_empty_freq_pct[in_op_id] >
|
|
504
|
+
self._THRESHOLDS['_DEVICEQUEUE_INPUT_QUEUE_EMPTY_FREQ_PCT_MAXIMUM']):
|
|
505
|
+
queue_usage_analysis.append(self._format_device_queue_suggestion(op_id, in_op_id))
|
|
506
|
+
elif in_op_id != self.op_id_not_exist and out_q != self.queue_usage_not_exist:
|
|
507
|
+
in_q = self.queue_utilization_pct[in_op_id]
|
|
508
|
+
if (in_q != self.queue_usage_not_exist and
|
|
509
|
+
in_q - out_q > self._THRESHOLDS['_IN_OUT_QUEUE_UTIL_PCT_DIFF_MAXIMUM']):
|
|
510
|
+
queue_usage_analysis.append(self._format_internal_node_suggestion(op_id, in_op_id, out_q, in_q))
|
|
511
|
+
return queue_usage_analysis
|
|
512
|
+
|
|
513
|
+
def _analyze_bottleneck(self):
|
|
514
|
+
""" analyze bottleneck by using both cpu and queue usage """
|
|
515
|
+
bottleneck, suggestion = "", ""
|
|
516
|
+
for op_id in reversed(self.op_ids):
|
|
517
|
+
if self._should_skip_op(op_id):
|
|
518
|
+
continue
|
|
519
|
+
|
|
520
|
+
in_op_id, out_q = self._get_non_inline_child_recur(op_id), self.queue_utilization_pct[op_id]
|
|
521
|
+
wkr_cpu = self.avg_cpu_pct_per_worker[op_id]
|
|
522
|
+
|
|
523
|
+
if wkr_cpu > self._THRESHOLDS['_AVG_CPU_UTIL_PCT_PER_WORKER_MAXIMUM']:
|
|
524
|
+
bottleneck = self.pipeline_ops[op_id]
|
|
525
|
+
suggestion = self._format_high_cpu_usage_suggestion(op_id, wkr_cpu)
|
|
526
|
+
|
|
527
|
+
elif wkr_cpu < self._THRESHOLDS['_AVG_CPU_UTIL_PCT_PER_WORKER_MINIMUM']:
|
|
528
|
+
in_q_usage = self.queue_utilization_pct[in_op_id]
|
|
529
|
+
if in_op_id != self.op_id_not_exist and (in_q_usage < self._THRESHOLDS['_IN_QUEUE_UTIL_PCT_MAXIMUM']
|
|
530
|
+
or out_q - in_q_usage > self._THRESHOLDS[
|
|
531
|
+
'_IN_OUT_QUEUE_UTIL_PCT_DIFF_MAXIMUM']):
|
|
532
|
+
bottleneck = self.pipeline_ops[op_id]
|
|
533
|
+
suggestion = self._format_queue_bottleneck_suggestion(op_id)
|
|
534
|
+
|
|
535
|
+
return [bottleneck], [suggestion]
|
|
536
|
+
|
|
537
|
+
def _should_skip_op(self, op_id):
|
|
538
|
+
return (op_id == -1 or
|
|
539
|
+
self.op_names[op_id] in self._NON_MULTITHREADED_OPS or
|
|
540
|
+
self.op_names[op_id] == "DeviceQueue")
|
|
541
|
+
|
|
542
|
+
def _get_non_inline_child_recur(self, cur_op_id):
|
|
543
|
+
""" get the child id of cur op which isn't an inline op """
|
|
544
|
+
if cur_op_id == self.op_id_not_exist or not self.children_ids[cur_op_id]:
|
|
545
|
+
return self.op_id_not_exist
|
|
546
|
+
cur_child_id = self.children_ids[cur_op_id][0]
|
|
547
|
+
if self.queue_average_size[cur_child_id] != -1:
|
|
548
|
+
return cur_child_id
|
|
549
|
+
return self._get_non_inline_child_recur(cur_child_id)
|
|
550
|
+
|
|
551
|
+
def _format_high_cpu_usage_suggestion(self, op_id, cpu_pct):
|
|
552
|
+
return (f"{self.pipeline_ops[op_id]} is using {cpu_pct}% CPU per worker. "
|
|
553
|
+
f"Setting num_parallel_workers>{self.num_workers[op_id]} might bring extra performance.")
|
|
554
|
+
|
|
555
|
+
def _format_low_cpu_usage_suggestion(self, op_id, cpu_pct):
|
|
556
|
+
return (f"{self.pipeline_ops[op_id]} is using {cpu_pct}% CPU per worker. "
|
|
557
|
+
f"Using num_parallel_workers={self.num_workers[op_id]} might not bring as much benefit "
|
|
558
|
+
f"due to low CPU usage per worker.")
|
|
559
|
+
|
|
560
|
+
def _format_leaf_node_suggestion(self, op_id, out_q):
|
|
561
|
+
return (f"Leaf op {self.pipeline_ops[op_id]} is using {out_q}% of its output queue. "
|
|
562
|
+
f"Setting num_parallel_workers>{self.num_workers[op_id]} might speed up I/O.")
|
|
563
|
+
|
|
564
|
+
def _format_device_queue_suggestion(self, op_id, in_op_id):
|
|
565
|
+
return (f"{self.pipeline_ops[op_id]}'s input queue is empty "
|
|
566
|
+
f"{self.queue_empty_freq_pct[in_op_id]}% of the time. "
|
|
567
|
+
f"This might indicate dataset bottlenecks. Hence host cannot keep up with "
|
|
568
|
+
f"the device {self.queue_empty_freq_pct[in_op_id]}% of the time. "
|
|
569
|
+
f"Device waits whenever input queue is empty.")
|
|
570
|
+
|
|
571
|
+
def _format_internal_node_suggestion(self, op_id, in_op_id, out_q, in_q):
|
|
572
|
+
return (f"{self.pipeline_ops[op_id]}'s input queue usage={in_q}% is greater than output queue "
|
|
573
|
+
f"usage={out_q}%. This indicates child op {self.pipeline_ops[in_op_id]} "
|
|
574
|
+
f"might be producing faster than its parent {self.pipeline_ops[op_id]} can consume. "
|
|
575
|
+
f"If this op has low CPU utilization, try increasing "
|
|
576
|
+
f"prefetch_size or increasing num_workers.")
|
|
577
|
+
|
|
578
|
+
def _format_queue_bottleneck_suggestion(self, op_id):
|
|
579
|
+
return (f"{self.pipeline_ops[op_id]} has low CPU utilization per worker of "
|
|
580
|
+
f"{self.avg_cpu_pct_per_worker[op_id]}% and abnormal queue usage. "
|
|
581
|
+
f"Try increasing prefetch_size.")
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Copyright 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
|
+
"""Workflow management for parsers"""
|
|
16
|
+
from typing import Iterator, Optional
|
|
17
|
+
from mindspore.profiler.analysis.parser.base_parser import BaseParser
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class WorkFlow:
|
|
21
|
+
"""
|
|
22
|
+
Manages a chain of parsers.
|
|
23
|
+
"""
|
|
24
|
+
def __init__(self, head_parser: Optional[BaseParser] = None):
|
|
25
|
+
"""
|
|
26
|
+
Initialize WorkFlow with an optional head parser.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
head_parser (Optional[BaseParser]): The first parser in the chain.
|
|
30
|
+
"""
|
|
31
|
+
self.head_parser = head_parser
|
|
32
|
+
|
|
33
|
+
def add_parser(self, parser: BaseParser) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Add a parser to the end of the chain.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
parser (BaseParser): Parser to be added to the chain.
|
|
39
|
+
"""
|
|
40
|
+
if not self.head_parser:
|
|
41
|
+
self.head_parser = parser
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
current = self.head_parser
|
|
45
|
+
while current.next_parser:
|
|
46
|
+
current = current.next_parser
|
|
47
|
+
current.next_parser = parser
|
|
48
|
+
|
|
49
|
+
def __iter__(self) -> Iterator[BaseParser]:
|
|
50
|
+
"""
|
|
51
|
+
Iterate through the chain of parsers.
|
|
52
|
+
|
|
53
|
+
Yields:
|
|
54
|
+
BaseParser: Each parser in the chain.
|
|
55
|
+
"""
|
|
56
|
+
current = self.head_parser
|
|
57
|
+
while current:
|
|
58
|
+
yield current
|
|
59
|
+
current = current.next_parser
|
|
60
|
+
|
|
61
|
+
def __len__(self) -> int:
|
|
62
|
+
"""
|
|
63
|
+
Get the length of the parser chain.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
int: The number of parsers in the chain.
|
|
67
|
+
"""
|
|
68
|
+
length = 0
|
|
69
|
+
current = self.head_parser
|
|
70
|
+
while current:
|
|
71
|
+
length += 1
|
|
72
|
+
current = current.next_parser
|
|
73
|
+
return length
|