mindspore 2.4.10__cp39-cp39-win_amd64.whl → 2.6.0rc1__cp39-cp39-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mindspore might be problematic. Click here for more details.

Files changed (577) hide show
  1. mindspore/.commit_id +1 -1
  2. mindspore/__init__.py +13 -6
  3. mindspore/_c_dataengine.cp39-win_amd64.pyd +0 -0
  4. mindspore/_c_expression.cp39-win_amd64.pyd +0 -0
  5. mindspore/_c_mindrecord.cp39-win_amd64.pyd +0 -0
  6. mindspore/_check_jit_forbidden_api.py +3 -0
  7. mindspore/_checkparam.py +3 -38
  8. mindspore/_deprecated/__init__.py +17 -0
  9. mindspore/_deprecated/jit.py +198 -0
  10. mindspore/_extends/builtin_operations.py +1 -1
  11. mindspore/_extends/parallel_compile/akg_compiler/gen_custom_op_files.py +1 -1
  12. mindspore/_extends/parse/__init__.py +6 -7
  13. mindspore/_extends/parse/compile_config.py +83 -0
  14. mindspore/_extends/parse/deprecated/__init__.py +0 -0
  15. mindspore/_extends/parse/deprecated/deprecated_tensor_method.py +394 -0
  16. mindspore/_extends/parse/jit_fallback_modules/__init__.py +0 -0
  17. mindspore/_extends/parse/jit_fallback_modules/check_utils.py +123 -0
  18. mindspore/_extends/parse/jit_fallback_modules/third_party_modules.py +50 -0
  19. mindspore/_extends/parse/parser.py +46 -197
  20. mindspore/_extends/parse/resources.py +1 -5
  21. mindspore/_extends/parse/standard_method.py +217 -98
  22. mindspore/_extends/pijit/__init__.py +2 -2
  23. mindspore/_extends/pijit/pijit_func_white_list.py +17 -12
  24. mindspore/_extends/pijit/tensor_func_list.py +27 -0
  25. mindspore/_extends/utils.py +1 -1
  26. mindspore/amp.py +11 -5
  27. mindspore/avcodec-59.dll +0 -0
  28. mindspore/avdevice-59.dll +0 -0
  29. mindspore/avfilter-8.dll +0 -0
  30. mindspore/avformat-59.dll +0 -0
  31. mindspore/avutil-57.dll +0 -0
  32. mindspore/boost/__init__.py +2 -2
  33. mindspore/boost/base.py +3 -7
  34. mindspore/boost/boost_cell_wrapper.py +138 -43
  35. mindspore/common/__init__.py +6 -3
  36. mindspore/common/_grad_function.py +56 -0
  37. mindspore/common/_pijit_context.py +14 -5
  38. mindspore/common/_register_for_tensor.py +1 -2
  39. mindspore/common/_stub_tensor.py +30 -14
  40. mindspore/common/_tensor_cpp_method.py +17 -0
  41. mindspore/common/_tensor_docs.py +4760 -0
  42. mindspore/common/api.py +435 -371
  43. mindspore/common/auto_dynamic_shape.py +41 -44
  44. mindspore/common/dtype.py +39 -36
  45. mindspore/common/dump.py +9 -6
  46. mindspore/common/file_system.py +9 -1
  47. mindspore/common/generator.py +2 -0
  48. mindspore/common/hook_handle.py +6 -2
  49. mindspore/common/initializer.py +13 -10
  50. mindspore/common/jit_begin_end.py +94 -0
  51. mindspore/common/jit_config.py +6 -1
  52. mindspore/common/jit_context.py +76 -0
  53. mindspore/common/jit_trace.py +378 -0
  54. mindspore/common/lazy_inline.py +9 -3
  55. mindspore/common/mindir_util.py +10 -2
  56. mindspore/common/mutable.py +5 -4
  57. mindspore/common/parameter.py +135 -52
  58. mindspore/common/seed.py +2 -2
  59. mindspore/common/sparse_tensor.py +23 -17
  60. mindspore/common/tensor.py +951 -1992
  61. mindspore/communication/__init__.py +7 -5
  62. mindspore/communication/_comm_helper.py +52 -2
  63. mindspore/communication/comm_func.py +240 -181
  64. mindspore/communication/management.py +95 -26
  65. mindspore/context.py +314 -566
  66. mindspore/dataset/__init__.py +65 -37
  67. mindspore/dataset/audio/__init__.py +2 -8
  68. mindspore/dataset/audio/transforms.py +3 -17
  69. mindspore/dataset/callback/ds_callback.py +2 -1
  70. mindspore/dataset/core/config.py +87 -6
  71. mindspore/dataset/engine/cache_admin.py +3 -3
  72. mindspore/dataset/engine/cache_client.py +6 -5
  73. mindspore/dataset/engine/datasets.py +292 -267
  74. mindspore/dataset/engine/datasets_audio.py +22 -8
  75. mindspore/dataset/engine/datasets_standard_format.py +46 -27
  76. mindspore/dataset/engine/datasets_text.py +78 -48
  77. mindspore/dataset/engine/datasets_user_defined.py +182 -116
  78. mindspore/dataset/engine/datasets_vision.py +120 -44
  79. mindspore/dataset/engine/iterators.py +283 -63
  80. mindspore/dataset/engine/obs/obs_mindrecord_dataset.py +1 -1
  81. mindspore/dataset/engine/obs/util.py +8 -0
  82. mindspore/dataset/engine/queue.py +40 -0
  83. mindspore/dataset/engine/samplers.py +289 -43
  84. mindspore/dataset/engine/serializer_deserializer.py +3 -2
  85. mindspore/dataset/engine/validators.py +53 -11
  86. mindspore/dataset/text/__init__.py +7 -6
  87. mindspore/dataset/text/transforms.py +6 -5
  88. mindspore/dataset/text/utils.py +3 -3
  89. mindspore/dataset/transforms/__init__.py +0 -9
  90. mindspore/dataset/transforms/py_transforms_util.py +17 -0
  91. mindspore/dataset/transforms/transforms.py +31 -14
  92. mindspore/dataset/utils/browse_dataset.py +1 -1
  93. mindspore/dataset/vision/__init__.py +2 -9
  94. mindspore/dataset/vision/transforms.py +202 -158
  95. mindspore/dataset/vision/utils.py +7 -5
  96. mindspore/dataset/vision/validators.py +1 -2
  97. mindspore/device_context/__init__.py +21 -0
  98. mindspore/device_context/ascend/__init__.py +25 -0
  99. mindspore/device_context/ascend/device.py +72 -0
  100. mindspore/device_context/ascend/op_debug.py +153 -0
  101. mindspore/device_context/ascend/op_precision.py +193 -0
  102. mindspore/device_context/ascend/op_tuning.py +123 -0
  103. mindspore/{ops_generate/gen_constants.py → device_context/cpu/__init__.py} +6 -17
  104. mindspore/device_context/cpu/device.py +62 -0
  105. mindspore/device_context/cpu/op_tuning.py +43 -0
  106. mindspore/device_context/gpu/__init__.py +21 -0
  107. mindspore/device_context/gpu/device.py +70 -0
  108. mindspore/device_context/gpu/op_precision.py +67 -0
  109. mindspore/device_context/gpu/op_tuning.py +175 -0
  110. mindspore/device_manager.py +170 -0
  111. mindspore/experimental/es/embedding_service.py +35 -27
  112. mindspore/experimental/llm_boost/__init__.py +1 -0
  113. mindspore/experimental/llm_boost/ascend_native/__init__.py +22 -0
  114. mindspore/experimental/llm_boost/ascend_native/llama_boost_ascend_native.py +211 -0
  115. mindspore/experimental/llm_boost/ascend_native/llm_boost.py +52 -0
  116. mindspore/experimental/llm_boost/atb/boost_base.py +2 -3
  117. mindspore/experimental/llm_boost/atb/llama_boost.py +6 -1
  118. mindspore/experimental/llm_boost/register.py +1 -0
  119. mindspore/experimental/map_parameter.py +4 -4
  120. mindspore/experimental/optim/adadelta.py +6 -6
  121. mindspore/experimental/optim/adagrad.py +4 -4
  122. mindspore/experimental/optim/adam.py +7 -0
  123. mindspore/experimental/optim/adamax.py +4 -4
  124. mindspore/experimental/optim/adamw.py +4 -0
  125. mindspore/experimental/optim/asgd.py +1 -1
  126. mindspore/experimental/optim/lr_scheduler.py +73 -46
  127. mindspore/experimental/optim/radam.py +34 -31
  128. mindspore/experimental/optim/rprop.py +1 -1
  129. mindspore/experimental/optim/sgd.py +1 -1
  130. mindspore/hal/contiguous_tensors_handle.py +6 -10
  131. mindspore/hal/device.py +55 -53
  132. mindspore/hal/event.py +52 -52
  133. mindspore/hal/memory.py +157 -117
  134. mindspore/hal/stream.py +150 -109
  135. mindspore/include/api/context.h +0 -1
  136. mindspore/include/dataset/constants.h +7 -4
  137. mindspore/include/dataset/execute.h +2 -2
  138. mindspore/jpeg62.dll +0 -0
  139. mindspore/log.py +50 -0
  140. mindspore/mindrecord/__init__.py +21 -8
  141. mindspore/mindrecord/config.py +17 -316
  142. mindspore/mindrecord/filereader.py +1 -9
  143. mindspore/mindrecord/filewriter.py +5 -15
  144. mindspore/mindrecord/mindpage.py +1 -9
  145. mindspore/mindspore_backend_common.dll +0 -0
  146. mindspore/mindspore_backend_manager.dll +0 -0
  147. mindspore/mindspore_common.dll +0 -0
  148. mindspore/mindspore_core.dll +0 -0
  149. mindspore/mindspore_dump.dll +0 -0
  150. mindspore/mindspore_frontend.dll +0 -0
  151. mindspore/mindspore_memory_pool.dll +0 -0
  152. mindspore/mindspore_ms_backend.dll +0 -0
  153. mindspore/mindspore_ops.dll +0 -0
  154. mindspore/{mindspore_backend.dll → mindspore_ops_host.dll} +0 -0
  155. mindspore/mindspore_ops_kernel_common.dll +0 -0
  156. mindspore/mindspore_profiler.dll +0 -0
  157. mindspore/mindspore_pyboost.dll +0 -0
  158. mindspore/mindspore_pynative.dll +0 -0
  159. mindspore/mindspore_res_manager.dll +0 -0
  160. mindspore/mindspore_runtime_pipeline.dll +0 -0
  161. mindspore/mint/__init__.py +796 -759
  162. mindspore/mint/distributed/__init__.py +70 -4
  163. mindspore/mint/distributed/distributed.py +2679 -44
  164. mindspore/mint/linalg/__init__.py +8 -0
  165. mindspore/mint/nn/__init__.py +743 -22
  166. mindspore/mint/nn/functional.py +716 -23
  167. mindspore/mint/nn/layer/__init__.py +21 -4
  168. mindspore/mint/nn/layer/_functions.py +334 -0
  169. mindspore/mint/nn/layer/activation.py +276 -1
  170. mindspore/mint/nn/layer/basic.py +123 -0
  171. mindspore/mint/nn/layer/conv.py +921 -0
  172. mindspore/mint/nn/layer/normalization.py +223 -28
  173. mindspore/mint/nn/layer/padding.py +797 -0
  174. mindspore/mint/nn/layer/pooling.py +235 -0
  175. mindspore/mint/optim/__init__.py +3 -1
  176. mindspore/mint/optim/adam.py +223 -0
  177. mindspore/mint/optim/adamw.py +26 -19
  178. mindspore/mint/optim/sgd.py +171 -0
  179. mindspore/mint/special/__init__.py +2 -1
  180. mindspore/multiprocessing/__init__.py +5 -0
  181. mindspore/nn/__init__.py +4 -1
  182. mindspore/nn/cell.py +1370 -189
  183. mindspore/nn/dynamic_lr.py +2 -1
  184. mindspore/nn/layer/activation.py +29 -27
  185. mindspore/nn/layer/basic.py +51 -35
  186. mindspore/nn/layer/channel_shuffle.py +3 -3
  187. mindspore/nn/layer/container.py +1 -1
  188. mindspore/nn/layer/conv.py +22 -17
  189. mindspore/nn/layer/embedding.py +12 -11
  190. mindspore/nn/layer/normalization.py +56 -49
  191. mindspore/nn/layer/padding.py +4 -3
  192. mindspore/nn/layer/pooling.py +120 -42
  193. mindspore/nn/layer/rnn_cells.py +1 -1
  194. mindspore/nn/layer/rnns.py +2 -1
  195. mindspore/nn/layer/timedistributed.py +5 -5
  196. mindspore/nn/layer/transformer.py +59 -36
  197. mindspore/nn/learning_rate_schedule.py +8 -4
  198. mindspore/nn/loss/loss.py +58 -55
  199. mindspore/nn/optim/ada_grad.py +7 -5
  200. mindspore/nn/optim/adadelta.py +11 -9
  201. mindspore/nn/optim/adafactor.py +1 -1
  202. mindspore/nn/optim/adam.py +17 -13
  203. mindspore/nn/optim/adamax.py +8 -7
  204. mindspore/nn/optim/adasum.py +5 -5
  205. mindspore/nn/optim/asgd.py +1 -1
  206. mindspore/nn/optim/ftrl.py +11 -9
  207. mindspore/nn/optim/lamb.py +1 -1
  208. mindspore/nn/optim/lars.py +1 -4
  209. mindspore/nn/optim/lazyadam.py +12 -10
  210. mindspore/nn/optim/momentum.py +7 -6
  211. mindspore/nn/optim/optimizer.py +3 -3
  212. mindspore/nn/optim/proximal_ada_grad.py +12 -10
  213. mindspore/nn/optim/rmsprop.py +13 -12
  214. mindspore/nn/optim/rprop.py +11 -9
  215. mindspore/nn/optim/sgd.py +9 -6
  216. mindspore/nn/optim/tft_wrapper.py +5 -2
  217. mindspore/nn/optim/thor.py +2 -1
  218. mindspore/nn/probability/bijector/bijector.py +17 -11
  219. mindspore/nn/probability/bijector/gumbel_cdf.py +5 -5
  220. mindspore/nn/probability/bijector/invert.py +2 -2
  221. mindspore/nn/probability/bijector/scalar_affine.py +3 -3
  222. mindspore/nn/probability/bijector/softplus.py +3 -2
  223. mindspore/nn/probability/distribution/beta.py +3 -3
  224. mindspore/nn/probability/distribution/categorical.py +1 -1
  225. mindspore/nn/probability/distribution/cauchy.py +4 -2
  226. mindspore/nn/probability/distribution/exponential.py +6 -7
  227. mindspore/nn/probability/distribution/gamma.py +2 -2
  228. mindspore/nn/probability/distribution/gumbel.py +2 -2
  229. mindspore/nn/probability/distribution/half_normal.py +5 -3
  230. mindspore/nn/probability/distribution/logistic.py +5 -3
  231. mindspore/nn/probability/distribution/poisson.py +1 -1
  232. mindspore/nn/probability/distribution/uniform.py +5 -3
  233. mindspore/nn/reinforcement/_tensors_queue.py +1 -1
  234. mindspore/nn/reinforcement/tensor_array.py +1 -1
  235. mindspore/nn/utils/init.py +13 -11
  236. mindspore/nn/wrap/__init__.py +6 -6
  237. mindspore/nn/wrap/cell_wrapper.py +181 -122
  238. mindspore/nn/wrap/grad_reducer.py +45 -36
  239. mindspore/nn/wrap/loss_scale.py +6 -7
  240. mindspore/numpy/array_creations.py +63 -65
  241. mindspore/numpy/array_ops.py +149 -144
  242. mindspore/numpy/logic_ops.py +41 -42
  243. mindspore/numpy/math_ops.py +365 -363
  244. mindspore/numpy/utils.py +17 -18
  245. mindspore/numpy/utils_const.py +5 -6
  246. mindspore/opencv_core452.dll +0 -0
  247. mindspore/opencv_imgcodecs452.dll +0 -0
  248. mindspore/opencv_imgproc452.dll +0 -0
  249. mindspore/ops/__init__.py +5 -3
  250. mindspore/ops/_grad_experimental/grad_comm_ops.py +112 -16
  251. mindspore/ops/_grad_experimental/grad_debug_ops.py +14 -2
  252. mindspore/ops/_grad_experimental/grad_inner_ops.py +9 -0
  253. mindspore/ops/_grad_experimental/grad_math_ops.py +2 -1
  254. mindspore/ops/_grad_experimental/taylor_rule.py +29 -0
  255. mindspore/ops/_op_impl/cpu/__init__.py +1 -0
  256. mindspore/ops/_op_impl/cpu/raise_op.py +28 -0
  257. mindspore/ops/_register_for_op.py +0 -11
  258. mindspore/{ops_generate → ops/_utils}/arg_dtype_cast.py +123 -4
  259. mindspore/{ops_generate → ops/_utils}/arg_handler.py +3 -65
  260. mindspore/ops/_vmap/vmap_array_ops.py +27 -25
  261. mindspore/ops/_vmap/vmap_base.py +0 -2
  262. mindspore/ops/_vmap/vmap_grad_nn_ops.py +21 -14
  263. mindspore/ops/_vmap/vmap_math_ops.py +15 -16
  264. mindspore/ops/_vmap/vmap_nn_ops.py +29 -42
  265. mindspore/ops/auto_generate/__init__.py +4 -3
  266. mindspore/ops/auto_generate/cpp_create_prim_instance_helper.py +236 -46
  267. mindspore/ops/auto_generate/gen_extend_func.py +764 -124
  268. mindspore/ops/auto_generate/gen_ops_def.py +4018 -2264
  269. mindspore/ops/auto_generate/gen_ops_prim.py +15463 -5037
  270. mindspore/ops/auto_generate/pyboost_inner_prim.py +221 -87
  271. mindspore/ops/composite/__init__.py +2 -1
  272. mindspore/ops/composite/base.py +20 -25
  273. mindspore/ops/composite/math_ops.py +6 -16
  274. mindspore/ops/composite/multitype_ops/__init__.py +5 -2
  275. mindspore/ops/composite/multitype_ops/_compile_utils.py +228 -30
  276. mindspore/ops/composite/multitype_ops/_constexpr_utils.py +1 -2
  277. mindspore/ops/composite/multitype_ops/add_impl.py +2 -1
  278. mindspore/ops/composite/multitype_ops/bitwise_and_impl.py +2 -1
  279. mindspore/ops/composite/multitype_ops/bitwise_or_impl.py +2 -1
  280. mindspore/ops/composite/multitype_ops/bitwise_xor_impl.py +2 -1
  281. mindspore/ops/composite/multitype_ops/div_impl.py +6 -4
  282. mindspore/ops/composite/multitype_ops/equal_impl.py +4 -3
  283. mindspore/ops/composite/multitype_ops/floordiv_impl.py +2 -1
  284. mindspore/ops/composite/multitype_ops/getitem_impl.py +3 -2
  285. mindspore/ops/composite/multitype_ops/greater_equal_impl.py +4 -3
  286. mindspore/ops/composite/multitype_ops/greater_impl.py +4 -3
  287. mindspore/ops/composite/multitype_ops/in_impl.py +2 -1
  288. mindspore/ops/composite/multitype_ops/invert_impl.py +50 -0
  289. mindspore/ops/composite/multitype_ops/left_shift_impl.py +2 -1
  290. mindspore/ops/composite/multitype_ops/less_equal_impl.py +4 -3
  291. mindspore/ops/composite/multitype_ops/less_impl.py +4 -3
  292. mindspore/ops/composite/multitype_ops/logic_not_impl.py +3 -2
  293. mindspore/ops/composite/multitype_ops/logical_and_impl.py +2 -1
  294. mindspore/ops/composite/multitype_ops/logical_or_impl.py +2 -1
  295. mindspore/ops/composite/multitype_ops/mod_impl.py +2 -1
  296. mindspore/ops/composite/multitype_ops/mul_impl.py +3 -2
  297. mindspore/ops/composite/multitype_ops/negative_impl.py +2 -1
  298. mindspore/ops/composite/multitype_ops/not_equal_impl.py +2 -1
  299. mindspore/ops/composite/multitype_ops/not_in_impl.py +2 -1
  300. mindspore/ops/composite/multitype_ops/ones_like_impl.py +18 -0
  301. mindspore/ops/composite/multitype_ops/pow_impl.py +2 -30
  302. mindspore/ops/composite/multitype_ops/right_shift_impl.py +2 -1
  303. mindspore/ops/composite/multitype_ops/setitem_impl.py +2 -1
  304. mindspore/ops/composite/multitype_ops/sub_impl.py +2 -1
  305. mindspore/ops/function/__init__.py +40 -2
  306. mindspore/ops/function/_add_attr_func.py +58 -0
  307. mindspore/ops/function/array_func.py +2089 -2403
  308. mindspore/ops/function/clip_func.py +80 -23
  309. mindspore/ops/function/debug_func.py +57 -57
  310. mindspore/ops/function/grad/__init__.py +1 -0
  311. mindspore/ops/function/grad/grad_func.py +104 -71
  312. mindspore/ops/function/image_func.py +2 -2
  313. mindspore/ops/function/linalg_func.py +47 -78
  314. mindspore/ops/function/math_func.py +4501 -3802
  315. mindspore/ops/function/nn_func.py +1726 -620
  316. mindspore/ops/function/other_func.py +159 -1
  317. mindspore/ops/function/parameter_func.py +18 -84
  318. mindspore/ops/function/random_func.py +440 -387
  319. mindspore/ops/function/reshard_func.py +4 -70
  320. mindspore/ops/function/sparse_func.py +3 -3
  321. mindspore/ops/function/sparse_unary_func.py +6 -6
  322. mindspore/ops/function/spectral_func.py +25 -58
  323. mindspore/ops/function/vmap_func.py +24 -17
  324. mindspore/ops/functional.py +22 -7
  325. mindspore/ops/functional_overload.py +1440 -0
  326. mindspore/ops/op_info_register.py +32 -244
  327. mindspore/ops/operations/__init__.py +13 -7
  328. mindspore/ops/operations/_custom_ops_utils.py +247 -0
  329. mindspore/ops/operations/_embedding_cache_ops.py +4 -4
  330. mindspore/ops/operations/_grad_ops.py +2 -43
  331. mindspore/ops/operations/_infer_ops.py +2 -1
  332. mindspore/ops/operations/_inner_ops.py +43 -84
  333. mindspore/ops/operations/_ms_kernel.py +4 -10
  334. mindspore/ops/operations/_rl_inner_ops.py +1 -1
  335. mindspore/ops/operations/_scalar_ops.py +3 -2
  336. mindspore/ops/operations/_sequence_ops.py +1 -1
  337. mindspore/ops/operations/_tensor_array.py +1 -1
  338. mindspore/ops/operations/array_ops.py +81 -324
  339. mindspore/ops/operations/comm_ops.py +154 -108
  340. mindspore/ops/operations/custom_ops.py +232 -78
  341. mindspore/ops/operations/debug_ops.py +153 -59
  342. mindspore/ops/operations/inner_ops.py +7 -5
  343. mindspore/ops/operations/linalg_ops.py +1 -57
  344. mindspore/ops/operations/manually_defined/_inner.py +1 -1
  345. mindspore/ops/operations/manually_defined/ops_def.py +928 -180
  346. mindspore/ops/operations/math_ops.py +32 -234
  347. mindspore/ops/operations/nn_ops.py +210 -498
  348. mindspore/ops/operations/other_ops.py +62 -9
  349. mindspore/ops/operations/random_ops.py +13 -7
  350. mindspore/ops/operations/reshard_ops.py +1 -1
  351. mindspore/ops/operations/sparse_ops.py +2 -2
  352. mindspore/ops/primitive.py +66 -53
  353. mindspore/ops/tensor_method.py +1888 -0
  354. mindspore/ops_generate/__init__.py +0 -5
  355. mindspore/ops_generate/aclnn/__init__.py +0 -0
  356. mindspore/ops_generate/aclnn/aclnn_kernel_register_auto_cc_generator.py +135 -0
  357. mindspore/ops_generate/aclnn/gen_aclnn_implement.py +257 -0
  358. mindspore/ops_generate/api/__init__.py +0 -0
  359. mindspore/ops_generate/api/add_tensor_docs_generator.py +56 -0
  360. mindspore/ops_generate/api/cpp_create_prim_instance_helper_generator.py +105 -0
  361. mindspore/ops_generate/api/functional_map_cpp_generator.py +504 -0
  362. mindspore/ops_generate/api/functional_overload_py_generator.py +112 -0
  363. mindspore/ops_generate/api/functions_cc_generator.py +237 -0
  364. mindspore/ops_generate/api/gen_api.py +103 -0
  365. mindspore/ops_generate/api/op_api_proto.py +235 -0
  366. mindspore/ops_generate/api/tensor_func_reg_cpp_generator.py +461 -0
  367. mindspore/ops_generate/common/__init__.py +0 -0
  368. mindspore/ops_generate/common/base_generator.py +11 -0
  369. mindspore/ops_generate/common/gen_constants.py +91 -0
  370. mindspore/ops_generate/common/gen_utils.py +348 -0
  371. mindspore/ops_generate/common/op_proto.py +473 -0
  372. mindspore/ops_generate/common/template.py +523 -0
  373. mindspore/ops_generate/gen_ops.py +22 -1069
  374. mindspore/ops_generate/op_def/__init__.py +0 -0
  375. mindspore/ops_generate/op_def/gen_op_def.py +90 -0
  376. mindspore/ops_generate/op_def/lite_ops_cpp_generator.py +191 -0
  377. mindspore/ops_generate/op_def/ops_def_cc_generator.py +299 -0
  378. mindspore/ops_generate/op_def/ops_def_h_generator.py +74 -0
  379. mindspore/ops_generate/op_def/ops_name_h_generator.py +83 -0
  380. mindspore/ops_generate/op_def/ops_primitive_h_generator.py +125 -0
  381. mindspore/ops_generate/op_def_py/__init__.py +0 -0
  382. mindspore/ops_generate/op_def_py/gen_op_def_py.py +47 -0
  383. mindspore/ops_generate/op_def_py/op_def_py_generator.py +132 -0
  384. mindspore/ops_generate/op_def_py/op_prim_py_generator.py +489 -0
  385. mindspore/ops_generate/pyboost/__init__.py +0 -0
  386. mindspore/ops_generate/pyboost/auto_grad_impl_cc_generator.py +139 -0
  387. mindspore/ops_generate/pyboost/auto_grad_reg_cc_generator.py +93 -0
  388. mindspore/ops_generate/pyboost/gen_pyboost_func.py +175 -0
  389. mindspore/ops_generate/pyboost/op_template_parser.py +517 -0
  390. mindspore/ops_generate/pyboost/pyboost_functions_cpp_generator.py +407 -0
  391. mindspore/ops_generate/pyboost/pyboost_functions_h_generator.py +100 -0
  392. mindspore/ops_generate/pyboost/pyboost_functions_py_generator.py +148 -0
  393. mindspore/ops_generate/pyboost/pyboost_grad_function_cpp_generator.py +155 -0
  394. mindspore/ops_generate/pyboost/pyboost_inner_prim_generator.py +132 -0
  395. mindspore/ops_generate/pyboost/pyboost_native_grad_functions_generator.py +272 -0
  396. mindspore/ops_generate/pyboost/pyboost_op_cpp_code_generator.py +938 -0
  397. mindspore/ops_generate/pyboost/pyboost_overload_functions_cpp_generator.py +357 -0
  398. mindspore/ops_generate/{pyboost_utils.py → pyboost/pyboost_utils.py} +179 -36
  399. mindspore/ops_generate/resources/__init__.py +0 -0
  400. mindspore/ops_generate/resources/resource_list.py +30 -0
  401. mindspore/ops_generate/resources/resource_loader.py +36 -0
  402. mindspore/ops_generate/resources/resource_manager.py +64 -0
  403. mindspore/ops_generate/resources/yaml_loader.py +88 -0
  404. mindspore/ops_generate/tensor_py_cc_generator.py +122 -0
  405. mindspore/parallel/__init__.py +7 -3
  406. mindspore/parallel/_auto_parallel_context.py +152 -34
  407. mindspore/parallel/_cell_wrapper.py +130 -15
  408. mindspore/parallel/_parallel_serialization.py +107 -5
  409. mindspore/parallel/_ps_context.py +1 -1
  410. mindspore/parallel/_recovery_context.py +7 -2
  411. mindspore/parallel/_tensor.py +142 -18
  412. mindspore/parallel/_utils.py +199 -23
  413. mindspore/parallel/algo_parameter_config.py +4 -4
  414. mindspore/parallel/auto_parallel.py +732 -0
  415. mindspore/parallel/checkpoint_convert.py +159 -0
  416. mindspore/parallel/checkpoint_transform.py +698 -35
  417. mindspore/parallel/cluster/process_entity/_api.py +276 -50
  418. mindspore/parallel/cluster/process_entity/_utils.py +41 -6
  419. mindspore/parallel/cluster/run.py +21 -4
  420. mindspore/parallel/function/__init__.py +24 -0
  421. mindspore/parallel/function/reshard_func.py +259 -0
  422. mindspore/parallel/nn/__init__.py +25 -0
  423. mindspore/parallel/nn/parallel_cell_wrapper.py +263 -0
  424. mindspore/parallel/nn/parallel_grad_reducer.py +169 -0
  425. mindspore/parallel/parameter_broadcast.py +25 -14
  426. mindspore/parallel/shard.py +137 -58
  427. mindspore/parallel/transform_safetensors.py +363 -305
  428. mindspore/profiler/__init__.py +22 -5
  429. mindspore/profiler/analysis/__init__.py +0 -0
  430. mindspore/profiler/analysis/parser/__init__.py +0 -0
  431. mindspore/profiler/analysis/parser/ascend_cann_parser.py +170 -0
  432. mindspore/profiler/analysis/parser/base_parser.py +158 -0
  433. mindspore/profiler/analysis/parser/framework_cann_relation_parser.py +45 -0
  434. mindspore/profiler/analysis/parser/ms_framework_parser.py +142 -0
  435. mindspore/profiler/analysis/parser/ms_minddata_parser.py +145 -0
  436. mindspore/profiler/analysis/parser/timeline_assembly_factory/__init__.py +0 -0
  437. mindspore/profiler/analysis/parser/timeline_assembly_factory/ascend_timeline_assembler.py +264 -0
  438. mindspore/profiler/analysis/parser/timeline_assembly_factory/base_timeline_assembler.py +40 -0
  439. mindspore/profiler/analysis/parser/timeline_assembly_factory/trace_view_container.py +106 -0
  440. mindspore/profiler/analysis/parser/timeline_creator/__init__.py +0 -0
  441. mindspore/profiler/analysis/parser/timeline_creator/base_timeline_creator.py +44 -0
  442. mindspore/profiler/analysis/parser/timeline_creator/cpu_op_timeline_creator.py +90 -0
  443. mindspore/profiler/analysis/parser/timeline_creator/fwk_timeline_creator.py +76 -0
  444. mindspore/profiler/analysis/parser/timeline_creator/msprof_timeline_creator.py +103 -0
  445. mindspore/profiler/analysis/parser/timeline_creator/scope_layer_timeline_creator.py +134 -0
  446. mindspore/profiler/analysis/parser/timeline_event/__init__.py +0 -0
  447. mindspore/profiler/analysis/parser/timeline_event/base_event.py +233 -0
  448. mindspore/profiler/analysis/parser/timeline_event/cpu_op_event.py +47 -0
  449. mindspore/profiler/analysis/parser/timeline_event/flow_event.py +36 -0
  450. mindspore/profiler/analysis/parser/timeline_event/fwk_event.py +415 -0
  451. mindspore/profiler/analysis/parser/timeline_event/msprof_event.py +73 -0
  452. mindspore/profiler/analysis/parser/timeline_event/scope_layer_event.py +53 -0
  453. mindspore/profiler/analysis/parser/timeline_event/timeline_event_pool.py +146 -0
  454. mindspore/profiler/analysis/task_manager.py +131 -0
  455. mindspore/profiler/analysis/time_converter.py +84 -0
  456. mindspore/profiler/analysis/viewer/__init__.py +0 -0
  457. mindspore/profiler/analysis/viewer/ascend_communication_viewer.py +372 -0
  458. mindspore/profiler/analysis/viewer/ascend_integrate_viewer.py +87 -0
  459. mindspore/profiler/analysis/viewer/ascend_kernel_details_viewer.py +250 -0
  460. mindspore/profiler/analysis/viewer/ascend_memory_viewer.py +320 -0
  461. mindspore/profiler/analysis/viewer/ascend_op_memory_viewer.py +327 -0
  462. mindspore/profiler/analysis/viewer/ascend_step_trace_time_viewer.py +376 -0
  463. mindspore/profiler/analysis/viewer/ascend_timeline_viewer.py +58 -0
  464. mindspore/profiler/analysis/viewer/base_viewer.py +26 -0
  465. mindspore/profiler/analysis/viewer/ms_dataset_viewer.py +96 -0
  466. mindspore/profiler/analysis/viewer/ms_minddata_viewer.py +581 -0
  467. mindspore/profiler/analysis/work_flow.py +73 -0
  468. mindspore/profiler/common/ascend_msprof_exporter.py +139 -0
  469. mindspore/profiler/common/command_executor.py +90 -0
  470. mindspore/profiler/common/constant.py +186 -3
  471. mindspore/profiler/common/file_manager.py +208 -0
  472. mindspore/profiler/common/log.py +130 -0
  473. mindspore/profiler/common/msprof_cmd_tool.py +221 -0
  474. mindspore/profiler/common/path_manager.py +395 -0
  475. mindspore/profiler/common/process_bar.py +168 -0
  476. mindspore/profiler/common/process_pool.py +9 -3
  477. mindspore/profiler/common/profiler_context.py +500 -0
  478. mindspore/profiler/common/profiler_info.py +304 -0
  479. mindspore/profiler/common/profiler_meta_data.py +74 -0
  480. mindspore/profiler/common/profiler_output_path.py +284 -0
  481. mindspore/profiler/common/profiler_parameters.py +251 -0
  482. mindspore/profiler/common/profiler_path_manager.py +179 -0
  483. mindspore/profiler/common/record_function.py +76 -0
  484. mindspore/profiler/common/tlv_decoder.py +76 -0
  485. mindspore/profiler/common/util.py +75 -2
  486. mindspore/profiler/dynamic_profiler.py +341 -75
  487. mindspore/profiler/envprofiler.py +163 -0
  488. mindspore/profiler/experimental_config.py +197 -0
  489. mindspore/profiler/mstx.py +242 -0
  490. mindspore/profiler/platform/__init__.py +21 -0
  491. mindspore/profiler/platform/base_profiler.py +40 -0
  492. mindspore/profiler/platform/cpu_profiler.py +124 -0
  493. mindspore/profiler/platform/gpu_profiler.py +74 -0
  494. mindspore/profiler/platform/npu_profiler.py +335 -0
  495. mindspore/profiler/profiler.py +1073 -90
  496. mindspore/profiler/profiler_action_controller.py +187 -0
  497. mindspore/profiler/profiler_interface.py +118 -0
  498. mindspore/profiler/schedule.py +243 -0
  499. mindspore/rewrite/api/node.py +15 -13
  500. mindspore/rewrite/api/symbol_tree.py +2 -3
  501. mindspore/run_check/_check_version.py +27 -20
  502. mindspore/run_check/run_check.py +1 -1
  503. mindspore/runtime/__init__.py +37 -0
  504. mindspore/runtime/device.py +27 -0
  505. mindspore/runtime/event.py +209 -0
  506. mindspore/runtime/executor.py +177 -0
  507. mindspore/runtime/memory.py +409 -0
  508. mindspore/runtime/stream.py +460 -0
  509. mindspore/runtime/thread_bind_core.py +401 -0
  510. mindspore/safeguard/rewrite_obfuscation.py +12 -9
  511. mindspore/swresample-4.dll +0 -0
  512. mindspore/swscale-6.dll +0 -0
  513. mindspore/tinyxml2.dll +0 -0
  514. mindspore/train/__init__.py +8 -8
  515. mindspore/train/_utils.py +88 -25
  516. mindspore/train/amp.py +9 -5
  517. mindspore/train/callback/__init__.py +2 -2
  518. mindspore/train/callback/_callback.py +2 -16
  519. mindspore/train/callback/_checkpoint.py +53 -55
  520. mindspore/train/callback/_cluster_monitor.py +14 -18
  521. mindspore/train/callback/_early_stop.py +1 -1
  522. mindspore/train/callback/_flops_collector.py +103 -68
  523. mindspore/train/callback/_history.py +8 -5
  524. mindspore/train/callback/_lambda_callback.py +2 -2
  525. mindspore/train/callback/_landscape.py +0 -3
  526. mindspore/train/callback/_loss_monitor.py +2 -1
  527. mindspore/train/callback/_on_request_exit.py +6 -5
  528. mindspore/train/callback/_reduce_lr_on_plateau.py +11 -6
  529. mindspore/train/callback/_summary_collector.py +52 -19
  530. mindspore/train/callback/_time_monitor.py +2 -1
  531. mindspore/train/callback/{_tft_register.py → _train_fault_tolerance.py} +204 -107
  532. mindspore/train/data_sink.py +25 -2
  533. mindspore/train/dataset_helper.py +15 -16
  534. mindspore/train/loss_scale_manager.py +8 -7
  535. mindspore/train/metrics/accuracy.py +3 -3
  536. mindspore/train/metrics/confusion_matrix.py +9 -9
  537. mindspore/train/metrics/error.py +3 -3
  538. mindspore/train/metrics/hausdorff_distance.py +4 -4
  539. mindspore/train/metrics/mean_surface_distance.py +3 -3
  540. mindspore/train/metrics/metric.py +0 -12
  541. mindspore/train/metrics/occlusion_sensitivity.py +4 -2
  542. mindspore/train/metrics/precision.py +11 -10
  543. mindspore/train/metrics/recall.py +9 -9
  544. mindspore/train/metrics/root_mean_square_surface_distance.py +2 -2
  545. mindspore/train/mind_ir_pb2.py +174 -46
  546. mindspore/train/model.py +184 -113
  547. mindspore/train/serialization.py +622 -978
  548. mindspore/train/summary/_summary_adapter.py +2 -2
  549. mindspore/train/summary/summary_record.py +2 -3
  550. mindspore/train/train_thor/model_thor.py +1 -1
  551. mindspore/turbojpeg.dll +0 -0
  552. mindspore/utils/__init__.py +6 -3
  553. mindspore/utils/dryrun.py +140 -0
  554. mindspore/utils/hooks.py +81 -0
  555. mindspore/utils/runtime_execution_order_check.py +550 -0
  556. mindspore/utils/utils.py +138 -4
  557. mindspore/version.py +1 -1
  558. {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/METADATA +3 -3
  559. {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/RECORD +562 -393
  560. {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/entry_points.txt +1 -1
  561. mindspore/_install_custom.py +0 -43
  562. mindspore/common/_register_for_adapter.py +0 -74
  563. mindspore/common/_tensor_overload.py +0 -139
  564. mindspore/mindspore_np_dtype.dll +0 -0
  565. mindspore/ops/auto_generate/gen_arg_dtype_cast.py +0 -252
  566. mindspore/ops/auto_generate/gen_arg_handler.py +0 -197
  567. mindspore/ops/operations/_opaque_predicate_registry.py +0 -41
  568. mindspore/ops_generate/gen_aclnn_implement.py +0 -263
  569. mindspore/ops_generate/gen_ops_inner_prim.py +0 -131
  570. mindspore/ops_generate/gen_pyboost_func.py +0 -1052
  571. mindspore/ops_generate/gen_utils.py +0 -209
  572. mindspore/ops_generate/op_proto.py +0 -145
  573. mindspore/ops_generate/template.py +0 -261
  574. mindspore/profiler/envprofiling.py +0 -254
  575. mindspore/profiler/profiling.py +0 -1926
  576. {mindspore-2.4.10.dist-info → mindspore-2.6.0rc1.dist-info}/WHEEL +0 -0
  577. {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)