mindspore 2.4.10__cp39-cp39-win_amd64.whl → 2.5.0__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/Microsoft.VisualStudio.Telemetry.dll +0 -0
- mindspore/Newtonsoft.Json.dll +0 -0
- mindspore/__init__.py +8 -3
- 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/_checkparam.py +0 -5
- mindspore/_extends/parallel_compile/akg_compiler/gen_custom_op_files.py +1 -1
- mindspore/_extends/parse/compile_config.py +64 -0
- mindspore/_extends/parse/deprecated/__init__.py +0 -0
- mindspore/_extends/parse/deprecated/deprecated_tensor_method.py +375 -0
- mindspore/_extends/parse/parser.py +23 -5
- mindspore/_extends/parse/standard_method.py +123 -27
- mindspore/_extends/pijit/pijit_func_white_list.py +1 -1
- mindspore/amp.py +7 -1
- 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/boost_cell_wrapper.py +136 -41
- mindspore/c1.dll +0 -0
- mindspore/c1xx.dll +0 -0
- mindspore/c2.dll +0 -0
- mindspore/common/__init__.py +3 -1
- mindspore/common/_register_for_tensor.py +0 -1
- mindspore/common/_stub_tensor.py +25 -4
- mindspore/common/_tensor_cpp_method.py +17 -0
- mindspore/common/_tensor_docs.py +6132 -0
- mindspore/common/api.py +98 -21
- mindspore/common/dtype.py +34 -34
- mindspore/common/dump.py +2 -1
- mindspore/common/file_system.py +8 -3
- mindspore/common/generator.py +2 -0
- mindspore/common/hook_handle.py +3 -1
- mindspore/common/initializer.py +3 -4
- mindspore/common/lazy_inline.py +8 -2
- mindspore/common/mindir_util.py +10 -2
- mindspore/common/parameter.py +31 -15
- mindspore/common/tensor.py +713 -1337
- mindspore/communication/__init__.py +1 -1
- mindspore/communication/_comm_helper.py +5 -0
- mindspore/communication/comm_func.py +215 -173
- mindspore/communication/management.py +23 -20
- mindspore/context.py +285 -191
- mindspore/dataset/__init__.py +23 -19
- mindspore/dataset/callback/ds_callback.py +2 -1
- mindspore/dataset/core/config.py +84 -3
- mindspore/dataset/engine/cache_admin.py +3 -3
- mindspore/dataset/engine/cache_client.py +5 -4
- mindspore/dataset/engine/datasets.py +192 -149
- mindspore/dataset/engine/datasets_audio.py +14 -0
- mindspore/dataset/engine/datasets_standard_format.py +11 -11
- mindspore/dataset/engine/datasets_text.py +38 -1
- mindspore/dataset/engine/datasets_user_defined.py +100 -66
- mindspore/dataset/engine/datasets_vision.py +81 -8
- mindspore/dataset/engine/iterators.py +281 -63
- mindspore/dataset/engine/obs/util.py +8 -0
- mindspore/dataset/engine/queue.py +40 -0
- mindspore/dataset/engine/samplers.py +26 -2
- mindspore/dataset/engine/serializer_deserializer.py +1 -1
- mindspore/dataset/engine/validators.py +43 -11
- mindspore/dataset/transforms/py_transforms_util.py +17 -0
- mindspore/dataset/transforms/transforms.py +29 -12
- 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 +94 -0
- mindspore/device_context/ascend/op_precision.py +193 -0
- mindspore/device_context/ascend/op_tuning.py +127 -0
- mindspore/device_context/cpu/__init__.py +25 -0
- 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 +134 -0
- mindspore/dnnl.dll +0 -0
- mindspore/dpcmi.dll +0 -0
- 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/optim/adadelta.py +26 -22
- mindspore/experimental/optim/adam.py +3 -0
- mindspore/experimental/optim/lr_scheduler.py +33 -24
- mindspore/experimental/optim/radam.py +33 -30
- mindspore/hal/device.py +28 -0
- mindspore/hal/event.py +17 -0
- mindspore/hal/memory.py +94 -3
- mindspore/hal/stream.py +91 -6
- mindspore/include/api/context.h +0 -1
- mindspore/jpeg62.dll +0 -0
- mindspore/log.py +12 -0
- mindspore/mindrecord/__init__.py +1 -1
- 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.dll +0 -0
- mindspore/mindspore_common.dll +0 -0
- mindspore/mindspore_core.dll +0 -0
- mindspore/mindspore_glog.dll +0 -0
- mindspore/mindspore_ops.dll +0 -0
- mindspore/mint/__init__.py +824 -218
- mindspore/mint/distributed/__init__.py +66 -4
- mindspore/mint/distributed/distributed.py +2594 -44
- mindspore/mint/linalg/__init__.py +6 -0
- mindspore/mint/nn/__init__.py +473 -14
- mindspore/mint/nn/functional.py +486 -11
- mindspore/mint/nn/layer/__init__.py +17 -4
- mindspore/mint/nn/layer/_functions.py +330 -0
- mindspore/mint/nn/layer/activation.py +169 -1
- mindspore/mint/nn/layer/basic.py +123 -0
- mindspore/mint/nn/layer/conv.py +727 -0
- mindspore/mint/nn/layer/normalization.py +215 -19
- mindspore/mint/nn/layer/padding.py +797 -0
- mindspore/mint/nn/layer/pooling.py +170 -0
- mindspore/mint/optim/__init__.py +2 -1
- mindspore/mint/optim/adam.py +223 -0
- mindspore/mint/optim/adamw.py +26 -19
- 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/cell.py +126 -19
- mindspore/nn/dynamic_lr.py +2 -1
- mindspore/nn/layer/activation.py +6 -6
- mindspore/nn/layer/basic.py +35 -25
- mindspore/nn/layer/channel_shuffle.py +3 -3
- mindspore/nn/layer/embedding.py +3 -3
- mindspore/nn/layer/normalization.py +8 -7
- mindspore/nn/layer/padding.py +4 -3
- mindspore/nn/layer/pooling.py +47 -13
- 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 +48 -26
- mindspore/nn/learning_rate_schedule.py +5 -3
- mindspore/nn/loss/loss.py +31 -36
- mindspore/nn/optim/ada_grad.py +1 -0
- mindspore/nn/optim/adadelta.py +2 -2
- mindspore/nn/optim/adam.py +1 -1
- mindspore/nn/optim/lars.py +1 -4
- mindspore/nn/optim/optimizer.py +1 -1
- mindspore/nn/optim/rprop.py +2 -2
- mindspore/nn/optim/thor.py +2 -1
- mindspore/nn/utils/init.py +13 -11
- mindspore/nn/wrap/cell_wrapper.py +4 -6
- mindspore/nn/wrap/loss_scale.py +3 -4
- mindspore/numpy/array_creations.py +60 -62
- mindspore/numpy/array_ops.py +148 -143
- mindspore/numpy/logic_ops.py +41 -42
- mindspore/numpy/math_ops.py +361 -359
- mindspore/numpy/utils.py +16 -16
- mindspore/numpy/utils_const.py +4 -4
- mindspore/opencv_core452.dll +0 -0
- mindspore/opencv_imgcodecs452.dll +0 -0
- mindspore/opencv_imgproc452.dll +0 -0
- mindspore/ops/__init__.py +2 -1
- mindspore/ops/_grad_experimental/grad_comm_ops.py +94 -13
- mindspore/ops/_grad_experimental/grad_debug_ops.py +6 -1
- mindspore/ops/_grad_experimental/grad_inner_ops.py +9 -0
- mindspore/ops/_grad_experimental/grad_math_ops.py +2 -1
- mindspore/ops/_op_impl/cpu/__init__.py +1 -0
- mindspore/ops/_op_impl/cpu/raise_op.py +28 -0
- mindspore/ops/_vmap/vmap_array_ops.py +20 -19
- mindspore/ops/_vmap/vmap_base.py +0 -2
- mindspore/ops/_vmap/vmap_grad_nn_ops.py +19 -13
- mindspore/ops/_vmap/vmap_math_ops.py +11 -9
- mindspore/ops/_vmap/vmap_nn_ops.py +20 -34
- mindspore/ops/auto_generate/cpp_create_prim_instance_helper.py +149 -12
- mindspore/ops/auto_generate/gen_arg_handler.py +0 -61
- mindspore/ops/auto_generate/gen_extend_func.py +554 -60
- mindspore/ops/auto_generate/gen_ops_def.py +1621 -115
- mindspore/ops/auto_generate/gen_ops_prim.py +8024 -3409
- mindspore/ops/auto_generate/pyboost_inner_prim.py +183 -79
- mindspore/ops/composite/base.py +1 -1
- mindspore/ops/composite/multitype_ops/_compile_utils.py +229 -30
- mindspore/ops/composite/multitype_ops/pow_impl.py +0 -29
- mindspore/ops/function/__init__.py +12 -0
- mindspore/ops/function/array_func.py +561 -159
- mindspore/ops/function/clip_func.py +64 -0
- mindspore/ops/function/debug_func.py +28 -20
- mindspore/ops/function/image_func.py +1 -1
- mindspore/ops/function/linalg_func.py +5 -4
- mindspore/ops/function/math_func.py +1659 -290
- mindspore/ops/function/nn_func.py +988 -317
- mindspore/ops/function/parameter_func.py +3 -56
- mindspore/ops/function/random_func.py +243 -33
- mindspore/ops/function/sparse_unary_func.py +1 -1
- mindspore/ops/functional.py +18 -5
- mindspore/ops/functional_overload.py +897 -0
- mindspore/ops/operations/__init__.py +3 -2
- mindspore/ops/operations/_embedding_cache_ops.py +4 -4
- mindspore/ops/operations/_grad_ops.py +2 -34
- mindspore/ops/operations/_infer_ops.py +2 -1
- mindspore/ops/operations/_inner_ops.py +38 -8
- mindspore/ops/operations/array_ops.py +45 -303
- mindspore/ops/operations/comm_ops.py +19 -16
- mindspore/ops/operations/custom_ops.py +11 -55
- mindspore/ops/operations/debug_ops.py +42 -47
- mindspore/ops/operations/inner_ops.py +6 -4
- mindspore/ops/operations/linalg_ops.py +3 -2
- mindspore/ops/operations/manually_defined/ops_def.py +185 -104
- mindspore/ops/operations/math_ops.py +11 -216
- mindspore/ops/operations/nn_ops.py +146 -308
- mindspore/ops/primitive.py +23 -21
- mindspore/ops/tensor_method.py +1669 -0
- mindspore/ops_generate/aclnn_kernel_register_auto_cc_generator.py +110 -0
- mindspore/ops_generate/add_tensor_docs_generator.py +54 -0
- mindspore/ops_generate/arg_handler.py +0 -61
- mindspore/ops_generate/auto_grad_impl_cc_generator.py +135 -0
- mindspore/ops_generate/auto_grad_reg_cc_generator.py +93 -0
- mindspore/ops_generate/base_generator.py +11 -0
- mindspore/ops_generate/cpp_create_prim_instance_helper_generator.py +108 -0
- mindspore/ops_generate/functional_map_cpp_generator.py +491 -0
- mindspore/ops_generate/functional_overload_py_generator.py +110 -0
- mindspore/ops_generate/functions_cc_generator.py +233 -0
- mindspore/ops_generate/gen_aclnn_implement.py +110 -114
- mindspore/ops_generate/gen_constants.py +157 -3
- mindspore/ops_generate/gen_ops.py +245 -990
- mindspore/ops_generate/gen_pyboost_func.py +97 -998
- mindspore/ops_generate/gen_utils.py +119 -33
- mindspore/ops_generate/lite_ops_cpp_generator.py +155 -0
- mindspore/ops_generate/op_api_proto.py +206 -0
- mindspore/ops_generate/op_def_py_generator.py +131 -0
- mindspore/ops_generate/op_prim_py_generator.py +480 -0
- mindspore/ops_generate/op_proto.py +373 -108
- mindspore/ops_generate/op_template_parser.py +436 -0
- mindspore/ops_generate/ops_def_cc_generator.py +288 -0
- mindspore/ops_generate/ops_def_h_generator.py +74 -0
- mindspore/ops_generate/ops_name_h_generator.py +68 -0
- mindspore/ops_generate/ops_primitive_h_generator.py +81 -0
- mindspore/ops_generate/pyboost_functions_cpp_generator.py +370 -0
- mindspore/ops_generate/pyboost_functions_h_generator.py +68 -0
- mindspore/ops_generate/pyboost_functions_py_generator.py +148 -0
- mindspore/ops_generate/pyboost_grad_function_cpp_generator.py +154 -0
- mindspore/ops_generate/pyboost_inner_prim_generator.py +131 -0
- mindspore/ops_generate/pyboost_native_grad_functions_generator.py +268 -0
- mindspore/ops_generate/pyboost_op_cpp_code_generator.py +851 -0
- mindspore/ops_generate/pyboost_overload_functions_cpp_generator.py +344 -0
- mindspore/ops_generate/pyboost_utils.py +92 -33
- mindspore/ops_generate/template.py +294 -44
- mindspore/ops_generate/tensor_func_reg_cpp_generator.py +422 -0
- mindspore/parallel/__init__.py +3 -3
- mindspore/parallel/_auto_parallel_context.py +24 -33
- mindspore/parallel/_parallel_serialization.py +13 -2
- mindspore/parallel/_utils.py +4 -1
- mindspore/parallel/algo_parameter_config.py +1 -1
- mindspore/parallel/checkpoint_transform.py +44 -0
- mindspore/parallel/cluster/process_entity/_api.py +131 -37
- mindspore/parallel/cluster/process_entity/_utils.py +41 -6
- mindspore/parallel/cluster/run.py +20 -3
- mindspore/parallel/parameter_broadcast.py +1 -1
- mindspore/parallel/shard.py +3 -0
- mindspore/parallel/transform_safetensors.py +119 -253
- mindspore/pgodb140.dll +0 -0
- mindspore/pgort140.dll +0 -0
- mindspore/profiler/__init__.py +17 -4
- mindspore/profiler/analysis/__init__.py +0 -0
- mindspore/profiler/analysis/parser/__init__.py +0 -0
- mindspore/profiler/analysis/parser/ascend_cann_parser.py +166 -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 +261 -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 +84 -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 +260 -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 +333 -0
- mindspore/profiler/analysis/viewer/ascend_integrate_viewer.py +87 -0
- mindspore/profiler/analysis/viewer/ascend_kernel_details_viewer.py +252 -0
- mindspore/profiler/analysis/viewer/ascend_memory_viewer.py +313 -0
- mindspore/profiler/analysis/viewer/ascend_op_memory_viewer.py +322 -0
- mindspore/profiler/analysis/viewer/ascend_step_trace_time_viewer.py +265 -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 +97 -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 +138 -0
- mindspore/profiler/common/command_executor.py +90 -0
- mindspore/profiler/common/constant.py +174 -3
- mindspore/profiler/common/file_manager.py +208 -0
- mindspore/profiler/common/log.py +130 -0
- mindspore/profiler/common/msprof_cmd_tool.py +202 -0
- mindspore/profiler/common/path_manager.py +371 -0
- mindspore/profiler/common/process_bar.py +168 -0
- mindspore/profiler/common/process_pool.py +9 -3
- mindspore/profiler/common/profiler_context.py +476 -0
- mindspore/profiler/common/profiler_info.py +304 -0
- mindspore/profiler/common/profiler_output_path.py +284 -0
- mindspore/profiler/common/profiler_parameters.py +210 -0
- mindspore/profiler/common/profiler_path_manager.py +120 -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 +270 -37
- mindspore/profiler/envprofiler.py +138 -0
- mindspore/profiler/mstx.py +199 -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 +309 -0
- mindspore/profiler/profiler.py +580 -93
- mindspore/profiler/profiler_action_controller.py +187 -0
- mindspore/profiler/profiler_interface.py +114 -0
- mindspore/profiler/schedule.py +208 -0
- mindspore/rewrite/api/symbol_tree.py +1 -2
- mindspore/run_check/_check_version.py +2 -6
- mindspore/runtime/__init__.py +37 -0
- mindspore/runtime/device.py +27 -0
- mindspore/runtime/event.py +209 -0
- mindspore/runtime/executor.py +148 -0
- mindspore/runtime/memory.py +392 -0
- mindspore/runtime/stream.py +460 -0
- mindspore/runtime/thread_bind_core.py +401 -0
- 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 +2 -2
- mindspore/train/_utils.py +53 -18
- mindspore/train/amp.py +8 -4
- mindspore/train/callback/_checkpoint.py +32 -18
- mindspore/train/callback/_early_stop.py +1 -1
- mindspore/train/callback/_flops_collector.py +105 -69
- mindspore/train/callback/_history.py +1 -1
- mindspore/train/callback/_summary_collector.py +44 -6
- mindspore/train/callback/_tft_register.py +31 -10
- mindspore/train/dataset_helper.py +11 -11
- mindspore/train/metrics/precision.py +4 -5
- mindspore/train/mind_ir_pb2.py +167 -46
- mindspore/train/model.py +13 -15
- mindspore/train/serialization.py +462 -76
- mindspore/train/summary/summary_record.py +1 -2
- mindspore/train/train_thor/model_thor.py +1 -1
- mindspore/turbojpeg.dll +0 -0
- mindspore/utils/__init__.py +4 -2
- mindspore/utils/dryrun.py +138 -0
- mindspore/utils/runtime_execution_order_check.py +550 -0
- 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.5.0.dist-info}/METADATA +2 -3
- {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/RECORD +385 -261
- {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/entry_points.txt +1 -1
- mindspore/common/_tensor_overload.py +0 -139
- mindspore/mindspore_np_dtype.dll +0 -0
- mindspore/profiler/envprofiling.py +0 -254
- mindspore/profiler/profiling.py +0 -1926
- {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/WHEEL +0 -0
- {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,322 @@
|
|
|
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
|
+
"""Ascend op memory viewer"""
|
|
16
|
+
import os
|
|
17
|
+
import struct
|
|
18
|
+
from collections import defaultdict
|
|
19
|
+
from enum import Enum
|
|
20
|
+
from typing import Any, Dict, List
|
|
21
|
+
from abc import ABC
|
|
22
|
+
|
|
23
|
+
from mindspore.profiler.parser.ascend_analysis.tlv_decoder import TLVDecoder
|
|
24
|
+
from mindspore.profiler.common.file_manager import FileManager
|
|
25
|
+
from mindspore.profiler.common.log import ProfilerLogger
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class OpMemoryIndexEnum(Enum):
|
|
29
|
+
"""Op memory index defining."""
|
|
30
|
+
|
|
31
|
+
DEVICE_ID = 0
|
|
32
|
+
TID = 1
|
|
33
|
+
PID = 2
|
|
34
|
+
CREATE_AT = 3
|
|
35
|
+
ADDR = 4
|
|
36
|
+
SIZE = 5
|
|
37
|
+
USED_SIZE = 6
|
|
38
|
+
PEAK_SIZE = 7
|
|
39
|
+
ALLOC_SIZE = 8
|
|
40
|
+
USED_BY_EVENT_SZIE = 9
|
|
41
|
+
EAGER_FREE_SIZE = 10
|
|
42
|
+
STEAM_PTR = 11
|
|
43
|
+
STREAM_ID = 12
|
|
44
|
+
FROM_PERSISTENT = 13
|
|
45
|
+
IS_PERSISTENT = 14
|
|
46
|
+
RUN_MODE = 15
|
|
47
|
+
ALLOC_TYPE = 16
|
|
48
|
+
OWNER = 17
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class BaseEvent(ABC):
|
|
52
|
+
"""Base class for all event types."""
|
|
53
|
+
|
|
54
|
+
def __init__(self, data: Dict):
|
|
55
|
+
if not isinstance(data, dict):
|
|
56
|
+
raise TypeError("Input data must be dict.")
|
|
57
|
+
self._origin_data = data
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class OpMemoryEvent(BaseEvent):
|
|
61
|
+
"""Op memory event."""
|
|
62
|
+
|
|
63
|
+
FIX_DATA_FORMAT = "<i11QI4B"
|
|
64
|
+
FIX_DATA_SIZE = struct.calcsize(FIX_DATA_FORMAT)
|
|
65
|
+
FREE_VALUE = 18446744073709551615 # 2^64 - 1
|
|
66
|
+
NAME_KEY = 3
|
|
67
|
+
|
|
68
|
+
def __init__(self, data: Dict):
|
|
69
|
+
super().__init__(data)
|
|
70
|
+
self.fix_size_data = struct.unpack(
|
|
71
|
+
self.FIX_DATA_FORMAT, self._origin_data.get("fix_size_bytes")
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def device_id(self):
|
|
76
|
+
"""Get device id."""
|
|
77
|
+
return self.fix_size_data[OpMemoryIndexEnum.DEVICE_ID.value]
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def tid(self):
|
|
81
|
+
"""Get tid."""
|
|
82
|
+
return self.fix_size_data[OpMemoryIndexEnum.TID.value]
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def pid(self):
|
|
86
|
+
"""Get pid."""
|
|
87
|
+
return self.fix_size_data[OpMemoryIndexEnum.PID.value]
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def create_at(self):
|
|
91
|
+
"""Get create at."""
|
|
92
|
+
return self.fix_size_data[OpMemoryIndexEnum.CREATE_AT.value]
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def addr(self):
|
|
96
|
+
"""Get addr."""
|
|
97
|
+
return self.fix_size_data[OpMemoryIndexEnum.ADDR.value]
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def size(self):
|
|
101
|
+
"""Get size."""
|
|
102
|
+
return self.fix_size_data[OpMemoryIndexEnum.SIZE.value]
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def used_size(self):
|
|
106
|
+
"""Get used size."""
|
|
107
|
+
return self.fix_size_data[OpMemoryIndexEnum.USED_SIZE.value]
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def peak_size(self):
|
|
111
|
+
"""Get peak size."""
|
|
112
|
+
return self.fix_size_data[OpMemoryIndexEnum.PEAK_SIZE.value]
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def alloc_size(self):
|
|
116
|
+
"""Get alloc size."""
|
|
117
|
+
return self.fix_size_data[OpMemoryIndexEnum.ALLOC_SIZE.value]
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def used_by_event_size(self):
|
|
121
|
+
"""Get used by event size."""
|
|
122
|
+
return self.fix_size_data[OpMemoryIndexEnum.USED_BY_EVENT_SZIE.value]
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def eager_free_size(self):
|
|
126
|
+
"""Get eager free size."""
|
|
127
|
+
return self.fix_size_data[OpMemoryIndexEnum.EAGER_FREE_SIZE.value]
|
|
128
|
+
|
|
129
|
+
@property
|
|
130
|
+
def stream_ptr(self):
|
|
131
|
+
"""Get stream ptr."""
|
|
132
|
+
return self.fix_size_data[OpMemoryIndexEnum.STEAM_PTR.value]
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def stream_id(self):
|
|
136
|
+
"""Get stream id."""
|
|
137
|
+
return self.fix_size_data[OpMemoryIndexEnum.STREAM_ID.value]
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def from_persistent(self):
|
|
141
|
+
"""Get from persistent."""
|
|
142
|
+
return self.fix_size_data[OpMemoryIndexEnum.FROM_PERSISTENT.value]
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def is_persistent(self):
|
|
146
|
+
"""Get is persistent."""
|
|
147
|
+
return self.fix_size_data[OpMemoryIndexEnum.IS_PERSISTENT.value]
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def run_mode(self):
|
|
151
|
+
"""Get run mode."""
|
|
152
|
+
return self.fix_size_data[OpMemoryIndexEnum.RUN_MODE.value]
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def alloc_type(self):
|
|
156
|
+
"""Get alloc type."""
|
|
157
|
+
return self.fix_size_data[OpMemoryIndexEnum.ALLOC_TYPE.value]
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def owner(self):
|
|
161
|
+
"""Get owner."""
|
|
162
|
+
return self._origin_data.get(self.NAME_KEY, "")
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
def is_alloc(self):
|
|
166
|
+
"""Get is alloc."""
|
|
167
|
+
return self.size != self.FREE_VALUE
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class AscendOpMemoryViewer:
|
|
171
|
+
"""
|
|
172
|
+
Ascend op memory viewer.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
FWK_BINARY_FILE_NAME = "mindspore.memory_usage"
|
|
176
|
+
OUTPUT_FILE_NAME = "operator_memory.csv"
|
|
177
|
+
HEADERS = [
|
|
178
|
+
"Name",
|
|
179
|
+
"Size(KB)",
|
|
180
|
+
"Allocation Time(us)",
|
|
181
|
+
"Release Time(us)",
|
|
182
|
+
"Active Release Time(us)",
|
|
183
|
+
"Duration(us)",
|
|
184
|
+
"Active Duration(us)",
|
|
185
|
+
"Allocation Total Allocated(MB)",
|
|
186
|
+
"Allocation Total Reserved(MB)",
|
|
187
|
+
"Allocation Total Active(MB)",
|
|
188
|
+
"Release Total Allocated(MB)",
|
|
189
|
+
"Release Total Reserved(MB)",
|
|
190
|
+
"Release Total Active(MB)",
|
|
191
|
+
"Stream Ptr",
|
|
192
|
+
"Device Type",
|
|
193
|
+
]
|
|
194
|
+
DEVICE_TYPE_FMT = "NPU:{}"
|
|
195
|
+
NS_TO_US = 1024
|
|
196
|
+
BYTES_TO_KB = 1024
|
|
197
|
+
BYTES_TO_MB = 1024 * 1024
|
|
198
|
+
EMPTY_VALUE = "N/A"
|
|
199
|
+
ALLOC_TIME_INDEX = 2
|
|
200
|
+
|
|
201
|
+
def __init__(self, **kwargs):
|
|
202
|
+
self._enable_profile_memory = kwargs.get("profile_memory", False)
|
|
203
|
+
self._framework_path = kwargs.get("framework_path")
|
|
204
|
+
self._ascend_profiler_output_path = kwargs.get("ascend_profiler_output_path")
|
|
205
|
+
self._ascend_ms_dir = kwargs.get("ascend_ms_dir")
|
|
206
|
+
ProfilerLogger.init(self._ascend_ms_dir)
|
|
207
|
+
self._logger = ProfilerLogger.get_instance()
|
|
208
|
+
self._op_memory_events = None
|
|
209
|
+
self._op_memory_data = []
|
|
210
|
+
self._addr_to_event_map = defaultdict(list)
|
|
211
|
+
|
|
212
|
+
def save(self, data: Any = None):
|
|
213
|
+
"""
|
|
214
|
+
Save step trace time data to csv file
|
|
215
|
+
"""
|
|
216
|
+
self._logger.info("AscendOpMemoryViewer start")
|
|
217
|
+
if not self._enable_profile_memory:
|
|
218
|
+
return
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
self._read_fwk_binary_file()
|
|
222
|
+
self._calculate_op_memory_data()
|
|
223
|
+
self._write_data()
|
|
224
|
+
except Exception as e: # pylint: disable=W0703
|
|
225
|
+
self._logger.error("Failed to save op memory data: %s", str(e), exc_info=True)
|
|
226
|
+
self._logger.info("AscendOpMemoryViewer end")
|
|
227
|
+
|
|
228
|
+
def _read_fwk_binary_file(self):
|
|
229
|
+
"""
|
|
230
|
+
Read fwk binary file
|
|
231
|
+
"""
|
|
232
|
+
self._logger.info("Read fwk binary file start")
|
|
233
|
+
op_name_file_path = os.path.join(self._framework_path, self.FWK_BINARY_FILE_NAME)
|
|
234
|
+
raw_bin_data = FileManager.read_file_content(op_name_file_path, mode="rb")
|
|
235
|
+
self._op_memory_events = TLVDecoder.decode(
|
|
236
|
+
raw_bin_data, OpMemoryEvent, OpMemoryEvent.FIX_DATA_SIZE
|
|
237
|
+
)
|
|
238
|
+
self._op_memory_events = sorted(self._op_memory_events, key=lambda x: x.create_at)
|
|
239
|
+
self._logger.info("Read fwk binary file done, %d events", len(self._op_memory_events))
|
|
240
|
+
|
|
241
|
+
def _calculate_op_memory_data(self):
|
|
242
|
+
"""
|
|
243
|
+
Calculate op memory data
|
|
244
|
+
"""
|
|
245
|
+
self._logger.info("Calculate op memory data start")
|
|
246
|
+
if not self._op_memory_events:
|
|
247
|
+
self._logger.info("No op memory events")
|
|
248
|
+
return
|
|
249
|
+
|
|
250
|
+
for event in self._op_memory_events:
|
|
251
|
+
self._addr_to_event_map[event.addr].append(event)
|
|
252
|
+
|
|
253
|
+
for _, event_list in self._addr_to_event_map.items():
|
|
254
|
+
row_data_list = self._get_op_mem_row_data(event_list)
|
|
255
|
+
self._op_memory_data.extend(row_data_list)
|
|
256
|
+
|
|
257
|
+
self._op_memory_data = sorted(self._op_memory_data, key=lambda x: x[self.ALLOC_TIME_INDEX])
|
|
258
|
+
self._logger.info("Calculate op memory data done")
|
|
259
|
+
|
|
260
|
+
def _combine_alloc_and_free_event(self, alloc_event: OpMemoryEvent, free_event=None):
|
|
261
|
+
"""
|
|
262
|
+
Combine alloc and free event
|
|
263
|
+
"""
|
|
264
|
+
if not alloc_event:
|
|
265
|
+
self._logger.error("Alloc event is None")
|
|
266
|
+
return []
|
|
267
|
+
|
|
268
|
+
return [
|
|
269
|
+
alloc_event.owner, # "Name"
|
|
270
|
+
alloc_event.size / self.BYTES_TO_KB, # "Size(KB)"
|
|
271
|
+
alloc_event.create_at / self.NS_TO_US, # "Allocation Time(us)"
|
|
272
|
+
self.EMPTY_VALUE if free_event is None else free_event.create_at / self.NS_TO_US, # "Release Time(us)"
|
|
273
|
+
self.EMPTY_VALUE, # "Active Release Time(us)"
|
|
274
|
+
self.EMPTY_VALUE if free_event is None else (free_event.create_at - alloc_event.create_at) / self.NS_TO_US, # "Duration(us)"
|
|
275
|
+
self.EMPTY_VALUE, # "Active Duration(us)"
|
|
276
|
+
alloc_event.alloc_size / self.BYTES_TO_MB, # "Allocation Total Allocated(MB)"
|
|
277
|
+
alloc_event.used_size / self.BYTES_TO_MB, # "Allocation Total Reserved(MB)"
|
|
278
|
+
alloc_event.alloc_size / self.BYTES_TO_MB, # "Allocation Total Active(MB)"
|
|
279
|
+
self.EMPTY_VALUE if free_event is None else free_event.alloc_size / self.BYTES_TO_MB, # "Release Total Allocated(MB)"
|
|
280
|
+
self.EMPTY_VALUE if free_event is None else free_event.used_size / self.BYTES_TO_MB, # "Release Total Reserved(MB)"
|
|
281
|
+
self.EMPTY_VALUE if free_event is None else free_event.alloc_size / self.BYTES_TO_MB, # "Release Total Active(MB)"
|
|
282
|
+
alloc_event.stream_ptr, # "Stream Ptr"
|
|
283
|
+
self.DEVICE_TYPE_FMT.format(alloc_event.device_id), # "Device Type"
|
|
284
|
+
]
|
|
285
|
+
|
|
286
|
+
def _get_op_mem_row_data(self, event_list: List[OpMemoryEvent]):
|
|
287
|
+
"""
|
|
288
|
+
Get op memory row data
|
|
289
|
+
"""
|
|
290
|
+
res = []
|
|
291
|
+
|
|
292
|
+
if not event_list:
|
|
293
|
+
self._logger.error("Event list length is less than 1")
|
|
294
|
+
return res
|
|
295
|
+
|
|
296
|
+
start_index = 0 if event_list[0].is_alloc else 1
|
|
297
|
+
alloc_event, free_event = None, None
|
|
298
|
+
for event in event_list[start_index:]:
|
|
299
|
+
if event.is_alloc:
|
|
300
|
+
alloc_event = event
|
|
301
|
+
else:
|
|
302
|
+
free_event = event
|
|
303
|
+
|
|
304
|
+
if alloc_event and free_event:
|
|
305
|
+
res.append(self._combine_alloc_and_free_event(alloc_event, free_event))
|
|
306
|
+
alloc_event, free_event = None, None
|
|
307
|
+
elif alloc_event is None and free_event:
|
|
308
|
+
self._logger.error("Alloc event is None, but free event is not None")
|
|
309
|
+
|
|
310
|
+
if alloc_event:
|
|
311
|
+
res.append(self._combine_alloc_and_free_event(alloc_event))
|
|
312
|
+
|
|
313
|
+
return res
|
|
314
|
+
|
|
315
|
+
def _write_data(self):
|
|
316
|
+
"""
|
|
317
|
+
Write data to csv file
|
|
318
|
+
"""
|
|
319
|
+
self._logger.info("Write data to csv file start")
|
|
320
|
+
save_path = os.path.join(self._ascend_profiler_output_path, self.OUTPUT_FILE_NAME)
|
|
321
|
+
FileManager.create_csv_file(save_path, self._op_memory_data, self.HEADERS)
|
|
322
|
+
self._logger.info("Write data to csv file done, %d rows, save path: %s", len(self._op_memory_data), save_path)
|
|
@@ -0,0 +1,265 @@
|
|
|
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
|
+
"""Ascend Step Trace Time Viewer"""
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
from decimal import Decimal
|
|
19
|
+
from enum import Enum
|
|
20
|
+
from typing import List, Any, Tuple
|
|
21
|
+
|
|
22
|
+
import numpy as np
|
|
23
|
+
|
|
24
|
+
from mindspore import log as logger
|
|
25
|
+
from mindspore.profiler.analysis.viewer.base_viewer import BaseViewer
|
|
26
|
+
from mindspore.profiler.common.file_manager import FileManager
|
|
27
|
+
from mindspore.profiler.common.constant import TimelineLayerName, OverlapAnalysisTidName, ProfilerLevel
|
|
28
|
+
from mindspore.profiler.analysis.parser.timeline_event.msprof_event import (
|
|
29
|
+
MsprofCompleteEvent,
|
|
30
|
+
)
|
|
31
|
+
from mindspore.profiler.analysis.parser.timeline_event.timeline_event_pool import (
|
|
32
|
+
TimelineEventPool,
|
|
33
|
+
)
|
|
34
|
+
from mindspore.profiler.analysis.parser.timeline_assembly_factory.trace_view_container import (
|
|
35
|
+
TraceViewContainer,
|
|
36
|
+
)
|
|
37
|
+
from mindspore.profiler.common.log import ProfilerLogger
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class StepTraceTimeHeaders(Enum):
|
|
41
|
+
"""Step trace time headers"""
|
|
42
|
+
STEP = "Step"
|
|
43
|
+
COMPUTING = "Computing"
|
|
44
|
+
COMMUNICATION_NOT_OVERLAPPED = "Communication(Not Overlapped)"
|
|
45
|
+
OVERLAPPED = "Overlapped"
|
|
46
|
+
COMMUNICATION = "Communication"
|
|
47
|
+
FREE = "Free"
|
|
48
|
+
STAGE = "Stage"
|
|
49
|
+
BUBBLE = "Bubble"
|
|
50
|
+
COMMUNICATION_NOT_OVERLAPPED_EXCLUDE_RECEIVE = "Communication(Not Overlapped and Exclude Receive)"
|
|
51
|
+
PREPARING = "Preparing"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class AscendStepTraceTimeViewer(BaseViewer):
|
|
55
|
+
"""Ascend Step Trace Time Viewer"""
|
|
56
|
+
|
|
57
|
+
STEP_TRACE_TIME_FILE_NAME = "step_trace_time.csv"
|
|
58
|
+
STEP_TRACE_TIME_HEADERS = [header.value for header in StepTraceTimeHeaders]
|
|
59
|
+
|
|
60
|
+
# HCCL Send, Recv op pattern
|
|
61
|
+
PP_OP_PATTERN = (
|
|
62
|
+
# eg: hcom_BatchSendRecv__101_0_1
|
|
63
|
+
re.compile(r"hcom_\w+SendRecv__\d+"),
|
|
64
|
+
# eg: hcom_send__101_0_1
|
|
65
|
+
re.compile(r"hcom_send__\d+"),
|
|
66
|
+
# eg: hcom_receive__101_0_1
|
|
67
|
+
re.compile(r"hcom_receive__\d+"),
|
|
68
|
+
re.compile(r"Receive-op"),
|
|
69
|
+
re.compile(r"Send-op"),
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# numpy array dtype
|
|
73
|
+
OVERLAP_DTYPE = np.dtype([("ts", object), ("dur", object)])
|
|
74
|
+
HCCL_DTYPE = np.dtype([("name", object), ("ts", object), ("dur", object)])
|
|
75
|
+
|
|
76
|
+
def __init__(self, **kwargs):
|
|
77
|
+
super().__init__()
|
|
78
|
+
self._save_path = os.path.join(
|
|
79
|
+
kwargs.get("ascend_profiler_output_path"), self.STEP_TRACE_TIME_FILE_NAME
|
|
80
|
+
)
|
|
81
|
+
self._profiler_level = kwargs.get("profiler_level")
|
|
82
|
+
self._ascend_ms_dir = kwargs.get("ascend_ms_dir")
|
|
83
|
+
ProfilerLogger.init(self._ascend_ms_dir)
|
|
84
|
+
self._logger = ProfilerLogger.get_instance()
|
|
85
|
+
self.step_trace_time_data = {}
|
|
86
|
+
self.trace_container: TraceViewContainer = None
|
|
87
|
+
self.hccl_pool: TimelineEventPool = None
|
|
88
|
+
self.overlap_pool: TimelineEventPool = None
|
|
89
|
+
# HCCL events
|
|
90
|
+
self.hccl_events: List[MsprofCompleteEvent] = None
|
|
91
|
+
# Overlap analysis events
|
|
92
|
+
self.computing_events: List[MsprofCompleteEvent] = None
|
|
93
|
+
self.communication_events: List[MsprofCompleteEvent] = None
|
|
94
|
+
self.communication_not_overlapped_events: List[MsprofCompleteEvent] = None
|
|
95
|
+
self.free_events: List[MsprofCompleteEvent] = None
|
|
96
|
+
# Overlap analysis numpy array
|
|
97
|
+
self.computing_np: np.ndarray = None
|
|
98
|
+
self.communication_np: np.ndarray = None
|
|
99
|
+
self.communication_not_overlapped_np: np.ndarray = None
|
|
100
|
+
self.free_np: np.ndarray = None
|
|
101
|
+
# HCCL numpy array
|
|
102
|
+
self.hccl_events_np: np.ndarray = None
|
|
103
|
+
|
|
104
|
+
def save(self, data: Any):
|
|
105
|
+
"""
|
|
106
|
+
Save step trace time data to csv file
|
|
107
|
+
"""
|
|
108
|
+
self._logger.info("AscendStepTraceTimeViewer start")
|
|
109
|
+
if self._profiler_level == ProfilerLevel.LevelNone.value:
|
|
110
|
+
return
|
|
111
|
+
try:
|
|
112
|
+
self._check_input_data(data)
|
|
113
|
+
self._convert_events_to_numpy()
|
|
114
|
+
self._calculate_step_trace_time()
|
|
115
|
+
self._write_data()
|
|
116
|
+
except Exception as e: # pylint: disable=W0703
|
|
117
|
+
self._logger.error("Failed to save step trace time data, error: %s", str(e), exc_info=True)
|
|
118
|
+
self._logger.info("AscendStepTraceTimeViewer end")
|
|
119
|
+
|
|
120
|
+
def _write_data(self):
|
|
121
|
+
"""
|
|
122
|
+
Write step trace time data to csv file
|
|
123
|
+
"""
|
|
124
|
+
self._logger.info("Write step trace time data start")
|
|
125
|
+
data = [[str(self.step_trace_time_data.get(header, "")) for header in self.STEP_TRACE_TIME_HEADERS]]
|
|
126
|
+
FileManager.create_csv_file(
|
|
127
|
+
self._save_path,
|
|
128
|
+
data,
|
|
129
|
+
self.STEP_TRACE_TIME_HEADERS,
|
|
130
|
+
)
|
|
131
|
+
self._logger.info("Write step trace time data done, %d rows saved, save path: %s", len(data), self._save_path)
|
|
132
|
+
|
|
133
|
+
def _check_input_data(self, data: Any):
|
|
134
|
+
"""
|
|
135
|
+
Check input data and initialize data
|
|
136
|
+
"""
|
|
137
|
+
self.trace_container: TraceViewContainer = data.get(
|
|
138
|
+
"trace_view_container", None
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
if self.trace_container is None:
|
|
142
|
+
raise ValueError("trace is empty")
|
|
143
|
+
|
|
144
|
+
self.overlap_pool: TimelineEventPool = self.trace_container.get_pool_by_name(
|
|
145
|
+
TimelineLayerName.OVERLAP_ANALYSIS.value
|
|
146
|
+
)
|
|
147
|
+
self.hccl_pool: TimelineEventPool = self.trace_container.get_pool_by_name(
|
|
148
|
+
TimelineLayerName.HCCL.value
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
if self.overlap_pool is None:
|
|
152
|
+
raise ValueError("overlap pool is empty")
|
|
153
|
+
|
|
154
|
+
self.computing_events: List[MsprofCompleteEvent] = (
|
|
155
|
+
self.overlap_pool.get_events_by_name(OverlapAnalysisTidName.COMPUTING.value)
|
|
156
|
+
)
|
|
157
|
+
self.communication_events: List[MsprofCompleteEvent] = (
|
|
158
|
+
self.overlap_pool.get_events_by_name(
|
|
159
|
+
OverlapAnalysisTidName.COMMUNICATION.value
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
self.communication_not_overlapped_events: List[MsprofCompleteEvent] = (
|
|
163
|
+
self.overlap_pool.get_events_by_name(
|
|
164
|
+
OverlapAnalysisTidName.COMMUNICATION_NOT_OVERLAP.value
|
|
165
|
+
)
|
|
166
|
+
)
|
|
167
|
+
self.free_events: List[MsprofCompleteEvent] = (
|
|
168
|
+
self.overlap_pool.get_events_by_name(OverlapAnalysisTidName.FREE.value)
|
|
169
|
+
)
|
|
170
|
+
if self.hccl_pool is not None:
|
|
171
|
+
self.hccl_events: List[MsprofCompleteEvent] = (
|
|
172
|
+
self.hccl_pool.get_complete_events()
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
def _convert_overlap_events_to_numpy(
|
|
176
|
+
self, events: List[MsprofCompleteEvent], dtype
|
|
177
|
+
):
|
|
178
|
+
"""
|
|
179
|
+
Convert overlap events to numpy array
|
|
180
|
+
"""
|
|
181
|
+
return np.array([(event.ts, event.dur) for event in events], dtype=dtype)
|
|
182
|
+
|
|
183
|
+
def _convert_events_to_numpy(self):
|
|
184
|
+
"""
|
|
185
|
+
Convert events to numpy array
|
|
186
|
+
"""
|
|
187
|
+
self.computing_np = self._convert_overlap_events_to_numpy(
|
|
188
|
+
self.computing_events, self.OVERLAP_DTYPE
|
|
189
|
+
)
|
|
190
|
+
self.communication_np = self._convert_overlap_events_to_numpy(
|
|
191
|
+
self.communication_events, self.OVERLAP_DTYPE
|
|
192
|
+
)
|
|
193
|
+
self.communication_not_overlapped_np = self._convert_overlap_events_to_numpy(
|
|
194
|
+
self.communication_not_overlapped_events, self.OVERLAP_DTYPE
|
|
195
|
+
)
|
|
196
|
+
self.free_np = self._convert_overlap_events_to_numpy(
|
|
197
|
+
self.free_events, self.OVERLAP_DTYPE
|
|
198
|
+
)
|
|
199
|
+
self.computing_np = np.sort(self.computing_np, order="ts")
|
|
200
|
+
self.communication_np = np.sort(self.communication_np, order="ts")
|
|
201
|
+
self.communication_not_overlapped_np = np.sort(
|
|
202
|
+
self.communication_not_overlapped_np, order="ts"
|
|
203
|
+
)
|
|
204
|
+
self.free_np = np.sort(self.free_np, order="ts")
|
|
205
|
+
|
|
206
|
+
if self.hccl_events is not None:
|
|
207
|
+
self.hccl_events_np = np.array(
|
|
208
|
+
[(event.name, event.ts, event.dur) for event in self.hccl_events],
|
|
209
|
+
dtype=self.HCCL_DTYPE,
|
|
210
|
+
)
|
|
211
|
+
self.hccl_events_np = np.sort(self.hccl_events_np, order="ts")
|
|
212
|
+
|
|
213
|
+
def _calculate_step_trace_time(self):
|
|
214
|
+
"""
|
|
215
|
+
Calculate step trace time data
|
|
216
|
+
"""
|
|
217
|
+
self.step_trace_time_data[StepTraceTimeHeaders.STEP.value] = "0"
|
|
218
|
+
self.step_trace_time_data[StepTraceTimeHeaders.COMPUTING.value] = np.sum(self.computing_np["dur"])
|
|
219
|
+
self.step_trace_time_data[StepTraceTimeHeaders.COMMUNICATION.value] = np.sum(self.communication_np["dur"])
|
|
220
|
+
self.step_trace_time_data[StepTraceTimeHeaders.COMMUNICATION_NOT_OVERLAPPED.value] = np.sum(
|
|
221
|
+
self.communication_not_overlapped_np["dur"]
|
|
222
|
+
)
|
|
223
|
+
self.step_trace_time_data[StepTraceTimeHeaders.OVERLAPPED.value] = (
|
|
224
|
+
self.step_trace_time_data[StepTraceTimeHeaders.COMMUNICATION.value]
|
|
225
|
+
- self.step_trace_time_data[StepTraceTimeHeaders.COMMUNICATION_NOT_OVERLAPPED.value]
|
|
226
|
+
)
|
|
227
|
+
self.step_trace_time_data[StepTraceTimeHeaders.FREE.value] = np.sum(self.free_np["dur"])
|
|
228
|
+
(
|
|
229
|
+
self.step_trace_time_data[StepTraceTimeHeaders.STAGE.value],
|
|
230
|
+
self.step_trace_time_data[StepTraceTimeHeaders.BUBBLE.value],
|
|
231
|
+
) = self._calculate_stage_bubble()
|
|
232
|
+
|
|
233
|
+
self.step_trace_time_data[StepTraceTimeHeaders.COMMUNICATION_NOT_OVERLAPPED_EXCLUDE_RECEIVE.value] = (
|
|
234
|
+
self.step_trace_time_data[StepTraceTimeHeaders.COMMUNICATION_NOT_OVERLAPPED.value]
|
|
235
|
+
- self.step_trace_time_data[StepTraceTimeHeaders.BUBBLE.value]
|
|
236
|
+
)
|
|
237
|
+
self.step_trace_time_data[StepTraceTimeHeaders.PREPARING.value] = "0"
|
|
238
|
+
|
|
239
|
+
def _calculate_stage_bubble(self) -> Tuple[Decimal, Decimal]:
|
|
240
|
+
"""
|
|
241
|
+
Calculate stage and bubble time
|
|
242
|
+
"""
|
|
243
|
+
if self.hccl_events is None:
|
|
244
|
+
logger.info("HCCL events is empty, skip calculate stage and bubble")
|
|
245
|
+
return Decimal(0), Decimal(0)
|
|
246
|
+
|
|
247
|
+
total_hccl_time = self.hccl_events_np["ts"][-1] - self.hccl_events_np["ts"][0]
|
|
248
|
+
bubble_time = np.sum(
|
|
249
|
+
self.hccl_events_np["dur"][
|
|
250
|
+
np.array(
|
|
251
|
+
[
|
|
252
|
+
self._is_send_recv_op(name)
|
|
253
|
+
for name in self.hccl_events_np["name"]
|
|
254
|
+
]
|
|
255
|
+
)
|
|
256
|
+
]
|
|
257
|
+
)
|
|
258
|
+
stage_time = total_hccl_time - bubble_time
|
|
259
|
+
return stage_time, bubble_time
|
|
260
|
+
|
|
261
|
+
def _is_send_recv_op(self, op_name: str) -> bool:
|
|
262
|
+
"""
|
|
263
|
+
Check if the op is a send or recv op
|
|
264
|
+
"""
|
|
265
|
+
return any(pattern.match(op_name) for pattern in self.PP_OP_PATTERN)
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
"""ascend timeline viewer"""
|
|
16
|
+
import os
|
|
17
|
+
from typing import List, Dict
|
|
18
|
+
|
|
19
|
+
from mindspore.profiler.analysis.viewer.base_viewer import BaseViewer
|
|
20
|
+
from mindspore.profiler.common.file_manager import FileManager
|
|
21
|
+
from mindspore.profiler.common.log import ProfilerLogger
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AscendTimelineViewer(BaseViewer):
|
|
25
|
+
"""Ascend Timeline Viewer for analyzing and saving timeline data."""
|
|
26
|
+
|
|
27
|
+
_TRACE_VIEW_FILE_NAME = 'trace_view.json'
|
|
28
|
+
|
|
29
|
+
def __init__(self, **kwargs):
|
|
30
|
+
"""Initialize the AscendTimelineViewer."""
|
|
31
|
+
super().__init__()
|
|
32
|
+
self._save_path = os.path.join(
|
|
33
|
+
kwargs.get("ascend_profiler_output_path"),
|
|
34
|
+
self._TRACE_VIEW_FILE_NAME
|
|
35
|
+
)
|
|
36
|
+
self._ascend_ms_dir = kwargs.get("ascend_ms_dir")
|
|
37
|
+
ProfilerLogger.init(self._ascend_ms_dir)
|
|
38
|
+
self._logger = ProfilerLogger.get_instance()
|
|
39
|
+
|
|
40
|
+
def save(self, data: Dict) -> None:
|
|
41
|
+
"""Get the input data and save the timeline data."""
|
|
42
|
+
self._logger.info("AscendTimelineViewer start")
|
|
43
|
+
try:
|
|
44
|
+
trace_view_container = data.get("trace_view_container", None)
|
|
45
|
+
if not trace_view_container:
|
|
46
|
+
raise RuntimeError("The trace view container is None, Failed to save trace_view.json.")
|
|
47
|
+
trace_view_data = trace_view_container.get_trace_view()
|
|
48
|
+
self._save_data(trace_view_data)
|
|
49
|
+
self._logger.info("Trace viewer save trace_view.json done")
|
|
50
|
+
except Exception as e: # pylint: disable=W0703
|
|
51
|
+
self._logger.error("Failed to save trace_view.json: %s", e, exc_info=True)
|
|
52
|
+
self._logger.info("AscendTimelineViewer end")
|
|
53
|
+
|
|
54
|
+
def _save_data(self, timeline_data: List[Dict]) -> None:
|
|
55
|
+
"""Save the timeline data to a JSON file."""
|
|
56
|
+
self._logger.info("Trace view saved start")
|
|
57
|
+
FileManager.create_json_file(self._save_path, timeline_data)
|
|
58
|
+
self._logger.info("Trace view saved done, save path: %s", self._save_path)
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
"""BaseViewer class"""
|
|
16
|
+
from abc import ABC, abstractmethod
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class BaseViewer(ABC):
|
|
21
|
+
def __init__(self):
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
@abstractmethod
|
|
25
|
+
def save(self, data: Any):
|
|
26
|
+
raise NotImplementedError("Subclasses should implement this!")
|