mindspore 2.4.10__cp311-cp311-win_amd64.whl → 2.5.0__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.

Files changed (366) hide show
  1. mindspore/.commit_id +1 -1
  2. mindspore/__init__.py +8 -3
  3. mindspore/_c_dataengine.cp311-win_amd64.pyd +0 -0
  4. mindspore/_c_expression.cp311-win_amd64.pyd +0 -0
  5. mindspore/_c_mindrecord.cp311-win_amd64.pyd +0 -0
  6. mindspore/_checkparam.py +0 -5
  7. mindspore/_extends/parallel_compile/akg_compiler/gen_custom_op_files.py +1 -1
  8. mindspore/_extends/parse/compile_config.py +64 -0
  9. mindspore/_extends/parse/deprecated/__init__.py +0 -0
  10. mindspore/_extends/parse/deprecated/deprecated_tensor_method.py +375 -0
  11. mindspore/_extends/parse/parser.py +23 -5
  12. mindspore/_extends/parse/standard_method.py +123 -27
  13. mindspore/_extends/pijit/pijit_func_white_list.py +1 -1
  14. mindspore/amp.py +7 -1
  15. mindspore/avcodec-59.dll +0 -0
  16. mindspore/avdevice-59.dll +0 -0
  17. mindspore/avfilter-8.dll +0 -0
  18. mindspore/avformat-59.dll +0 -0
  19. mindspore/avutil-57.dll +0 -0
  20. mindspore/boost/boost_cell_wrapper.py +136 -41
  21. mindspore/common/__init__.py +3 -1
  22. mindspore/common/_register_for_tensor.py +0 -1
  23. mindspore/common/_stub_tensor.py +25 -4
  24. mindspore/common/_tensor_cpp_method.py +17 -0
  25. mindspore/common/_tensor_docs.py +6132 -0
  26. mindspore/common/api.py +98 -21
  27. mindspore/common/dtype.py +34 -34
  28. mindspore/common/dump.py +2 -1
  29. mindspore/common/file_system.py +8 -3
  30. mindspore/common/generator.py +2 -0
  31. mindspore/common/hook_handle.py +3 -1
  32. mindspore/common/initializer.py +3 -4
  33. mindspore/common/lazy_inline.py +8 -2
  34. mindspore/common/mindir_util.py +10 -2
  35. mindspore/common/parameter.py +31 -15
  36. mindspore/common/tensor.py +713 -1337
  37. mindspore/communication/__init__.py +1 -1
  38. mindspore/communication/_comm_helper.py +5 -0
  39. mindspore/communication/comm_func.py +215 -173
  40. mindspore/communication/management.py +23 -20
  41. mindspore/context.py +285 -191
  42. mindspore/dataset/__init__.py +23 -19
  43. mindspore/dataset/callback/ds_callback.py +2 -1
  44. mindspore/dataset/core/config.py +84 -3
  45. mindspore/dataset/engine/cache_admin.py +3 -3
  46. mindspore/dataset/engine/cache_client.py +5 -4
  47. mindspore/dataset/engine/datasets.py +192 -149
  48. mindspore/dataset/engine/datasets_audio.py +14 -0
  49. mindspore/dataset/engine/datasets_standard_format.py +11 -11
  50. mindspore/dataset/engine/datasets_text.py +38 -1
  51. mindspore/dataset/engine/datasets_user_defined.py +100 -66
  52. mindspore/dataset/engine/datasets_vision.py +81 -8
  53. mindspore/dataset/engine/iterators.py +281 -63
  54. mindspore/dataset/engine/obs/util.py +8 -0
  55. mindspore/dataset/engine/queue.py +40 -0
  56. mindspore/dataset/engine/samplers.py +26 -2
  57. mindspore/dataset/engine/serializer_deserializer.py +1 -1
  58. mindspore/dataset/engine/validators.py +43 -11
  59. mindspore/dataset/transforms/py_transforms_util.py +17 -0
  60. mindspore/dataset/transforms/transforms.py +29 -12
  61. mindspore/dataset/vision/validators.py +1 -2
  62. mindspore/device_context/__init__.py +21 -0
  63. mindspore/device_context/ascend/__init__.py +25 -0
  64. mindspore/device_context/ascend/device.py +72 -0
  65. mindspore/device_context/ascend/op_debug.py +94 -0
  66. mindspore/device_context/ascend/op_precision.py +193 -0
  67. mindspore/device_context/ascend/op_tuning.py +127 -0
  68. mindspore/device_context/cpu/__init__.py +25 -0
  69. mindspore/device_context/cpu/device.py +62 -0
  70. mindspore/device_context/cpu/op_tuning.py +43 -0
  71. mindspore/device_context/gpu/__init__.py +21 -0
  72. mindspore/device_context/gpu/device.py +70 -0
  73. mindspore/device_context/gpu/op_precision.py +67 -0
  74. mindspore/device_context/gpu/op_tuning.py +175 -0
  75. mindspore/device_manager.py +134 -0
  76. mindspore/dnnl.dll +0 -0
  77. mindspore/experimental/llm_boost/__init__.py +1 -0
  78. mindspore/experimental/llm_boost/ascend_native/__init__.py +22 -0
  79. mindspore/experimental/llm_boost/ascend_native/llama_boost_ascend_native.py +211 -0
  80. mindspore/experimental/llm_boost/ascend_native/llm_boost.py +52 -0
  81. mindspore/experimental/llm_boost/atb/boost_base.py +2 -3
  82. mindspore/experimental/llm_boost/atb/llama_boost.py +6 -1
  83. mindspore/experimental/llm_boost/register.py +1 -0
  84. mindspore/experimental/optim/adadelta.py +26 -22
  85. mindspore/experimental/optim/adam.py +3 -0
  86. mindspore/experimental/optim/lr_scheduler.py +33 -24
  87. mindspore/experimental/optim/radam.py +33 -30
  88. mindspore/hal/device.py +28 -0
  89. mindspore/hal/event.py +17 -0
  90. mindspore/hal/memory.py +94 -3
  91. mindspore/hal/stream.py +91 -6
  92. mindspore/include/api/context.h +0 -1
  93. mindspore/jpeg62.dll +0 -0
  94. mindspore/log.py +12 -0
  95. mindspore/mindrecord/__init__.py +1 -1
  96. mindspore/mindrecord/config.py +17 -316
  97. mindspore/mindrecord/filereader.py +1 -9
  98. mindspore/mindrecord/filewriter.py +5 -15
  99. mindspore/mindrecord/mindpage.py +1 -9
  100. mindspore/mindspore_backend.dll +0 -0
  101. mindspore/mindspore_common.dll +0 -0
  102. mindspore/mindspore_core.dll +0 -0
  103. mindspore/mindspore_glog.dll +0 -0
  104. mindspore/mindspore_ops.dll +0 -0
  105. mindspore/mint/__init__.py +824 -218
  106. mindspore/mint/distributed/__init__.py +66 -4
  107. mindspore/mint/distributed/distributed.py +2594 -44
  108. mindspore/mint/linalg/__init__.py +6 -0
  109. mindspore/mint/nn/__init__.py +473 -14
  110. mindspore/mint/nn/functional.py +486 -11
  111. mindspore/mint/nn/layer/__init__.py +17 -4
  112. mindspore/mint/nn/layer/_functions.py +330 -0
  113. mindspore/mint/nn/layer/activation.py +169 -1
  114. mindspore/mint/nn/layer/basic.py +123 -0
  115. mindspore/mint/nn/layer/conv.py +727 -0
  116. mindspore/mint/nn/layer/normalization.py +215 -19
  117. mindspore/mint/nn/layer/padding.py +797 -0
  118. mindspore/mint/nn/layer/pooling.py +170 -0
  119. mindspore/mint/optim/__init__.py +2 -1
  120. mindspore/mint/optim/adam.py +223 -0
  121. mindspore/mint/optim/adamw.py +26 -19
  122. mindspore/mint/special/__init__.py +2 -1
  123. mindspore/multiprocessing/__init__.py +5 -0
  124. mindspore/nn/cell.py +126 -19
  125. mindspore/nn/dynamic_lr.py +2 -1
  126. mindspore/nn/layer/activation.py +6 -6
  127. mindspore/nn/layer/basic.py +35 -25
  128. mindspore/nn/layer/channel_shuffle.py +3 -3
  129. mindspore/nn/layer/embedding.py +3 -3
  130. mindspore/nn/layer/normalization.py +8 -7
  131. mindspore/nn/layer/padding.py +4 -3
  132. mindspore/nn/layer/pooling.py +47 -13
  133. mindspore/nn/layer/rnn_cells.py +1 -1
  134. mindspore/nn/layer/rnns.py +2 -1
  135. mindspore/nn/layer/timedistributed.py +5 -5
  136. mindspore/nn/layer/transformer.py +48 -26
  137. mindspore/nn/learning_rate_schedule.py +5 -3
  138. mindspore/nn/loss/loss.py +31 -36
  139. mindspore/nn/optim/ada_grad.py +1 -0
  140. mindspore/nn/optim/adadelta.py +2 -2
  141. mindspore/nn/optim/adam.py +1 -1
  142. mindspore/nn/optim/lars.py +1 -4
  143. mindspore/nn/optim/optimizer.py +1 -1
  144. mindspore/nn/optim/rprop.py +2 -2
  145. mindspore/nn/optim/thor.py +2 -1
  146. mindspore/nn/utils/init.py +13 -11
  147. mindspore/nn/wrap/cell_wrapper.py +4 -6
  148. mindspore/nn/wrap/loss_scale.py +3 -4
  149. mindspore/numpy/array_creations.py +60 -62
  150. mindspore/numpy/array_ops.py +148 -143
  151. mindspore/numpy/logic_ops.py +41 -42
  152. mindspore/numpy/math_ops.py +361 -359
  153. mindspore/numpy/utils.py +16 -16
  154. mindspore/numpy/utils_const.py +4 -4
  155. mindspore/opencv_core452.dll +0 -0
  156. mindspore/opencv_imgcodecs452.dll +0 -0
  157. mindspore/opencv_imgproc452.dll +0 -0
  158. mindspore/ops/__init__.py +2 -1
  159. mindspore/ops/_grad_experimental/grad_comm_ops.py +94 -13
  160. mindspore/ops/_grad_experimental/grad_debug_ops.py +6 -1
  161. mindspore/ops/_grad_experimental/grad_inner_ops.py +9 -0
  162. mindspore/ops/_grad_experimental/grad_math_ops.py +2 -1
  163. mindspore/ops/_op_impl/cpu/__init__.py +1 -0
  164. mindspore/ops/_op_impl/cpu/raise_op.py +28 -0
  165. mindspore/ops/_vmap/vmap_array_ops.py +20 -19
  166. mindspore/ops/_vmap/vmap_base.py +0 -2
  167. mindspore/ops/_vmap/vmap_grad_nn_ops.py +19 -13
  168. mindspore/ops/_vmap/vmap_math_ops.py +11 -9
  169. mindspore/ops/_vmap/vmap_nn_ops.py +20 -34
  170. mindspore/ops/auto_generate/cpp_create_prim_instance_helper.py +149 -12
  171. mindspore/ops/auto_generate/gen_arg_handler.py +0 -61
  172. mindspore/ops/auto_generate/gen_extend_func.py +554 -60
  173. mindspore/ops/auto_generate/gen_ops_def.py +1621 -115
  174. mindspore/ops/auto_generate/gen_ops_prim.py +8024 -3409
  175. mindspore/ops/auto_generate/pyboost_inner_prim.py +183 -79
  176. mindspore/ops/composite/base.py +1 -1
  177. mindspore/ops/composite/multitype_ops/_compile_utils.py +229 -30
  178. mindspore/ops/composite/multitype_ops/pow_impl.py +0 -29
  179. mindspore/ops/function/__init__.py +12 -0
  180. mindspore/ops/function/array_func.py +561 -159
  181. mindspore/ops/function/clip_func.py +64 -0
  182. mindspore/ops/function/debug_func.py +28 -20
  183. mindspore/ops/function/image_func.py +1 -1
  184. mindspore/ops/function/linalg_func.py +5 -4
  185. mindspore/ops/function/math_func.py +1659 -290
  186. mindspore/ops/function/nn_func.py +988 -317
  187. mindspore/ops/function/parameter_func.py +3 -56
  188. mindspore/ops/function/random_func.py +243 -33
  189. mindspore/ops/function/sparse_unary_func.py +1 -1
  190. mindspore/ops/functional.py +18 -5
  191. mindspore/ops/functional_overload.py +897 -0
  192. mindspore/ops/operations/__init__.py +3 -2
  193. mindspore/ops/operations/_embedding_cache_ops.py +4 -4
  194. mindspore/ops/operations/_grad_ops.py +2 -34
  195. mindspore/ops/operations/_infer_ops.py +2 -1
  196. mindspore/ops/operations/_inner_ops.py +38 -8
  197. mindspore/ops/operations/array_ops.py +45 -303
  198. mindspore/ops/operations/comm_ops.py +19 -16
  199. mindspore/ops/operations/custom_ops.py +11 -55
  200. mindspore/ops/operations/debug_ops.py +42 -47
  201. mindspore/ops/operations/inner_ops.py +6 -4
  202. mindspore/ops/operations/linalg_ops.py +3 -2
  203. mindspore/ops/operations/manually_defined/ops_def.py +185 -104
  204. mindspore/ops/operations/math_ops.py +11 -216
  205. mindspore/ops/operations/nn_ops.py +146 -308
  206. mindspore/ops/primitive.py +23 -21
  207. mindspore/ops/tensor_method.py +1669 -0
  208. mindspore/ops_generate/aclnn_kernel_register_auto_cc_generator.py +110 -0
  209. mindspore/ops_generate/add_tensor_docs_generator.py +54 -0
  210. mindspore/ops_generate/arg_handler.py +0 -61
  211. mindspore/ops_generate/auto_grad_impl_cc_generator.py +135 -0
  212. mindspore/ops_generate/auto_grad_reg_cc_generator.py +93 -0
  213. mindspore/ops_generate/base_generator.py +11 -0
  214. mindspore/ops_generate/cpp_create_prim_instance_helper_generator.py +108 -0
  215. mindspore/ops_generate/functional_map_cpp_generator.py +491 -0
  216. mindspore/ops_generate/functional_overload_py_generator.py +110 -0
  217. mindspore/ops_generate/functions_cc_generator.py +233 -0
  218. mindspore/ops_generate/gen_aclnn_implement.py +110 -114
  219. mindspore/ops_generate/gen_constants.py +157 -3
  220. mindspore/ops_generate/gen_ops.py +245 -990
  221. mindspore/ops_generate/gen_pyboost_func.py +97 -998
  222. mindspore/ops_generate/gen_utils.py +119 -33
  223. mindspore/ops_generate/lite_ops_cpp_generator.py +155 -0
  224. mindspore/ops_generate/op_api_proto.py +206 -0
  225. mindspore/ops_generate/op_def_py_generator.py +131 -0
  226. mindspore/ops_generate/op_prim_py_generator.py +480 -0
  227. mindspore/ops_generate/op_proto.py +373 -108
  228. mindspore/ops_generate/op_template_parser.py +436 -0
  229. mindspore/ops_generate/ops_def_cc_generator.py +288 -0
  230. mindspore/ops_generate/ops_def_h_generator.py +74 -0
  231. mindspore/ops_generate/ops_name_h_generator.py +68 -0
  232. mindspore/ops_generate/ops_primitive_h_generator.py +81 -0
  233. mindspore/ops_generate/pyboost_functions_cpp_generator.py +370 -0
  234. mindspore/ops_generate/pyboost_functions_h_generator.py +68 -0
  235. mindspore/ops_generate/pyboost_functions_py_generator.py +148 -0
  236. mindspore/ops_generate/pyboost_grad_function_cpp_generator.py +154 -0
  237. mindspore/ops_generate/pyboost_inner_prim_generator.py +131 -0
  238. mindspore/ops_generate/pyboost_native_grad_functions_generator.py +268 -0
  239. mindspore/ops_generate/pyboost_op_cpp_code_generator.py +851 -0
  240. mindspore/ops_generate/pyboost_overload_functions_cpp_generator.py +344 -0
  241. mindspore/ops_generate/pyboost_utils.py +92 -33
  242. mindspore/ops_generate/template.py +294 -44
  243. mindspore/ops_generate/tensor_func_reg_cpp_generator.py +422 -0
  244. mindspore/parallel/__init__.py +3 -3
  245. mindspore/parallel/_auto_parallel_context.py +24 -33
  246. mindspore/parallel/_parallel_serialization.py +13 -2
  247. mindspore/parallel/_utils.py +4 -1
  248. mindspore/parallel/algo_parameter_config.py +1 -1
  249. mindspore/parallel/checkpoint_transform.py +44 -0
  250. mindspore/parallel/cluster/process_entity/_api.py +131 -37
  251. mindspore/parallel/cluster/process_entity/_utils.py +41 -6
  252. mindspore/parallel/cluster/run.py +20 -3
  253. mindspore/parallel/parameter_broadcast.py +1 -1
  254. mindspore/parallel/shard.py +3 -0
  255. mindspore/parallel/transform_safetensors.py +119 -253
  256. mindspore/profiler/__init__.py +17 -4
  257. mindspore/profiler/analysis/__init__.py +0 -0
  258. mindspore/profiler/analysis/parser/__init__.py +0 -0
  259. mindspore/profiler/analysis/parser/ascend_cann_parser.py +166 -0
  260. mindspore/profiler/analysis/parser/base_parser.py +158 -0
  261. mindspore/profiler/analysis/parser/framework_cann_relation_parser.py +45 -0
  262. mindspore/profiler/analysis/parser/ms_framework_parser.py +142 -0
  263. mindspore/profiler/analysis/parser/ms_minddata_parser.py +145 -0
  264. mindspore/profiler/analysis/parser/timeline_assembly_factory/__init__.py +0 -0
  265. mindspore/profiler/analysis/parser/timeline_assembly_factory/ascend_timeline_assembler.py +261 -0
  266. mindspore/profiler/analysis/parser/timeline_assembly_factory/base_timeline_assembler.py +40 -0
  267. mindspore/profiler/analysis/parser/timeline_assembly_factory/trace_view_container.py +84 -0
  268. mindspore/profiler/analysis/parser/timeline_creator/__init__.py +0 -0
  269. mindspore/profiler/analysis/parser/timeline_creator/base_timeline_creator.py +44 -0
  270. mindspore/profiler/analysis/parser/timeline_creator/cpu_op_timeline_creator.py +90 -0
  271. mindspore/profiler/analysis/parser/timeline_creator/fwk_timeline_creator.py +76 -0
  272. mindspore/profiler/analysis/parser/timeline_creator/msprof_timeline_creator.py +103 -0
  273. mindspore/profiler/analysis/parser/timeline_creator/scope_layer_timeline_creator.py +134 -0
  274. mindspore/profiler/analysis/parser/timeline_event/__init__.py +0 -0
  275. mindspore/profiler/analysis/parser/timeline_event/base_event.py +233 -0
  276. mindspore/profiler/analysis/parser/timeline_event/cpu_op_event.py +47 -0
  277. mindspore/profiler/analysis/parser/timeline_event/flow_event.py +36 -0
  278. mindspore/profiler/analysis/parser/timeline_event/fwk_event.py +260 -0
  279. mindspore/profiler/analysis/parser/timeline_event/msprof_event.py +73 -0
  280. mindspore/profiler/analysis/parser/timeline_event/scope_layer_event.py +53 -0
  281. mindspore/profiler/analysis/parser/timeline_event/timeline_event_pool.py +146 -0
  282. mindspore/profiler/analysis/task_manager.py +131 -0
  283. mindspore/profiler/analysis/time_converter.py +84 -0
  284. mindspore/profiler/analysis/viewer/__init__.py +0 -0
  285. mindspore/profiler/analysis/viewer/ascend_communication_viewer.py +333 -0
  286. mindspore/profiler/analysis/viewer/ascend_integrate_viewer.py +87 -0
  287. mindspore/profiler/analysis/viewer/ascend_kernel_details_viewer.py +252 -0
  288. mindspore/profiler/analysis/viewer/ascend_memory_viewer.py +313 -0
  289. mindspore/profiler/analysis/viewer/ascend_op_memory_viewer.py +322 -0
  290. mindspore/profiler/analysis/viewer/ascend_step_trace_time_viewer.py +265 -0
  291. mindspore/profiler/analysis/viewer/ascend_timeline_viewer.py +58 -0
  292. mindspore/profiler/analysis/viewer/base_viewer.py +26 -0
  293. mindspore/profiler/analysis/viewer/ms_dataset_viewer.py +97 -0
  294. mindspore/profiler/analysis/viewer/ms_minddata_viewer.py +581 -0
  295. mindspore/profiler/analysis/work_flow.py +73 -0
  296. mindspore/profiler/common/ascend_msprof_exporter.py +138 -0
  297. mindspore/profiler/common/command_executor.py +90 -0
  298. mindspore/profiler/common/constant.py +174 -3
  299. mindspore/profiler/common/file_manager.py +208 -0
  300. mindspore/profiler/common/log.py +130 -0
  301. mindspore/profiler/common/msprof_cmd_tool.py +202 -0
  302. mindspore/profiler/common/path_manager.py +371 -0
  303. mindspore/profiler/common/process_bar.py +168 -0
  304. mindspore/profiler/common/process_pool.py +9 -3
  305. mindspore/profiler/common/profiler_context.py +476 -0
  306. mindspore/profiler/common/profiler_info.py +304 -0
  307. mindspore/profiler/common/profiler_output_path.py +284 -0
  308. mindspore/profiler/common/profiler_parameters.py +210 -0
  309. mindspore/profiler/common/profiler_path_manager.py +120 -0
  310. mindspore/profiler/common/record_function.py +76 -0
  311. mindspore/profiler/common/tlv_decoder.py +76 -0
  312. mindspore/profiler/common/util.py +75 -2
  313. mindspore/profiler/dynamic_profiler.py +270 -37
  314. mindspore/profiler/envprofiler.py +138 -0
  315. mindspore/profiler/mstx.py +199 -0
  316. mindspore/profiler/platform/__init__.py +21 -0
  317. mindspore/profiler/platform/base_profiler.py +40 -0
  318. mindspore/profiler/platform/cpu_profiler.py +124 -0
  319. mindspore/profiler/platform/gpu_profiler.py +74 -0
  320. mindspore/profiler/platform/npu_profiler.py +309 -0
  321. mindspore/profiler/profiler.py +580 -93
  322. mindspore/profiler/profiler_action_controller.py +187 -0
  323. mindspore/profiler/profiler_interface.py +114 -0
  324. mindspore/profiler/schedule.py +208 -0
  325. mindspore/rewrite/api/symbol_tree.py +1 -2
  326. mindspore/run_check/_check_version.py +2 -6
  327. mindspore/runtime/__init__.py +37 -0
  328. mindspore/runtime/device.py +27 -0
  329. mindspore/runtime/event.py +209 -0
  330. mindspore/runtime/executor.py +148 -0
  331. mindspore/runtime/memory.py +392 -0
  332. mindspore/runtime/stream.py +460 -0
  333. mindspore/runtime/thread_bind_core.py +401 -0
  334. mindspore/swresample-4.dll +0 -0
  335. mindspore/swscale-6.dll +0 -0
  336. mindspore/tinyxml2.dll +0 -0
  337. mindspore/train/__init__.py +2 -2
  338. mindspore/train/_utils.py +53 -18
  339. mindspore/train/amp.py +8 -4
  340. mindspore/train/callback/_checkpoint.py +32 -18
  341. mindspore/train/callback/_early_stop.py +1 -1
  342. mindspore/train/callback/_flops_collector.py +105 -69
  343. mindspore/train/callback/_history.py +1 -1
  344. mindspore/train/callback/_summary_collector.py +44 -6
  345. mindspore/train/callback/_tft_register.py +31 -10
  346. mindspore/train/dataset_helper.py +11 -11
  347. mindspore/train/metrics/precision.py +4 -5
  348. mindspore/train/mind_ir_pb2.py +167 -46
  349. mindspore/train/model.py +13 -15
  350. mindspore/train/serialization.py +462 -76
  351. mindspore/train/summary/summary_record.py +1 -2
  352. mindspore/train/train_thor/model_thor.py +1 -1
  353. mindspore/turbojpeg.dll +0 -0
  354. mindspore/utils/__init__.py +4 -2
  355. mindspore/utils/dryrun.py +138 -0
  356. mindspore/utils/runtime_execution_order_check.py +550 -0
  357. mindspore/version.py +1 -1
  358. {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/METADATA +2 -3
  359. {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/RECORD +362 -238
  360. {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/entry_points.txt +1 -1
  361. mindspore/common/_tensor_overload.py +0 -139
  362. mindspore/mindspore_np_dtype.dll +0 -0
  363. mindspore/profiler/envprofiling.py +0 -254
  364. mindspore/profiler/profiling.py +0 -1926
  365. {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/WHEEL +0 -0
  366. {mindspore-2.4.10.dist-info → mindspore-2.5.0.dist-info}/top_level.txt +0 -0
@@ -15,19 +15,24 @@
15
15
  """Built-in iterators"""
16
16
  from abc import abstractmethod
17
17
  from copy import deepcopy
18
+ import atexit
18
19
  import json
19
20
  import os
21
+ import queue
20
22
  import signal
23
+ import threading
21
24
  import weakref
22
25
  from functools import wraps
23
26
  import numpy as np
24
27
 
25
28
  import mindspore._c_dataengine as cde
26
29
  from mindspore.common.tensor import Tensor, np_types
30
+ import mindspore.dataset as ds
27
31
  import mindspore.dataset.engine.offload as offload
28
32
  from mindspore.dataset.core.config import get_debug_mode
29
33
 
30
34
  from mindspore import log as logger
35
+ from ..core.py_util_helpers import ExceptionHandler
31
36
 
32
37
  _ITERATOR_CLEANUP = False
33
38
 
@@ -87,6 +92,126 @@ def _cleanup_the_iterators_if_created(method):
87
92
  return wrapper
88
93
 
89
94
 
95
+ def __convert_python(obj, to_numpy, _do_copy):
96
+ """
97
+ Attempts to recursively convert a python object to Numpy array(s) or tensor(s).
98
+
99
+ Args:
100
+ obj (any): the python object to be converted
101
+ to_numpy (bool): If True, convert primitive types to NumPy array. If False, convert to Tensor.
102
+ (return the obj if type isn't supported)
103
+ """
104
+ if isinstance(obj, (int, float, bool, str, np.ndarray, np.str_, np.bytes_, *np_types)):
105
+ # error out if array is of unsupported type
106
+ if isinstance(obj, np.ndarray) and obj.dtype not in np_types and obj.dtype.kind not in ('U', 'S'):
107
+ new_line = '\n'
108
+ raise TypeError("A NumPy array of unsupported type detected: {}."
109
+ "\nSupported types are: {}.".format(
110
+ obj.dtype, new_line.join(map(str, (*np_types, np.str_, np.bytes_)))))
111
+ if to_numpy:
112
+ return np.array(obj, copy=_do_copy)
113
+ if _do_copy:
114
+ return Tensor(np.asarray(obj))
115
+ return Tensor.from_numpy(np.asarray(obj))
116
+ if isinstance(obj, dict):
117
+ return {key: __convert_python(val, to_numpy, _do_copy) for key, val in obj.items()}
118
+ if isinstance(obj, tuple):
119
+ return tuple([__convert_python(item, to_numpy, _do_copy) for item in obj])
120
+ if isinstance(obj, list):
121
+ return [__convert_python(item, to_numpy, _do_copy) for item in obj]
122
+ # if we can't convert it to Tensor, return the object as is
123
+ if _do_copy:
124
+ return deepcopy(obj)
125
+ return obj
126
+
127
+
128
+ def _transform_md_to_output(t, _output_numpy, _do_copy):
129
+ if _output_numpy:
130
+ if t.type().is_python():
131
+ return __convert_python(t.as_python(), True, _do_copy)
132
+ return t.as_array()
133
+ return _transform_md_to_tensor(t, _do_copy)
134
+
135
+
136
+ def _transform_md_to_tensor(t, _do_copy):
137
+ if t.type().is_python():
138
+ return __convert_python(t.as_python(), False, _do_copy)
139
+ array = t.as_array()
140
+ if _do_copy:
141
+ return Tensor(array)
142
+ return Tensor.from_numpy(array)
143
+
144
+
145
+ def _transform_tensor_to_output(t, _output_numpy):
146
+ if _output_numpy:
147
+ return t.asnumpy()
148
+ return t
149
+
150
+
151
+ def _convert_tuple_data(queue_in, queue_out, offload_model, _output_numpy, _do_copy, thread_event):
152
+ """
153
+ Convert data on tuple iterator.
154
+ """
155
+ while True:
156
+ try:
157
+ if thread_event.is_set():
158
+ return
159
+ item = queue_in.get(timeout=1)
160
+ if offload_model is None:
161
+ queue_out.put([_transform_md_to_output(t, _output_numpy, _do_copy) for t in item])
162
+ if not item:
163
+ break
164
+ continue
165
+
166
+ data = [_transform_md_to_tensor(t, _do_copy) for t in item]
167
+ if data:
168
+ data = offload.apply_offload_iterators(data, offload_model)
169
+ queue_out.put([_transform_tensor_to_output(t, _output_numpy) for t in data])
170
+ if not item:
171
+ break
172
+ except queue.Empty:
173
+ continue
174
+ except Exception: # pylint: disable=broad-except
175
+ result = ExceptionHandler()
176
+ queue_out.put(result)
177
+ break
178
+ thread_event.set()
179
+
180
+
181
+ def _convert_dict_data(queue_in, queue_out, offload_model, _output_numpy, _do_copy, thread_event, col_names):
182
+ """
183
+ Convert data on dict iterator.
184
+ """
185
+ while True:
186
+ try:
187
+ if thread_event.is_set():
188
+ return
189
+ item = queue_in.get(timeout=1)
190
+ if offload_model is None:
191
+ queue_out.put({k: _transform_md_to_output(t, _output_numpy, _do_copy) for k, t in item})
192
+ if not item:
193
+ break
194
+ continue
195
+ data = [_transform_md_to_tensor(t, _do_copy) for t in item]
196
+ if data:
197
+ data = offload.apply_offload_iterators(data, offload_model)
198
+ # Create output dictionary after offload
199
+ out_data = {}
200
+ for i, col in enumerate(col_names):
201
+ out_data[col] = _transform_tensor_to_output(data[i], _output_numpy)
202
+ data = out_data
203
+ if not item:
204
+ break
205
+ queue_out.put(data)
206
+ except queue.Empty:
207
+ continue
208
+ except Exception: # pylint: disable=broad-except
209
+ result = ExceptionHandler()
210
+ queue_out.put(result)
211
+ break
212
+ thread_event.set()
213
+
214
+
90
215
  class Iterator:
91
216
  """
92
217
  General Iterator over a dataset.
@@ -112,6 +237,8 @@ class Iterator:
112
237
  init_step = dataset.get_init_step()
113
238
  dataset_size = dataset.get_dataset_size()
114
239
  if get_debug_mode():
240
+ if dataset.get_init_step() != 0:
241
+ logger.warning("Dataset init step will be ignored in debug mode.")
115
242
  consumer = cde.PythonPullBasedIteratorConsumer(num_epochs)
116
243
  consumer.Init(self.ir_tree)
117
244
  else:
@@ -134,10 +261,35 @@ class Iterator:
134
261
 
135
262
  ITERATORS_LIST.append(weakref.ref(self))
136
263
  _unset_iterator_cleanup()
264
+ self.parallel_convert = ds.config.get_iterator_mode()["parallel_convert"]
265
+ if self.parallel_convert:
266
+ # The variable "tick" ensures that the thread is only started on the first iteration
267
+ self.tick = True
268
+ self.thread_convert = None
269
+ self.queue_in = queue.Queue(3)
270
+ self.queue_out = queue.Queue(3)
271
+ self.thread_event = None
272
+ self.enable_get_next_data = True
273
+ atexit.register(self.__class__.terminate, weakref.ref(self))
137
274
 
138
275
  def __iter__(self):
139
276
  return self
140
277
 
278
+ @staticmethod
279
+ def terminate(ref):
280
+ """
281
+ Interrupt the convert subthread
282
+ """
283
+ self = ref()
284
+ if self is None:
285
+ return
286
+ if hasattr(self, "parallel_convert"):
287
+ if self.parallel_convert:
288
+ if self.thread_event is not None and self.thread_convert is not None and \
289
+ not self.thread_event.is_set():
290
+ self.thread_event.set()
291
+ self.thread_convert.join()
292
+
141
293
  def stop(self):
142
294
  """
143
295
  Manually terminate Python iterator instead of relying on out of scope destruction.
@@ -165,18 +317,26 @@ class Iterator:
165
317
  self.stop()
166
318
 
167
319
  def __del__(self):
320
+ if hasattr(self, "parallel_convert"):
321
+ if self.parallel_convert:
322
+ if self.thread_event is not None and self.thread_convert is not None and \
323
+ not self.thread_event.is_set():
324
+ self.thread_event.set()
325
+ self.thread_convert.join()
168
326
  self.release()
169
327
 
170
328
  @abstractmethod
171
329
  def _get_next(self):
172
330
  raise RuntimeError("Calling base class Iterator's get_next is invalid.")
173
331
 
174
- def __next__(self):
175
- if not self._runtime_context:
176
- logger.warning("Iterator does not have a running C++ pipeline." +
177
- "It might because Iterator stop() had been called, or C++ pipeline crashed silently.")
178
- raise RuntimeError("Iterator does not have a running C++ pipeline.")
332
+ @abstractmethod
333
+ def _parallel_transformation_iteration(self):
334
+ raise RuntimeError("Calling base class Iterator's parallel_transformation_iteration is invalid.")
179
335
 
336
+ def serial_conversion_iteration(self):
337
+ """
338
+ Fetch data to serial conversion
339
+ """
180
340
  # Note offload is applied inside _get_next() if applicable since get_next converts to output format
181
341
  data = self._get_next()
182
342
  if not data:
@@ -189,6 +349,16 @@ class Iterator:
189
349
 
190
350
  return data
191
351
 
352
+ def __next__(self):
353
+ if not self._runtime_context:
354
+ logger.warning("Iterator does not have a running C++ pipeline." +
355
+ "It might because Iterator stop() had been called, or C++ pipeline crashed silently.")
356
+ raise RuntimeError("Iterator does not have a running C++ pipeline.")
357
+
358
+ if self.parallel_convert:
359
+ return self._parallel_transformation_iteration()
360
+ return self.serial_conversion_iteration()
361
+
192
362
  def __deepcopy__(self, memo):
193
363
  return self
194
364
 
@@ -218,58 +388,20 @@ class Iterator:
218
388
  dataset_size (int): The number of steps that one epoch has.
219
389
  """
220
390
  self._iterator.Reset(step, dataset_size)
221
-
222
- def __convert_python(self, obj, to_numpy):
223
- """
224
- Attempts to recursively convert a python object to Numpy array(s) or tensor(s).
225
-
226
- Args:
227
- obj (any): the python object to be converted
228
- to_numpy (bool): If True, convert primitive types to NumPy array. If False, convert to Tensor.
229
- (return the obj if type isn't supported)
230
- """
231
- if isinstance(obj, (int, float, bool, str, np.ndarray, np.str_, np.bytes_, *np_types)):
232
- # error out if array is of unsupported type
233
- if isinstance(obj, np.ndarray) and obj.dtype not in np_types and obj.dtype.kind not in ('U', 'S'):
234
- new_line = '\n'
235
- raise TypeError("A NumPy array of unsupported type detected: {}."
236
- "\nSupported types are: {}.".format(
237
- obj.dtype, new_line.join(map(str, (*np_types, np.str_, np.bytes_)))))
238
- if to_numpy:
239
- return np.array(obj, copy=self._do_copy)
240
- if self._do_copy:
241
- return Tensor(np.asarray(obj))
242
- return Tensor.from_numpy(np.asarray(obj))
243
- if isinstance(obj, dict):
244
- return {key: self.__convert_python(val, to_numpy) for key, val in obj.items()}
245
- if isinstance(obj, tuple):
246
- return tuple([self.__convert_python(item, to_numpy) for item in obj])
247
- if isinstance(obj, list):
248
- return [self.__convert_python(item, to_numpy) for item in obj]
249
- # if we can't convert it to Tensor, return the object as is
250
- if self._do_copy:
251
- return deepcopy(obj)
252
- return obj
253
-
254
- def _transform_md_to_output(self, t):
255
- if self._output_numpy:
256
- if t.type().is_python():
257
- return self.__convert_python(t.as_python(), True)
258
- return t.as_array()
259
- return self._transform_md_to_tensor(t)
260
-
261
- def _transform_md_to_tensor(self, t):
262
- if t.type().is_python():
263
- return self.__convert_python(t.as_python(), False)
264
- array = t.as_array()
265
- if self._do_copy:
266
- return Tensor(array)
267
- return Tensor.from_numpy(array)
268
-
269
- def _transform_tensor_to_output(self, t):
270
- if self._output_numpy:
271
- return t.asnumpy()
272
- return t
391
+ if self.parallel_convert:
392
+ while not self.queue_in.empty():
393
+ self.queue_in.get()
394
+ while not self.queue_out.empty():
395
+ self.queue_out.get()
396
+ if self.thread_event is not None:
397
+ if self.thread_event.is_set():
398
+ self.thread_event.clear()
399
+ self.tick = True
400
+ else:
401
+ self.thread_event.set()
402
+ self.thread_convert.join()
403
+ self.tick = True
404
+ self.enable_get_next_data = True
273
405
 
274
406
 
275
407
  class DictIterator(Iterator):
@@ -286,14 +418,15 @@ class DictIterator(Iterator):
286
418
  """
287
419
  try:
288
420
  if self.offload_model is None:
289
- return {k: self._transform_md_to_output(t) for k, t in self._iterator.GetNextAsMap().items()}
290
- data = [self._transform_md_to_tensor(t) for t in self._iterator.GetNextAsList()]
421
+ return {k: _transform_md_to_output(t, self._output_numpy, self._do_copy) for k, t in
422
+ self._iterator.GetNextAsMap().items()}
423
+ data = [_transform_md_to_tensor(t, self._do_copy) for t in self._iterator.GetNextAsList()]
291
424
  if data:
292
425
  data = offload.apply_offload_iterators(data, self.offload_model)
293
426
  # Create output dictionary after offload
294
427
  out_data = {}
295
428
  for i, col in enumerate(self.get_col_names()):
296
- out_data[col] = self._transform_tensor_to_output(data[i])
429
+ out_data[col] = _transform_tensor_to_output(data[i], self._output_numpy)
297
430
  data = out_data
298
431
  return data
299
432
 
@@ -305,6 +438,53 @@ class DictIterator(Iterator):
305
438
  os.kill(os.getpid(), signal.SIGKILL)
306
439
  raise err
307
440
 
441
+ def _parallel_transformation_iteration(self):
442
+ """
443
+ Launch child thread to convert tensor.
444
+ """
445
+ if self.tick:
446
+ self.thread_event = threading.Event()
447
+ self.thread_convert = threading.Thread(target=_convert_dict_data,
448
+ name="Convert_dict_data",
449
+ args=(self.queue_in, self.queue_out, self.offload_model,
450
+ self._output_numpy, self._do_copy, self.thread_event,
451
+ self.get_col_names()),
452
+ daemon=True)
453
+ self.thread_convert.start()
454
+ self.tick = False
455
+ while True:
456
+ if self.thread_event.is_set() and self.queue_out.qsize() == 0:
457
+ self.tick = True
458
+ self.enable_get_next_data = True
459
+ raise StopIteration
460
+ try:
461
+ if not self.queue_in.full() and self.enable_get_next_data:
462
+ if self.offload_model is None:
463
+ item = self._iterator.GetNextAsMap().items()
464
+ if not item:
465
+ self.enable_get_next_data = False
466
+ self.queue_in.put(item)
467
+ else:
468
+ item = self._iterator.GetNextAsList()
469
+ if not item:
470
+ self.enable_get_next_data = False
471
+ self.queue_in.put(item)
472
+ data = self.queue_out.get(timeout=0.00001)
473
+ if not data:
474
+ continue
475
+ if isinstance(data, ExceptionHandler):
476
+ if data.except_msg.find("Out of memory") >= 0 or data.except_msg.find("MemoryError") >= 0:
477
+ logger.critical("Memory error occurred, process will exit.")
478
+ os.kill(os.getpid(), signal.SIGKILL)
479
+ data.reraise()
480
+ return data
481
+ except queue.Empty:
482
+ continue
483
+ except Exception as err_info:
484
+ self.thread_event.set()
485
+ self.thread_convert.join()
486
+ raise err_info
487
+
308
488
 
309
489
  class TupleIterator(Iterator):
310
490
  """
@@ -327,11 +507,49 @@ class TupleIterator(Iterator):
327
507
  """
328
508
 
329
509
  if self.offload_model is None:
330
- return [self._transform_md_to_output(t) for t in self._iterator.GetNextAsList()]
331
- data = [self._transform_md_to_tensor(t) for t in self._iterator.GetNextAsList()]
510
+ return [_transform_md_to_output(t, self._output_numpy, self._do_copy) for t in
511
+ self._iterator.GetNextAsList()]
512
+ data = [_transform_md_to_tensor(t, self._do_copy) for t in self._iterator.GetNextAsList()]
332
513
  if data:
333
514
  data = offload.apply_offload_iterators(data, self.offload_model)
334
- return [self._transform_tensor_to_output(t) for t in data]
515
+ return [_transform_tensor_to_output(t, self._output_numpy) for t in data]
516
+
517
+ def _parallel_transformation_iteration(self):
518
+ """
519
+ Launch child thread to convert tensor.
520
+ """
521
+ if self.tick:
522
+ self.thread_event = threading.Event()
523
+ self.thread_convert = threading.Thread(target=_convert_tuple_data,
524
+ name="Convert_tuple_data",
525
+ args=(self.queue_in, self.queue_out, self.offload_model,
526
+ self._output_numpy, self._do_copy, self.thread_event),
527
+ daemon=True)
528
+ self.thread_convert.start()
529
+ self.tick = False
530
+ while True:
531
+ if self.thread_event.is_set() and self.queue_out.qsize() == 0:
532
+ self.tick = True
533
+ self.enable_get_next_data = True
534
+ raise StopIteration
535
+ try:
536
+ if not self.queue_in.full() and self.enable_get_next_data:
537
+ item = self._iterator.GetNextAsList()
538
+ if not item:
539
+ self.enable_get_next_data = False
540
+ self.queue_in.put(item)
541
+ data = self.queue_out.get(timeout=0.00001)
542
+ if not data:
543
+ continue
544
+ if isinstance(data, ExceptionHandler):
545
+ data.reraise()
546
+ return data
547
+ except queue.Empty:
548
+ continue
549
+ except Exception as err_info:
550
+ self.thread_event.set()
551
+ self.thread_convert.join()
552
+ raise err_info
335
553
 
336
554
 
337
555
  class DummyIterator:
@@ -42,6 +42,14 @@ obsClient = ObsClient(
42
42
  def get_used_disk_per():
43
43
  """ Get the disk usage of working directory."""
44
44
 
45
+ if os.path.exists(config.WORKING_PATH) and not os.access(config.WORKING_PATH, os.R_OK | os.W_OK | os.X_OK):
46
+ err_msg =\
47
+ "Permission denied:'{}'. Suggestion: " \
48
+ "1) It is recommended to manually create the {} directory and add read/write permissions to it. " \
49
+ "2) If you can't create, we suggest you download MindRecord manually and "\
50
+ "read it using the MindDataset interface.".format(config.WORKING_PATH, config.WORKING_PATH)
51
+ raise RuntimeError(err_msg)
52
+
45
53
  if not os.path.exists(config.WORKING_PATH):
46
54
  try:
47
55
  os.makedirs(config.WORKING_PATH)
@@ -24,6 +24,7 @@ import platform
24
24
  import queue
25
25
  import types
26
26
 
27
+ import dill
27
28
  import numpy as np
28
29
 
29
30
  from mindspore import log as logger
@@ -71,6 +72,9 @@ class _SharedQueue(multiprocessing.queues.Queue):
71
72
  # reading a buffer and also have a full queue of buffers in the meta-data queue
72
73
  self.num_seg = size + 2
73
74
 
75
+ self.dynamic_shm = True
76
+ self.fd_list = []
77
+ self.seg_size = 0
74
78
  if platform.system().lower() != 'windows' and max_rowsize == -1:
75
79
  self.dynamic_shm = True
76
80
  self.fd_list = []
@@ -89,6 +93,42 @@ class _SharedQueue(multiprocessing.queues.Queue):
89
93
  else:
90
94
  self.shm_list.append(shared_array)
91
95
 
96
+ def __getstate__(self):
97
+ copy_out = dill.dumps(self.copy_out)
98
+ min_shared_mem = dill.dumps(self.min_shared_mem)
99
+ data_immediate = dill.dumps(self.data_immediate)
100
+ data_shared = dill.dumps(self.data_shared)
101
+ # cannot dill 'mmap.mmap' object : self.count
102
+ print_error = dill.dumps(self.print_error)
103
+ shm_list = dill.dumps(self.shm_list)
104
+ seg_pos = dill.dumps(self.seg_pos)
105
+ num_seg = dill.dumps(self.num_seg)
106
+ dynamic_shm = dill.dumps(self.dynamic_shm)
107
+ fd_list = dill.dumps(self.fd_list)
108
+ seg_size = dill.dumps(self.seg_size)
109
+ # multiprocessing attribute
110
+ _closed = dill.dumps(self._closed)
111
+ super_variable = super().__getstate__()
112
+ return (copy_out, min_shared_mem, data_immediate, data_shared, print_error, shm_list,
113
+ seg_pos, num_seg, dynamic_shm, fd_list, seg_size, _closed, super_variable)
114
+
115
+ def __setstate__(self, state):
116
+ copy_out, min_shared_mem, data_immediate, data_shared, print_error, shm_list, \
117
+ seg_pos, num_seg, dynamic_shm, fd_list, seg_size, _closed, super_variable = state
118
+ self.copy_out = dill.loads(copy_out)
119
+ self.min_shared_mem = dill.loads(min_shared_mem)
120
+ self.data_immediate = dill.loads(data_immediate)
121
+ self.data_shared = dill.loads(data_shared)
122
+ self.print_error = dill.loads(print_error)
123
+ self.shm_list = dill.loads(shm_list)
124
+ self.seg_pos = dill.loads(seg_pos)
125
+ self.num_seg = dill.loads(num_seg)
126
+ self.dynamic_shm = dill.loads(dynamic_shm)
127
+ self.fd_list = dill.loads(fd_list)
128
+ self.seg_size = dill.loads(seg_size)
129
+ self._closed = dill.loads(_closed)
130
+ super().__setstate__(super_variable)
131
+
92
132
  def put_until(self, data, timeout=None, exit_signal=None):
93
133
  """Put data into the queue. Block until timeout is reached or exit_signal is set."""
94
134
  while True:
@@ -19,7 +19,9 @@ SequentialSampler, SubsetRandomSampler, and WeightedRandomSampler.
19
19
  Users can also define a custom sampler by extending from the Sampler class.
20
20
  """
21
21
 
22
+ import copy
22
23
  import numbers
24
+
23
25
  import numpy as np
24
26
  import mindspore._c_dataengine as cde
25
27
  import mindspore.dataset as ds
@@ -253,6 +255,7 @@ class Sampler(BuiltinSampler):
253
255
  self.dataset_size = 0
254
256
  self.child_sampler = None
255
257
  self.num_samples = num_samples
258
+ self.batch_sizes = []
256
259
 
257
260
  def __iter__(self):
258
261
  """
@@ -278,17 +281,34 @@ class Sampler(BuiltinSampler):
278
281
  def _get_indices(self):
279
282
  sampler_iter = iter(self)
280
283
  ret = []
284
+ batch_sizes = []
281
285
  for _ in range(self.num_samples):
282
286
  try:
283
287
  idx = next(sampler_iter)
284
- ret.append(idx)
288
+ # The idx can be either a number (for sampler) or a list (for batch sampler).
289
+ # If number, we convert it to list first. So they can be handled in the same way.
290
+ if isinstance(idx, numbers.Number):
291
+ idx = [idx]
292
+ # normal sampler does not have batch sizes
293
+ batch_sizes.append(0)
294
+ else:
295
+ # Using extend instead of append will flatten the list, so we need to save the
296
+ # batch size information here.
297
+ batch_sizes.append(len(idx))
298
+ ret.extend(idx)
285
299
  except StopIteration:
286
300
  break
301
+ self.batch_sizes.append(batch_sizes)
287
302
  indices = np.array(ret)
288
303
  if indices.dtype == object:
289
304
  raise RuntimeError("Fetched indices can not be converted to a valid ndarray.")
290
305
  return indices
291
306
 
307
+ def _get_batch_sizes(self):
308
+ if not self.batch_sizes:
309
+ return []
310
+ return self.batch_sizes.pop(0)
311
+
292
312
  # Instance fetcher
293
313
  # Do not override this method!
294
314
  def parse(self):
@@ -818,7 +838,11 @@ class IterSampler(Sampler):
818
838
 
819
839
  def __init__(self, sampler, num_samples=None):
820
840
  if num_samples is None:
821
- num_samples = len(list(sampler))
841
+ if hasattr(sampler, "__len__"):
842
+ num_samples = len(sampler)
843
+ else:
844
+ # counting on a copied sampler to prevent changing the random state of the original one
845
+ num_samples = len(list(copy.deepcopy(sampler)))
822
846
  super().__init__(num_samples=num_samples)
823
847
  self.sampler = sampler
824
848
 
@@ -68,7 +68,7 @@ def deserialize(input_dict=None, json_filepath=None):
68
68
  Args:
69
69
  input_dict (dict): A Python dictionary containing a serialized dataset graph. Default: ``None``.
70
70
  json_filepath (str): A path to the JSON file containing dataset graph.
71
- User can obtain this file by calling API `mindspore.dataset.serialize()` . Default: ``None``.
71
+ User can obtain this file by calling API :func:`mindspore.dataset.serialize` . Default: ``None``.
72
72
 
73
73
  Returns:
74
74
  de.Dataset or None if error occurs.