mindspore 2.4.10__cp311-cp311-win_amd64.whl → 2.6.0rc1__cp311-cp311-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.cp311-win_amd64.pyd +0 -0
- mindspore/_c_expression.cp311-win_amd64.pyd +0 -0
- mindspore/_c_mindrecord.cp311-win_amd64.pyd +0 -0
- mindspore/_check_jit_forbidden_api.py +3 -0
- mindspore/_checkparam.py +3 -38
- mindspore/_deprecated/__init__.py +17 -0
- mindspore/_deprecated/jit.py +198 -0
- mindspore/_extends/builtin_operations.py +1 -1
- mindspore/_extends/parallel_compile/akg_compiler/gen_custom_op_files.py +1 -1
- mindspore/_extends/parse/__init__.py +6 -7
- mindspore/_extends/parse/compile_config.py +83 -0
- mindspore/_extends/parse/deprecated/__init__.py +0 -0
- mindspore/_extends/parse/deprecated/deprecated_tensor_method.py +394 -0
- mindspore/_extends/parse/jit_fallback_modules/__init__.py +0 -0
- mindspore/_extends/parse/jit_fallback_modules/check_utils.py +123 -0
- mindspore/_extends/parse/jit_fallback_modules/third_party_modules.py +50 -0
- mindspore/_extends/parse/parser.py +46 -197
- mindspore/_extends/parse/resources.py +1 -5
- mindspore/_extends/parse/standard_method.py +217 -98
- mindspore/_extends/pijit/__init__.py +2 -2
- mindspore/_extends/pijit/pijit_func_white_list.py +17 -12
- mindspore/_extends/pijit/tensor_func_list.py +27 -0
- mindspore/_extends/utils.py +1 -1
- mindspore/amp.py +11 -5
- mindspore/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 +435 -371
- mindspore/common/auto_dynamic_shape.py +41 -44
- mindspore/common/dtype.py +39 -36
- mindspore/common/dump.py +9 -6
- mindspore/common/file_system.py +9 -1
- mindspore/common/generator.py +2 -0
- mindspore/common/hook_handle.py +6 -2
- mindspore/common/initializer.py +13 -10
- mindspore/common/jit_begin_end.py +94 -0
- mindspore/common/jit_config.py +6 -1
- mindspore/common/jit_context.py +76 -0
- mindspore/common/jit_trace.py +378 -0
- mindspore/common/lazy_inline.py +9 -3
- mindspore/common/mindir_util.py +10 -2
- mindspore/common/mutable.py +5 -4
- mindspore/common/parameter.py +135 -52
- mindspore/common/seed.py +2 -2
- mindspore/common/sparse_tensor.py +23 -17
- mindspore/common/tensor.py +951 -1992
- mindspore/communication/__init__.py +7 -5
- mindspore/communication/_comm_helper.py +52 -2
- mindspore/communication/comm_func.py +240 -181
- mindspore/communication/management.py +95 -26
- mindspore/context.py +314 -566
- mindspore/dataset/__init__.py +65 -37
- mindspore/dataset/audio/__init__.py +2 -8
- mindspore/dataset/audio/transforms.py +3 -17
- mindspore/dataset/callback/ds_callback.py +2 -1
- mindspore/dataset/core/config.py +87 -6
- mindspore/dataset/engine/cache_admin.py +3 -3
- mindspore/dataset/engine/cache_client.py +6 -5
- mindspore/dataset/engine/datasets.py +292 -267
- mindspore/dataset/engine/datasets_audio.py +22 -8
- mindspore/dataset/engine/datasets_standard_format.py +46 -27
- mindspore/dataset/engine/datasets_text.py +78 -48
- mindspore/dataset/engine/datasets_user_defined.py +182 -116
- mindspore/dataset/engine/datasets_vision.py +120 -44
- mindspore/dataset/engine/iterators.py +283 -63
- mindspore/dataset/engine/obs/obs_mindrecord_dataset.py +1 -1
- mindspore/dataset/engine/obs/util.py +8 -0
- mindspore/dataset/engine/queue.py +40 -0
- mindspore/dataset/engine/samplers.py +289 -43
- mindspore/dataset/engine/serializer_deserializer.py +3 -2
- mindspore/dataset/engine/validators.py +53 -11
- mindspore/dataset/text/__init__.py +7 -6
- mindspore/dataset/text/transforms.py +6 -5
- mindspore/dataset/text/utils.py +3 -3
- mindspore/dataset/transforms/__init__.py +0 -9
- mindspore/dataset/transforms/py_transforms_util.py +17 -0
- mindspore/dataset/transforms/transforms.py +31 -14
- mindspore/dataset/utils/browse_dataset.py +1 -1
- mindspore/dataset/vision/__init__.py +2 -9
- mindspore/dataset/vision/transforms.py +202 -158
- mindspore/dataset/vision/utils.py +7 -5
- mindspore/dataset/vision/validators.py +1 -2
- mindspore/device_context/__init__.py +21 -0
- mindspore/device_context/ascend/__init__.py +25 -0
- mindspore/device_context/ascend/device.py +72 -0
- mindspore/device_context/ascend/op_debug.py +153 -0
- mindspore/device_context/ascend/op_precision.py +193 -0
- mindspore/device_context/ascend/op_tuning.py +123 -0
- mindspore/{ops_generate/gen_constants.py → device_context/cpu/__init__.py} +6 -17
- mindspore/device_context/cpu/device.py +62 -0
- mindspore/device_context/cpu/op_tuning.py +43 -0
- mindspore/device_context/gpu/__init__.py +21 -0
- mindspore/device_context/gpu/device.py +70 -0
- mindspore/device_context/gpu/op_precision.py +67 -0
- mindspore/device_context/gpu/op_tuning.py +175 -0
- mindspore/device_manager.py +170 -0
- mindspore/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 +211 -0
- mindspore/experimental/llm_boost/ascend_native/llm_boost.py +52 -0
- mindspore/experimental/llm_boost/atb/boost_base.py +2 -3
- mindspore/experimental/llm_boost/atb/llama_boost.py +6 -1
- mindspore/experimental/llm_boost/register.py +1 -0
- mindspore/experimental/map_parameter.py +4 -4
- mindspore/experimental/optim/adadelta.py +6 -6
- mindspore/experimental/optim/adagrad.py +4 -4
- mindspore/experimental/optim/adam.py +7 -0
- mindspore/experimental/optim/adamax.py +4 -4
- mindspore/experimental/optim/adamw.py +4 -0
- mindspore/experimental/optim/asgd.py +1 -1
- mindspore/experimental/optim/lr_scheduler.py +73 -46
- mindspore/experimental/optim/radam.py +34 -31
- mindspore/experimental/optim/rprop.py +1 -1
- mindspore/experimental/optim/sgd.py +1 -1
- mindspore/hal/contiguous_tensors_handle.py +6 -10
- mindspore/hal/device.py +55 -53
- mindspore/hal/event.py +52 -52
- mindspore/hal/memory.py +157 -117
- mindspore/hal/stream.py +150 -109
- mindspore/include/api/context.h +0 -1
- mindspore/include/dataset/constants.h +7 -4
- mindspore/include/dataset/execute.h +2 -2
- mindspore/jpeg62.dll +0 -0
- mindspore/log.py +50 -0
- mindspore/mindrecord/__init__.py +21 -8
- mindspore/mindrecord/config.py +17 -316
- mindspore/mindrecord/filereader.py +1 -9
- mindspore/mindrecord/filewriter.py +5 -15
- mindspore/mindrecord/mindpage.py +1 -9
- mindspore/mindspore_backend_common.dll +0 -0
- mindspore/mindspore_backend_manager.dll +0 -0
- mindspore/mindspore_common.dll +0 -0
- mindspore/mindspore_core.dll +0 -0
- mindspore/mindspore_dump.dll +0 -0
- mindspore/mindspore_frontend.dll +0 -0
- mindspore/mindspore_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 +796 -759
- mindspore/mint/distributed/__init__.py +70 -4
- mindspore/mint/distributed/distributed.py +2679 -44
- mindspore/mint/linalg/__init__.py +8 -0
- mindspore/mint/nn/__init__.py +743 -22
- mindspore/mint/nn/functional.py +716 -23
- mindspore/mint/nn/layer/__init__.py +21 -4
- mindspore/mint/nn/layer/_functions.py +334 -0
- mindspore/mint/nn/layer/activation.py +276 -1
- mindspore/mint/nn/layer/basic.py +123 -0
- mindspore/mint/nn/layer/conv.py +921 -0
- mindspore/mint/nn/layer/normalization.py +223 -28
- mindspore/mint/nn/layer/padding.py +797 -0
- mindspore/mint/nn/layer/pooling.py +235 -0
- mindspore/mint/optim/__init__.py +3 -1
- mindspore/mint/optim/adam.py +223 -0
- mindspore/mint/optim/adamw.py +26 -19
- mindspore/mint/optim/sgd.py +171 -0
- mindspore/mint/special/__init__.py +2 -1
- mindspore/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 +1370 -189
- mindspore/nn/dynamic_lr.py +2 -1
- mindspore/nn/layer/activation.py +29 -27
- mindspore/nn/layer/basic.py +51 -35
- mindspore/nn/layer/channel_shuffle.py +3 -3
- mindspore/nn/layer/container.py +1 -1
- mindspore/nn/layer/conv.py +22 -17
- mindspore/nn/layer/embedding.py +12 -11
- mindspore/nn/layer/normalization.py +56 -49
- mindspore/nn/layer/padding.py +4 -3
- mindspore/nn/layer/pooling.py +120 -42
- mindspore/nn/layer/rnn_cells.py +1 -1
- mindspore/nn/layer/rnns.py +2 -1
- mindspore/nn/layer/timedistributed.py +5 -5
- mindspore/nn/layer/transformer.py +59 -36
- mindspore/nn/learning_rate_schedule.py +8 -4
- mindspore/nn/loss/loss.py +58 -55
- mindspore/nn/optim/ada_grad.py +7 -5
- mindspore/nn/optim/adadelta.py +11 -9
- mindspore/nn/optim/adafactor.py +1 -1
- mindspore/nn/optim/adam.py +17 -13
- mindspore/nn/optim/adamax.py +8 -7
- mindspore/nn/optim/adasum.py +5 -5
- mindspore/nn/optim/asgd.py +1 -1
- mindspore/nn/optim/ftrl.py +11 -9
- mindspore/nn/optim/lamb.py +1 -1
- mindspore/nn/optim/lars.py +1 -4
- mindspore/nn/optim/lazyadam.py +12 -10
- mindspore/nn/optim/momentum.py +7 -6
- mindspore/nn/optim/optimizer.py +3 -3
- mindspore/nn/optim/proximal_ada_grad.py +12 -10
- mindspore/nn/optim/rmsprop.py +13 -12
- mindspore/nn/optim/rprop.py +11 -9
- mindspore/nn/optim/sgd.py +9 -6
- mindspore/nn/optim/tft_wrapper.py +5 -2
- mindspore/nn/optim/thor.py +2 -1
- mindspore/nn/probability/bijector/bijector.py +17 -11
- mindspore/nn/probability/bijector/gumbel_cdf.py +5 -5
- mindspore/nn/probability/bijector/invert.py +2 -2
- mindspore/nn/probability/bijector/scalar_affine.py +3 -3
- mindspore/nn/probability/bijector/softplus.py +3 -2
- mindspore/nn/probability/distribution/beta.py +3 -3
- mindspore/nn/probability/distribution/categorical.py +1 -1
- mindspore/nn/probability/distribution/cauchy.py +4 -2
- mindspore/nn/probability/distribution/exponential.py +6 -7
- mindspore/nn/probability/distribution/gamma.py +2 -2
- mindspore/nn/probability/distribution/gumbel.py +2 -2
- mindspore/nn/probability/distribution/half_normal.py +5 -3
- mindspore/nn/probability/distribution/logistic.py +5 -3
- mindspore/nn/probability/distribution/poisson.py +1 -1
- mindspore/nn/probability/distribution/uniform.py +5 -3
- mindspore/nn/reinforcement/_tensors_queue.py +1 -1
- mindspore/nn/reinforcement/tensor_array.py +1 -1
- mindspore/nn/utils/init.py +13 -11
- mindspore/nn/wrap/__init__.py +6 -6
- mindspore/nn/wrap/cell_wrapper.py +181 -122
- mindspore/nn/wrap/grad_reducer.py +45 -36
- mindspore/nn/wrap/loss_scale.py +6 -7
- mindspore/numpy/array_creations.py +63 -65
- mindspore/numpy/array_ops.py +149 -144
- mindspore/numpy/logic_ops.py +41 -42
- mindspore/numpy/math_ops.py +365 -363
- mindspore/numpy/utils.py +17 -18
- mindspore/numpy/utils_const.py +5 -6
- mindspore/opencv_core452.dll +0 -0
- mindspore/opencv_imgcodecs452.dll +0 -0
- mindspore/opencv_imgproc452.dll +0 -0
- mindspore/ops/__init__.py +5 -3
- mindspore/ops/_grad_experimental/grad_comm_ops.py +112 -16
- mindspore/ops/_grad_experimental/grad_debug_ops.py +14 -2
- mindspore/ops/_grad_experimental/grad_inner_ops.py +9 -0
- mindspore/ops/_grad_experimental/grad_math_ops.py +2 -1
- mindspore/ops/_grad_experimental/taylor_rule.py +29 -0
- mindspore/ops/_op_impl/cpu/__init__.py +1 -0
- mindspore/ops/_op_impl/cpu/raise_op.py +28 -0
- mindspore/ops/_register_for_op.py +0 -11
- mindspore/{ops_generate → ops/_utils}/arg_dtype_cast.py +123 -4
- mindspore/{ops_generate → ops/_utils}/arg_handler.py +3 -65
- mindspore/ops/_vmap/vmap_array_ops.py +27 -25
- mindspore/ops/_vmap/vmap_base.py +0 -2
- mindspore/ops/_vmap/vmap_grad_nn_ops.py +21 -14
- mindspore/ops/_vmap/vmap_math_ops.py +15 -16
- mindspore/ops/_vmap/vmap_nn_ops.py +29 -42
- mindspore/ops/auto_generate/__init__.py +4 -3
- mindspore/ops/auto_generate/cpp_create_prim_instance_helper.py +236 -46
- mindspore/ops/auto_generate/gen_extend_func.py +764 -124
- mindspore/ops/auto_generate/gen_ops_def.py +4018 -2264
- mindspore/ops/auto_generate/gen_ops_prim.py +15463 -5037
- mindspore/ops/auto_generate/pyboost_inner_prim.py +221 -87
- mindspore/ops/composite/__init__.py +2 -1
- mindspore/ops/composite/base.py +20 -25
- mindspore/ops/composite/math_ops.py +6 -16
- mindspore/ops/composite/multitype_ops/__init__.py +5 -2
- mindspore/ops/composite/multitype_ops/_compile_utils.py +228 -30
- mindspore/ops/composite/multitype_ops/_constexpr_utils.py +1 -2
- mindspore/ops/composite/multitype_ops/add_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/bitwise_and_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/bitwise_or_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/bitwise_xor_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/div_impl.py +6 -4
- mindspore/ops/composite/multitype_ops/equal_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/floordiv_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/getitem_impl.py +3 -2
- mindspore/ops/composite/multitype_ops/greater_equal_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/greater_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/in_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/invert_impl.py +50 -0
- mindspore/ops/composite/multitype_ops/left_shift_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/less_equal_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/less_impl.py +4 -3
- mindspore/ops/composite/multitype_ops/logic_not_impl.py +3 -2
- mindspore/ops/composite/multitype_ops/logical_and_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/logical_or_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/mod_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/mul_impl.py +3 -2
- mindspore/ops/composite/multitype_ops/negative_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/not_equal_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/not_in_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/ones_like_impl.py +18 -0
- mindspore/ops/composite/multitype_ops/pow_impl.py +2 -30
- mindspore/ops/composite/multitype_ops/right_shift_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/setitem_impl.py +2 -1
- mindspore/ops/composite/multitype_ops/sub_impl.py +2 -1
- mindspore/ops/function/__init__.py +40 -2
- mindspore/ops/function/_add_attr_func.py +58 -0
- mindspore/ops/function/array_func.py +2089 -2403
- mindspore/ops/function/clip_func.py +80 -23
- mindspore/ops/function/debug_func.py +57 -57
- mindspore/ops/function/grad/__init__.py +1 -0
- mindspore/ops/function/grad/grad_func.py +104 -71
- mindspore/ops/function/image_func.py +2 -2
- mindspore/ops/function/linalg_func.py +47 -78
- mindspore/ops/function/math_func.py +4501 -3802
- mindspore/ops/function/nn_func.py +1726 -620
- mindspore/ops/function/other_func.py +159 -1
- mindspore/ops/function/parameter_func.py +18 -84
- mindspore/ops/function/random_func.py +440 -387
- mindspore/ops/function/reshard_func.py +4 -70
- mindspore/ops/function/sparse_func.py +3 -3
- mindspore/ops/function/sparse_unary_func.py +6 -6
- mindspore/ops/function/spectral_func.py +25 -58
- mindspore/ops/function/vmap_func.py +24 -17
- mindspore/ops/functional.py +22 -7
- mindspore/ops/functional_overload.py +1440 -0
- mindspore/ops/op_info_register.py +32 -244
- mindspore/ops/operations/__init__.py +13 -7
- mindspore/ops/operations/_custom_ops_utils.py +247 -0
- mindspore/ops/operations/_embedding_cache_ops.py +4 -4
- mindspore/ops/operations/_grad_ops.py +2 -43
- mindspore/ops/operations/_infer_ops.py +2 -1
- mindspore/ops/operations/_inner_ops.py +43 -84
- mindspore/ops/operations/_ms_kernel.py +4 -10
- mindspore/ops/operations/_rl_inner_ops.py +1 -1
- mindspore/ops/operations/_scalar_ops.py +3 -2
- mindspore/ops/operations/_sequence_ops.py +1 -1
- mindspore/ops/operations/_tensor_array.py +1 -1
- mindspore/ops/operations/array_ops.py +81 -324
- mindspore/ops/operations/comm_ops.py +154 -108
- mindspore/ops/operations/custom_ops.py +232 -78
- mindspore/ops/operations/debug_ops.py +153 -59
- mindspore/ops/operations/inner_ops.py +7 -5
- mindspore/ops/operations/linalg_ops.py +1 -57
- mindspore/ops/operations/manually_defined/_inner.py +1 -1
- mindspore/ops/operations/manually_defined/ops_def.py +928 -180
- mindspore/ops/operations/math_ops.py +32 -234
- mindspore/ops/operations/nn_ops.py +210 -498
- mindspore/ops/operations/other_ops.py +62 -9
- mindspore/ops/operations/random_ops.py +13 -7
- mindspore/ops/operations/reshard_ops.py +1 -1
- mindspore/ops/operations/sparse_ops.py +2 -2
- mindspore/ops/primitive.py +66 -53
- mindspore/ops/tensor_method.py +1888 -0
- mindspore/ops_generate/__init__.py +0 -5
- mindspore/ops_generate/aclnn/__init__.py +0 -0
- mindspore/ops_generate/aclnn/aclnn_kernel_register_auto_cc_generator.py +135 -0
- mindspore/ops_generate/aclnn/gen_aclnn_implement.py +257 -0
- mindspore/ops_generate/api/__init__.py +0 -0
- mindspore/ops_generate/api/add_tensor_docs_generator.py +56 -0
- mindspore/ops_generate/api/cpp_create_prim_instance_helper_generator.py +105 -0
- mindspore/ops_generate/api/functional_map_cpp_generator.py +504 -0
- mindspore/ops_generate/api/functional_overload_py_generator.py +112 -0
- mindspore/ops_generate/api/functions_cc_generator.py +237 -0
- mindspore/ops_generate/api/gen_api.py +103 -0
- mindspore/ops_generate/api/op_api_proto.py +235 -0
- mindspore/ops_generate/api/tensor_func_reg_cpp_generator.py +461 -0
- mindspore/ops_generate/common/__init__.py +0 -0
- mindspore/ops_generate/common/base_generator.py +11 -0
- mindspore/ops_generate/common/gen_constants.py +91 -0
- mindspore/ops_generate/common/gen_utils.py +348 -0
- mindspore/ops_generate/common/op_proto.py +473 -0
- mindspore/ops_generate/common/template.py +523 -0
- mindspore/ops_generate/gen_ops.py +22 -1069
- mindspore/ops_generate/op_def/__init__.py +0 -0
- mindspore/ops_generate/op_def/gen_op_def.py +90 -0
- mindspore/ops_generate/op_def/lite_ops_cpp_generator.py +191 -0
- mindspore/ops_generate/op_def/ops_def_cc_generator.py +299 -0
- mindspore/ops_generate/op_def/ops_def_h_generator.py +74 -0
- mindspore/ops_generate/op_def/ops_name_h_generator.py +83 -0
- mindspore/ops_generate/op_def/ops_primitive_h_generator.py +125 -0
- mindspore/ops_generate/op_def_py/__init__.py +0 -0
- mindspore/ops_generate/op_def_py/gen_op_def_py.py +47 -0
- mindspore/ops_generate/op_def_py/op_def_py_generator.py +132 -0
- mindspore/ops_generate/op_def_py/op_prim_py_generator.py +489 -0
- mindspore/ops_generate/pyboost/__init__.py +0 -0
- mindspore/ops_generate/pyboost/auto_grad_impl_cc_generator.py +139 -0
- mindspore/ops_generate/pyboost/auto_grad_reg_cc_generator.py +93 -0
- mindspore/ops_generate/pyboost/gen_pyboost_func.py +175 -0
- mindspore/ops_generate/pyboost/op_template_parser.py +517 -0
- mindspore/ops_generate/pyboost/pyboost_functions_cpp_generator.py +407 -0
- mindspore/ops_generate/pyboost/pyboost_functions_h_generator.py +100 -0
- mindspore/ops_generate/pyboost/pyboost_functions_py_generator.py +148 -0
- mindspore/ops_generate/pyboost/pyboost_grad_function_cpp_generator.py +155 -0
- mindspore/ops_generate/pyboost/pyboost_inner_prim_generator.py +132 -0
- mindspore/ops_generate/pyboost/pyboost_native_grad_functions_generator.py +272 -0
- mindspore/ops_generate/pyboost/pyboost_op_cpp_code_generator.py +938 -0
- mindspore/ops_generate/pyboost/pyboost_overload_functions_cpp_generator.py +357 -0
- mindspore/ops_generate/{pyboost_utils.py → pyboost/pyboost_utils.py} +179 -36
- mindspore/ops_generate/resources/__init__.py +0 -0
- mindspore/ops_generate/resources/resource_list.py +30 -0
- mindspore/ops_generate/resources/resource_loader.py +36 -0
- mindspore/ops_generate/resources/resource_manager.py +64 -0
- mindspore/ops_generate/resources/yaml_loader.py +88 -0
- mindspore/ops_generate/tensor_py_cc_generator.py +122 -0
- mindspore/parallel/__init__.py +7 -3
- mindspore/parallel/_auto_parallel_context.py +152 -34
- mindspore/parallel/_cell_wrapper.py +130 -15
- mindspore/parallel/_parallel_serialization.py +107 -5
- mindspore/parallel/_ps_context.py +1 -1
- mindspore/parallel/_recovery_context.py +7 -2
- mindspore/parallel/_tensor.py +142 -18
- mindspore/parallel/_utils.py +199 -23
- mindspore/parallel/algo_parameter_config.py +4 -4
- mindspore/parallel/auto_parallel.py +732 -0
- mindspore/parallel/checkpoint_convert.py +159 -0
- mindspore/parallel/checkpoint_transform.py +698 -35
- mindspore/parallel/cluster/process_entity/_api.py +276 -50
- mindspore/parallel/cluster/process_entity/_utils.py +41 -6
- mindspore/parallel/cluster/run.py +21 -4
- mindspore/parallel/function/__init__.py +24 -0
- mindspore/parallel/function/reshard_func.py +259 -0
- mindspore/parallel/nn/__init__.py +25 -0
- mindspore/parallel/nn/parallel_cell_wrapper.py +263 -0
- mindspore/parallel/nn/parallel_grad_reducer.py +169 -0
- mindspore/parallel/parameter_broadcast.py +25 -14
- mindspore/parallel/shard.py +137 -58
- mindspore/parallel/transform_safetensors.py +363 -305
- mindspore/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 +106 -0
- mindspore/profiler/analysis/parser/timeline_creator/__init__.py +0 -0
- mindspore/profiler/analysis/parser/timeline_creator/base_timeline_creator.py +44 -0
- mindspore/profiler/analysis/parser/timeline_creator/cpu_op_timeline_creator.py +90 -0
- mindspore/profiler/analysis/parser/timeline_creator/fwk_timeline_creator.py +76 -0
- mindspore/profiler/analysis/parser/timeline_creator/msprof_timeline_creator.py +103 -0
- mindspore/profiler/analysis/parser/timeline_creator/scope_layer_timeline_creator.py +134 -0
- mindspore/profiler/analysis/parser/timeline_event/__init__.py +0 -0
- mindspore/profiler/analysis/parser/timeline_event/base_event.py +233 -0
- mindspore/profiler/analysis/parser/timeline_event/cpu_op_event.py +47 -0
- mindspore/profiler/analysis/parser/timeline_event/flow_event.py +36 -0
- mindspore/profiler/analysis/parser/timeline_event/fwk_event.py +415 -0
- mindspore/profiler/analysis/parser/timeline_event/msprof_event.py +73 -0
- mindspore/profiler/analysis/parser/timeline_event/scope_layer_event.py +53 -0
- mindspore/profiler/analysis/parser/timeline_event/timeline_event_pool.py +146 -0
- mindspore/profiler/analysis/task_manager.py +131 -0
- mindspore/profiler/analysis/time_converter.py +84 -0
- mindspore/profiler/analysis/viewer/__init__.py +0 -0
- mindspore/profiler/analysis/viewer/ascend_communication_viewer.py +372 -0
- mindspore/profiler/analysis/viewer/ascend_integrate_viewer.py +87 -0
- mindspore/profiler/analysis/viewer/ascend_kernel_details_viewer.py +250 -0
- mindspore/profiler/analysis/viewer/ascend_memory_viewer.py +320 -0
- mindspore/profiler/analysis/viewer/ascend_op_memory_viewer.py +327 -0
- mindspore/profiler/analysis/viewer/ascend_step_trace_time_viewer.py +376 -0
- mindspore/profiler/analysis/viewer/ascend_timeline_viewer.py +58 -0
- mindspore/profiler/analysis/viewer/base_viewer.py +26 -0
- mindspore/profiler/analysis/viewer/ms_dataset_viewer.py +96 -0
- mindspore/profiler/analysis/viewer/ms_minddata_viewer.py +581 -0
- mindspore/profiler/analysis/work_flow.py +73 -0
- mindspore/profiler/common/ascend_msprof_exporter.py +139 -0
- mindspore/profiler/common/command_executor.py +90 -0
- mindspore/profiler/common/constant.py +186 -3
- mindspore/profiler/common/file_manager.py +208 -0
- mindspore/profiler/common/log.py +130 -0
- mindspore/profiler/common/msprof_cmd_tool.py +221 -0
- mindspore/profiler/common/path_manager.py +395 -0
- mindspore/profiler/common/process_bar.py +168 -0
- mindspore/profiler/common/process_pool.py +9 -3
- mindspore/profiler/common/profiler_context.py +500 -0
- mindspore/profiler/common/profiler_info.py +304 -0
- mindspore/profiler/common/profiler_meta_data.py +74 -0
- mindspore/profiler/common/profiler_output_path.py +284 -0
- mindspore/profiler/common/profiler_parameters.py +251 -0
- mindspore/profiler/common/profiler_path_manager.py +179 -0
- mindspore/profiler/common/record_function.py +76 -0
- mindspore/profiler/common/tlv_decoder.py +76 -0
- mindspore/profiler/common/util.py +75 -2
- mindspore/profiler/dynamic_profiler.py +341 -75
- mindspore/profiler/envprofiler.py +163 -0
- mindspore/profiler/experimental_config.py +197 -0
- mindspore/profiler/mstx.py +242 -0
- mindspore/profiler/platform/__init__.py +21 -0
- mindspore/profiler/platform/base_profiler.py +40 -0
- mindspore/profiler/platform/cpu_profiler.py +124 -0
- mindspore/profiler/platform/gpu_profiler.py +74 -0
- mindspore/profiler/platform/npu_profiler.py +335 -0
- mindspore/profiler/profiler.py +1073 -90
- mindspore/profiler/profiler_action_controller.py +187 -0
- mindspore/profiler/profiler_interface.py +118 -0
- mindspore/profiler/schedule.py +243 -0
- mindspore/rewrite/api/node.py +15 -13
- mindspore/rewrite/api/symbol_tree.py +2 -3
- mindspore/run_check/_check_version.py +27 -20
- mindspore/run_check/run_check.py +1 -1
- mindspore/runtime/__init__.py +37 -0
- mindspore/runtime/device.py +27 -0
- mindspore/runtime/event.py +209 -0
- mindspore/runtime/executor.py +177 -0
- mindspore/runtime/memory.py +409 -0
- mindspore/runtime/stream.py +460 -0
- mindspore/runtime/thread_bind_core.py +401 -0
- mindspore/safeguard/rewrite_obfuscation.py +12 -9
- mindspore/swresample-4.dll +0 -0
- mindspore/swscale-6.dll +0 -0
- mindspore/tbbmalloc.dll +0 -0
- mindspore/tinyxml2.dll +0 -0
- mindspore/train/__init__.py +8 -8
- mindspore/train/_utils.py +88 -25
- mindspore/train/amp.py +9 -5
- mindspore/train/callback/__init__.py +2 -2
- mindspore/train/callback/_callback.py +2 -16
- mindspore/train/callback/_checkpoint.py +53 -55
- mindspore/train/callback/_cluster_monitor.py +14 -18
- mindspore/train/callback/_early_stop.py +1 -1
- mindspore/train/callback/_flops_collector.py +103 -68
- mindspore/train/callback/_history.py +8 -5
- mindspore/train/callback/_lambda_callback.py +2 -2
- mindspore/train/callback/_landscape.py +0 -3
- mindspore/train/callback/_loss_monitor.py +2 -1
- mindspore/train/callback/_on_request_exit.py +6 -5
- mindspore/train/callback/_reduce_lr_on_plateau.py +11 -6
- mindspore/train/callback/_summary_collector.py +52 -19
- mindspore/train/callback/_time_monitor.py +2 -1
- mindspore/train/callback/{_tft_register.py → _train_fault_tolerance.py} +204 -107
- mindspore/train/data_sink.py +25 -2
- mindspore/train/dataset_helper.py +15 -16
- mindspore/train/loss_scale_manager.py +8 -7
- mindspore/train/metrics/accuracy.py +3 -3
- mindspore/train/metrics/confusion_matrix.py +9 -9
- mindspore/train/metrics/error.py +3 -3
- mindspore/train/metrics/hausdorff_distance.py +4 -4
- mindspore/train/metrics/mean_surface_distance.py +3 -3
- mindspore/train/metrics/metric.py +0 -12
- mindspore/train/metrics/occlusion_sensitivity.py +4 -2
- mindspore/train/metrics/precision.py +11 -10
- mindspore/train/metrics/recall.py +9 -9
- mindspore/train/metrics/root_mean_square_surface_distance.py +2 -2
- mindspore/train/mind_ir_pb2.py +174 -46
- mindspore/train/model.py +184 -113
- mindspore/train/serialization.py +622 -978
- mindspore/train/summary/_summary_adapter.py +2 -2
- mindspore/train/summary/summary_record.py +2 -3
- mindspore/train/train_thor/model_thor.py +1 -1
- mindspore/turbojpeg.dll +0 -0
- mindspore/utils/__init__.py +6 -3
- mindspore/utils/dryrun.py +140 -0
- mindspore/utils/hooks.py +81 -0
- mindspore/utils/runtime_execution_order_check.py +550 -0
- mindspore/utils/utils.py +138 -4
- mindspore/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.0rc1.dist-info}/METADATA +3 -3
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/RECORD +587 -418
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/entry_points.txt +1 -1
- mindspore/_install_custom.py +0 -43
- mindspore/common/_register_for_adapter.py +0 -74
- mindspore/common/_tensor_overload.py +0 -139
- mindspore/mindspore_np_dtype.dll +0 -0
- mindspore/ops/auto_generate/gen_arg_dtype_cast.py +0 -252
- mindspore/ops/auto_generate/gen_arg_handler.py +0 -197
- mindspore/ops/operations/_opaque_predicate_registry.py +0 -41
- mindspore/ops_generate/gen_aclnn_implement.py +0 -263
- mindspore/ops_generate/gen_ops_inner_prim.py +0 -131
- mindspore/ops_generate/gen_pyboost_func.py +0 -1052
- mindspore/ops_generate/gen_utils.py +0 -209
- mindspore/ops_generate/op_proto.py +0 -145
- mindspore/ops_generate/template.py +0 -261
- mindspore/profiler/envprofiling.py +0 -254
- mindspore/profiler/profiling.py +0 -1926
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/WHEEL +0 -0
- {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,550 @@
|
|
|
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
|
+
"""mindspore utils runtime order check."""
|
|
16
|
+
import csv
|
|
17
|
+
import os
|
|
18
|
+
import re
|
|
19
|
+
from collections import defaultdict
|
|
20
|
+
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
|
|
21
|
+
from multiprocessing import cpu_count
|
|
22
|
+
from typing import List, Dict, Union, Optional
|
|
23
|
+
import sys
|
|
24
|
+
import mindspore.log as logger
|
|
25
|
+
|
|
26
|
+
# Set Recursion Depth Limit
|
|
27
|
+
sys.setrecursionlimit(10000)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ExecuteOrder:
|
|
31
|
+
"""Represents a single record from the execute_order.csv file."""
|
|
32
|
+
|
|
33
|
+
def __init__(self, index: str, group: str, comm_rank: str,
|
|
34
|
+
primitive: str, src_rank: str = '', dest_rank: str = '', root_rank: str = '', input_shape: str = '',
|
|
35
|
+
output_shape: str = ''):
|
|
36
|
+
self.index = index
|
|
37
|
+
self.group = group
|
|
38
|
+
self.comm_rank = comm_rank.split() # Split comm_rank into a list of individual ranks
|
|
39
|
+
self.primitive = primitive
|
|
40
|
+
self.src_rank = src_rank
|
|
41
|
+
self.dest_rank = dest_rank
|
|
42
|
+
self.root_rank = root_rank
|
|
43
|
+
self.input_shape = input_shape
|
|
44
|
+
self.output_shape = output_shape
|
|
45
|
+
|
|
46
|
+
def generate_base_key(self, rank: str) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Generates a unique base key for counting, excluding the counter part.
|
|
49
|
+
"""
|
|
50
|
+
if not self.src_rank and not self.dest_rank and not self.root_rank:
|
|
51
|
+
# Aggregate communication status, for example, allGather.
|
|
52
|
+
comm_str = ",".join(self.comm_rank)
|
|
53
|
+
return f"{self.primitive}_{self.group}_({comm_str})"
|
|
54
|
+
|
|
55
|
+
if self.primitive == "Send":
|
|
56
|
+
# Unique base key of the Send operation.
|
|
57
|
+
return f"Send_Receive_{self.group}_({rank})->({self.dest_rank})_{self.input_shape}"
|
|
58
|
+
|
|
59
|
+
if self.primitive == "Receive":
|
|
60
|
+
# Unique base key of the reception operation
|
|
61
|
+
return f"Send_Receive_{self.group}_({self.src_rank})->({rank})_{self.output_shape}"
|
|
62
|
+
|
|
63
|
+
# Other operations, such as broadCast
|
|
64
|
+
parts = [f"{self.primitive}_{self.group}", f"commRank:({','.join(self.comm_rank)})"]
|
|
65
|
+
if self.src_rank:
|
|
66
|
+
parts.append(f"srcRank:({self.src_rank})")
|
|
67
|
+
if self.dest_rank:
|
|
68
|
+
parts.append(f"destRank:({self.dest_rank})")
|
|
69
|
+
if self.root_rank:
|
|
70
|
+
parts.append(f"rootRank:({self.root_rank})")
|
|
71
|
+
|
|
72
|
+
return "_".join(parts)
|
|
73
|
+
|
|
74
|
+
def generate_key(self, rank: str, count: int) -> str:
|
|
75
|
+
"""
|
|
76
|
+
Generates the final unique key, including the counterpart.
|
|
77
|
+
"""
|
|
78
|
+
base_key = self.generate_base_key(rank)
|
|
79
|
+
return f"{base_key}_{count}th"
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class RankFolderParser:
|
|
83
|
+
"""
|
|
84
|
+
Parses specified folder(s) and reads execute_order.csv files within rank_x folders.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
REQUIRED_COLUMNS = [
|
|
88
|
+
"index", "group", "comm_rank", "primitive",
|
|
89
|
+
"src_rank", "dest_rank", "root_rank", "input_shape", "input_type", "output_shape", "output_type", "input_size",
|
|
90
|
+
"output_size"
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
def __init__(self, folders: Union[str, List[str]]):
|
|
94
|
+
# Ensure folders is always a list of absolute paths
|
|
95
|
+
if isinstance(folders, str):
|
|
96
|
+
self.folders = [folders]
|
|
97
|
+
else:
|
|
98
|
+
self.folders = folders
|
|
99
|
+
|
|
100
|
+
# Validate provided folders or rank_{x} paths
|
|
101
|
+
self._validate_paths()
|
|
102
|
+
|
|
103
|
+
# Store results here
|
|
104
|
+
self.result_map: Dict[str, List[ExecuteOrder]] = {}
|
|
105
|
+
|
|
106
|
+
# Determine optimal number of workers based on CPU count
|
|
107
|
+
self.cpu_cores = cpu_count()
|
|
108
|
+
self.max_threads = min(8, self.cpu_cores * 2) # For I/O-bound tasks
|
|
109
|
+
self.max_processes = min(8, self.cpu_cores) # For CPU-bound tasks
|
|
110
|
+
|
|
111
|
+
def _validate_paths(self):
|
|
112
|
+
"""
|
|
113
|
+
Validate all provided paths.
|
|
114
|
+
Each path must be either:
|
|
115
|
+
- A valid absolute directory containing rank_{x} folders, or
|
|
116
|
+
- A valid absolute path directly pointing to a rank_{x} folder.
|
|
117
|
+
|
|
118
|
+
Additionally, checks for duplicate rank_{x} folders and raises an error if duplicates are found.
|
|
119
|
+
"""
|
|
120
|
+
seen_ranks = set() # To track rank_x folder names and detect duplicates
|
|
121
|
+
|
|
122
|
+
for path in self.folders:
|
|
123
|
+
if not os.path.isabs(path):
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"Invalid path: {path}. "
|
|
126
|
+
f"Please provide an absolute path, e.g., '/absolute/path/to/folder' or '/absolute/path/to/rank_x'."
|
|
127
|
+
)
|
|
128
|
+
if not os.path.exists(path):
|
|
129
|
+
raise ValueError(
|
|
130
|
+
f"Path does not exist: {path}. "
|
|
131
|
+
f"Ensure the path exists and is accessible."
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Check if it is a specific rank_{x} folder
|
|
135
|
+
if os.path.isdir(path) and os.path.basename(path).startswith("rank_"):
|
|
136
|
+
rank_name = os.path.basename(path)
|
|
137
|
+
if rank_name in seen_ranks:
|
|
138
|
+
raise ValueError(
|
|
139
|
+
f"Duplicate rank folder detected: {rank_name}. "
|
|
140
|
+
f"Each rank_x folder must be unique. Please remove duplicates."
|
|
141
|
+
)
|
|
142
|
+
seen_ranks.add(rank_name)
|
|
143
|
+
continue # Valid rank_{x} folder
|
|
144
|
+
|
|
145
|
+
# Check if it is a directory containing rank_{x} folders
|
|
146
|
+
if os.path.isdir(path):
|
|
147
|
+
rank_folders = [d for d in os.listdir(path) if
|
|
148
|
+
d.startswith("rank_") and os.path.isdir(os.path.join(path, d))]
|
|
149
|
+
if not rank_folders:
|
|
150
|
+
raise ValueError(
|
|
151
|
+
f"No rank_x folders found in {path}. Ensure the directory contains at least one folder named "
|
|
152
|
+
f"'rank_x', where x is an integer."
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Check for duplicates within this directory
|
|
156
|
+
for rank_folder in rank_folders:
|
|
157
|
+
if rank_folder in seen_ranks:
|
|
158
|
+
raise ValueError(
|
|
159
|
+
f"Duplicate rank folder detected: {rank_folder} in {path}. "
|
|
160
|
+
f"Each rank_x folder must be unique. Please remove duplicates."
|
|
161
|
+
)
|
|
162
|
+
seen_ranks.add(rank_folder)
|
|
163
|
+
continue # Valid directory containing rank_{x} folders
|
|
164
|
+
|
|
165
|
+
# Invalid case
|
|
166
|
+
raise ValueError(
|
|
167
|
+
f"Invalid path: {path}. "
|
|
168
|
+
f"Paths must either be rank_x folders or directories containing rank_x folders."
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
def parse(self) -> Dict[str, List[ExecuteOrder]]:
|
|
172
|
+
"""
|
|
173
|
+
Main parsing function using a ProcessPoolExecutor to handle multiple paths.
|
|
174
|
+
Each rank_{x} folder is processed in parallel.
|
|
175
|
+
"""
|
|
176
|
+
with ProcessPoolExecutor(max_workers=self.max_processes) as process_executor:
|
|
177
|
+
futures = [process_executor.submit(self._parse_path, path) for path in self.folders]
|
|
178
|
+
for future in as_completed(futures):
|
|
179
|
+
try:
|
|
180
|
+
path_result = future.result()
|
|
181
|
+
if path_result:
|
|
182
|
+
self.result_map.update(path_result)
|
|
183
|
+
except FileNotFoundError as e:
|
|
184
|
+
logger.error(f"File not found: {e}. Please ensure all required files are present.")
|
|
185
|
+
except ValueError as e:
|
|
186
|
+
logger.error(f"Value error: {e}. Please check the file contents or paths.")
|
|
187
|
+
|
|
188
|
+
return self.result_map
|
|
189
|
+
|
|
190
|
+
def _parse_path(self, path: str) -> Dict[str, List]:
|
|
191
|
+
"""
|
|
192
|
+
Helper function to parse a single path. Handles both:
|
|
193
|
+
- Direct rank_{x} folder paths.
|
|
194
|
+
- Parent directories containing multiple rank_{x} folders.
|
|
195
|
+
"""
|
|
196
|
+
result = {}
|
|
197
|
+
|
|
198
|
+
# If the path is a rank_{x} folder, parse it directly
|
|
199
|
+
if os.path.basename(path).startswith("rank_"):
|
|
200
|
+
rank_id = os.path.basename(path).split("_")[1]
|
|
201
|
+
# Adding one more layer to access the "execute_order" folder
|
|
202
|
+
execute_order_path = os.path.join(path, "execute_order")
|
|
203
|
+
if os.path.exists(execute_order_path):
|
|
204
|
+
rank_result = self.parse_rank_folder(execute_order_path, rank_id)
|
|
205
|
+
if rank_result:
|
|
206
|
+
result[rank_id] = rank_result[1] # Extract execute orders
|
|
207
|
+
return result
|
|
208
|
+
|
|
209
|
+
# If the path is a directory containing rank_{x} folders, parse all
|
|
210
|
+
with ThreadPoolExecutor(max_workers=self.max_threads) as thread_executor:
|
|
211
|
+
futures = []
|
|
212
|
+
for d in os.listdir(path):
|
|
213
|
+
if d.startswith("rank_"):
|
|
214
|
+
rank_id = d.split("_")[1]
|
|
215
|
+
rank_folder_path = os.path.join(path, d)
|
|
216
|
+
execute_order_path = os.path.join(rank_folder_path, "execute_order")
|
|
217
|
+
|
|
218
|
+
if os.path.exists(execute_order_path):
|
|
219
|
+
futures.append(thread_executor.submit(self.parse_rank_folder, execute_order_path, rank_id))
|
|
220
|
+
|
|
221
|
+
for future in as_completed(futures):
|
|
222
|
+
try:
|
|
223
|
+
rank_id, execute_orders = future.result()
|
|
224
|
+
if execute_orders:
|
|
225
|
+
result[rank_id] = execute_orders
|
|
226
|
+
except FileNotFoundError as e:
|
|
227
|
+
logger.error(f"File not found during parallel processing: {e}. "
|
|
228
|
+
f"Ensure the required files are present.")
|
|
229
|
+
except ValueError as e:
|
|
230
|
+
logger.error(f"Value error during parallel processing: {e}. Check file format or contents.")
|
|
231
|
+
|
|
232
|
+
return result
|
|
233
|
+
|
|
234
|
+
def parse_rank_folder(self, rank_folder_path: str, rank_id: str) -> Optional[tuple]:
|
|
235
|
+
"""
|
|
236
|
+
Parse a single rank_{x} folders execute_order.csv file with header validation.
|
|
237
|
+
"""
|
|
238
|
+
execute_order_file = os.path.join(rank_folder_path, "comm_execute_order.csv")
|
|
239
|
+
|
|
240
|
+
if not os.path.exists(execute_order_file):
|
|
241
|
+
logger.error(
|
|
242
|
+
f"No execute_order.csv found in {rank_folder_path}. Skipping this folder. "
|
|
243
|
+
f"Ensure the rank_{rank_id} folder contains a valid comm_execute_order.csv file."
|
|
244
|
+
)
|
|
245
|
+
return rank_id, None
|
|
246
|
+
|
|
247
|
+
execute_orders = []
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
with open(execute_order_file, mode='r', encoding='utf-8') as file:
|
|
251
|
+
csv_reader = csv.DictReader(file)
|
|
252
|
+
|
|
253
|
+
# Validate the header
|
|
254
|
+
if csv_reader.fieldnames != self.REQUIRED_COLUMNS:
|
|
255
|
+
logger.error(
|
|
256
|
+
f"Invalid header in {execute_order_file}. Skipping this file. "
|
|
257
|
+
f"Expected columns: {self.REQUIRED_COLUMNS}. "
|
|
258
|
+
f"Ensure the file contains the correct column names."
|
|
259
|
+
)
|
|
260
|
+
return rank_id, None
|
|
261
|
+
|
|
262
|
+
# Read and parse data rows
|
|
263
|
+
for row in csv_reader:
|
|
264
|
+
execute_order = ExecuteOrder(
|
|
265
|
+
index=row["index"],
|
|
266
|
+
group=row["group"],
|
|
267
|
+
comm_rank=row["comm_rank"],
|
|
268
|
+
primitive=row["primitive"],
|
|
269
|
+
src_rank=row["src_rank"],
|
|
270
|
+
dest_rank=row["dest_rank"],
|
|
271
|
+
root_rank=row["root_rank"],
|
|
272
|
+
input_shape=row["input_shape"],
|
|
273
|
+
output_shape=row["output_shape"],
|
|
274
|
+
|
|
275
|
+
)
|
|
276
|
+
execute_orders.append(execute_order)
|
|
277
|
+
except FileNotFoundError as e:
|
|
278
|
+
logger.error(f"File not found: {execute_order_file}. Ensure the file exists and is accessible. Error: {e}")
|
|
279
|
+
return rank_id, None
|
|
280
|
+
|
|
281
|
+
return rank_id, execute_orders
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def modify_execute_orders(execute_orders_map: dict) -> dict:
|
|
285
|
+
"""
|
|
286
|
+
Modify and generate unique execution order keys for each rank.
|
|
287
|
+
|
|
288
|
+
This function processes a mapping of execution orders grouped by ranks. For each order,
|
|
289
|
+
it generates a unique key by combining a base key and a counter, ensuring all orders
|
|
290
|
+
are uniquely identifiable. The result is a dictionary where the keys are rank identifiers
|
|
291
|
+
and the values are lists of unique execution order keys.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
execute_orders_map (dict): A dictionary where keys are rank identifiers (e.g., "rank_0")
|
|
295
|
+
and values are lists of ExecuteOrder objects. If a rank has no
|
|
296
|
+
orders, its value may be `None`.
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
dict: A dictionary where keys are rank identifiers and values are lists of unique string
|
|
300
|
+
keys representing the modified execution orders for each rank.
|
|
301
|
+
|
|
302
|
+
"""
|
|
303
|
+
result = {}
|
|
304
|
+
|
|
305
|
+
for rank, execute_orders in execute_orders_map.items():
|
|
306
|
+
# If execute_orders is None, use an empty list instead.
|
|
307
|
+
if execute_orders is None:
|
|
308
|
+
execute_orders = []
|
|
309
|
+
|
|
310
|
+
count_map = defaultdict(int)
|
|
311
|
+
new_orders = []
|
|
312
|
+
|
|
313
|
+
for order in execute_orders:
|
|
314
|
+
# Use generate_base_key to generate the base key for counting.
|
|
315
|
+
base_key = order.generate_base_key(rank)
|
|
316
|
+
|
|
317
|
+
count_map[base_key] += 1
|
|
318
|
+
count = count_map[base_key]
|
|
319
|
+
|
|
320
|
+
# Use generate_key to generate the final unique key.
|
|
321
|
+
new_key = order.generate_key(rank, count)
|
|
322
|
+
new_orders.append(new_key)
|
|
323
|
+
|
|
324
|
+
# Save the generated new order list to the result dictionary.
|
|
325
|
+
result[rank] = new_orders
|
|
326
|
+
|
|
327
|
+
return result
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def parse_and_validate(data: dict, all_rank: bool = True):
|
|
331
|
+
"""
|
|
332
|
+
Parse and validate execution orders in a directed graph structure.
|
|
333
|
+
|
|
334
|
+
This function checks the integrity and consistency of a given dataset, ensuring all required
|
|
335
|
+
keys are present and correctly referenced. It also validates the structure of the input data
|
|
336
|
+
and parses string values to extract meaningful components.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
data (dict): A dictionary where keys are string identifiers and values are lists of strings.
|
|
340
|
+
Each value represents a dependency or reference to other keys.
|
|
341
|
+
all_rank (bool): If True, checks that all elements referenced in the data are present as keys
|
|
342
|
+
in the dictionary. If False, only checks intersections.
|
|
343
|
+
|
|
344
|
+
Returns:
|
|
345
|
+
None: Log error messages to the console if validation fails, otherwise completes silently.
|
|
346
|
+
|
|
347
|
+
Raises:
|
|
348
|
+
ValueError: Raised indirectly if `parse_elements` encounters malformed input strings.
|
|
349
|
+
TypeError: Raised indirectly if data contains unexpected types.
|
|
350
|
+
|
|
351
|
+
"""
|
|
352
|
+
def parse_elements(value: str, max_groups: int = 2) -> set:
|
|
353
|
+
"""Extract unique elements inside the first one or two parentheses from a string."""
|
|
354
|
+
groups = re.findall(r'\((.*?)\)', value)
|
|
355
|
+
limited_groups = groups[:max_groups] # Limit to the first `max_groups` matches
|
|
356
|
+
return {item.strip() for group in limited_groups for item in group.split(',')}
|
|
357
|
+
|
|
358
|
+
if not isinstance(data, dict):
|
|
359
|
+
logger.error("Input must be a dictionary with string keys and lists of strings as values.")
|
|
360
|
+
return
|
|
361
|
+
|
|
362
|
+
key_to_values = {key: set(values) for key, values in data.items() if
|
|
363
|
+
isinstance(values, list) and all(isinstance(v, str) for v in values)}
|
|
364
|
+
|
|
365
|
+
for key, values in data.items():
|
|
366
|
+
if not isinstance(values, list) or not all(isinstance(v, str) for v in values):
|
|
367
|
+
logger.error(f"Values for key '{key}' must be a list of strings.")
|
|
368
|
+
continue
|
|
369
|
+
|
|
370
|
+
for value in values:
|
|
371
|
+
try:
|
|
372
|
+
elements = parse_elements(value)
|
|
373
|
+
except (ValueError, TypeError, AttributeError) as e:
|
|
374
|
+
logger.error(f"Unable to parse elements from value '{value}' in key '{key}'. Error: {e}")
|
|
375
|
+
continue
|
|
376
|
+
|
|
377
|
+
# Check for missing keys if all_rank is True
|
|
378
|
+
if all_rank:
|
|
379
|
+
missing_keys = elements - key_to_values.keys()
|
|
380
|
+
if missing_keys:
|
|
381
|
+
logger.error(f"The following keys are missing for value '{value}': {missing_keys}")
|
|
382
|
+
continue
|
|
383
|
+
|
|
384
|
+
# Check if the value is present in the referenced keys
|
|
385
|
+
for element in elements & key_to_values.keys() if not all_rank else elements:
|
|
386
|
+
if value not in key_to_values[element]:
|
|
387
|
+
logger.error(f"Key '{element}' is missing the value '{value}'.")
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def detect_cycle_in_graph(ranks_map):
|
|
391
|
+
"""
|
|
392
|
+
Detects a cycle in the directed graph constructed from ranks_map.
|
|
393
|
+
|
|
394
|
+
Args:
|
|
395
|
+
- ranks_map (dict): A dictionary where keys are rank names and values are lists of nodes.
|
|
396
|
+
|
|
397
|
+
Returns:
|
|
398
|
+
- tuple: (cycle_path, cycle_ranks) where cycle_path is a list of nodes forming the cycle and cycle_ranks
|
|
399
|
+
is a list of rank transitions corresponding to the cycle path.
|
|
400
|
+
"""
|
|
401
|
+
# Step 1: Build the directed graph and track edges with ranks
|
|
402
|
+
graph = defaultdict(list)
|
|
403
|
+
rank_edges = {}
|
|
404
|
+
|
|
405
|
+
for rank, nodes in ranks_map.items():
|
|
406
|
+
for i in range(len(nodes) - 1):
|
|
407
|
+
u, v = nodes[i], nodes[i + 1]
|
|
408
|
+
graph[u].append(v)
|
|
409
|
+
rank_edges[(u, v)] = rank
|
|
410
|
+
|
|
411
|
+
# Step 2: Detect cycle using DFS with path and rank tracking
|
|
412
|
+
visited = set()
|
|
413
|
+
recursion_stack = set()
|
|
414
|
+
path = []
|
|
415
|
+
cycle_path = []
|
|
416
|
+
cycle_ranks = []
|
|
417
|
+
|
|
418
|
+
def dfs(node):
|
|
419
|
+
if node in recursion_stack: # Cycle detected
|
|
420
|
+
# Identify the cycle path from the recursion stack
|
|
421
|
+
cycle_index = path.index(node)
|
|
422
|
+
cycle_path.extend(path[cycle_index:])
|
|
423
|
+
for i in range(cycle_index, len(path) - 1):
|
|
424
|
+
u, v = path[i], path[i + 1]
|
|
425
|
+
cycle_ranks.append(f"{rank_edges[(u, v)]} {u} -> {v}")
|
|
426
|
+
# Add the closing edge for the cycle
|
|
427
|
+
cycle_ranks.append(f"{rank_edges[(path[-1], node)]} {path[-1]} -> {node}")
|
|
428
|
+
return True
|
|
429
|
+
|
|
430
|
+
if node in visited:
|
|
431
|
+
return False
|
|
432
|
+
|
|
433
|
+
visited.add(node)
|
|
434
|
+
recursion_stack.add(node)
|
|
435
|
+
path.append(node)
|
|
436
|
+
|
|
437
|
+
for neighbor in graph[node]:
|
|
438
|
+
if dfs(neighbor):
|
|
439
|
+
return True
|
|
440
|
+
|
|
441
|
+
# Backtrack
|
|
442
|
+
recursion_stack.remove(node)
|
|
443
|
+
path.pop()
|
|
444
|
+
return False
|
|
445
|
+
|
|
446
|
+
nodes = list(graph.keys())
|
|
447
|
+
for node in nodes:
|
|
448
|
+
if node not in visited:
|
|
449
|
+
if dfs(node):
|
|
450
|
+
return cycle_path, cycle_ranks
|
|
451
|
+
|
|
452
|
+
return None, None
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def determine_all_rank(folders_):
|
|
456
|
+
"""
|
|
457
|
+
Determine the value of all_rank based on the input folders_.
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
folders_ (str | list): Folder path(s) to process.
|
|
461
|
+
|
|
462
|
+
Returns:
|
|
463
|
+
bool | None: Returns True/False for valid inputs, or None for invalid inputs.
|
|
464
|
+
"""
|
|
465
|
+
if isinstance(folders_, str) and folders_:
|
|
466
|
+
return True
|
|
467
|
+
if isinstance(folders_, list):
|
|
468
|
+
if len(folders_) == 1:
|
|
469
|
+
return True
|
|
470
|
+
if len(folders_) > 1:
|
|
471
|
+
return False
|
|
472
|
+
return None
|
|
473
|
+
return None
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
def output_cycle_results(cycle_path, cycle_ranks):
|
|
477
|
+
"""
|
|
478
|
+
Helper function to output cycle detection results.
|
|
479
|
+
|
|
480
|
+
Args:
|
|
481
|
+
cycle_path (list): List of nodes forming a cycle, if any.
|
|
482
|
+
cycle_ranks (list): List of ranks involved in the cycle.
|
|
483
|
+
|
|
484
|
+
Returns:
|
|
485
|
+
None: Outputs results to the console.
|
|
486
|
+
"""
|
|
487
|
+
if cycle_path:
|
|
488
|
+
logger.warning("Cycle detected:")
|
|
489
|
+
logger.warning(" -> ".join(cycle_path) + f" -> {cycle_path[0]}") # Close the cycle
|
|
490
|
+
logger.warning("Involving ranks:")
|
|
491
|
+
for rank in cycle_ranks:
|
|
492
|
+
logger.warning(rank)
|
|
493
|
+
else:
|
|
494
|
+
logger.warning("Check success.")
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
def runtime_execution_order_check(folders_, all_rank=None):
|
|
498
|
+
"""
|
|
499
|
+
Verify the rank_x folder in the specified directory.
|
|
500
|
+
|
|
501
|
+
Parameter description:
|
|
502
|
+
1. folders (str or list[str]):
|
|
503
|
+
- Can be a single string or a list of strings representing the rank_x folder path or its upper-level directory path.
|
|
504
|
+
- If the input directory is the upper-level directory path, the function automatically identifies and verifies
|
|
505
|
+
all rank_x folders in the directory.
|
|
506
|
+
- If a specific rank_x folder path is passed, the function will only verify these specified folders.
|
|
507
|
+
|
|
508
|
+
2. check_all (optional, true by default):
|
|
509
|
+
- Controls whether to verify all rank_x folders.
|
|
510
|
+
- True (default): Verify all files.
|
|
511
|
+
- False: Only part of the transferred rank_x folder is verified.
|
|
512
|
+
|
|
513
|
+
Example:
|
|
514
|
+
Example 1: Verify all rank_x folders (default behavior)
|
|
515
|
+
runtime_execution_order_check("path/to/parent_folder")
|
|
516
|
+
|
|
517
|
+
Example 2: Verify only some specified rank_x folders.
|
|
518
|
+
runtime_execution_order_check(["path/to/rank_1", "path/to/rank_2"], all_rank=False)
|
|
519
|
+
|
|
520
|
+
Example 3: Verify a single rank_x folder.
|
|
521
|
+
runtime_execution_order_check("path/to/rank_x", all_rank=True)
|
|
522
|
+
|
|
523
|
+
Precautions:
|
|
524
|
+
- When folders is the upper-level directory path, the function automatically
|
|
525
|
+
searches for and verifies the rank_x folder.
|
|
526
|
+
- When check_all is set to false, only the rank_x folder specified in the input path is verified.
|
|
527
|
+
"""
|
|
528
|
+
# Use the provided all_rank if available, otherwise determine it
|
|
529
|
+
if all_rank is None:
|
|
530
|
+
all_rank = determine_all_rank(folders_)
|
|
531
|
+
|
|
532
|
+
if all_rank is None: # Input validation failed
|
|
533
|
+
logger.error("Invalid input. `folders_` must be a non-empty string or a list with at least one string element.")
|
|
534
|
+
return
|
|
535
|
+
|
|
536
|
+
# Parse folders
|
|
537
|
+
parser = RankFolderParser(folders_)
|
|
538
|
+
result_map = parser.parse()
|
|
539
|
+
|
|
540
|
+
# Modify execution orders
|
|
541
|
+
modified_orders = modify_execute_orders(result_map)
|
|
542
|
+
|
|
543
|
+
# Parse and validate execution orders
|
|
544
|
+
parse_and_validate(modified_orders, all_rank)
|
|
545
|
+
|
|
546
|
+
# Detect cycles
|
|
547
|
+
cycle_path, cycle_ranks = detect_cycle_in_graph(modified_orders)
|
|
548
|
+
|
|
549
|
+
# Output results
|
|
550
|
+
output_cycle_results(cycle_path, cycle_ranks)
|